[FFmpeg-devel] [PATCH 1/2] avcodec/dpx: add float support for single components and rgb(a)

Paul B Mahol onemda at gmail.com
Thu Feb 11 19:53:19 EET 2021


Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
 libavcodec/dpx.c | 71 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 67 insertions(+), 4 deletions(-)

diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index 12bc165415..702caa385e 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -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;
@@ -327,6 +327,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 +389,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;
@@ -499,6 +505,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 +569,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 +591,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 +690,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:
-- 
2.17.1



More information about the ffmpeg-devel mailing list