]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/cdxl.c
avutil/hwcontext_vulkan: fix format specifiers for some printed variables
[ffmpeg] / libavcodec / cdxl.c
index 78f5d50102f1849c8cbd04b857247e4826c9936c..860dc639f6e5b0064e5f0d95f4ef26189574d3bb 100644 (file)
@@ -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,
@@ -324,7 +336,7 @@ static av_cold int cdxl_decode_end(AVCodecContext *avctx)
     return 0;
 }
 
-AVCodec ff_cdxl_decoder = {
+const AVCodec ff_cdxl_decoder = {
     .name           = "cdxl",
     .long_name      = NULL_IF_CONFIG_SMALL("Commodore CDXL video"),
     .type           = AVMEDIA_TYPE_VIDEO,
@@ -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,
 };