summaryrefslogtreecommitdiff
path: root/libavcodec/dnxhddec.c
diff options
context:
space:
mode:
authorChristophe Gisquet <christophe.gisquet@gmail.com>2015-09-25 17:07:38 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2015-09-26 17:35:04 +0200
commitdc218bd08305656d97ad51c57ee4ab2040cd2425 (patch)
tree52580bdcc5cfc1f64f2fea1c5e534f3a73f235dd /libavcodec/dnxhddec.c
parente4b7c3a9f21b9be84fe3ba9aed953c60720c6459 (diff)
dnxhddec: parse and print adaptive color transform
Indicates a YCbCr->RGB transform at the block level. Although nothing explicitly states it, this would assume the actual content is planar RGB. Currently unsupported, but the one sequence I found using it flagged every mb that way, actually meaning the content was YCbCr, and thus best left to the output format to decide what to do of it. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/dnxhddec.c')
-rw-r--r--libavcodec/dnxhddec.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
index e5c5f07fd8..22d8c0b785 100644
--- a/libavcodec/dnxhddec.c
+++ b/libavcodec/dnxhddec.c
@@ -51,6 +51,7 @@ typedef struct DNXHDContext {
int bit_depth; // 8, 10 or 0 if not initialized at all.
int is_444;
int mbaff;
+ int act;
void (*decode_dct_block)(struct DNXHDContext *ctx, int16_t *block,
int n, int qscale);
int last_qscale;
@@ -189,6 +190,11 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame,
av_log(ctx->avctx, AV_LOG_WARNING,
"Adaptive MB interlace flag in an unsupported profile.\n");
+ ctx->act = buf[0x2C] & 7;
+ if (ctx->act && ctx->cid_table->cid != 1256)
+ av_log(ctx->avctx, AV_LOG_WARNING,
+ "Adaptive color transform in an unsupported profile.\n");
+
// make sure profile size constraints are respected
// DNx100 allows 1920->1440 and 1280->960 subsampling
if (ctx->width != ctx->cid_table->width) {
@@ -354,7 +360,7 @@ static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame,
int dct_linesize_chroma = frame->linesize[1];
uint8_t *dest_y, *dest_u, *dest_v;
int dct_y_offset, dct_x_offset;
- int qscale, i;
+ int qscale, i, act;
int interlaced_mb = 0;
if (ctx->mbaff) {
@@ -362,7 +368,15 @@ static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame,
qscale = get_bits(&ctx->gb, 10);
} else
qscale = get_bits(&ctx->gb, 11);
- skip_bits1(&ctx->gb);
+ act = get_bits1(&ctx->gb);
+ if (act) {
+ static int warned = 0;
+ if (!warned) {
+ warned = 1;
+ av_log(ctx->avctx, AV_LOG_ERROR,
+ "Unsupported adaptive color transform, patch welcome.\n");
+ }
+ }
if (qscale != ctx->last_qscale) {
for (i = 0; i < 64; i++) {