diff --git a/libavcodec/proresdec2.c b/libavcodec/proresdec2.c index 8a537eed1a5e0a7b55925b290928f53ef03b93f1..8581d797fbc0b16d167875662dd2ede0e7eeb9e1 100644 --- a/libavcodec/proresdec2.c +++ b/libavcodec/proresdec2.c @@ -155,15 +155,23 @@ static av_cold int decode_init(AVCodecContext *avctx) break; case MKTAG('a','p','4','h'): avctx->profile = FF_PROFILE_PRORES_4444; + avctx->bits_per_raw_sample = 12; break; case MKTAG('a','p','4','x'): avctx->profile = FF_PROFILE_PRORES_XQ; + avctx->bits_per_raw_sample = 12; break; default: avctx->profile = FF_PROFILE_UNKNOWN; 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); ret = ff_proresdsp_init(&ctx->prodsp, avctx); if (ret < 0) { @@ -211,6 +219,7 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf, width = AV_RB16(buf + 8); height = AV_RB16(buf + 10); + if (width != avctx->width || height != avctx->height) { av_log(avctx, AV_LOG_ERROR, "picture resolution change: %dx%d -> %dx%d\n", 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) { - avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P10 : AV_PIX_FMT_YUVA422P10; + if (avctx->bits_per_raw_sample == 10) { + 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 { - avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10; + if (avctx->bits_per_raw_sample == 10) { + 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]; @@ -585,6 +602,7 @@ static void decode_slice_alpha(ProresContext *ctx, } block = blocks; + for (i = 0; i < 16; i++) { memcpy(dst, block, 16 * blocks_per_slice * sizeof(*dst)); 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]); int mb_x_shift; int ret; + uint16_t val_no_chroma; slice->ret = -1; //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; } - 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; log2_chroma_blocks_per_mb = 2; } else { @@ -684,10 +704,15 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int else { size_t mb_max_x = slice->mb_count << (mb_x_shift - 1); 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 (j = 0; j < mb_max_x; ++j) { - *(uint16_t*)(dest_u + (i * chroma_stride) + (j << 1)) = 511; - *(uint16_t*)(dest_v + (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)) = val_no_chroma; } } diff --git a/tests/fate/prores.mak b/tests/fate/prores.mak index 2f3375f4fc43186752ffea7737d4b8b266982847..b7fcc7449a85edc5651eafeb861c323901e44529 100644 --- a/tests/fate/prores.mak +++ b/tests/fate/prores.mak @@ -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_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-alpha: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuva444p10le -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-transparency: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuva444p10le -fate-prores-transparency_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuv444p10le +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 yuv444p12le +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 yuv444p12le fate-prores-gray: CMD = framecrc -flags +bitexact -c:a aac_fixed -i $(TARGET_SAMPLES)/prores/gray.mov -pix_fmt yuv422p10le #Test bsf prores-metadata diff --git a/tests/ref/fate/prores-alpha b/tests/ref/fate/prores-alpha index f451d83ae900802d7cfa7ab347a3ae5bea2cfe11..d5e3e6877d64dacb9b859030284f252d3730fe79 100644 --- a/tests/ref/fate/prores-alpha +++ b/tests/ref/fate/prores-alpha @@ -3,5 +3,5 @@ #codec_id 0: rawvideo #dimensions 0: 1920x1080 #sar 0: 0/1 -0, 0, 0, 1, 16588800, 0x8e4dac48 -0, 1, 1, 1, 16588800, 0x8e4dac48 +0, 0, 0, 1, 16588800, 0xb035f658 +0, 1, 1, 1, 16588800, 0xb035f658 diff --git a/tests/ref/fate/prores-alpha_skip b/tests/ref/fate/prores-alpha_skip index a17cef810c19e320232ed5b920f127ddfceebfcb..09691310ed371e722601385245b622c49cb6637f 100644 --- a/tests/ref/fate/prores-alpha_skip +++ b/tests/ref/fate/prores-alpha_skip @@ -3,5 +3,5 @@ #codec_id 0: rawvideo #dimensions 0: 1920x1080 #sar 0: 0/1 -0, 0, 0, 1, 12441600, 0xf11685dd -0, 1, 1, 1, 12441600, 0xf11685dd +0, 0, 0, 1, 12441600, 0x65e009b8 +0, 1, 1, 1, 12441600, 0x65e009b8 diff --git a/tests/ref/fate/prores-transparency b/tests/ref/fate/prores-transparency index 7b3efc6335911f02eacbeb56da3fde8c445a09e6..4e8815283461ec976240abd21085e747ae107e15 100644 --- a/tests/ref/fate/prores-transparency +++ b/tests/ref/fate/prores-transparency @@ -9,6 +9,6 @@ #sample_rate 1: 48000 #channel_layout 1: 3 #channel_layout_name 1: stereo -0, 0, 0, 1, 16588800, 0x7163b01a +0, 0, 0, 1, 16588800, 0xcfb3d806 1, 0, 0, 1024, 4096, 0x00000000 1, 1024, 1024, 896, 3584, 0x00000000 diff --git a/tests/ref/fate/prores-transparency_skip b/tests/ref/fate/prores-transparency_skip index 5c98d3e4383b2d8d5ff8d5c40dd486556c30a2a6..82c180d174373cfbc0d6b82c343de30351c2873d 100644 --- a/tests/ref/fate/prores-transparency_skip +++ b/tests/ref/fate/prores-transparency_skip @@ -9,6 +9,6 @@ #sample_rate 1: 48000 #channel_layout 1: 3 #channel_layout_name 1: stereo -0, 0, 0, 1, 12441600, 0x627d1548 +0, 0, 0, 1, 12441600, 0x74f53304 1, 0, 0, 1024, 4096, 0x00000000 1, 1024, 1024, 896, 3584, 0x00000000