]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/dpx.c
avcodec: Remove redundant freeing of extradata of encoders
[ffmpeg] / libavcodec / dpx.c
index 12bc165415d2eaba3a8e3fcfdb7017a0c0286960..8e77c09bb17aec20b54cccee501a08e52984fc86 100644 (file)
@@ -159,8 +159,8 @@ static int decode_frame(AVCodecContext *avctx,
     AVFrame *const p = data;
     uint8_t *ptr[AV_NUM_DATA_POINTERS];
     uint32_t header_version, version = 0;
-    char creator[101];
-    char input_device[33];
+    char creator[101] = { 0 };
+    char input_device[33] = { 0 };
 
     unsigned int offset;
     int magic_num, endian;
@@ -242,6 +242,9 @@ static int decode_frame(AVCodecContext *avctx,
         return AVERROR_PATCHWELCOME;
     }
 
+    if (bits_per_color > 32)
+        return AVERROR_INVALIDDATA;
+
     buf += 820;
     avctx->sample_aspect_ratio.num = read32(&buf, endian);
     avctx->sample_aspect_ratio.den = read32(&buf, endian);
@@ -327,6 +330,10 @@ static int decode_frame(AVCodecContext *avctx,
     }
 
     switch (descriptor) {
+    case 1:  // R
+    case 2:  // G
+    case 3:  // B
+    case 4:  // A
     case 6:  // Y
         elements = 1;
         yuv = 1;
@@ -385,8 +392,10 @@ static int decode_frame(AVCodecContext *avctx,
     case 16:
         stride = 2 * avctx->width * elements;
         break;
-    case 1:
     case 32:
+        stride = 4 * avctx->width * elements;
+        break;
+    case 1:
     case 64:
         avpriv_report_missing_feature(avctx, "Depth %d", bits_per_color);
         return AVERROR_PATCHWELCOME;
@@ -491,6 +500,14 @@ static int decode_frame(AVCodecContext *avctx,
     }
 
     switch (1000 * descriptor + 10 * bits_per_color + endian) {
+    case 1081:
+    case 1080:
+    case 2081:
+    case 2080:
+    case 3081:
+    case 3080:
+    case 4081:
+    case 4080:
     case 6081:
     case 6080:
         avctx->pix_fmt = AV_PIX_FMT_GRAY8;
@@ -499,6 +516,20 @@ static int decode_frame(AVCodecContext *avctx,
     case 6120:
         avctx->pix_fmt = AV_PIX_FMT_GRAY12;
         break;
+    case 1320:
+    case 2320:
+    case 3320:
+    case 4320:
+    case 6320:
+        avctx->pix_fmt = AV_PIX_FMT_GRAYF32LE;
+        break;
+    case 1321:
+    case 2321:
+    case 3321:
+    case 4321:
+    case 6321:
+        avctx->pix_fmt = AV_PIX_FMT_GRAYF32BE;
+        break;
     case 50081:
     case 50080:
         avctx->pix_fmt = AV_PIX_FMT_RGB24;
@@ -549,6 +580,18 @@ static int decode_frame(AVCodecContext *avctx,
     case 51160:
         avctx->pix_fmt = AV_PIX_FMT_RGBA64LE;
         break;
+    case 50320:
+        avctx->pix_fmt = AV_PIX_FMT_GBRPF32LE;
+        break;
+    case 50321:
+        avctx->pix_fmt = AV_PIX_FMT_GBRPF32BE;
+        break;
+    case 51320:
+        avctx->pix_fmt = AV_PIX_FMT_GBRAPF32LE;
+        break;
+    case 51321:
+        avctx->pix_fmt = AV_PIX_FMT_GBRAPF32BE;
+        break;
     case 100081:
         avctx->pix_fmt = AV_PIX_FMT_UYVY422;
         break;
@@ -559,7 +602,8 @@ static int decode_frame(AVCodecContext *avctx,
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
         break;
     default:
-        av_log(avctx, AV_LOG_ERROR, "Unsupported format\n");
+        av_log(avctx, AV_LOG_ERROR, "Unsupported format %d\n",
+               1000 * descriptor + 10 * bits_per_color + endian);
         return AVERROR_PATCHWELCOME;
     }
 
@@ -657,6 +701,36 @@ static int decode_frame(AVCodecContext *avctx,
             buf += need_align;
         }
         break;
+    case 32:
+        if (elements == 1) {
+            av_image_copy_plane(ptr[0], p->linesize[0],
+                                buf, stride,
+                                elements * avctx->width * 4, avctx->height);
+        } else {
+            for (y = 0; y < avctx->height; y++) {
+                ptr[0] = p->data[0] + y * p->linesize[0];
+                ptr[1] = p->data[1] + y * p->linesize[1];
+                ptr[2] = p->data[2] + y * p->linesize[2];
+                ptr[3] = p->data[3] + y * p->linesize[3];
+                for (x = 0; x < avctx->width; x++) {
+                    AV_WN32(ptr[2], AV_RN32(buf));
+                    AV_WN32(ptr[0], AV_RN32(buf + 4));
+                    AV_WN32(ptr[1], AV_RN32(buf + 8));
+                    if (avctx->pix_fmt == AV_PIX_FMT_GBRAPF32BE ||
+                        avctx->pix_fmt == AV_PIX_FMT_GBRAPF32LE) {
+                        AV_WN32(ptr[3], AV_RN32(buf + 12));
+                        buf += 4;
+                        ptr[3] += 4;
+                    }
+
+                    buf += 12;
+                    ptr[2] += 4;
+                    ptr[0] += 4;
+                    ptr[1] += 4;
+                }
+            }
+        }
+        break;
     case 16:
         elements *= 2;
     case 8:
@@ -688,7 +762,7 @@ static int decode_frame(AVCodecContext *avctx,
     return buf_size;
 }
 
-AVCodec ff_dpx_decoder = {
+const AVCodec ff_dpx_decoder = {
     .name           = "dpx",
     .long_name      = NULL_IF_CONFIG_SMALL("DPX (Digital Picture Exchange) image"),
     .type           = AVMEDIA_TYPE_VIDEO,