aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2021-02-11 18:07:30 +0100
committerPaul B Mahol <onemda@gmail.com>2021-02-12 20:43:51 +0100
commit68fa294bf85247dd1236e6ef4292b4903eb192e9 (patch)
treed2443794fff25f0b664fd732dda60c499c73fe8c
parent48a0eb21aac062c3a65d22c48484a2420f452ec6 (diff)
downloadffmpeg-68fa294bf85247dd1236e6ef4292b4903eb192e9.tar.gz
avcodec/dpx: add float support for single components and rgb(a)
-rw-r--r--libavcodec/dpx.c71
1 files 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: