Coverage Report

Created: 2026-05-16 07:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
hevc.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
h26x.c:hevc_getNALType
Line
Count
Source
247
3.15k
{
248
3.15k
    return ((p_buf[0] & 0x7E) >> 1);
249
3.15k
}
hevc.c:hevc_getNALType
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
h26x.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
}
hevc.c:hevc_getNALLayer
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 */