[FFmpeg-devel] [PATCH 19/20] avcodec/(h264|hevc)_ps: Factor common VUI code out

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sun Jul 3 01:21:59 EEST 2022


Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/Makefile     |  5 ++-
 libavcodec/h2645_vui.c  | 91 +++++++++++++++++++++++++++++++++++++++++
 libavcodec/h2645_vui.h  | 49 ++++++++++++++++++++++
 libavcodec/h264_ps.c    | 69 +++----------------------------
 libavcodec/h264_ps.h    | 10 +----
 libavcodec/h264_slice.c | 36 ++++++++--------
 libavcodec/hevc_ps.c    | 54 ++++--------------------
 libavcodec/hevc_ps.h    | 19 ++-------
 libavcodec/hevcdec.c    | 34 +++++++--------
 9 files changed, 197 insertions(+), 170 deletions(-)
 create mode 100644 libavcodec/h2645_vui.c
 create mode 100644 libavcodec/h2645_vui.h

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 5d6aedeba7..a210c46f49 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -97,12 +97,13 @@ OBJS-$(CONFIG_GOLOMB)                  += golomb.o
 OBJS-$(CONFIG_H263DSP)                 += h263dsp.o
 OBJS-$(CONFIG_H264CHROMA)              += h264chroma.o
 OBJS-$(CONFIG_H264DSP)                 += h264dsp.o h264idct.o
-OBJS-$(CONFIG_H264PARSE)               += h264_parse.o h264_ps.o h2645data.o h2645_parse.o
+OBJS-$(CONFIG_H264PARSE)               += h264_parse.o h264_ps.o h2645data.o \
+                                          h2645_parse.o h2645_vui.o
 OBJS-$(CONFIG_H264PRED)                += h264pred.o
 OBJS-$(CONFIG_H264QPEL)                += h264qpel.o
 OBJS-$(CONFIG_H264_SEI)                += h264_sei.o h2645_sei.o
 OBJS-$(CONFIG_HEVCPARSE)               += hevc_parse.o hevc_ps.o hevc_data.o \
-                                          h2645data.o h2645_parse.o
+                                          h2645data.o h2645_parse.o h2645_vui.o
 OBJS-$(CONFIG_HEVC_SEI)                += hevc_sei.o h2645_sei.o dynamic_hdr10_plus.o dynamic_hdr_vivid.o
 OBJS-$(CONFIG_HPELDSP)                 += hpeldsp.o
 OBJS-$(CONFIG_HUFFMAN)                 += huffman.o
