Browse Source

avcodec/proresdec : add 12b decoding

based on patch by Kieran Kunhya

ticket 7163
tags/n4.2
Martin Vignali 7 years ago
parent
commit
ffafa53dbf
6 changed files with 40 additions and 15 deletions
  1. +30
    -5
      libavcodec/proresdec2.c
  2. +4
    -4
      tests/fate/prores.mak
  3. +2
    -2
      tests/ref/fate/prores-alpha
  4. +2
    -2
      tests/ref/fate/prores-alpha_skip
  5. +1
    -1
      tests/ref/fate/prores-transparency
  6. +1
    -1
      tests/ref/fate/prores-transparency_skip

+ 30
- 5
libavcodec/proresdec2.c 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) {
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_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;
} }
} }




+ 4
- 4
tests/fate/prores.mak 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_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 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


+ 2
- 2
tests/ref/fate/prores-alpha 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, 1, 1, 1, 16588800, 0x8e4dac48
0, 0, 0, 1, 16588800, 0xb035f658
0, 1, 1, 1, 16588800, 0xb035f658

+ 2
- 2
tests/ref/fate/prores-alpha_skip 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, 1, 1, 1, 12441600, 0xf11685dd
0, 0, 0, 1, 12441600, 0x65e009b8
0, 1, 1, 1, 12441600, 0x65e009b8

+ 1
- 1
tests/ref/fate/prores-transparency 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

+ 1
- 1
tests/ref/fate/prores-transparency_skip 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

Loading…
Cancel
Save