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