[FFmpeg-devel] [PATCH 16/18] h264dec: do not export the chroma sample location immediately on parsing the SPS
Anton Khirnov
anton at khirnov.net
Fri Mar 13 12:28:48 EET 2020
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 67e24c35f7..1951bb1161 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 7c12930db1..055ac42c63 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 211bcab680..e25c3c0d9e 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1087,6 +1087,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 a119fa7641..04b1f74cc2 100644
--- a/libavcodec/h264dec.c
+++ b/libavcodec/h264dec.c
@@ -326,8 +326,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) {
--
2.24.1
More information about the ffmpeg-devel
mailing list