/src/vlc/modules/packetizer/hevc_nal.h
Line | Count | Source (jump to first uncovered line) |
1 | | /***************************************************************************** |
2 | | * Copyright © 2010-2014 VideoLAN |
3 | | * |
4 | | * Authors: Thomas Guillem <thomas.guillem@gmail.com> |
5 | | * |
6 | | * This program is free software; you can redistribute it and/or modify it |
7 | | * under the terms of the GNU Lesser General Public License as published by |
8 | | * the Free Software Foundation; either version 2.1 of the License, or |
9 | | * (at your option) any later version. |
10 | | * |
11 | | * This program 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 |
14 | | * GNU Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public License |
17 | | * along with this program; if not, write to the Free Software Foundation, |
18 | | * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
19 | | *****************************************************************************/ |
20 | | #ifndef HEVC_NAL_H |
21 | | # define HEVC_NAL_H |
22 | | |
23 | | # include <vlc_es.h> |
24 | | # include <vlc_bits.h> |
25 | | |
26 | | #ifdef __cplusplus |
27 | | extern "C" { |
28 | | #endif |
29 | | |
30 | 0 | #define HEVC_VPS_ID_MAX 15 |
31 | 0 | #define HEVC_SPS_ID_MAX 15 |
32 | 0 | #define HEVC_PPS_ID_MAX 63 |
33 | | |
34 | | enum hevc_general_profile_idc_e |
35 | | { |
36 | | HEVC_PROFILE_IDC_NONE = 0, |
37 | | HEVC_PROFILE_IDC_MAIN = 1, |
38 | | HEVC_PROFILE_IDC_MAIN_10 = 2, |
39 | | HEVC_PROFILE_IDC_MAIN_STILL_PICTURE = 3, |
40 | | HEVC_PROFILE_IDC_REXT = 4, /* range extensions */ |
41 | | HEVC_PROFILE_IDC_HIGH_THROUGHPUT = 5, |
42 | | HEVC_PROFILE_IDC_MULTIVIEW_MAIN = 6, |
43 | | HEVC_PROFILE_IDC_SCALABLE_MAIN = 7, |
44 | | HEVC_PROFILE_IDC_3D_MAIN = 8, |
45 | | HEVC_PROFILE_IDC_SCREEN_EXTENDED = 9, |
46 | | HEVC_PROFILE_IDC_SCALABLE_REXT = 10, |
47 | | }; |
48 | | |
49 | | enum hevc_level_idc_e |
50 | | { |
51 | | HEVC_LEVEL_IDC_1 = 30, /* stored as 30 times the level number */ |
52 | | HEVC_LEVEL_IDC_2 = 60, |
53 | | HEVC_LEVEL_IDC_2_1 = 63, |
54 | | HEVC_LEVEL_IDC_3 = 90, |
55 | | HEVC_LEVEL_IDC_3_1 = 93, |
56 | | HEVC_LEVEL_IDC_4 = 120, |
57 | | HEVC_LEVEL_IDC_4_1 = 123, |
58 | | HEVC_LEVEL_IDC_5 = 150, |
59 | | HEVC_LEVEL_IDC_5_1 = 153, |
60 | | HEVC_LEVEL_IDC_5_2 = 156, |
61 | | HEVC_LEVEL_IDC_6 = 180, |
62 | | HEVC_LEVEL_IDC_6_1 = 183, |
63 | | HEVC_LEVEL_IDC_6_2 = 186, |
64 | | HEVC_LEVEL_IDC_8_5 = 255, |
65 | | }; |
66 | | |
67 | | /* Values built from 9 bits mapping of the A-2 bitstream indications for conformance */ |
68 | | enum hevc_rext_indication_e |
69 | | { |
70 | | HEVC_REXT_INDICATION_MONOCHROME = 0x1F9, |
71 | | HEVC_REXT_INDICATION_MONOCHROME_10 = 0x1B9, |
72 | | HEVC_REXT_INDICATION_MONOCHROME_12 = 0x139, |
73 | | HEVC_REXT_INDICATION_MONOCHROME_16 = 0x039, |
74 | | HEVC_REXT_INDICATION_MAIN_12 = 0x131, |
75 | | HEVC_REXT_INDICATION_MAIN_422_10 = 0x1A1, |
76 | | HEVC_REXT_INDICATION_MAIN_422_12 = 0x121, |
77 | | HEVC_REXT_INDICATION_MAIN_444 = 0x1C1, |
78 | | HEVC_REXT_INDICATION_MAIN_444_10 = 0x181, |
79 | | HEVC_REXT_INDICATION_MAIN_444_12 = 0x101, |
80 | | HEVC_REXT_INDICATION_MAIN_INTRA = 0x1F4, /* From this one, lowest bit is insignifiant */ |
81 | | HEVC_REXT_INDICATION_MAIN_10_INTRA = 0x1B4, |
82 | | HEVC_REXT_INDICATION_MAIN_12_INTRA = 0x134, |
83 | | HEVC_REXT_INDICATION_MAIN_422_10_INTRA = 0x1A4, |
84 | | HEVC_REXT_INDICATION_MAIN_422_12_INTRA = 0x124, |
85 | | HEVC_REXT_INDICATION_MAIN_444_INTRA = 0x1C4, |
86 | | HEVC_REXT_INDICATION_MAIN_444_10_INTRA = 0x184, |
87 | | HEVC_REXT_INDICATION_MAIN_444_12_INTRA = 0x104, |
88 | | HEVC_REXT_INDICATION_MAIN_444_16_INTRA = 0x004, |
89 | | HEVC_REXT_INDICATION_MAIN_444_STILL_PICTURE = 0x1C6, |
90 | | HEVC_REXT_INDICATION_MAIN_444_16_STILL_PICTURE = 0x006, |
91 | | }; |
92 | | |
93 | | enum hevc_high_throughput_indication_e |
94 | | { |
95 | | HEVC_HIGH_THROUGHPUT_INDICATION_444 = 0x3C1, |
96 | | HEVC_HIGH_THROUGHPUT_INDICATION_444_10 = 0x381, |
97 | | HEVC_HIGH_THROUGHPUT_INDICATION_444_14 = 0x201, |
98 | | HEVC_HIGH_THROUGHPUT_INDICATION_444_16_INTRA = 0x002, /* lowest bit is insignifiant */ |
99 | | }; |
100 | | |
101 | | enum hevc_screen_extended_indication_e |
102 | | { |
103 | | HEVC_SCREEN_EXTENDED_INDICATION_MAIN = 0x3F1, |
104 | | HEVC_SCREEN_EXTENDED_INDICATION_MAIN_10 = 0x3B1, |
105 | | HEVC_SCREEN_EXTENDED_INDICATION_MAIN_444 = 0x3C1, |
106 | | HEVC_SCREEN_EXTENDED_INDICATION_MAIN_444_10 = 0x381, |
107 | | /* skip HP 444 profiles which are the same */ |
108 | | HEVC_SCREEN_EXTENDED_INDICATION_HIGH_THROUGHPUT_444_14 = 0x201, |
109 | | }; |
110 | | |
111 | | /* VLC only specific profiles for features testing and special cases. |
112 | | These are not to be stored. */ |
113 | 0 | #define HEVC_INDICATION_SHIFT 8 |
114 | | #define MKPROF(a, b) ((HEVC_##a##_INDICATION_##b << HEVC_INDICATION_SHIFT) | HEVC_PROFILE_IDC_##a) |
115 | | enum vlc_hevc_profile_e |
116 | | { |
117 | | VLC_HEVC_PROFILE_NONE = HEVC_PROFILE_IDC_NONE, |
118 | | VLC_HEVC_PROFILE_MAIN = HEVC_PROFILE_IDC_MAIN, |
119 | | VLC_HEVC_PROFILE_MAIN_10 = HEVC_PROFILE_IDC_MAIN_10, |
120 | | VLC_HEVC_PROFILE_MAIN_STILL_PICTURE = HEVC_PROFILE_IDC_MAIN_STILL_PICTURE, |
121 | | /* range extensions */ |
122 | | VLC_HEVC_PROFILE_MONOCHROME = MKPROF(REXT,MONOCHROME), |
123 | | VLC_HEVC_PROFILE_MONOCHROME_10 = MKPROF(REXT,MONOCHROME_10), |
124 | | VLC_HEVC_PROFILE_MONOCHROME_12 = MKPROF(REXT,MONOCHROME_12), |
125 | | VLC_HEVC_PROFILE_MONOCHROME_16 = MKPROF(REXT,MONOCHROME_16), |
126 | | VLC_HEVC_PROFILE_MAIN_12 = MKPROF(REXT,MAIN_12), |
127 | | VLC_HEVC_PROFILE_MAIN_422_10 = MKPROF(REXT,MAIN_422_10), |
128 | | VLC_HEVC_PROFILE_MAIN_422_12 = MKPROF(REXT,MAIN_422_12), |
129 | | VLC_HEVC_PROFILE_MAIN_444 = MKPROF(REXT,MAIN_444), |
130 | | VLC_HEVC_PROFILE_MAIN_444_10 = MKPROF(REXT,MAIN_444_10), |
131 | | VLC_HEVC_PROFILE_MAIN_444_12 = MKPROF(REXT,MAIN_444_12), |
132 | | VLC_HEVC_PROFILE_MAIN_INTRA = MKPROF(REXT,MAIN_INTRA), |
133 | | VLC_HEVC_PROFILE_MAIN_10_INTRA = MKPROF(REXT,MAIN_10_INTRA), |
134 | | VLC_HEVC_PROFILE_MAIN_12_INTRA = MKPROF(REXT,MAIN_12_INTRA), |
135 | | VLC_HEVC_PROFILE_MAIN_422_10_INTRA = MKPROF(REXT,MAIN_422_10_INTRA), |
136 | | VLC_HEVC_PROFILE_MAIN_422_12_INTRA = MKPROF(REXT,MAIN_422_12_INTRA), |
137 | | VLC_HEVC_PROFILE_MAIN_444_INTRA = MKPROF(REXT,MAIN_444_INTRA), |
138 | | VLC_HEVC_PROFILE_MAIN_444_10_INTRA = MKPROF(REXT,MAIN_444_10_INTRA), |
139 | | VLC_HEVC_PROFILE_MAIN_444_12_INTRA = MKPROF(REXT,MAIN_444_12_INTRA), |
140 | | VLC_HEVC_PROFILE_MAIN_444_16_INTRA = MKPROF(REXT,MAIN_444_16_INTRA), |
141 | | VLC_HEVC_PROFILE_MAIN_444_STILL_PICTURE = MKPROF(REXT,MAIN_444_STILL_PICTURE), |
142 | | VLC_HEVC_PROFILE_MAIN_444_16_STILL_PICTURE = MKPROF(REXT,MAIN_444_16_STILL_PICTURE), |
143 | | /* high thoughput */ |
144 | | VLC_HEVC_PROFILE_HIGH_THROUGHPUT_444 = MKPROF(HIGH_THROUGHPUT,444), |
145 | | VLC_HEVC_PROFILE_HIGH_THROUGHPUT_444_10 = MKPROF(HIGH_THROUGHPUT,444_10), |
146 | | VLC_HEVC_PROFILE_HIGH_THROUGHPUT_444_14 = MKPROF(HIGH_THROUGHPUT,444_14), |
147 | | VLC_HEVC_PROFILE_HIGH_THROUGHPUT_444_16_INTRA = MKPROF(HIGH_THROUGHPUT,444_16_INTRA), |
148 | | /**/ |
149 | | VLC_HEVC_PROFILE_MULTIVIEW_MAIN = HEVC_PROFILE_IDC_MULTIVIEW_MAIN, |
150 | | VLC_HEVC_PROFILE_SCALABLE_MAIN = HEVC_PROFILE_IDC_SCALABLE_MAIN, |
151 | | VLC_HEVC_PROFILE_3D_MAIN = HEVC_PROFILE_IDC_3D_MAIN, |
152 | | /* screen extended */ |
153 | | VLC_HEVC_PROFILE_SCREEN_EXTENDED_MAIN = MKPROF(SCREEN_EXTENDED,MAIN), |
154 | | VLC_HEVC_PROFILE_SCREEN_EXTENDED_MAIN_10 = MKPROF(SCREEN_EXTENDED,MAIN_10), |
155 | | VLC_HEVC_PROFILE_SCREEN_EXTENDED_MAIN_444 = MKPROF(SCREEN_EXTENDED,MAIN_444), |
156 | | VLC_HEVC_PROFILE_SCREEN_EXTENDED_MAIN_444_10 = MKPROF(SCREEN_EXTENDED,MAIN_444_10), |
157 | | VLC_HEVC_PROFILE_SCREEN_EXTENDED_HIGH_THROUGHPUT_444_14 = MKPROF(SCREEN_EXTENDED,HIGH_THROUGHPUT_444_14), |
158 | | /* scalable rext */ |
159 | | VLC_HEVC_PROFILE_SCALABLE_REXT = 10, |
160 | | }; |
161 | | #undef MKPROF |
162 | | /* vlc_hevc_profile helpers */ |
163 | | #define vlc_hevc_profile_is_Intra(p) (p && (1 << (2+HEVC_INDICATION_SHIFT))) |
164 | | |
165 | | /* NAL types from https://www.itu.int/rec/T-REC-H.265-201504-I */ |
166 | | enum hevc_nal_unit_type_e |
167 | | { |
168 | | HEVC_NAL_TRAIL_N = 0, /* Trailing */ |
169 | | HEVC_NAL_TRAIL_R = 1, /* Trailing Reference */ |
170 | | HEVC_NAL_TSA_N = 2, /* Temporal Sublayer Access */ |
171 | | HEVC_NAL_TSA_R = 3, /* Temporal Sublayer Access Reference */ |
172 | | HEVC_NAL_STSA_N = 4, /* Stepwise Temporal Sublayer Access */ |
173 | | HEVC_NAL_STSA_R = 5, /* Stepwise Temporal Sublayer Access Reference */ |
174 | | HEVC_NAL_RADL_N = 6, /* Random Access Decodable Leading (display order) */ |
175 | | HEVC_NAL_RADL_R = 7, /* Random Access Decodable Leading (display order) Reference */ |
176 | | HEVC_NAL_RASL_N = 8, /* Random Access Skipped Leading (display order) */ |
177 | | HEVC_NAL_RASL_R = 9, /* Random Access Skipped Leading (display order) Reference */ |
178 | | /* 10 to 15 reserved */ |
179 | | HEVC_NAL_RSV_VCL_N10= 10, |
180 | | HEVC_NAL_RSV_VCL_N12= 12, |
181 | | HEVC_NAL_RSV_VCL_N14= 14, |
182 | | /* Key frames */ |
183 | | HEVC_NAL_BLA_W_LP = 16, /* Broken Link Access with Associated RASL */ |
184 | | HEVC_NAL_BLA_W_RADL = 17, /* Broken Link Access with Associated RADL */ |
185 | | HEVC_NAL_BLA_N_LP = 18, /* Broken Link Access */ |
186 | | HEVC_NAL_IDR_W_RADL = 19, /* Instantaneous Decoder Refresh with Associated RADL */ |
187 | | HEVC_NAL_IDR_N_LP = 20, /* Instantaneous Decoder Refresh */ |
188 | | HEVC_NAL_CRA = 21, /* Clean Random Access */ |
189 | | /* 22 to 31 reserved */ |
190 | | HEVC_NAL_IRAP_VCL22 = 22, /* Intra Random Access Point */ |
191 | | HEVC_NAL_IRAP_VCL23 = 23, |
192 | | /* Non VCL NAL*/ |
193 | | HEVC_NAL_VPS = 32, |
194 | | HEVC_NAL_SPS = 33, |
195 | | HEVC_NAL_PPS = 34, |
196 | | HEVC_NAL_AUD = 35, /* Access unit delimiter */ |
197 | | HEVC_NAL_EOS = 36, /* End of sequence */ |
198 | | HEVC_NAL_EOB = 37, /* End of bitstream */ |
199 | | HEVC_NAL_FD = 38, /* Filler data*/ |
200 | | HEVC_NAL_PREF_SEI = 39, /* Prefix SEI */ |
201 | | HEVC_NAL_SUFF_SEI = 40, /* Suffix SEI */ |
202 | | /* 41 to 47 reserved */ |
203 | | HEVC_NAL_RSV_NVCL41 = 41, /* Reserved Non VCL */ |
204 | | HEVC_NAL_RSV_NVCL44 = 44, |
205 | | HEVC_NAL_RSV_NVCL45 = 45, |
206 | | HEVC_NAL_RSV_NVCL47 = 47, |
207 | | HEVC_NAL_UNSPEC48 = 48, /* Unspecified (custom) */ |
208 | | HEVC_NAL_UNSPEC55 = 55, |
209 | | HEVC_NAL_UNSPEC56 = 56, |
210 | | HEVC_NAL_UNSPEC63 = 63, |
211 | | HEVC_NAL_UNKNOWN |
212 | | }; |
213 | | |
214 | | enum hevc_slice_type_e |
215 | | { |
216 | | HEVC_SLICE_TYPE_B = 0, |
217 | | HEVC_SLICE_TYPE_P, |
218 | | HEVC_SLICE_TYPE_I |
219 | | }; |
220 | | |
221 | 0 | #define HEVC_MIN_HVCC_SIZE 23 |
222 | | |
223 | | /* checks if data is an HEVCDecoderConfigurationRecord */ |
224 | | static inline bool hevc_ishvcC( const uint8_t *p_buf, size_t i_buf ) |
225 | 0 | { |
226 | 0 | return ( i_buf >= HEVC_MIN_HVCC_SIZE && |
227 | 0 | p_buf[0] != 0x00 |
228 | | /* /!\Broken quicktime streams does not respect reserved bits |
229 | | (p_buf[13] & 0xF0) == 0xF0 && // Match all reserved bits |
230 | | (p_buf[15] & 0xFC) == 0xFC && |
231 | | (p_buf[16] & 0xFC) == 0xFC && |
232 | | (p_buf[17] & 0xF8) == 0xF8 && |
233 | | (p_buf[18] & 0xF8) == 0xF8 && |
234 | | (p_buf[21] & 0x03) != 0x02 */ |
235 | 0 | ); |
236 | 0 | } Unexecuted instantiation: avi.c:hevc_ishvcC Unexecuted instantiation: h26x.c:hevc_ishvcC Unexecuted instantiation: hevc.c:hevc_ishvcC Unexecuted instantiation: hevc_nal.c:hevc_ishvcC |
237 | | |
238 | | static inline uint8_t hevc_getNALLengthSize( const uint8_t *p_hvcC ) |
239 | 0 | { |
240 | 0 | return (p_hvcC[21] & 0x03) + 1; |
241 | 0 | } Unexecuted instantiation: avi.c:hevc_getNALLengthSize Unexecuted instantiation: h26x.c:hevc_getNALLengthSize Unexecuted instantiation: hevc.c:hevc_getNALLengthSize Unexecuted instantiation: hevc_nal.c:hevc_getNALLengthSize |
242 | | |
243 | | static inline uint8_t hevc_getNALType( const uint8_t *p_buf ) |
244 | 0 | { |
245 | 0 | return ((p_buf[0] & 0x7E) >> 1); |
246 | 0 | } Unexecuted instantiation: avi.c:hevc_getNALType Unexecuted instantiation: h26x.c:hevc_getNALType Unexecuted instantiation: hevc.c:hevc_getNALType Unexecuted instantiation: hevc_nal.c:hevc_getNALType |
247 | | |
248 | | static inline uint8_t hevc_getNALLayer( const uint8_t *p_buf ) |
249 | 0 | { |
250 | 0 | return ((p_buf[0] & 0x01) << 6) | (p_buf[1] >> 3); |
251 | 0 | } Unexecuted instantiation: avi.c:hevc_getNALLayer Unexecuted instantiation: h26x.c:hevc_getNALLayer Unexecuted instantiation: hevc.c:hevc_getNALLayer Unexecuted instantiation: hevc_nal.c:hevc_getNALLayer |
252 | | |
253 | | /* NAL decoding */ |
254 | | typedef struct hevc_video_parameter_set_t hevc_video_parameter_set_t; |
255 | | typedef struct hevc_sequence_parameter_set_t hevc_sequence_parameter_set_t; |
256 | | typedef struct hevc_picture_parameter_set_t hevc_picture_parameter_set_t; |
257 | | typedef struct hevc_slice_segment_header_t hevc_slice_segment_header_t; |
258 | | |
259 | | /* Decodes from three bytes emulation prevented or rbsp stream */ |
260 | | hevc_video_parameter_set_t * hevc_decode_vps( const uint8_t *, size_t, bool ); |
261 | | hevc_sequence_parameter_set_t * hevc_decode_sps( const uint8_t *, size_t, bool ); |
262 | | hevc_picture_parameter_set_t * hevc_decode_pps( const uint8_t *, size_t, bool ); |
263 | | |
264 | | typedef void(*pf_get_matchedxps)(uint8_t i_pps_id, void *priv, |
265 | | hevc_picture_parameter_set_t **, |
266 | | hevc_sequence_parameter_set_t **, |
267 | | hevc_video_parameter_set_t **); |
268 | | hevc_slice_segment_header_t * hevc_decode_slice_header( const uint8_t *, size_t, bool, |
269 | | pf_get_matchedxps, void *priv ); |
270 | | |
271 | | void hevc_rbsp_release_vps( hevc_video_parameter_set_t * ); |
272 | | void hevc_rbsp_release_sps( hevc_sequence_parameter_set_t * ); |
273 | | void hevc_rbsp_release_pps( hevc_picture_parameter_set_t * ); |
274 | | void hevc_rbsp_release_slice_header( hevc_slice_segment_header_t * ); |
275 | | |
276 | | /* set specific */ |
277 | | uint8_t hevc_get_sps_vps_id( const hevc_sequence_parameter_set_t * ); |
278 | | uint8_t hevc_get_pps_sps_id( const hevc_picture_parameter_set_t * ); |
279 | | uint8_t hevc_get_slice_pps_id( const hevc_slice_segment_header_t * ); |
280 | | bool hevc_get_slice_no_output_of_prior_pics_flag( const hevc_slice_segment_header_t * ); |
281 | | |
282 | | bool hevc_get_xps_id(const uint8_t *p_nalbuf, size_t i_nalbuf, uint8_t *pi_id); |
283 | | bool hevc_get_sps_profile_tier_level( const hevc_sequence_parameter_set_t *, |
284 | | uint8_t *pi_profile, uint8_t *pi_level ); |
285 | | enum vlc_hevc_profile_e |
286 | | hevc_get_vlc_profile( const hevc_sequence_parameter_set_t * ); |
287 | | bool hevc_get_picture_size( const hevc_sequence_parameter_set_t *, |
288 | | unsigned *p_ox, unsigned *p_oy, |
289 | | unsigned *p_w, unsigned *p_h, |
290 | | unsigned *p_vw, unsigned *p_vh ); |
291 | | bool hevc_get_frame_rate( const hevc_sequence_parameter_set_t *, |
292 | | const hevc_video_parameter_set_t * /* can be NULL */, |
293 | | unsigned *pi_num, unsigned *pi_den ); |
294 | | bool hevc_get_aspect_ratio( const hevc_sequence_parameter_set_t *, |
295 | | unsigned *pi_num, unsigned *pi_den ); |
296 | | bool hevc_get_chroma_luma( const hevc_sequence_parameter_set_t *, uint8_t *pi_chroma_format, |
297 | | uint8_t *pi_depth_luma, uint8_t *pi_depth_chroma ); |
298 | | bool hevc_get_colorimetry( const hevc_sequence_parameter_set_t *p_sps, |
299 | | video_color_primaries_t *p_primaries, |
300 | | video_transfer_func_t *p_transfer, |
301 | | video_color_space_t *p_colorspace, |
302 | | video_color_range_t *p_full_range ); |
303 | | void hevc_get_dpb_values( const hevc_sequence_parameter_set_t *, uint8_t *num_reorder_pics, |
304 | | uint8_t *max_latency_pics, uint8_t *max_dec_pic_buffering ); |
305 | | bool hevc_get_slice_type( const hevc_slice_segment_header_t *, enum hevc_slice_type_e * ); |
306 | | bool hevc_get_slice_pic_output( const hevc_slice_segment_header_t * ); |
307 | | |
308 | | /* Get level and Profile from DecoderConfigurationRecord */ |
309 | | bool hevc_get_profile_level(const es_format_t *p_fmt, uint8_t *pi_profile, |
310 | | uint8_t *pi_level, uint8_t *pi_nal_length_size); |
311 | | |
312 | | /* |
313 | | * HEVCDecoderConfigurationRecord related |
314 | | */ |
315 | | struct hevc_dcr_values |
316 | | { |
317 | | uint8_t general_configuration[12]; |
318 | | uint8_t i_numTemporalLayer; |
319 | | uint8_t i_chroma_idc; |
320 | | uint8_t i_bit_depth_luma_minus8; |
321 | | uint8_t i_bit_depth_chroma_minus8; |
322 | | bool b_temporalIdNested; |
323 | | }; |
324 | | |
325 | | #define HEVC_DCR_VPS_COUNT (HEVC_VPS_ID_MAX + 1) |
326 | | #define HEVC_DCR_SPS_COUNT (HEVC_SPS_ID_MAX + 1) |
327 | | #define HEVC_DCR_PPS_COUNT (HEVC_PPS_ID_MAX + 1) |
328 | | #define HEVC_DCR_SEI_COUNT (16) |
329 | | |
330 | | struct hevc_dcr_params |
331 | | { |
332 | | const uint8_t *p_vps[HEVC_DCR_VPS_COUNT], |
333 | | *p_sps[HEVC_DCR_SPS_COUNT], |
334 | | *p_pps[HEVC_DCR_PPS_COUNT], |
335 | | *p_seipref[HEVC_DCR_SEI_COUNT], |
336 | | *p_seisuff[HEVC_DCR_SEI_COUNT]; |
337 | | uint16_t rgi_vps[HEVC_DCR_VPS_COUNT], |
338 | | rgi_sps[HEVC_DCR_SPS_COUNT], |
339 | | rgi_pps[HEVC_DCR_PPS_COUNT], |
340 | | rgi_seipref[HEVC_DCR_SEI_COUNT], |
341 | | rgi_seisuff[HEVC_DCR_SEI_COUNT]; |
342 | | uint8_t i_vps_count, i_sps_count, i_pps_count; |
343 | | uint8_t i_seipref_count, i_seisuff_count; |
344 | | struct hevc_dcr_values *p_values; |
345 | | }; |
346 | | |
347 | | uint8_t * hevc_create_dcr( const struct hevc_dcr_params *p_params, |
348 | | uint8_t i_nal_length_size, |
349 | | bool b_completeness, size_t *pi_size ); |
350 | | |
351 | | /* Converts HEVCDecoderConfigurationRecord to Annex B format */ |
352 | | uint8_t * hevc_hvcC_to_AnnexB_NAL( const uint8_t *p_buf, size_t i_buf, |
353 | | size_t *pi_res, uint8_t *pi_nal_length_size ); |
354 | | |
355 | | /* |
356 | | * POC computing |
357 | | */ |
358 | | typedef struct |
359 | | { |
360 | | struct |
361 | | { |
362 | | int lsb; |
363 | | int msb; |
364 | | } prevTid0PicOrderCnt; |
365 | | |
366 | | bool HandleCraAsBlaFlag; |
367 | | bool first_picture; /* Must be set on start or on NAL_EOS */ |
368 | | } hevc_poc_ctx_t; |
369 | | |
370 | | static inline void hevc_poc_cxt_init( hevc_poc_ctx_t *p_ctx ) |
371 | 0 | { |
372 | 0 | p_ctx->prevTid0PicOrderCnt.lsb = 0; |
373 | 0 | p_ctx->prevTid0PicOrderCnt.msb = 0; |
374 | 0 | p_ctx->first_picture = true; |
375 | 0 | p_ctx->HandleCraAsBlaFlag = false; |
376 | 0 | } Unexecuted instantiation: avi.c:hevc_poc_cxt_init Unexecuted instantiation: h26x.c:hevc_poc_cxt_init Unexecuted instantiation: hevc.c:hevc_poc_cxt_init Unexecuted instantiation: hevc_nal.c:hevc_poc_cxt_init |
377 | | |
378 | | int hevc_compute_picture_order_count( const hevc_sequence_parameter_set_t *p_sps, |
379 | | const hevc_slice_segment_header_t *slice, |
380 | | hevc_poc_ctx_t *ctx ); |
381 | | bool hevc_NAL_IsIRAP( uint8_t i_nal_type ); |
382 | | bool hevc_get_IRAPNoRaslOutputFlag( uint8_t nal_type, |
383 | | const hevc_poc_ctx_t *); |
384 | | |
385 | | |
386 | | typedef struct hevc_sei_pic_timing_t hevc_sei_pic_timing_t; |
387 | | |
388 | | hevc_sei_pic_timing_t * hevc_decode_sei_pic_timing( bs_t *, |
389 | | const hevc_sequence_parameter_set_t * ); |
390 | | void hevc_release_sei_pic_timing( hevc_sei_pic_timing_t * ); |
391 | | |
392 | | typedef struct |
393 | | { |
394 | | int i_frames; |
395 | | } hevc_sei_recovery_point_t; |
396 | | |
397 | | bool hevc_decode_sei_recovery_point( bs_t *, hevc_sei_recovery_point_t * ); |
398 | | |
399 | | uint8_t hevc_get_num_clock_ts( const hevc_sequence_parameter_set_t *, |
400 | | const hevc_sei_pic_timing_t * /* can be NULL */ ); |
401 | | bool hevc_frame_is_progressive( const hevc_sequence_parameter_set_t *, |
402 | | const hevc_sei_pic_timing_t * /* can be NULL */); |
403 | | |
404 | | #ifdef __cplusplus |
405 | | } |
406 | | #endif |
407 | | |
408 | | #endif /* HEVC_NAL_H */ |