blob: da3b3918603767d38d178aa3af29a5afcfe2fa24
1 | /* |
2 | * This file is part of FFmpeg. |
3 | * |
4 | * FFmpeg is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2.1 of the License, or (at your option) any later version. |
8 | * |
9 | * FFmpeg is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Lesser General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Lesser General Public |
15 | * License along with FFmpeg; if not, write to the Free Software |
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
17 | */ |
18 | |
19 | #ifndef AVCODEC_H264_SEI_H |
20 | #define AVCODEC_H264_SEI_H |
21 | |
22 | #include "get_bits.h" |
23 | |
24 | /** |
25 | * SEI message types |
26 | */ |
27 | typedef enum { |
28 | SEI_TYPE_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1) |
29 | SEI_TYPE_PIC_TIMING = 1, ///< picture timing |
30 | SEI_TYPE_USER_DATA_REGISTERED = 4, ///< registered user data as specified by Rec. ITU-T T.35 |
31 | SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data |
32 | SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) |
33 | SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement |
34 | SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation |
35 | SEI_TYPE_GREEN_METADATA = 56 ///< GreenMPEG information |
36 | } SEI_Type; |
37 | |
38 | /** |
39 | * pic_struct in picture timing SEI message |
40 | */ |
41 | typedef enum { |
42 | SEI_PIC_STRUCT_FRAME = 0, ///< 0: %frame |
43 | SEI_PIC_STRUCT_TOP_FIELD = 1, ///< 1: top field |
44 | SEI_PIC_STRUCT_BOTTOM_FIELD = 2, ///< 2: bottom field |
45 | SEI_PIC_STRUCT_TOP_BOTTOM = 3, ///< 3: top field, bottom field, in that order |
46 | SEI_PIC_STRUCT_BOTTOM_TOP = 4, ///< 4: bottom field, top field, in that order |
47 | SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5, ///< 5: top field, bottom field, top field repeated, in that order |
48 | SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6, ///< 6: bottom field, top field, bottom field repeated, in that order |
49 | SEI_PIC_STRUCT_FRAME_DOUBLING = 7, ///< 7: %frame doubling |
50 | SEI_PIC_STRUCT_FRAME_TRIPLING = 8 ///< 8: %frame tripling |
51 | } SEI_PicStructType; |
52 | |
53 | /** |
54 | * frame_packing_arrangement types |
55 | */ |
56 | typedef enum { |
57 | SEI_FPA_TYPE_CHECKERBOARD = 0, |
58 | SEI_FPA_TYPE_INTERLEAVE_COLUMN = 1, |
59 | SEI_FPA_TYPE_INTERLEAVE_ROW = 2, |
60 | SEI_FPA_TYPE_SIDE_BY_SIDE = 3, |
61 | SEI_FPA_TYPE_TOP_BOTTOM = 4, |
62 | SEI_FPA_TYPE_INTERLEAVE_TEMPORAL = 5, |
63 | SEI_FPA_TYPE_2D = 6, |
64 | } SEI_FpaType; |
65 | |
66 | typedef struct H264SEIPictureTiming { |
67 | int present; |
68 | SEI_PicStructType pic_struct; |
69 | |
70 | /** |
71 | * Bit set of clock types for fields/frames in picture timing SEI message. |
72 | * For each found ct_type, appropriate bit is set (e.g., bit 1 for |
73 | * interlaced). |
74 | */ |
75 | int ct_type; |
76 | |
77 | /** |
78 | * dpb_output_delay in picture timing SEI message, see H.264 C.2.2 |
79 | */ |
80 | int dpb_output_delay; |
81 | |
82 | /** |
83 | * cpb_removal_delay in picture timing SEI message, see H.264 C.1.2 |
84 | */ |
85 | int cpb_removal_delay; |
86 | } H264SEIPictureTiming; |
87 | |
88 | typedef struct H264SEIAFD { |
89 | int present; |
90 | uint8_t active_format_description; |
91 | } H264SEIAFD; |
92 | |
93 | typedef struct H264SEIA53Caption { |
94 | int a53_caption_size; |
95 | uint8_t *a53_caption; |
96 | } H264SEIA53Caption; |
97 | |
98 | typedef struct H264SEIUnregistered { |
99 | int x264_build; |
100 | } H264SEIUnregistered; |
101 | |
102 | typedef struct H264SEIRecoveryPoint { |
103 | /** |
104 | * recovery_frame_cnt |
105 | * |
106 | * Set to -1 if no recovery point SEI message found or to number of frames |
107 | * before playback synchronizes. Frames having recovery point are key |
108 | * frames. |
109 | */ |
110 | int recovery_frame_cnt; |
111 | } H264SEIRecoveryPoint; |
112 | |
113 | typedef struct H264SEIBufferingPeriod { |
114 | int present; ///< Buffering period SEI flag |
115 | int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs |
116 | } H264SEIBufferingPeriod; |
117 | |
118 | typedef struct H264SEIFramePacking { |
119 | int present; |
120 | int frame_packing_arrangement_id; |
121 | int frame_packing_arrangement_cancel_flag; ///< is previous arrangement canceled, -1 if never received |
122 | SEI_FpaType frame_packing_arrangement_type; |
123 | int frame_packing_arrangement_repetition_period; |
124 | int content_interpretation_type; |
125 | int quincunx_sampling_flag; |
126 | } H264SEIFramePacking; |
127 | |
128 | typedef struct H264SEIDisplayOrientation { |
129 | int present; |
130 | int anticlockwise_rotation; |
131 | int hflip, vflip; |
132 | } H264SEIDisplayOrientation; |
133 | |
134 | typedef struct H264SEIGreenMetaData { |
135 | uint8_t green_metadata_type; |
136 | uint8_t period_type; |
137 | uint16_t num_seconds; |
138 | uint16_t num_pictures; |
139 | uint8_t percent_non_zero_macroblocks; |
140 | uint8_t percent_intra_coded_macroblocks; |
141 | uint8_t percent_six_tap_filtering; |
142 | uint8_t percent_alpha_point_deblocking_instance; |
143 | uint8_t xsd_metric_type; |
144 | uint16_t xsd_metric_value; |
145 | } H264SEIGreenMetaData; |
146 | |
147 | typedef struct H264SEIContext { |
148 | H264SEIPictureTiming picture_timing; |
149 | H264SEIAFD afd; |
150 | H264SEIA53Caption a53_caption; |
151 | H264SEIUnregistered unregistered; |
152 | H264SEIRecoveryPoint recovery_point; |
153 | H264SEIBufferingPeriod buffering_period; |
154 | H264SEIFramePacking frame_packing; |
155 | H264SEIDisplayOrientation display_orientation; |
156 | H264SEIGreenMetaData green_metadata; |
157 | } H264SEIContext; |
158 | |
159 | struct H264ParamSets; |
160 | |
161 | int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, |
162 | const struct H264ParamSets *ps, void *logctx); |
163 | |
164 | /** |
165 | * Reset SEI values at the beginning of the frame. |
166 | */ |
167 | void ff_h264_sei_uninit(H264SEIContext *h); |
168 | |
169 | /** |
170 | * Get stereo_mode string from the h264 frame_packing_arrangement |
171 | */ |
172 | const char *ff_h264_sei_stereo_mode(const H264SEIFramePacking *h); |
173 | |
174 | #endif /* AVCODEC_H264_SEI_H */ |
175 |