From 6eae7e564482c70c785ceb33c8ad476c49f24e53 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 29 Jul 2017 22:03:55 +0200 Subject: [PATCH] h264dec: do not export the chroma sample location immediately on parsing the SPS This SPS is not necessarily the one that will be used. Export the chroma location along with all the other SPS properties. --- libavcodec/h264_ps.c | 5 +++-- libavcodec/h264_ps.h | 2 ++ libavcodec/h264_slice.c | 1 + libavcodec/h264dec.c | 2 -- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c index 708594954c..96edb3a327 100644 --- a/libavcodec/h264_ps.c +++ b/libavcodec/h264_ps.c @@ -181,9 +181,10 @@ static inline int decode_vui_parameters(GetBitContext *gb, AVCodecContext *avctx /* chroma_location_info_present_flag */ if (get_bits1(gb)) { /* chroma_sample_location_type_top_field */ - avctx->chroma_sample_location = get_ue_golomb(gb) + 1; + sps->chroma_location = get_ue_golomb(gb) + 1; get_ue_golomb(gb); /* chroma_sample_location_type_bottom_field */ - } + } else + sps->chroma_location = AVCHROMA_LOC_LEFT; if (show_bits1(gb) && get_bits_left(gb) < 10) { av_log(avctx, AV_LOG_WARNING, "Truncated VUI (%d)\n", get_bits_left(gb)); diff --git a/libavcodec/h264_ps.h b/libavcodec/h264_ps.h index 2cc1cd6254..d6798ca0ef 100644 --- a/libavcodec/h264_ps.h +++ b/libavcodec/h264_ps.h @@ -77,6 +77,8 @@ typedef struct SPS { enum AVColorPrimaries color_primaries; enum AVColorTransferCharacteristic color_trc; enum AVColorSpace colorspace; + enum AVChromaLocation chroma_location; + int timing_info_present_flag; uint32_t num_units_in_tick; uint32_t time_scale; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 34f659b299..af30f6267b 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1086,6 +1086,7 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl h->avctx->color_trc = h->sei.alternative_transfer.preferred_transfer_characteristics; } } + h->avctx->chroma_sample_location = sps->chroma_location; if (!h->context_initialized || must_reinit || needs_reinit) { int flush_changes = h->context_initialized; diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 8a2a8a7b41..fec1adfeed 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -325,8 +325,6 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) ff_h264_sei_uninit(&h->sei); - avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; - h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? avctx->thread_count : 1; h->slice_ctx = av_mallocz_array(h->nb_slice_ctx, sizeof(*h->slice_ctx)); if (!h->slice_ctx) {