diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index d23efecc16..77c4b57d3e 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -496,10 +496,9 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) } if (get_bits1(gb)) { - v->s.avctx->color_primaries = get_bits(gb, 8); - v->s.avctx->color_trc = get_bits(gb, 8); - v->s.avctx->colorspace = get_bits(gb, 8); - v->s.avctx->color_range = AVCOL_RANGE_MPEG; + v->color_prim = get_bits(gb, 8); + v->transfer_char = get_bits(gb, 8); + v->matrix_coef = get_bits(gb, 8); } } diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index a1b98e8337..eefb613ee8 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -203,6 +203,9 @@ typedef struct VC1Context{ int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present int refdist_flag; ///< REFDIST syntax element present in II, IP, PI or PP field picture headers int extended_dmv; ///< Additional extended dmv range at P/B frame-level + int color_prim; ///< 8bits, chroma coordinates of the color primaries + int transfer_char; ///< 8bits, Opto-electronic transfer characteristics + int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix int hrd_param_flag; ///< Presence of Hypothetical Reference ///< Decoder parameters int psf; ///< Progressive Segmented Frame diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 3967e855d3..da6724ca39 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -527,6 +527,13 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) avctx->has_b_frames = !!avctx->max_b_frames; + if (v->color_prim == 1 || v->color_prim == 5 || v->color_prim == 6) + avctx->color_primaries = v->color_prim; + if (v->transfer_char == 1 || v->transfer_char == 7) + avctx->color_trc = v->transfer_char; + if (v->matrix_coef == 1 || v->matrix_coef == 6 || v->matrix_coef == 7) + avctx->colorspace = v->matrix_coef; + s->mb_width = (avctx->coded_width + 15) >> 4; s->mb_height = (avctx->coded_height + 15) >> 4;