diff --git a/libavcodec/h2645_vui.c b/libavcodec/h2645_vui.c
new file mode 100644
index 0000000000..fcc4b37105
--- /dev/null
+++ b/libavcodec/h2645_vui.c
@@ -0,0 +1,91 @@
+/*
+ * Common H.264/HEVC VUI Parameter decoding
+ *
+ * Copyright (c) 2003 Michael Niedermayer <michaelni at gmx.at>
+ * Copyright (C) 2012 - 2013 Guillaume Martres
+ * Copyright (C) 2012 - 2013 Mickael Raulet
+ * Copyright (C) 2012 - 2013 Gildas Cocherel
+ * Copyright (C) 2013 Vittorio Giovara
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/log.h"
+#include "libavutil/pixdesc.h"
+
+#include "get_bits.h"
+#include "golomb.h"
+#include "h2645data.h"
+#include "h2645_vui.h"
+
+#define EXTENDED_SAR       255
+
+void ff_h2645_decode_common_vui_params(GetBitContext *gb, H2645VUI *vui, void *logctx)
+{
+    int aspect_ratio_info_present_flag;
+
+    av_log(logctx, AV_LOG_DEBUG, "Decoding VUI\n");
+
+    aspect_ratio_info_present_flag = get_bits1(gb);
+    if (aspect_ratio_info_present_flag) {
+        uint8_t aspect_ratio_idc = get_bits(gb, 8);
+        if (aspect_ratio_idc < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect))
+            vui->sar = ff_h2645_pixel_aspect[aspect_ratio_idc];
+        else if (aspect_ratio_idc == EXTENDED_SAR) {
+            vui->sar.num = get_bits(gb, 16);
+            vui->sar.den = get_bits(gb, 16);
+        } else
+            av_log(logctx, AV_LOG_WARNING,
+                   "Unknown SAR index: %u.\n", aspect_ratio_idc);
+    } else
+        vui->sar = (AVRational){ 0, 1 };
+
+    vui->overscan_info_present_flag = get_bits1(gb);
+    if (vui->overscan_info_present_flag)
+        vui->overscan_appropriate_flag = get_bits1(gb);
+
+    vui->video_signal_type_present_flag = get_bits1(gb);
+    if (vui->video_signal_type_present_flag) {
+        vui->video_format                    = get_bits(gb, 3);
+        vui->video_full_range_flag           = get_bits1(gb);
+        vui->colour_description_present_flag = get_bits1(gb);
+        if (vui->colour_description_present_flag) {
+            vui->colour_primaries         = get_bits(gb, 8);
+            vui->transfer_characteristics = get_bits(gb, 8);
+            vui->matrix_coeffs            = get_bits(gb, 8);
+
+            // Set invalid values to "unspecified"
+            if (!av_color_primaries_name(vui->colour_primaries))
+                vui->colour_primaries = AVCOL_PRI_UNSPECIFIED;
+            if (!av_color_transfer_name(vui->transfer_characteristics))
+                vui->transfer_characteristics = AVCOL_TRC_UNSPECIFIED;
+            if (!av_color_space_name(vui->matrix_coeffs))
+                vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED;
+        }
+    }
+
+    vui->chroma_loc_info_present_flag = get_bits1(gb);
+    if (vui->chroma_loc_info_present_flag) {
+        vui->chroma_sample_loc_type_top_field    = get_ue_golomb_31(gb);
+        vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_31(gb);
+        if (vui->chroma_sample_loc_type_top_field <= 5U)
+            vui->chroma_location = vui->chroma_sample_loc_type_top_field + 1;
+        else
+            vui->chroma_location = AVCHROMA_LOC_UNSPECIFIED;
+    } else
+        vui->chroma_location = AVCHROMA_LOC_LEFT;
+}
\ No newline at end of file
diff --git a/libavcodec/h2645_vui.h b/libavcodec/h2645_vui.h
new file mode 100644
index 0000000000..7b9bbad2d3
--- /dev/null
+++ b/libavcodec/h2645_vui.h
@@ -0,0 +1,49 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_H2645_VUI_H
+#define AVCODEC_H2645_VUI_H
+
+#include "libavutil/pixfmt.h"
+#include "libavutil/rational.h"
+
+#include "get_bits.h"
+
+typedef struct H2645VUI {
+    AVRational sar;
+
+    int overscan_info_present_flag;
+    int overscan_appropriate_flag;
+
+    int video_signal_type_present_flag;
+    int video_format;
+    int video_full_range_flag;
+    int colour_description_present_flag;
+    enum AVColorPrimaries colour_primaries;
+    enum AVColorTransferCharacteristic transfer_characteristics;
+    enum AVColorSpace matrix_coeffs;
+
+    int chroma_loc_info_present_flag;
+    int chroma_sample_loc_type_top_field;
+    int chroma_sample_loc_type_bottom_field;
+    enum AVChromaLocation chroma_location;
+} H2645VUI;
+
+void ff_h2645_decode_common_vui_params(GetBitContext *gb, H2645VUI *vui, void *logctx);
+
+#endif /* AVCODEC_H2645_VUI_H */
\ No newline at end of file
diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c
index 874790a3a3..d0d1e65903 100644
--- a/libavcodec/h264_ps.c
+++ b/libavcodec/h264_ps.c
@@ -31,14 +31,12 @@
 #include "mathops.h"
 #include "avcodec.h"
 #include "h264data.h"
-#include "h2645data.h"
+#include "h2645_vui.h"
 #include "h264_ps.h"
 #include "golomb.h"
 
 #define MIN_LOG2_MAX_FRAME_NUM    4
 
