diff options
author | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2016-09-20 00:26:06 +0300 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2016-09-20 00:26:06 +0300 |
commit | 11777eb8142117864bff0c8060f17b4089434143 (patch) | |
tree | f25c1297d9cefadbac0a6ed43b12fd47bd742ac2 /libavcodec/rscc.c | |
parent | 2c48014ab2bb6613b79e3c0b6f45daa5333018ae (diff) |
lavc/rscc: Support pal8 in rscc.
Fixes the colours of the sample for ticket #5611.
Diffstat (limited to 'libavcodec/rscc.c')
-rw-r--r-- | libavcodec/rscc.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libavcodec/rscc.c b/libavcodec/rscc.c index 3b3703cf19..7f280a9a97 100644 --- a/libavcodec/rscc.c +++ b/libavcodec/rscc.c @@ -31,7 +31,7 @@ * and it can be deflated or not. Similarly, pixel data comes after the header * and a variable size value, and it can be deflated or just raw. * - * Supports: GRAY8, BGRA, BGR24, RGB555, RGB8 + * Supports: BGRA, BGR24, RGB555, PAL8 */ #include <stdint.h> @@ -58,6 +58,7 @@ typedef struct RsccContext { Tile *tiles; unsigned int tiles_size; int component_size; + uint32_t pal[AVPALETTE_COUNT]; /* zlib interaction */ uint8_t *inflated_buf; @@ -89,7 +90,7 @@ static av_cold int rscc_init(AVCodecContext *avctx) ctx->component_size = avctx->bits_per_coded_sample / 8; switch (avctx->bits_per_coded_sample) { case 8: - avctx->pix_fmt = AV_PIX_FMT_GRAY8; + avctx->pix_fmt = AV_PIX_FMT_PAL8; break; case 16: avctx->pix_fmt = AV_PIX_FMT_RGB555LE; @@ -308,6 +309,16 @@ static int rscc_decode_frame(AVCodecContext *avctx, void *data, } else { frame->pict_type = AV_PICTURE_TYPE_P; } + if (avctx->pix_fmt == AV_PIX_FMT_PAL8) { + const uint8_t *pal = av_packet_get_side_data(avpkt, + AV_PKT_DATA_PALETTE, + NULL); + if (pal) { + frame->palette_has_changed = 1; + memcpy(ctx->pal, pal, AVPALETTE_SIZE); + } + memcpy (frame->data[1], ctx->pal, AVPALETTE_SIZE); + } *got_frame = 1; end: |