avcodec/dpx: add float support for single components and rgb(a)

pull/371/head
Paul B Mahol 4 years ago
parent 48a0eb21aa
commit 68fa294bf8
  1. 71
      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:

Loading…
Cancel
Save