avcodec/dpx: add float support for single components and rgb(a)
This commit is contained in:
parent
48a0eb21aa
commit
68fa294bf8
@ -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…
x
Reference in New Issue
Block a user