From f60c3a7c1b1ef3fa5adf4ea62bbe7b8ba346f7c5 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Thu, 24 Oct 2013 11:10:49 +0200 Subject: lavd/x11grab: Support AV_PIX_FMT_PAL8. Fixes ticket #3068. --- libavdevice/x11grab.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/libavdevice/x11grab.c b/libavdevice/x11grab.c index eb23ec332d..0e7b6ae5ee 100644 --- a/libavdevice/x11grab.c +++ b/libavdevice/x11grab.c @@ -77,6 +77,8 @@ struct x11grab { int follow_mouse; /**< Set by a private option. */ int show_region; /**< set by a private option. */ AVRational framerate; /**< Set by a private option. */ + int palette_changed; + uint32_t palette[256]; Cursor c; Window region_win; /**< This is used by show_region option. */ @@ -167,6 +169,9 @@ x11grab_read_header(AVFormatContext *s1) int use_shm; char *dpyname, *offset; int ret = 0; + Colormap color_map; + XColor color[256]; + int i; dpyname = av_strdup(s1->filename); if (!dpyname) @@ -258,6 +263,15 @@ x11grab_read_header(AVFormatContext *s1) case 8: av_log (s1, AV_LOG_DEBUG, "8 bit palette\n"); 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; case 16: if ( image->red_mask == 0xf800 && @@ -489,6 +503,16 @@ x11grab_read_packet(AVFormatContext *s1, AVPacket *pkt) pkt->data = image->data; pkt->size = s->frame_size; 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); root = RootWindow(dpy, screen); -- cgit v1.2.3