[FFmpeg-cvslog] h264dec: do not export the chroma sample location immediately on parsing the SPS

Anton Khirnov git at videolan.org
Fri Mar 20 11:42:02 EET 2020


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sat Jul 29 22:03:55 2017 +0200| [6eae7e564482c70c785ceb33c8ad476c49f24e53] | committer: Anton Khirnov

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6eae7e564482c70c785ceb33c8ad476c49f24e53
---

 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) {



More information about the ffmpeg-cvslog mailing list