xref: /third_party/ffmpeg/libavcodec/hevc_sei.h (revision cabdff1a)
1/*
2 * HEVC Supplementary Enhancement Information messages
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#ifndef AVCODEC_HEVC_SEI_H
22#define AVCODEC_HEVC_SEI_H
23
24#include <stdint.h>
25
26#include "libavutil/buffer.h"
27
28#include "get_bits.h"
29#include "hevc.h"
30#include "sei.h"
31
32
33typedef enum {
34        HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING = 7,
35        HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING = 8
36} HEVC_SEI_PicStructType;
37
38typedef struct HEVCSEIPictureHash {
39    uint8_t       md5[3][16];
40    uint8_t is_md5;
41} HEVCSEIPictureHash;
42
43typedef struct HEVCSEIFramePacking {
44    int present;
45    int arrangement_type;
46    int content_interpretation_type;
47    int quincunx_subsampling;
48    int current_frame_is_frame0_flag;
49} HEVCSEIFramePacking;
50
51typedef struct HEVCSEIDisplayOrientation {
52    int present;
53    int anticlockwise_rotation;
54    int hflip, vflip;
55} HEVCSEIDisplayOrientation;
56
57typedef struct HEVCSEIPictureTiming {
58    int picture_struct;
59} HEVCSEIPictureTiming;
60
61typedef struct HEVCSEIA53Caption {
62    AVBufferRef *buf_ref;
63} HEVCSEIA53Caption;
64
65typedef struct HEVCSEIUnregistered {
66    AVBufferRef **buf_ref;
67    int nb_buf_ref;
68} HEVCSEIUnregistered;
69
70typedef struct HEVCSEIMasteringDisplay {
71    int present;
72    uint16_t display_primaries[3][2];
73    uint16_t white_point[2];
74    uint32_t max_luminance;
75    uint32_t min_luminance;
76} HEVCSEIMasteringDisplay;
77
78typedef struct HEVCSEIDynamicHDRPlus {
79    AVBufferRef *info;
80} HEVCSEIDynamicHDRPlus;
81
82typedef struct HEVCSEIDynamicHDRVivid {
83    AVBufferRef *info;
84} HEVCSEIDynamicHDRVivid;
85
86typedef struct HEVCSEIContentLight {
87    int present;
88    uint16_t max_content_light_level;
89    uint16_t max_pic_average_light_level;
90} HEVCSEIContentLight;
91
92typedef struct HEVCSEIAlternativeTransfer {
93    int present;
94    int preferred_transfer_characteristics;
95} HEVCSEIAlternativeTransfer;
96
97typedef struct HEVCSEITimeCode {
98    int      present;
99    uint8_t  num_clock_ts;
100    uint8_t  clock_timestamp_flag[3];
101    uint8_t  units_field_based_flag[3];
102    uint8_t  counting_type[3];
103    uint8_t  full_timestamp_flag[3];
104    uint8_t  discontinuity_flag[3];
105    uint8_t  cnt_dropped_flag[3];
106    uint16_t n_frames[3];
107    uint8_t  seconds_value[3];
108    uint8_t  minutes_value[3];
109    uint8_t  hours_value[3];
110    uint8_t  seconds_flag[3];
111    uint8_t  minutes_flag[3];
112    uint8_t  hours_flag[3];
113    uint8_t  time_offset_length[3];
114    int32_t  time_offset_value[3];
115} HEVCSEITimeCode;
116
117typedef struct HEVCSEIFilmGrainCharacteristics {
118    int present;
119    int model_id;
120    int separate_colour_description_present_flag;
121    int bit_depth_luma;
122    int bit_depth_chroma;
123    int full_range;
124    int color_primaries;
125    int transfer_characteristics;
126    int matrix_coeffs;
127    int blending_mode_id;
128    int log2_scale_factor;
129    int comp_model_present_flag[3];
130    uint16_t num_intensity_intervals[3];
131    uint8_t num_model_values[3];
132    uint8_t intensity_interval_lower_bound[3][256];
133    uint8_t intensity_interval_upper_bound[3][256];
134    int16_t comp_model_value[3][256][6];
135    int persistence_flag;
136} HEVCSEIFilmGrainCharacteristics;
137
138typedef struct HEVCSEI {
139    HEVCSEIPictureHash picture_hash;
140    HEVCSEIFramePacking frame_packing;
141    HEVCSEIDisplayOrientation display_orientation;
142    HEVCSEIPictureTiming picture_timing;
143    HEVCSEIA53Caption a53_caption;
144    HEVCSEIUnregistered unregistered;
145    HEVCSEIMasteringDisplay mastering_display;
146    HEVCSEIDynamicHDRPlus dynamic_hdr_plus;
147    HEVCSEIDynamicHDRVivid dynamic_hdr_vivid;
148    HEVCSEIContentLight content_light;
149    int active_seq_parameter_set_id;
150    HEVCSEIAlternativeTransfer alternative_transfer;
151    HEVCSEITimeCode timecode;
152    HEVCSEIFilmGrainCharacteristics film_grain_characteristics;
153} HEVCSEI;
154
155struct HEVCParamSets;
156
157int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s,
158                           const struct HEVCParamSets *ps, enum HEVCNALUnitType type);
159
160/**
161 * Reset SEI values that are stored on the Context.
162 * e.g. Caption data that was extracted during NAL
163 * parsing.
164 *
165 * @param s HEVCContext.
166 */
167void ff_hevc_reset_sei(HEVCSEI *s);
168
169#endif /* AVCODEC_HEVC_SEI_H */
170