h264dec: do not export the chroma sample location immediately on parsing the SPS
authorAnton Khirnov <anton@khirnov.net>
Sat, 29 Jul 2017 20:03:55 +0000 (22:03 +0200)
committerAnton Khirnov <anton@khirnov.net>
Fri, 20 Mar 2020 08:16:05 +0000 (09:16 +0100)
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
libavcodec/h264_ps.h
libavcodec/h264_slice.c
libavcodec/h264dec.c

index 7085949..96edb3a 100644 (file)
@@ -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));
index 2cc1cd6..d6798ca 100644 (file)
@@ -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;
index 34f659b..af30f62 100644 (file)
@@ -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;
index 8a2a8a7..fec1adf 100644 (file)
@@ -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) {