X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fcdxl.c;h=056c3577ab759af49431059677cf0936d3bbe004;hb=e5bcda6473a2d6984216004506374669501fcf3b;hp=78f5d50102f1849c8cbd04b857247e4826c9936c;hpb=768b07e3bca7e81d2f9c60badb3973d3d88481dc;p=ffmpeg diff --git a/libavcodec/cdxl.c b/libavcodec/cdxl.c index 78f5d50102f..056c3577ab7 100644 --- a/libavcodec/cdxl.c +++ b/libavcodec/cdxl.c @@ -43,6 +43,7 @@ typedef struct CDXLVideoContext { AVCodecContext *avctx; int bpp; + int type; int format; int padded_bits; const uint8_t *palette; @@ -65,14 +66,19 @@ static av_cold int cdxl_decode_init(AVCodecContext *avctx) static void import_palette(CDXLVideoContext *c, uint32_t *new_palette) { - int i; - - for (i = 0; i < c->palette_size / 2; i++) { - unsigned rgb = AV_RB16(&c->palette[i * 2]); - unsigned r = ((rgb >> 8) & 0xF) * 0x11; - unsigned g = ((rgb >> 4) & 0xF) * 0x11; - unsigned b = (rgb & 0xF) * 0x11; - AV_WN32(&new_palette[i], (0xFFU << 24) | (r << 16) | (g << 8) | b); + if (c->type == 1) { + for (int i = 0; i < c->palette_size / 2; i++) { + unsigned rgb = AV_RB16(&c->palette[i * 2]); + unsigned r = ((rgb >> 8) & 0xF) * 0x11; + unsigned g = ((rgb >> 4) & 0xF) * 0x11; + unsigned b = (rgb & 0xF) * 0x11; + AV_WN32(&new_palette[i], (0xFFU << 24) | (r << 16) | (g << 8) | b); + } + } else { + for (int i = 0; i < c->palette_size / 3; i++) { + unsigned rgb = AV_RB24(&c->palette[i * 3]); + AV_WN32(&new_palette[i], (0xFFU << 24) | rgb); + } } } @@ -246,6 +252,7 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, if (buf_size < 32) return AVERROR_INVALIDDATA; + c->type = buf[0]; encoding = buf[1] & 7; c->format = buf[1] & 0xE0; w = AV_RB16(&buf[14]); @@ -256,7 +263,11 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, c->video = c->palette + c->palette_size; c->video_size = buf_size - c->palette_size - 32; - if (c->palette_size > 512) + if (c->type > 1) + return AVERROR_INVALIDDATA; + if (c->type == 1 && c->palette_size > 512) + return AVERROR_INVALIDDATA; + if (c->type == 0 && c->palette_size > 768) return AVERROR_INVALIDDATA; if (buf_size < c->palette_size + 32) return AVERROR_INVALIDDATA; @@ -295,6 +306,7 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data, if ((ret = ff_get_buffer(avctx, p, 0)) < 0) return ret; p->pict_type = AV_PICTURE_TYPE_I; + p->key_frame = 1; if (encoding) { av_fast_padded_malloc(&c->new_video, &c->new_video_size, @@ -334,4 +346,5 @@ AVCodec ff_cdxl_decoder = { .close = cdxl_decode_end, .decode = cdxl_decode_frame, .capabilities = AV_CODEC_CAP_DR1, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, };