avcodec/proresdec : add 12b decoding

based on patch by Kieran Kunhya

ticket 7163
pull/302/head
Martin Vignali 6 years ago
parent 6a583261ea
commit ffafa53dbf
  1. 35
      libavcodec/proresdec2.c
  2. 8
      tests/fate/prores.mak
  3. 4
      tests/ref/fate/prores-alpha
  4. 4
      tests/ref/fate/prores-alpha_skip
  5. 2
      tests/ref/fate/prores-transparency
  6. 2
      tests/ref/fate/prores-transparency_skip

@ -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) {
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 { } 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]; 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…
Cancel
Save