FFmpeg
Loading...
Searching...
No Matches
vvc_parser.c
Go to the documentation of this file.
1/*
2 * H.266 / VVC parser
3 *
4 * Copyright (C) 2021 Nuo Mi <nuomi2021@gmail.com>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include "libavutil/mem.h"
24#include "cbs.h"
25#include "cbs_h266.h"
26#include "parser.h"
27#include "parser_internal.h"
28
29#define START_CODE 0x000001 ///< start_code_prefix_one_3bytes
30#define IS_IDR(nut) (nut == VVC_IDR_W_RADL || nut == VVC_IDR_N_LP)
31#define IS_H266_SLICE(nut) (nut <= VVC_RASL_NUT || (nut >= VVC_IDR_W_RADL && nut <= VVC_GDR_NUT))
32
33typedef struct PuInfo {
39} PuInfo;
40
41typedef struct AuDetector {
46
60
65
70
71static int get_format(const H266RawSPS *sps)
72{
73 switch (sps->sps_bitdepth_minus8) {
74 case 0:
75 return pix_fmts_8bit[sps->sps_chroma_format_idc];
76 case 2:
77 return pix_fmts_10bit[sps->sps_chroma_format_idc];
78 }
79 return AV_PIX_FMT_NONE;
80}
81
82/**
83 * Find the end of the current frame in the bitstream.
84 * @return the position of the first byte of the next frame, or END_NOT_FOUND
85 */
86static int find_frame_end(AVCodecParserContext *s, const uint8_t *buf,
87 int buf_size)
88{
89 VVCParserContext *ctx = s->priv_data;
90 ParseContext *pc = &ctx->pc;
91 int i;
92
93 for (i = 0; i < buf_size; i++) {
94 int nut, code_len;
95
96 pc->state64 = (pc->state64 << 8) | buf[i];
97
98 if (((pc->state64 >> 3 * 8) & 0xFFFFFF) != START_CODE)
99 continue;
100
101 code_len = ((pc->state64 >> 3 * 8) & 0xFFFFFFFF) == 0x01 ? 4 : 3;
102
103 nut = (pc->state64 >> (8 + 3)) & 0x1F;
104 // 7.4.2.4.3 and 7.4.2.4.4
105 if ((nut >= VVC_OPI_NUT && nut <= VVC_PREFIX_APS_NUT &&
106 nut != VVC_PH_NUT) || nut == VVC_AUD_NUT
107 || nut == VVC_PREFIX_SEI_NUT
108 || nut == VVC_RSV_NVCL_26 || nut == VVC_UNSPEC_28
109 || nut == VVC_UNSPEC_29) {
110 if (pc->frame_start_found) {
111 pc->frame_start_found = 0;
112 return i - (code_len + 2);
113 }
114 } else if (nut == VVC_PH_NUT || IS_H266_SLICE(nut)) {
115 int sh_picture_header_in_slice_header_flag = buf[i] >> 7;
116
117 if (nut == VVC_PH_NUT || sh_picture_header_in_slice_header_flag) {
118 if (!pc->frame_start_found) {
119 pc->frame_start_found = 1;
120 } else { // First slice of next frame found
121 pc->frame_start_found = 0;
122 return i - (code_len + 2);
123 }
124 }
125 }
126 }
127 return END_NOT_FOUND;
128}
129
131{
132 int has_p = 0;
133 for (int i = 0; i < pu->nb_units; i++) {
134 CodedBitstreamUnit *unit = &pu->units[i];
135 if (IS_H266_SLICE(unit->type)) {
136 const H266RawSlice *slice = unit->content;
137 uint8_t type = slice->header.sh_slice_type;
138 if (type == VVC_SLICE_TYPE_B) {
139 return AV_PICTURE_TYPE_B;
140 }
141 if (type == VVC_SLICE_TYPE_P) {
142 has_p = 1;
143 }
144 }
145 }
146 return has_p ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
147}
148
150 const PuInfo *pu)
151{
152 static const uint8_t h266_sub_width_c[] = {
153 1, 2, 2, 1
154 };
155 static const uint8_t h266_sub_height_c[] = {
156 1, 2, 1, 1
157 };
158 const H266RawSPS *sps = pu->sps;
159 const H266RawPPS *pps = pu->pps;
161
162 s->pict_type = pu->pic_type;
163 s->format = get_format(sps);
164 s->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
165
166 s->key_frame = nal->nal_unit_type == VVC_IDR_W_RADL ||
167 nal->nal_unit_type == VVC_IDR_N_LP ||
168 nal->nal_unit_type == VVC_CRA_NUT ||
169 nal->nal_unit_type == VVC_GDR_NUT;
170
171 s->coded_width = pps->pps_pic_width_in_luma_samples;
172 s->coded_height = pps->pps_pic_height_in_luma_samples;
173 s->width = pps->pps_pic_width_in_luma_samples -
174 (pps->pps_conf_win_left_offset + pps->pps_conf_win_right_offset) *
175 h266_sub_width_c[sps->sps_chroma_format_idc];
176 s->height = pps->pps_pic_height_in_luma_samples -
177 (pps->pps_conf_win_top_offset + pps->pps_conf_win_bottom_offset) *
178 h266_sub_height_c[sps->sps_chroma_format_idc];
179
180 avctx->profile = sps->profile_tier_level.general_profile_idc;
181 avctx->level = sps->profile_tier_level.general_level_idc;
182
183 avctx->colorspace = (enum AVColorSpace) sps->vui.vui_matrix_coeffs;
184 avctx->color_primaries = (enum AVColorPrimaries) sps->vui.vui_colour_primaries;
185 avctx->color_trc = (enum AVColorTransferCharacteristic) sps->vui.vui_transfer_characteristics;
186 avctx->color_range =
187 sps->vui.vui_full_range_flag ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
188
189 if (sps->sps_ptl_dpb_hrd_params_present_flag &&
190 sps->sps_timing_hrd_params_present_flag) {
191 uint32_t num = sps->sps_general_timing_hrd_parameters.num_units_in_tick;
192 uint32_t den = sps->sps_general_timing_hrd_parameters.time_scale;
193
194 if (num != 0 && den != 0)
195 av_reduce(&avctx->framerate.den, &avctx->framerate.num,
196 num, den, 1 << 30);
197 }
198}
199
200//8.3.1 Decoding process for picture order count.
201//VTM did not follow the spec, and it's much simpler than spec.
202//We follow the VTM.
203static void get_slice_poc(VVCParserContext *s, int *poc,
204 const H266RawSPS *sps,
206 const H266RawSliceHeader *slice, void *log_ctx)
207{
208 int poc_msb, max_poc_lsb, poc_lsb;
209 AuDetector *d = &s->au_detector;
210 max_poc_lsb = 1 << (sps->sps_log2_max_pic_order_cnt_lsb_minus4 + 4);
211 poc_lsb = ph->ph_pic_order_cnt_lsb;
213 if (ph->ph_poc_msb_cycle_present_flag)
214 poc_msb = ph->ph_poc_msb_cycle_val * max_poc_lsb;
215 else
216 poc_msb = 0;
217 } else {
218 int prev_poc = d->prev_tid0_poc;
219 int prev_poc_lsb = prev_poc & (max_poc_lsb - 1);
220 int prev_poc_msb = prev_poc - prev_poc_lsb;
221 if (ph->ph_poc_msb_cycle_present_flag) {
222 poc_msb = ph->ph_poc_msb_cycle_val * max_poc_lsb;
223 } else {
224 if ((poc_lsb < prev_poc_lsb) && ((prev_poc_lsb - poc_lsb) >=
225 (max_poc_lsb / 2)))
226 poc_msb = prev_poc_msb + (unsigned)max_poc_lsb;
227 else if ((poc_lsb > prev_poc_lsb) && ((poc_lsb - prev_poc_lsb) >
228 (max_poc_lsb / 2)))
229 poc_msb = prev_poc_msb - (unsigned)max_poc_lsb;
230 else
231 poc_msb = prev_poc_msb;
232 }
233 }
234
235 *poc = poc_msb + poc_lsb;
236}
237
239{
240 d->prev_layer_id = UINT8_MAX;
241 d->prev_poc = INT_MAX;
242 d->prev_tid0_poc = INT_MAX;
243}
244
245static int is_au_start(VVCParserContext *s, const PuInfo *pu, void *log_ctx)
246{
247 //7.4.2.4.3
248 AuDetector *d = &s->au_detector;
249 const H266RawSPS *sps = pu->sps;
251 const H266RawPictureHeader *ph = pu->ph;
252 const H266RawSlice *slice = pu->slice;
253 int ret, poc, nut;
254
255 get_slice_poc(s, &poc, sps, ph, &slice->header, log_ctx);
256
257 ret = (nal->nuh_layer_id <= d->prev_layer_id) || (poc != d->prev_poc);
258
259 nut = nal->nal_unit_type;
260 d->prev_layer_id = nal->nuh_layer_id;
261 d->prev_poc = poc;
262 if (nal->nuh_temporal_id_plus1 == 1 &&
263 !ph->ph_non_ref_pic_flag && nut != VVC_RADL_NUT
264 && nut != VVC_RASL_NUT) {
265 d->prev_tid0_poc = poc;
266 }
267 return ret;
268}
269
270static int get_pu_info(PuInfo *info, const CodedBitstreamH266Context *h266,
271 const CodedBitstreamFragment *pu, void *logctx)
272{
274 int ret;
275
276 memset(info, 0, sizeof(*info));
277 for (int i = 0; i < pu->nb_units; i++) {
278 nal = pu->units[i].content;
279 if (!nal)
280 continue;
281 if ( nal->nal_unit_type == VVC_PH_NUT ) {
282 const H266RawPH *ph = pu->units[i].content;
283 info->ph = &ph->ph_picture_header;
284 } else if (IS_H266_SLICE(nal->nal_unit_type)) {
285 info->slice = pu->units[i].content;
287 info->ph = &info->slice->header.sh_picture_header;
288 if (!info->ph) {
289 av_log(logctx, AV_LOG_ERROR,
290 "can't find picture header in picture unit.\n");
292 goto error;
293 }
294 break;
295 }
296 }
297 if (!info->slice) {
298 av_log(logctx, AV_LOG_ERROR, "can't find slice in picture unit.\n");
300 goto error;
301 }
302 info->pps = h266->pps[info->ph->ph_pic_parameter_set_id];
303 if (!info->pps) {
304 av_log(logctx, AV_LOG_ERROR, "PPS id %d is not available.\n",
307 goto error;
308 }
309 info->sps = h266->sps[info->pps->pps_seq_parameter_set_id];
310 if (!info->sps) {
311 av_log(logctx, AV_LOG_ERROR, "SPS id %d is not available.\n",
314 goto error;
315 }
316 info->pic_type = get_pict_type(pu);
317 return 0;
318error:
319 memset(info, 0, sizeof(*info));
320 return ret;
321}
322
323static int append_au(AVPacket *pkt, const uint8_t *buf, int buf_size)
324{
325 int offset = pkt->size;
326 int ret;
327 if ((ret = av_grow_packet(pkt, buf_size)) < 0)
328 goto end;
329 memcpy(pkt->data + offset, buf, buf_size);
330end:
331 return ret;
332}
333
334/**
335 * Parse NAL units of found picture and decode some basic information.
336 *
337 * @param s parser context.
338 * @param avctx codec context.
339 * @param buf buffer with field/frame data.
340 * @param buf_size size of the buffer.
341 * @return < 0 for error, == 0 for a complete au, > 0 is not a completed au.
342 */
343static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf,
344 int buf_size, AVCodecContext *avctx)
345{
346 VVCParserContext *ctx = s->priv_data;
347 const CodedBitstreamH266Context *h266 = ctx->cbc->priv_data;
348
349 CodedBitstreamFragment *pu = &ctx->picture_unit;
350 int ret;
351 PuInfo info;
352
353 if (!buf_size) {
354 if (ctx->au.size) {
355 av_packet_move_ref(&ctx->last_au, &ctx->au);
356 return 0;
357 }
358 return 1;
359 }
360
361 if ((ret = ff_cbs_read(ctx->cbc, pu, NULL, buf, buf_size)) < 0) {
362 av_log(avctx, AV_LOG_ERROR, "Failed to parse picture unit.\n");
363 goto end;
364 }
365 if ((ret = get_pu_info(&info, h266, pu, avctx)) < 0)
366 goto end;
367 if (append_au(&ctx->au, buf, buf_size) < 0) {
368 ret = AVERROR(ENOMEM);
369 goto end;
370 }
371 if (is_au_start(ctx, &info, avctx)) {
372 set_parser_ctx(s, avctx, &info);
373 av_packet_move_ref(&ctx->last_au, &ctx->au);
374 } else {
375 ret = 1; //not a completed au
376 }
377end:
378 ff_cbs_fragment_reset(pu);
379 return ret;
380}
381
382/**
383 * Combine PU to AU
384 *
385 * @param s parser context.
386 * @param avctx codec context.
387 * @param buf buffer to a PU.
388 * @param buf_size size of the buffer.
389 * @return < 0 for error, == 0 a complete au, > 0 not a completed au.
390 */
392 const uint8_t **buf, int *buf_size)
393{
394 VVCParserContext *ctx = s->priv_data;
395 int ret;
396
397 ctx->cbc->log_ctx = avctx;
398
399 av_packet_unref(&ctx->last_au);
400 ret = parse_nal_units(s, *buf, *buf_size, avctx);
401 if (ret == 0) {
402 if (ctx->last_au.size) {
403 *buf = ctx->last_au.data;
404 *buf_size = ctx->last_au.size;
405 } else {
406 ret = 1; //no output
407 }
408 }
409 ctx->cbc->log_ctx = NULL;
410 return ret;
411}
412
414 const uint8_t **poutbuf, int *poutbuf_size,
415 const uint8_t *buf, int buf_size)
416{
417 int next, ret;
418 VVCParserContext *ctx = s->priv_data;
419 ParseContext *pc = &ctx->pc;
420 CodedBitstreamFragment *pu = &ctx->picture_unit;
421
422 int is_dummy_buf = !buf_size;
423 int flush = !buf_size;
424 const uint8_t *dummy_buf = buf;
425
426 *poutbuf = NULL;
427 *poutbuf_size = 0;
428
429 if (avctx->extradata_size && !ctx->parsed_extradata) {
430 ctx->parsed_extradata = 1;
431
432 ret = ff_cbs_read_extradata_from_codec(ctx->cbc, pu, avctx);
433 if (ret < 0)
434 av_log(avctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
435
436 ff_cbs_fragment_reset(pu);
437 }
438
439 if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) {
440 next = buf_size;
441 } else {
442 next = find_frame_end(s, buf, buf_size);
443 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0)
444 return buf_size;
445 }
446
447 is_dummy_buf &= (dummy_buf == buf);
448
449 if (!is_dummy_buf) {
450 ret = combine_au(s, avctx, &buf, &buf_size);
451 if (ret > 0 && flush) {
452 buf_size = 0;
453 ret = combine_au(s, avctx, &buf, &buf_size);
454 }
455 if (ret != 0)
456 return next;
457 }
458
459 *poutbuf = buf;
460 *poutbuf_size = buf_size;
461
462 return next;
463}
464
480
482{
483 VVCParserContext *ctx = s->priv_data;
484 int ret;
485
486 ret = ff_cbs_init(&ctx->cbc, AV_CODEC_ID_VVC, NULL);
487 if (ret < 0)
488 return ret;
489 au_detector_init(&ctx->au_detector);
490
491 ctx->cbc->decompose_unit_types = decompose_unit_types;
492 ctx->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
493
494 return ret;
495}
496
498{
499 VVCParserContext *ctx = s->priv_data;
500
501 av_packet_unref(&ctx->au);
502 av_packet_unref(&ctx->last_au);
503 ff_cbs_fragment_free(&ctx->picture_unit);
504
505 ff_cbs_close(&ctx->cbc);
506 av_freep(&ctx->pc.buffer);
507}
508
static AVFormatContext * ctx
static int parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition apv_parser.c:92
static const CodedBitstreamUnitType decompose_unit_types[]
Definition apv_parser.c:178
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
static enum AVPixelFormat pix_fmts_8bit[2][2]
Definition av1_parser.c:38
static enum AVPixelFormat pix_fmts_10bit[2][2]
Definition av1_parser.c:42
#define PARSER_FLAG_COMPLETE_FRAMES
Definition avcodec.h:2651
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
static int FUNC ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
static int FUNC nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
static AVPacket * pkt
uint64_t pps
Definition dovi_rpuenc.c:36
void(* flush)(AVBSFContext *ctx)
Definition dts2pts.c:610
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
@ AV_CODEC_ID_VVC
Definition codec_id.h:247
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
Definition packet.c:121
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition packet.c:491
@ AV_PICTURE_STRUCTURE_FRAME
coded as frame
Definition avcodec.h:2614
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition avutil.h:280
cl_device_type type
unsigned offset
Definition libaomenc.c:763
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition cbs.h:66
@ VVC_SLICE_TYPE_B
Definition vvc.h:64
@ VVC_SLICE_TYPE_P
Definition vvc.h:65
@ VVC_RASL_NUT
Definition vvc.h:32
@ VVC_SPS_NUT
Definition vvc.h:44
@ VVC_PREFIX_SEI_NUT
Definition vvc.h:52
@ VVC_CRA_NUT
Definition vvc.h:38
@ VVC_IDR_N_LP
Definition vvc.h:37
@ VVC_TRAIL_NUT
Definition vvc.h:29
@ VVC_OPI_NUT
Definition vvc.h:41
@ VVC_RSV_NVCL_26
Definition vvc.h:55
@ VVC_RADL_NUT
Definition vvc.h:31
@ VVC_PH_NUT
Definition vvc.h:48
@ VVC_VPS_NUT
Definition vvc.h:43
@ VVC_IDR_W_RADL
Definition vvc.h:36
@ VVC_STSA_NUT
Definition vvc.h:30
@ VVC_GDR_NUT
Definition vvc.h:39
@ VVC_AUD_NUT
Definition vvc.h:49
@ VVC_PREFIX_APS_NUT
Definition vvc.h:46
@ VVC_PPS_NUT
Definition vvc.h:45
@ VVC_UNSPEC_29
Definition vvc.h:58
@ VVC_UNSPEC_28
Definition vvc.h:57
#define av_cold
Definition attributes.h:117
Memory handling functions.
int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size)
Combine the (truncated) bitstream to a complete frame.
Definition parser.c:213
#define END_NOT_FOUND
Definition parser.h:40
#define PARSER_CODEC_LIST(...)
const FFCodecParser ff_vvc_parser
Definition vvc_parser.c:509
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
#define AV_PIX_FMT_GRAY10
Definition pixfmt.h:525
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition pixfmt.h:642
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition pixfmt.h:672
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
AVColorSpace
YUV colorspace type.
Definition pixfmt.h:706
#define START_CODE
#define FF_ARRAY_ELEMS(a)
main external API structure.
Definition avcodec.h:443
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:681
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
AVRational framerate
Definition avcodec.h:563
int level
Encoding level descriptor.
Definition avcodec.h:1646
int profile
profile
Definition avcodec.h:1636
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
int extradata_size
Definition avcodec.h:527
This structure stores compressed data.
Definition packet.h:580
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
int prev_tid0_poc
Definition vvc_parser.c:43
uint8_t prev_layer_id
Definition vvc_parser.c:42
Context structure for coded bitstream operations.
Definition cbs.h:226
Coded bitstream fragment structure, combining one or more units.
Definition cbs.h:129
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition cbs.h:175
int nb_units
Number of units in this fragment.
Definition cbs.h:160
H266RawSPS * sps[VVC_MAX_SPS_COUNT]
RefStruct references.
Definition cbs_h266.h:870
H266RawPPS * pps[VVC_MAX_PPS_COUNT]
RefStruct references.
Definition cbs_h266.h:871
Coded bitstream unit structure.
Definition cbs.h:77
void * content
Pointer to the decomposed form of this unit.
Definition cbs.h:114
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition cbs.h:81
uint8_t nal_unit_type
Definition cbs_h266.h:31
uint8_t pps_seq_parameter_set_id
Definition cbs_h266.h:500
uint8_t ph_pic_parameter_set_id
Definition cbs_h266.h:682
uint8_t sh_slice_type
Definition cbs_h266.h:780
H266RawNALUnitHeader nal_unit_header
Definition cbs_h266.h:772
H266RawPictureHeader sh_picture_header
Definition cbs_h266.h:774
uint8_t sh_picture_header_in_slice_header_flag
Definition cbs_h266.h:773
H266RawSliceHeader header
Definition cbs_h266.h:844
uint64_t state64
contains the last 8 bytes in MSB order
Definition parser.h:37
int frame_start_found
Definition parser.h:34
int pic_type
Definition vvc_parser.c:38
const H266RawSPS * sps
Definition vvc_parser.c:35
const H266RawPictureHeader * ph
Definition vvc_parser.c:36
const H266RawPPS * pps
Definition vvc_parser.c:34
const H266RawSlice * slice
Definition vvc_parser.c:37
CodedBitstreamFragment picture_unit
Definition vvc_parser.c:51
AuDetector au_detector
Definition vvc_parser.c:56
AVPacket last_au
Definition vvc_parser.c:54
CodedBitstreamContext * cbc
Definition vvc_parser.c:49
ParseContext pc
Definition vvc_parser.c:48
#define av_freep(p)
#define av_log(a,...)
static void error(const char *err)
static int get_pu_info(PuInfo *info, const CodedBitstreamH266Context *h266, const CodedBitstreamFragment *pu, void *logctx)
Definition vvc_parser.c:270
static void au_detector_init(AuDetector *d)
Definition vvc_parser.c:238
static av_cold void vvc_parser_close(AVCodecParserContext *s)
Definition vvc_parser.c:497
static av_cold int vvc_parser_init(AVCodecParserContext *s)
Definition vvc_parser.c:481
static int append_au(AVPacket *pkt, const uint8_t *buf, int buf_size)
Definition vvc_parser.c:323
static int get_pict_type(const CodedBitstreamFragment *pu)
Definition vvc_parser.c:130
static void set_parser_ctx(AVCodecParserContext *s, AVCodecContext *avctx, const PuInfo *pu)
Definition vvc_parser.c:149
static int find_frame_end(AVCodecParserContext *s, const uint8_t *buf, int buf_size)
Find the end of the current frame in the bitstream.
Definition vvc_parser.c:86
static int is_au_start(VVCParserContext *s, const PuInfo *pu, void *log_ctx)
Definition vvc_parser.c:245
static void get_slice_poc(VVCParserContext *s, int *poc, const H266RawSPS *sps, const H266RawPictureHeader *ph, const H266RawSliceHeader *slice, void *log_ctx)
Definition vvc_parser.c:203
#define IS_IDR(nut)
Definition vvc_parser.c:30
#define IS_H266_SLICE(nut)
Definition vvc_parser.c:31
static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, int buf_size, AVCodecContext *avctx)
Parse NAL units of found picture and decode some basic information.
Definition vvc_parser.c:343
static int combine_au(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **buf, int *buf_size)
Combine PU to AU.
Definition vvc_parser.c:391
static int vvc_parser_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition vvc_parser.c:413
static int get_format(const H266RawSPS *sps)
Definition vvc_parser.c:71