-#define EXTENDED_SAR       255
-
 static const uint8_t default_scaling4[2][16] = {
     {  6, 13, 20, 28, 13, 20, 28, 32,
       20, 28, 32, 37, 28, 32, 37, 42 },
@@ -133,62 +131,7 @@ static inline int decode_hrd_parameters(GetBitContext *gb, void *logctx,
 static inline int decode_vui_parameters(GetBitContext *gb, void *logctx,
                                         SPS *sps)
 {
-    int aspect_ratio_info_present_flag;
-    unsigned int aspect_ratio_idc;
-
-    aspect_ratio_info_present_flag = get_bits1(gb);
-
-    if (aspect_ratio_info_present_flag) {
-        aspect_ratio_idc = get_bits(gb, 8);
-        if (aspect_ratio_idc == EXTENDED_SAR) {
-            sps->sar.num = get_bits(gb, 16);
-            sps->sar.den = get_bits(gb, 16);
-        } else if (aspect_ratio_idc < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect)) {
-            sps->sar = ff_h2645_pixel_aspect[aspect_ratio_idc];
-        } else {
-            av_log(logctx, AV_LOG_WARNING, "Unknown SAR index: %u.\n",
-                   aspect_ratio_idc);
-        }
-    } else {
-        sps->sar.num =
-        sps->sar.den = 0;
-    }
-
-    if (get_bits1(gb))      /* overscan_info_present_flag */
-        get_bits1(gb);      /* overscan_appropriate_flag */
-
-    sps->video_signal_type_present_flag = get_bits1(gb);
-    if (sps->video_signal_type_present_flag) {
-        get_bits(gb, 3);                 /* video_format */
-        sps->full_range = get_bits1(gb); /* video_full_range_flag */
-
-        sps->colour_description_present_flag = get_bits1(gb);
-        if (sps->colour_description_present_flag) {
-            sps->color_primaries = get_bits(gb, 8); /* colour_primaries */
-            sps->color_trc       = get_bits(gb, 8); /* transfer_characteristics */
-            sps->colorspace      = get_bits(gb, 8); /* matrix_coefficients */
-
-            // Set invalid values to "unspecified"
-            if (!av_color_primaries_name(sps->color_primaries))
-                sps->color_primaries = AVCOL_PRI_UNSPECIFIED;
-            if (!av_color_transfer_name(sps->color_trc))
-                sps->color_trc = AVCOL_TRC_UNSPECIFIED;
-            if (!av_color_space_name(sps->colorspace))
-                sps->colorspace = AVCOL_SPC_UNSPECIFIED;
-        }
-    }
-
-    /* chroma_location_info_present_flag */
-    if (get_bits1(gb)) {
-        /* chroma_sample_location_type_top_field */
-        sps->chroma_location = get_ue_golomb_31(gb);
-        if (sps->chroma_location <= 5U)
-            sps->chroma_location++;
-        else
-            sps->chroma_location = AVCHROMA_LOC_UNSPECIFIED;
-        get_ue_golomb_31(gb);  /* chroma_sample_location_type_bottom_field */
-    } else
-        sps->chroma_location = AVCHROMA_LOC_LEFT;
+    ff_h2645_decode_common_vui_params(gb, &sps->vui, logctx);
 
     if (show_bits1(gb) && get_bits_left(gb) < 10) {
         av_log(logctx, AV_LOG_WARNING, "Truncated VUI (%d)\n", get_bits_left(gb));
@@ -381,12 +324,12 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
     sps->profile_idc          = profile_idc;
     sps->constraint_set_flags = constraint_set_flags;
     sps->level_idc            = level_idc;
-    sps->full_range           = -1;
+    sps->vui.video_full_range_flag = -1;
 
     memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4));
     memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8));
     sps->scaling_matrix_present = 0;
-    sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED
+    sps->vui.matrix_coeffs = AVCOL_SPC_UNSPECIFIED;
 
     if (sps->profile_idc == 100 ||  // High profile
         sps->profile_idc == 110 ||  // High10 profile
@@ -603,8 +546,8 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
         }
     }
 
-    if (!sps->sar.den)
-        sps->sar.den = 1;
+    if (!sps->vui.sar.den)
+        sps->vui.sar.den = 1;
 
     if (avctx->debug & FF_DEBUG_PICT_INFO) {
         static const char csp[4][5] = { "Gray", "420", "422", "444" };
diff --git a/libavcodec/h264_ps.h b/libavcodec/h264_ps.h
index dc52835ed4..5c35761fbc 100644
--- a/libavcodec/h264_ps.h
+++ b/libavcodec/h264_ps.h
@@ -33,6 +33,7 @@
 #include "avcodec.h"
 #include "get_bits.h"
 #include "h264.h"
+#include "h2645_vui.h"
 
 #define MAX_SPS_COUNT          32
 #define MAX_PPS_COUNT         256
@@ -70,14 +71,7 @@ typedef struct SPS {
     unsigned int crop_top;             ///< frame_cropping_rect_top_offset
     unsigned int crop_bottom;          ///< frame_cropping_rect_bottom_offset
     int vui_parameters_present_flag;
-    AVRational sar;
-    int video_signal_type_present_flag;
-    int full_range;
-    int colour_description_present_flag;
-    enum AVColorPrimaries color_primaries;
-    enum AVColorTransferCharacteristic color_trc;
-    enum AVColorSpace colorspace;
-    enum AVChromaLocation chroma_location;
+    H2645VUI vui;
 
     int timing_info_present_flag;
     uint32_t num_units_in_tick;
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 205ad5f97b..ba873254ce 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -326,7 +326,7 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
          !h->ps.sps                                            ||
          h->ps.sps->bit_depth_luma    != h1->ps.sps->bit_depth_luma    ||
          h->ps.sps->chroma_format_idc != h1->ps.sps->chroma_format_idc ||
-         h->ps.sps->colorspace        != h1->ps.sps->colorspace)) {
+         h->ps.sps->vui.matrix_coeffs != h1->ps.sps->vui.matrix_coeffs)) {
         need_reinit = 1;
     }
 
