aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2017-07-29 22:03:55 +0200
committerAnton Khirnov <anton@khirnov.net>2020-03-20 09:16:05 +0100
commit6eae7e564482c70c785ceb33c8ad476c49f24e53 (patch)
treed395a7978e1d73895f88f2dc1e54f873af0bc0c1
parentbdd31feec934bad07f5035250f9cb1ec5b571062 (diff)
downloadffmpeg-6eae7e564482c70c785ceb33c8ad476c49f24e53.tar.gz
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.
-rw-r--r--libavcodec/h264_ps.c5
-rw-r--r--libavcodec/h264_ps.h2
-rw-r--r--libavcodec/h264_slice.c1
-rw-r--r--libavcodec/h264dec.c2
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) {