avcodec/proresdec : add 12b decoding

based on patch by Kieran Kunhya

ticket 7163
This commit is contained in:
Martin Vignali 2018-11-27 22:41:38 +01:00
parent 6a583261ea
commit ffafa53dbf
6 changed files with 40 additions and 15 deletions

View File

@ -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;
} }
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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