| @@ -77,6 +77,8 @@ struct x11grab { | |||||
| int follow_mouse; /**< Set by a private option. */ | int follow_mouse; /**< Set by a private option. */ | ||||
| int show_region; /**< set by a private option. */ | int show_region; /**< set by a private option. */ | ||||
| AVRational framerate; /**< Set by a private option. */ | AVRational framerate; /**< Set by a private option. */ | ||||
| int palette_changed; | |||||
| uint32_t palette[256]; | |||||
| Cursor c; | Cursor c; | ||||
| Window region_win; /**< This is used by show_region option. */ | Window region_win; /**< This is used by show_region option. */ | ||||
| @@ -167,6 +169,9 @@ x11grab_read_header(AVFormatContext *s1) | |||||
| int use_shm; | int use_shm; | ||||
| char *dpyname, *offset; | char *dpyname, *offset; | ||||
| int ret = 0; | int ret = 0; | ||||
| Colormap color_map; | |||||
| XColor color[256]; | |||||
| int i; | |||||
| dpyname = av_strdup(s1->filename); | dpyname = av_strdup(s1->filename); | ||||
| if (!dpyname) | if (!dpyname) | ||||
| @@ -258,6 +263,15 @@ x11grab_read_header(AVFormatContext *s1) | |||||
| case 8: | case 8: | ||||
| av_log (s1, AV_LOG_DEBUG, "8 bit palette\n"); | av_log (s1, AV_LOG_DEBUG, "8 bit palette\n"); | ||||
| input_pixfmt = AV_PIX_FMT_PAL8; | input_pixfmt = AV_PIX_FMT_PAL8; | ||||
| color_map = DefaultColormap(dpy, screen); | |||||
| for (i = 0; i < 256; ++i) | |||||
| color[i].pixel = i; | |||||
| XQueryColors(dpy, color_map, color, 256); | |||||
| for (i = 0; i < 256; ++i) | |||||
| x11grab->palette[i] = (color[i].red & 0xFF00) << 8 | | |||||
| (color[i].green & 0xFF00) | | |||||
| (color[i].blue & 0xFF00) >> 8; | |||||
| x11grab->palette_changed = 1; | |||||
| break; | break; | ||||
| case 16: | case 16: | ||||
| if ( image->red_mask == 0xf800 && | if ( image->red_mask == 0xf800 && | ||||
| @@ -489,6 +503,16 @@ x11grab_read_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
| pkt->data = image->data; | pkt->data = image->data; | ||||
| pkt->size = s->frame_size; | pkt->size = s->frame_size; | ||||
| pkt->pts = curtime; | pkt->pts = curtime; | ||||
| if (s->palette_changed) { | |||||
| uint8_t *pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, | |||||
| AVPALETTE_SIZE); | |||||
| if (!pal) { | |||||
| av_log(s, AV_LOG_ERROR, "Cannot append palette to packet\n"); | |||||
| } else { | |||||
| memcpy(pal, s->palette, AVPALETTE_SIZE); | |||||
| s->palette_changed = 0; | |||||
| } | |||||
| } | |||||
| screen = DefaultScreen(dpy); | screen = DefaultScreen(dpy); | ||||
| root = RootWindow(dpy, screen); | root = RootWindow(dpy, screen); | ||||