1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#ifndef AVCODEC_H264_SEI_H 20cabdff1aSopenharmony_ci#define AVCODEC_H264_SEI_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "get_bits.h" 23cabdff1aSopenharmony_ci#include "h264_ps.h" 24cabdff1aSopenharmony_ci#include "sei.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci/** 28cabdff1aSopenharmony_ci * pic_struct in picture timing SEI message 29cabdff1aSopenharmony_ci */ 30cabdff1aSopenharmony_citypedef enum { 31cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_FRAME = 0, ///< 0: %frame 32cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_TOP_FIELD = 1, ///< 1: top field 33cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_BOTTOM_FIELD = 2, ///< 2: bottom field 34cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_TOP_BOTTOM = 3, ///< 3: top field, bottom field, in that order 35cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_BOTTOM_TOP = 4, ///< 4: bottom field, top field, in that order 36cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5, ///< 5: top field, bottom field, top field repeated, in that order 37cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6, ///< 6: bottom field, top field, bottom field repeated, in that order 38cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_FRAME_DOUBLING = 7, ///< 7: %frame doubling 39cabdff1aSopenharmony_ci H264_SEI_PIC_STRUCT_FRAME_TRIPLING = 8 ///< 8: %frame tripling 40cabdff1aSopenharmony_ci} H264_SEI_PicStructType; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci/** 43cabdff1aSopenharmony_ci * frame_packing_arrangement types 44cabdff1aSopenharmony_ci */ 45cabdff1aSopenharmony_citypedef enum { 46cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_CHECKERBOARD = 0, 47cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_INTERLEAVE_COLUMN = 1, 48cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_INTERLEAVE_ROW = 2, 49cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_SIDE_BY_SIDE = 3, 50cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_TOP_BOTTOM = 4, 51cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_INTERLEAVE_TEMPORAL = 5, 52cabdff1aSopenharmony_ci H264_SEI_FPA_TYPE_2D = 6, 53cabdff1aSopenharmony_ci} H264_SEI_FpaType; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_citypedef struct H264SEITimeCode { 56cabdff1aSopenharmony_ci /* When not continuously receiving full timecodes, we have to reference 57cabdff1aSopenharmony_ci the previous timecode received */ 58cabdff1aSopenharmony_ci int full; 59cabdff1aSopenharmony_ci int frame; 60cabdff1aSopenharmony_ci int seconds; 61cabdff1aSopenharmony_ci int minutes; 62cabdff1aSopenharmony_ci int hours; 63cabdff1aSopenharmony_ci int dropframe; 64cabdff1aSopenharmony_ci} H264SEITimeCode; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_citypedef struct H264SEIPictureTiming { 67cabdff1aSopenharmony_ci // maximum size of pic_timing according to the spec should be 274 bits 68cabdff1aSopenharmony_ci uint8_t payload[40]; 69cabdff1aSopenharmony_ci int payload_size_bits; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci int present; 72cabdff1aSopenharmony_ci H264_SEI_PicStructType pic_struct; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci /** 75cabdff1aSopenharmony_ci * Bit set of clock types for fields/frames in picture timing SEI message. 76cabdff1aSopenharmony_ci * For each found ct_type, appropriate bit is set (e.g., bit 1 for 77cabdff1aSopenharmony_ci * interlaced). 78cabdff1aSopenharmony_ci */ 79cabdff1aSopenharmony_ci int ct_type; 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci /** 82cabdff1aSopenharmony_ci * dpb_output_delay in picture timing SEI message, see H.264 C.2.2 83cabdff1aSopenharmony_ci */ 84cabdff1aSopenharmony_ci int dpb_output_delay; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci /** 87cabdff1aSopenharmony_ci * cpb_removal_delay in picture timing SEI message, see H.264 C.1.2 88cabdff1aSopenharmony_ci */ 89cabdff1aSopenharmony_ci int cpb_removal_delay; 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci /** 92cabdff1aSopenharmony_ci * Maximum three timecodes in a pic_timing SEI. 93cabdff1aSopenharmony_ci */ 94cabdff1aSopenharmony_ci H264SEITimeCode timecode[3]; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci /** 97cabdff1aSopenharmony_ci * Number of timecode in use 98cabdff1aSopenharmony_ci */ 99cabdff1aSopenharmony_ci int timecode_cnt; 100cabdff1aSopenharmony_ci} H264SEIPictureTiming; 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_citypedef struct H264SEIAFD { 103cabdff1aSopenharmony_ci int present; 104cabdff1aSopenharmony_ci uint8_t active_format_description; 105cabdff1aSopenharmony_ci} H264SEIAFD; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_citypedef struct H264SEIA53Caption { 108cabdff1aSopenharmony_ci AVBufferRef *buf_ref; 109cabdff1aSopenharmony_ci} H264SEIA53Caption; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_citypedef struct H264SEIUnregistered { 112cabdff1aSopenharmony_ci int x264_build; 113cabdff1aSopenharmony_ci AVBufferRef **buf_ref; 114cabdff1aSopenharmony_ci int nb_buf_ref; 115cabdff1aSopenharmony_ci} H264SEIUnregistered; 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_citypedef struct H264SEIRecoveryPoint { 118cabdff1aSopenharmony_ci /** 119cabdff1aSopenharmony_ci * recovery_frame_cnt 120cabdff1aSopenharmony_ci * 121cabdff1aSopenharmony_ci * Set to -1 if no recovery point SEI message found or to number of frames 122cabdff1aSopenharmony_ci * before playback synchronizes. Frames having recovery point are key 123cabdff1aSopenharmony_ci * frames. 124cabdff1aSopenharmony_ci */ 125cabdff1aSopenharmony_ci int recovery_frame_cnt; 126cabdff1aSopenharmony_ci} H264SEIRecoveryPoint; 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_citypedef struct H264SEIBufferingPeriod { 129cabdff1aSopenharmony_ci int present; ///< Buffering period SEI flag 130cabdff1aSopenharmony_ci int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs 131cabdff1aSopenharmony_ci} H264SEIBufferingPeriod; 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_citypedef struct H264SEIFramePacking { 134cabdff1aSopenharmony_ci int present; 135cabdff1aSopenharmony_ci int arrangement_id; 136cabdff1aSopenharmony_ci int arrangement_cancel_flag; ///< is previous arrangement canceled, -1 if never received 137cabdff1aSopenharmony_ci H264_SEI_FpaType arrangement_type; 138cabdff1aSopenharmony_ci int arrangement_repetition_period; 139cabdff1aSopenharmony_ci int content_interpretation_type; 140cabdff1aSopenharmony_ci int quincunx_sampling_flag; 141cabdff1aSopenharmony_ci int current_frame_is_frame0_flag; 142cabdff1aSopenharmony_ci} H264SEIFramePacking; 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_citypedef struct H264SEIDisplayOrientation { 145cabdff1aSopenharmony_ci int present; 146cabdff1aSopenharmony_ci int anticlockwise_rotation; 147cabdff1aSopenharmony_ci int hflip, vflip; 148cabdff1aSopenharmony_ci} H264SEIDisplayOrientation; 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_citypedef struct H264SEIGreenMetaData { 151cabdff1aSopenharmony_ci uint8_t green_metadata_type; 152cabdff1aSopenharmony_ci uint8_t period_type; 153cabdff1aSopenharmony_ci uint16_t num_seconds; 154cabdff1aSopenharmony_ci uint16_t num_pictures; 155cabdff1aSopenharmony_ci uint8_t percent_non_zero_macroblocks; 156cabdff1aSopenharmony_ci uint8_t percent_intra_coded_macroblocks; 157cabdff1aSopenharmony_ci uint8_t percent_six_tap_filtering; 158cabdff1aSopenharmony_ci uint8_t percent_alpha_point_deblocking_instance; 159cabdff1aSopenharmony_ci uint8_t xsd_metric_type; 160cabdff1aSopenharmony_ci uint16_t xsd_metric_value; 161cabdff1aSopenharmony_ci} H264SEIGreenMetaData; 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_citypedef struct H264SEIAlternativeTransfer { 164cabdff1aSopenharmony_ci int present; 165cabdff1aSopenharmony_ci int preferred_transfer_characteristics; 166cabdff1aSopenharmony_ci} H264SEIAlternativeTransfer; 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_citypedef struct H264SEIFilmGrainCharacteristics { 169cabdff1aSopenharmony_ci int present; 170cabdff1aSopenharmony_ci int model_id; 171cabdff1aSopenharmony_ci int separate_colour_description_present_flag; 172cabdff1aSopenharmony_ci int bit_depth_luma; 173cabdff1aSopenharmony_ci int bit_depth_chroma; 174cabdff1aSopenharmony_ci int full_range; 175cabdff1aSopenharmony_ci int color_primaries; 176cabdff1aSopenharmony_ci int transfer_characteristics; 177cabdff1aSopenharmony_ci int matrix_coeffs; 178cabdff1aSopenharmony_ci int blending_mode_id; 179cabdff1aSopenharmony_ci int log2_scale_factor; 180cabdff1aSopenharmony_ci int comp_model_present_flag[3]; 181cabdff1aSopenharmony_ci uint16_t num_intensity_intervals[3]; 182cabdff1aSopenharmony_ci uint8_t num_model_values[3]; 183cabdff1aSopenharmony_ci uint8_t intensity_interval_lower_bound[3][256]; 184cabdff1aSopenharmony_ci uint8_t intensity_interval_upper_bound[3][256]; 185cabdff1aSopenharmony_ci int16_t comp_model_value[3][256][6]; 186cabdff1aSopenharmony_ci int repetition_period; 187cabdff1aSopenharmony_ci} H264SEIFilmGrainCharacteristics; 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_citypedef struct H264SEIContext { 190cabdff1aSopenharmony_ci H264SEIPictureTiming picture_timing; 191cabdff1aSopenharmony_ci H264SEIAFD afd; 192cabdff1aSopenharmony_ci H264SEIA53Caption a53_caption; 193cabdff1aSopenharmony_ci H264SEIUnregistered unregistered; 194cabdff1aSopenharmony_ci H264SEIRecoveryPoint recovery_point; 195cabdff1aSopenharmony_ci H264SEIBufferingPeriod buffering_period; 196cabdff1aSopenharmony_ci H264SEIFramePacking frame_packing; 197cabdff1aSopenharmony_ci H264SEIDisplayOrientation display_orientation; 198cabdff1aSopenharmony_ci H264SEIGreenMetaData green_metadata; 199cabdff1aSopenharmony_ci H264SEIAlternativeTransfer alternative_transfer; 200cabdff1aSopenharmony_ci H264SEIFilmGrainCharacteristics film_grain_characteristics; 201cabdff1aSopenharmony_ci} H264SEIContext; 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_cistruct H264ParamSets; 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ciint ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, 206cabdff1aSopenharmony_ci const struct H264ParamSets *ps, void *logctx); 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_ci/** 209cabdff1aSopenharmony_ci * Reset SEI values at the beginning of the frame. 210cabdff1aSopenharmony_ci */ 211cabdff1aSopenharmony_civoid ff_h264_sei_uninit(H264SEIContext *h); 212cabdff1aSopenharmony_ci 213cabdff1aSopenharmony_ci/** 214cabdff1aSopenharmony_ci * Get stereo_mode string from the h264 frame_packing_arrangement 215cabdff1aSopenharmony_ci */ 216cabdff1aSopenharmony_ciconst char *ff_h264_sei_stereo_mode(const H264SEIFramePacking *h); 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci/** 219cabdff1aSopenharmony_ci * Parse the contents of a picture timing message given an active SPS. 220cabdff1aSopenharmony_ci */ 221cabdff1aSopenharmony_ciint ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps, 222cabdff1aSopenharmony_ci void *logctx); 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci#endif /* AVCODEC_H264_SEI_H */ 225