Coverage Report

Created: 2025-08-29 06:30

/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 */