avcodec/proresdec : add 12b decoding
based on patch by Kieran Kunhya ticket 7163
This commit is contained in:
parent
6a583261ea
commit
ffafa53dbf
@ -155,15 +155,23 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
break;
|
break;
|
||||||
case MKTAG('a','p','4','h'):
|
case MKTAG('a','p','4','h'):
|
||||||
avctx->profile = FF_PROFILE_PRORES_4444;
|
avctx->profile = FF_PROFILE_PRORES_4444;
|
||||||
|
avctx->bits_per_raw_sample = 12;
|
||||||
break;
|
break;
|
||||||
case MKTAG('a','p','4','x'):
|
case MKTAG('a','p','4','x'):
|
||||||
avctx->profile = FF_PROFILE_PRORES_XQ;
|
avctx->profile = FF_PROFILE_PRORES_XQ;
|
||||||
|
avctx->bits_per_raw_sample = 12;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
avctx->profile = FF_PROFILE_UNKNOWN;
|
avctx->profile = FF_PROFILE_UNKNOWN;
|
||||||
av_log(avctx, AV_LOG_WARNING, "Unknown prores profile %d\n", avctx->codec_tag);
|
av_log(avctx, AV_LOG_WARNING, "Unknown prores profile %d\n", avctx->codec_tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (avctx->bits_per_raw_sample == 10) {
|
||||||
|
av_log(avctx, AV_LOG_DEBUG, "Auto bitdepth precision. Use 10b decoding based on codec tag");
|
||||||
|
} else { /* 12b */
|
||||||
|
av_log(avctx, AV_LOG_DEBUG, "Auto bitdepth precision. Use 12b decoding based on codec tag");
|
||||||
|
}
|
||||||
|
|
||||||
ff_blockdsp_init(&ctx->bdsp, avctx);
|
ff_blockdsp_init(&ctx->bdsp, avctx);
|
||||||
ret = ff_proresdsp_init(&ctx->prodsp, avctx);
|
ret = ff_proresdsp_init(&ctx->prodsp, avctx);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -211,6 +219,7 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
|
|||||||
|
|
||||||
width = AV_RB16(buf + 8);
|
width = AV_RB16(buf + 8);
|
||||||
height = AV_RB16(buf + 10);
|
height = AV_RB16(buf + 10);
|
||||||
|
|
||||||
if (width != avctx->width || height != avctx->height) {
|
if (width != avctx->width || height != avctx->height) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "picture resolution change: %dx%d -> %dx%d\n",
|
av_log(avctx, AV_LOG_ERROR, "picture resolution change: %dx%d -> %dx%d\n",
|
||||||
avctx->width, avctx->height, width, height);
|
avctx->width, avctx->height, width, height);
|
||||||
@ -237,9 +246,17 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->alpha_info) {
|
if (ctx->alpha_info) {
|
||||||
|
if (avctx->bits_per_raw_sample == 10) {
|
||||||
avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P10 : AV_PIX_FMT_YUVA422P10;
|
avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P10 : AV_PIX_FMT_YUVA422P10;
|
||||||
|
} else { /* 12b */
|
||||||
|
avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P12 : AV_PIX_FMT_YUVA422P12;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (avctx->bits_per_raw_sample == 10) {
|
||||||
avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10;
|
avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10;
|
||||||
|
} else { /* 12b */
|
||||||
|
avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P12 : AV_PIX_FMT_YUV422P12;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
avctx->color_primaries = buf[14];
|
avctx->color_primaries = buf[14];
|
||||||
@ -585,6 +602,7 @@ static void decode_slice_alpha(ProresContext *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
block = blocks;
|
block = blocks;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
memcpy(dst, block, 16 * blocks_per_slice * sizeof(*dst));
|
memcpy(dst, block, 16 * blocks_per_slice * sizeof(*dst));
|
||||||
dst += dst_stride >> 1;
|
dst += dst_stride >> 1;
|
||||||
@ -606,6 +624,7 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int
|
|||||||
LOCAL_ALIGNED_16(int16_t, qmat_chroma_scaled,[64]);
|
LOCAL_ALIGNED_16(int16_t, qmat_chroma_scaled,[64]);
|
||||||
int mb_x_shift;
|
int mb_x_shift;
|
||||||
int ret;
|
int ret;
|
||||||
|
uint16_t val_no_chroma;
|
||||||
|
|
||||||
slice->ret = -1;
|
slice->ret = -1;
|
||||||
//av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n",
|
//av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n",
|
||||||
@ -643,7 +662,8 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int
|
|||||||
chroma_stride = pic->linesize[1] << 1;
|
chroma_stride = pic->linesize[1] << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
|
if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10 ||
|
||||||
|
avctx->pix_fmt == AV_PIX_FMT_YUV444P12 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P12) {
|
||||||
mb_x_shift = 5;
|
mb_x_shift = 5;
|
||||||
log2_chroma_blocks_per_mb = 2;
|
log2_chroma_blocks_per_mb = 2;
|
||||||
} else {
|
} else {
|
||||||
@ -684,10 +704,15 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int
|
|||||||
else {
|
else {
|
||||||
size_t mb_max_x = slice->mb_count << (mb_x_shift - 1);
|
size_t mb_max_x = slice->mb_count << (mb_x_shift - 1);
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
|
if (avctx->bits_per_raw_sample == 10) {
|
||||||
|
val_no_chroma = 511;
|
||||||
|
} else { /* 12b */
|
||||||
|
val_no_chroma = 511 * 4;
|
||||||
|
}
|
||||||
for (i = 0; i < 16; ++i)
|
for (i = 0; i < 16; ++i)
|
||||||
for (j = 0; j < mb_max_x; ++j) {
|
for (j = 0; j < mb_max_x; ++j) {
|
||||||
*(uint16_t*)(dest_u + (i * chroma_stride) + (j << 1)) = 511;
|
*(uint16_t*)(dest_u + (i * chroma_stride) + (j << 1)) = val_no_chroma;
|
||||||
*(uint16_t*)(dest_v + (i * chroma_stride) + (j << 1)) = 511;
|
*(uint16_t*)(dest_v + (i * chroma_stride) + (j << 1)) = val_no_chroma;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@ fate-prores-422: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/pror
|
|||||||
fate-prores-422_hq: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_HQ.mov -pix_fmt yuv422p10le
|
fate-prores-422_hq: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_HQ.mov -pix_fmt yuv422p10le
|
||||||
fate-prores-422_lt: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_LT.mov -pix_fmt yuv422p10le
|
fate-prores-422_lt: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_LT.mov -pix_fmt yuv422p10le
|
||||||
fate-prores-422_proxy: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_Proxy.mov -pix_fmt yuv422p10le
|
fate-prores-422_proxy: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_Proxy.mov -pix_fmt yuv422p10le
|
||||||
fate-prores-alpha: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuva444p10le
|
fate-prores-alpha: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuva444p12le
|
||||||
fate-prores-alpha_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuv444p10le
|
fate-prores-alpha_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuv444p12le
|
||||||
fate-prores-transparency: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuva444p10le
|
fate-prores-transparency: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuva444p12le
|
||||||
fate-prores-transparency_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuv444p10le
|
fate-prores-transparency_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuv444p12le
|
||||||
fate-prores-gray: CMD = framecrc -flags +bitexact -c:a aac_fixed -i $(TARGET_SAMPLES)/prores/gray.mov -pix_fmt yuv422p10le
|
fate-prores-gray: CMD = framecrc -flags +bitexact -c:a aac_fixed -i $(TARGET_SAMPLES)/prores/gray.mov -pix_fmt yuv422p10le
|
||||||
|
|
||||||
#Test bsf prores-metadata
|
#Test bsf prores-metadata
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
#codec_id 0: rawvideo
|
#codec_id 0: rawvideo
|
||||||
#dimensions 0: 1920x1080
|
#dimensions 0: 1920x1080
|
||||||
#sar 0: 0/1
|
#sar 0: 0/1
|
||||||
0, 0, 0, 1, 16588800, 0x8e4dac48
|
0, 0, 0, 1, 16588800, 0xb035f658
|
||||||
0, 1, 1, 1, 16588800, 0x8e4dac48
|
0, 1, 1, 1, 16588800, 0xb035f658
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
#codec_id 0: rawvideo
|
#codec_id 0: rawvideo
|
||||||
#dimensions 0: 1920x1080
|
#dimensions 0: 1920x1080
|
||||||
#sar 0: 0/1
|
#sar 0: 0/1
|
||||||
0, 0, 0, 1, 12441600, 0xf11685dd
|
0, 0, 0, 1, 12441600, 0x65e009b8
|
||||||
0, 1, 1, 1, 12441600, 0xf11685dd
|
0, 1, 1, 1, 12441600, 0x65e009b8
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
#sample_rate 1: 48000
|
#sample_rate 1: 48000
|
||||||
#channel_layout 1: 3
|
#channel_layout 1: 3
|
||||||
#channel_layout_name 1: stereo
|
#channel_layout_name 1: stereo
|
||||||
0, 0, 0, 1, 16588800, 0x7163b01a
|
0, 0, 0, 1, 16588800, 0xcfb3d806
|
||||||
1, 0, 0, 1024, 4096, 0x00000000
|
1, 0, 0, 1024, 4096, 0x00000000
|
||||||
1, 1024, 1024, 896, 3584, 0x00000000
|
1, 1024, 1024, 896, 3584, 0x00000000
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
#sample_rate 1: 48000
|
#sample_rate 1: 48000
|
||||||
#channel_layout 1: 3
|
#channel_layout 1: 3
|
||||||
#channel_layout_name 1: stereo
|
#channel_layout_name 1: stereo
|
||||||
0, 0, 0, 1, 12441600, 0x627d1548
|
0, 0, 0, 1, 12441600, 0x74f53304
|
||||||
1, 0, 0, 1024, 4096, 0x00000000
|
1, 0, 0, 1024, 4096, 0x00000000
|
||||||
1, 1024, 1024, 896, 3584, 0x00000000
|
1, 1024, 1024, 896, 3584, 0x00000000
|
||||||
|
Loading…
x
Reference in New Issue
Block a user