@@ -936,7 +936,7 @@ static int h264_slice_header_init(H264Context *h)
         goto fail;
     }
 
-    ff_set_sar(h->avctx, sps->sar);
+    ff_set_sar(h->avctx, sps->vui.sar);
     av_pix_fmt_get_chroma_sub_sample(h->avctx->pix_fmt,
                                      &h->chroma_x_shift, &h->chroma_y_shift);
 
@@ -1061,7 +1061,7 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl
         || (non_j_pixfmt(h->avctx->pix_fmt) != non_j_pixfmt(get_pixel_format(h, 0))))
         must_reinit = 1;
 
-    if (first_slice && av_cmp_q(sps->sar, h->avctx->sample_aspect_ratio))
+    if (first_slice && av_cmp_q(sps->vui.sar, h->avctx->sample_aspect_ratio))
         must_reinit = 1;
 
     if (!h->setup_finished) {
@@ -1083,15 +1083,15 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl
 
         init_dimensions(h);
 
-        if (sps->video_signal_type_present_flag) {
-            h->avctx->color_range = sps->full_range > 0 ? AVCOL_RANGE_JPEG
-                                                        : AVCOL_RANGE_MPEG;
-            if (sps->colour_description_present_flag) {
-                if (h->avctx->colorspace != sps->colorspace)
+        if (sps->vui.video_signal_type_present_flag) {
+            h->avctx->color_range = sps->vui.video_full_range_flag > 0 ? AVCOL_RANGE_JPEG
+                                                                       : AVCOL_RANGE_MPEG;
+            if (sps->vui.colour_description_present_flag) {
+                if (h->avctx->colorspace != sps->vui.matrix_coeffs)
                     needs_reinit = 1;
-                h->avctx->color_primaries = sps->color_primaries;
-                h->avctx->color_trc       = sps->color_trc;
-                h->avctx->colorspace      = sps->colorspace;
+                h->avctx->color_primaries = sps->vui.colour_primaries;
+                h->avctx->color_trc       = sps->vui.transfer_characteristics;
+                h->avctx->colorspace      = sps->vui.matrix_coeffs;
             }
         }
 
@@ -1101,7 +1101,7 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_sl
             h->avctx->color_trc = h->sei.common.alternative_transfer.preferred_transfer_characteristics;
         }
     }
-    h->avctx->chroma_sample_location = sps->chroma_location;
+    h->avctx->chroma_sample_location = sps->vui.chroma_location;
 
     if (!h->context_initialized || must_reinit || needs_reinit) {
         int flush_changes = h->context_initialized;
@@ -1249,14 +1249,14 @@ static int h264_export_frame_props(H264Context *h)
         } else {
             fgp->codec.h274.bit_depth_luma = sps->bit_depth_luma;
             fgp->codec.h274.bit_depth_chroma = sps->bit_depth_chroma;
-            if (sps->video_signal_type_present_flag)
-                fgp->codec.h274.color_range = sps->full_range + 1;
+            if (sps->vui.video_signal_type_present_flag)
+                fgp->codec.h274.color_range = sps->vui.video_full_range_flag + 1;
             else
                 fgp->codec.h274.color_range = AVCOL_RANGE_UNSPECIFIED;
-            if (sps->colour_description_present_flag) {
-                fgp->codec.h274.color_primaries = sps->color_primaries;
-                fgp->codec.h274.color_trc = sps->color_trc;
-                fgp->codec.h274.color_space = sps->colorspace;
+            if (sps->vui.colour_description_present_flag) {
+                fgp->codec.h274.color_primaries = sps->vui.colour_primaries;
+                fgp->codec.h274.color_trc       = sps->vui.transfer_characteristics;
+                fgp->codec.h274.color_space     = sps->vui.matrix_coeffs;
             } else {
                 fgp->codec.h274.color_primaries = AVCOL_PRI_UNSPECIFIED;
                 fgp->codec.h274.color_trc = AVCOL_TRC_UNSPECIFIED;
diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
index 25620357de..b68656e352 100644
--- a/libavcodec/hevc_ps.c
+++ b/libavcodec/hevc_ps.c
@@ -25,7 +25,7 @@
 
 #include "libavutil/imgutils.h"
 #include "golomb.h"
-#include "h2645data.h"
+#include "h2645_vui.h"
 #include "hevc_data.h"
 #include "hevc_ps.h"
 
@@ -571,47 +571,15 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx,
 {
     VUI backup_vui, *vui = &sps->vui;
     GetBitContext backup;
-    int sar_present, alt = 0;
-
-    av_log(avctx, AV_LOG_DEBUG, "Decoding VUI\n");
-
-    sar_present = get_bits1(gb);
-    if (sar_present) {
-        uint8_t sar_idx = get_bits(gb, 8);
-        if (sar_idx < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect))
-            vui->sar = ff_h2645_pixel_aspect[sar_idx];
-        else if (sar_idx == 255) {
-            vui->sar.num = get_bits(gb, 16);
-            vui->sar.den = get_bits(gb, 16);
-        } else
-            av_log(avctx, AV_LOG_WARNING,
-                   "Unknown SAR index: %u.\n", sar_idx);
-    }
+    int alt = 0;
 
-    vui->overscan_info_present_flag = get_bits1(gb);
-    if (vui->overscan_info_present_flag)
-        vui->overscan_appropriate_flag = get_bits1(gb);
+    ff_h2645_decode_common_vui_params(gb, &sps->vui.common, avctx);
 
-    vui->video_signal_type_present_flag = get_bits1(gb);
-    if (vui->video_signal_type_present_flag) {
-        vui->video_format                    = get_bits(gb, 3);
-        vui->video_full_range_flag           = get_bits1(gb);
-        vui->colour_description_present_flag = get_bits1(gb);
-        if (vui->video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P)
+    if (vui->common.video_signal_type_present_flag) {
+        if (vui->common.video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P)
             sps->pix_fmt = AV_PIX_FMT_YUVJ420P;
-        if (vui->colour_description_present_flag) {
-            vui->colour_primaries        = get_bits(gb, 8);
-            vui->transfer_characteristic = get_bits(gb, 8);
-            vui->matrix_coeffs           = get_bits(gb, 8);
-
-            // Set invalid values to "unspecified"
-            if (!av_color_primaries_name(vui->colour_primaries))
-                vui->colour_primaries = AVCOL_PRI_UNSPECIFIED;
-            if (!av_color_transfer_name(vui->transfer_characteristic))
-                vui->transfer_characteristic = AVCOL_TRC_UNSPECIFIED;
-            if (!av_color_space_name(vui->matrix_coeffs))
-                vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED;
-            if (vui->matrix_coeffs == AVCOL_SPC_RGB) {
+        if (vui->common.colour_description_present_flag) {
+            if (vui->common.matrix_coeffs == AVCOL_SPC_RGB) {
                 switch (sps->pix_fmt) {
                 case AV_PIX_FMT_YUV444P:
                     sps->pix_fmt = AV_PIX_FMT_GBRP;
@@ -627,12 +595,6 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx,
         }
     }
 
-    vui->chroma_loc_info_present_flag = get_bits1(gb);
-    if (vui->chroma_loc_info_present_flag) {
-        vui->chroma_sample_loc_type_top_field    = get_ue_golomb_long(gb);
-        vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_long(gb);
-    }
-
     vui->neutra_chroma_indication_flag = get_bits1(gb);
     vui->field_seq_flag                = get_bits1(gb);
     vui->frame_field_info_present_flag = get_bits1(gb);
@@ -1107,7 +1069,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
 
     sps->sps_temporal_mvp_enabled_flag          = get_bits1(gb);
     sps->sps_strong_intra_smoothing_enable_flag = get_bits1(gb);
-    sps->vui.sar = (AVRational){0, 1};
+    sps->vui.common.sar = (AVRational){0, 1};
     vui_present = get_bits1(gb);
     if (vui_present)
         decode_vui(gb, avctx, apply_defdispwin, sps);
diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h
index 2a1bbf6489..18894cfed1 100644
--- a/libavcodec/hevc_ps.h
+++ b/libavcodec/hevc_ps.h
@@ -29,6 +29,7 @@
 
 #include "avcodec.h"
 #include "get_bits.h"
+#include "h2645_vui.h"
 #include "hevc.h"
 
 typedef struct ShortTermRPS {
@@ -47,22 +48,8 @@ typedef struct HEVCWindow {
 } HEVCWindow;
 
 typedef struct VUI {
-    AVRational sar;
-
-    int overscan_info_present_flag;
-    int overscan_appropriate_flag;
-
-    int video_signal_type_present_flag;
-    int video_format;
-    int video_full_range_flag;
-    int colour_description_present_flag;
-    uint8_t colour_primaries;
-    uint8_t transfer_characteristic;
-    uint8_t matrix_coeffs;
-
-    int chroma_loc_info_present_flag;
-    int chroma_sample_loc_type_top_field;
-    int chroma_sample_loc_type_bottom_field;
+    H2645VUI common;
+
     int neutra_chroma_indication_flag;
 
     int field_seq_flag;
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index fdb8de5b15..7147944bc6 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -337,18 +337,18 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
     avctx->profile             = sps->ptl.general_ptl.profile_idc;
     avctx->level               = sps->ptl.general_ptl.level_idc;
 
-    ff_set_sar(avctx, sps->vui.sar);
+    ff_set_sar(avctx, sps->vui.common.sar);
 
-    if (sps->vui.video_signal_type_present_flag)
-        avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
-                                                            : AVCOL_RANGE_MPEG;
+    if (sps->vui.common.video_signal_type_present_flag)
+        avctx->color_range = sps->vui.common.video_full_range_flag ? AVCOL_RANGE_JPEG
+                                                                   : AVCOL_RANGE_MPEG;
     else
         avctx->color_range = AVCOL_RANGE_MPEG;
 
-    if (sps->vui.colour_description_present_flag) {
-        avctx->color_primaries = sps->vui.colour_primaries;
-        avctx->color_trc       = sps->vui.transfer_characteristic;
-        avctx->colorspace      = sps->vui.matrix_coeffs;
+    if (sps->vui.common.colour_description_present_flag) {
+        avctx->color_primaries = sps->vui.common.colour_primaries;
+        avctx->color_trc       = sps->vui.common.transfer_characteristics;
+        avctx->colorspace      = sps->vui.common.matrix_coeffs;
     } else {
         avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
         avctx->color_trc       = AVCOL_TRC_UNSPECIFIED;
@@ -357,9 +357,9 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
 
     avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED;
     if (sps->chroma_format_idc == 1) {
-        if (sps->vui.chroma_loc_info_present_flag) {
-            if (sps->vui.chroma_sample_loc_type_top_field <= 5)
-                avctx->chroma_sample_location = sps->vui.chroma_sample_loc_type_top_field + 1;
+        if (sps->vui.common.chroma_loc_info_present_flag) {
+            if (sps->vui.common.chroma_sample_loc_type_top_field <= 5)
+                avctx->chroma_sample_location = sps->vui.common.chroma_sample_loc_type_top_field + 1;
         } else
             avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
     }
@@ -2851,14 +2851,14 @@ static int set_side_data(HEVCContext *s)
             const VUI *vui = &sps->vui;
             fgp->codec.h274.bit_depth_luma = sps->bit_depth;
             fgp->codec.h274.bit_depth_chroma = sps->bit_depth_chroma;
-            if (vui->video_signal_type_present_flag)
-                fgp->codec.h274.color_range = vui->video_full_range_flag + 1;
+            if (vui->common.video_signal_type_present_flag)
+                fgp->codec.h274.color_range = vui->common.video_full_range_flag + 1;
             else
                 fgp->codec.h274.color_range = AVCOL_RANGE_UNSPECIFIED;
-            if (vui->colour_description_present_flag) {
-                fgp->codec.h274.color_primaries = vui->colour_primaries;
-                fgp->codec.h274.color_trc = vui->transfer_characteristic;
-                fgp->codec.h274.color_space = vui->matrix_coeffs;
+            if (vui->common.colour_description_present_flag) {
+                fgp->codec.h274.color_primaries = vui->common.colour_primaries;
+                fgp->codec.h274.color_trc       = vui->common.transfer_characteristics;
+                fgp->codec.h274.color_space     = vui->common.matrix_coeffs;
             } else {
                 fgp->codec.h274.color_primaries = AVCOL_PRI_UNSPECIFIED;
                 fgp->codec.h274.color_trc = AVCOL_TRC_UNSPECIFIED;
-- 
2.34.1



More information about the ffmpeg-devel mailing list