From c4dffe7e36a41df66203a7757e3b56ed85822367 Mon Sep 17 00:00:00 2001 From: David Conrad Date: Mon, 11 Jan 2010 00:31:39 +0000 Subject: [PATCH] Export fullrange flag and color information for h.264 Originally committed as revision 21126 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 30 ++++++++++++++++++++++++------ libavcodec/h264.h | 6 ++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 34261a2f38..165eb66fe3 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -3813,6 +3813,15 @@ static int decode_slice_header(H264Context *h, H264Context *h0){ if(!s->avctx->sample_aspect_ratio.den) s->avctx->sample_aspect_ratio.den = 1; + if(h->sps.video_signal_type_present_flag){ + s->avctx->color_range = h->sps.full_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + if(h->sps.colour_description_present_flag){ + s->avctx->color_primaries = h->sps.color_primaries; + s->avctx->color_trc = h->sps.color_trc; + s->avctx->colorspace = h->sps.colorspace; + } + } + if(h->sps.timing_info_present_flag){ s->avctx->time_base= (AVRational){h->sps.num_units_in_tick, h->sps.time_scale}; if(h->x264_build > 0 && h->x264_build < 44) @@ -7079,13 +7088,22 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ get_bits1(&s->gb); /* overscan_appropriate_flag */ } - if(get_bits1(&s->gb)){ /* video_signal_type_present_flag */ + sps->video_signal_type_present_flag = get_bits1(&s->gb); + if(sps->video_signal_type_present_flag){ get_bits(&s->gb, 3); /* video_format */ - get_bits1(&s->gb); /* video_full_range_flag */ - if(get_bits1(&s->gb)){ /* colour_description_present_flag */ - get_bits(&s->gb, 8); /* colour_primaries */ - get_bits(&s->gb, 8); /* transfer_characteristics */ - get_bits(&s->gb, 8); /* matrix_coefficients */ + sps->full_range = get_bits1(&s->gb); /* video_full_range_flag */ + + sps->colour_description_present_flag = get_bits1(&s->gb); + if(sps->colour_description_present_flag){ + sps->color_primaries = get_bits(&s->gb, 8); /* colour_primaries */ + sps->color_trc = get_bits(&s->gb, 8); /* transfer_characteristics */ + sps->colorspace = get_bits(&s->gb, 8); /* matrix_coefficients */ + if (sps->color_primaries >= AVCOL_PRI_NB) + sps->color_primaries = AVCOL_PRI_UNSPECIFIED; + if (sps->color_trc >= AVCOL_TRC_NB) + sps->color_trc = AVCOL_TRC_UNSPECIFIED; + if (sps->colorspace >= AVCOL_SPC_NB) + sps->colorspace = AVCOL_SPC_UNSPECIFIED; } } diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 91ecee58e0..d0bc691e04 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -166,6 +166,12 @@ typedef struct SPS{ unsigned int crop_bottom; ///< frame_cropping_rect_bottom_offset int vui_parameters_present_flag; AVRational sar; + int video_signal_type_present_flag; + int full_range; + int colour_description_present_flag; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; int timing_info_present_flag; uint32_t num_units_in_tick; uint32_t time_scale;