Skip to content

Commit 90de925

Browse files
authored
Merge pull request #3 from K-os/fix_parameter_sets
Fix parsing VvcPTLRecord and insert parameter sets correctly
2 parents fd6333b + 9ae2081 commit 90de925

1 file changed

Lines changed: 67 additions & 24 deletions

File tree

libavcodec/vvc_mp4toannexb_bsf.c

Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,15 @@ static int vvc_extradata_to_annexb(AVBSFContext *ctx)
5555
length_size = (( temp & 6) >> 1) + 1;
5656
ptl_present = temp & 1;
5757
if (ptl_present) {
58-
int num_bytes_constraint_info;
59-
int general_profile_idc;
60-
int general_tier_flag;
61-
int ptl_num_sub_profiles;
62-
int temp3, temp4;
63-
int temp2 = bytestream2_get_be16(&gb);
58+
int num_bytes_constraint_info;
59+
int general_profile_idc;
60+
int general_tier_flag;
61+
int general_level_idc;
62+
int ptl_frame_only_constraint_flag;
63+
int ptl_multi_layer_enabled_flag;
64+
int ptl_num_sub_profiles;
65+
int temp3, temp4, temp5;
66+
int temp2 = bytestream2_get_be16(&gb);
6467
int ols_idx = (temp2 >> 7) & 0x1ff;
6568
int num_sublayers = (temp2 >> 4) & 0x7;
6669
int constant_frame_rate = (temp2 >> 2) & 0x3;
@@ -74,24 +77,37 @@ static int vvc_extradata_to_annexb(AVBSFContext *ctx)
7477
temp4 = bytestream2_get_byte(&gb);
7578
general_profile_idc = (temp4 >> 1) & 0x7f;
7679
general_tier_flag = (temp4) & 1;
80+
general_level_idc = bytestream2_get_byte(&gb);
7781
av_log(ctx, AV_LOG_DEBUG,
7882
"general_profile_idc %d, num_sublayers %d num_bytes_constraint_info %d\n", general_profile_idc, num_sublayers, num_bytes_constraint_info);
79-
for (i = 0; i < num_bytes_constraint_info; i++)
80-
// unsigned int(1) ptl_frame_only_constraint_flag;
81-
// unsigned int(1) ptl_multi_layer_enabled_flag;
83+
84+
temp5 = bytestream2_get_byte(&gb);
85+
ptl_frame_only_constraint_flag = (temp5 >> 7) & 0x1;
86+
ptl_multi_layer_enabled_flag = (temp5 >> 6) & 0x1;
87+
for (i = 0; i < num_bytes_constraint_info-1; i++) {
8288
// unsigned int(8*num_bytes_constraint_info - 2) general_constraint_info;
8389
bytestream2_get_byte(&gb);
84-
/*for (i=num_sublayers - 2; i >= 0; i--)
85-
unsigned int(1) ptl_sublayer_level_present_flag[i];
86-
for (j=num_sublayers; j<=8 && num_sublayers > 1; j++)
87-
bit(1) ptl_reserved_zero_bit = 0;
88-
*/
89-
bytestream2_get_byte(&gb);
90-
/*for (i=num_sublayers-2; i >= 0; i--)
91-
if (ptl_sublayer_level_present_flag[i])
92-
unsigned int(8) sublayer_level_idc[i]; */
93-
ptl_num_sub_profiles = bytestream2_get_byte(&gb); // unsigned int(8) sublayer_level_idc;
90+
}
9491

92+
if( num_sublayers > 1 )
93+
{
94+
int temp6 = bytestream2_get_byte(&gb);
95+
uint8_t ptl_sublayer_level_present_flag[8] = {0};
96+
uint8_t sublayer_level_idc[8] = {0};
97+
for (i=num_sublayers - 2; i >= 0; i--){
98+
ptl_sublayer_level_present_flag[i] = (temp6 >> (7 - (num_sublayers - 2 - i))) & 0x01;
99+
}
100+
// for (j=num_sublayers; j<=8 && num_sublayers > 1; j++)
101+
// bit(1) ptl_reserved_zero_bit = 0;
102+
for (i=num_sublayers-2; i >= 0; i--)
103+
{
104+
if (ptl_sublayer_level_present_flag[i]) {
105+
sublayer_level_idc[i] = bytestream2_get_byte(&gb);
106+
}
107+
}
108+
}
109+
110+
ptl_num_sub_profiles = bytestream2_get_byte(&gb);
95111
for (j=0; j < ptl_num_sub_profiles; j++) {
96112
// unsigned int(32) general_sub_profile_idc[j];
97113
bytestream2_get_be16(&gb);
@@ -192,7 +208,8 @@ static int vvc_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
192208
AVPacket *in;
193209
GetByteContext gb;
194210

195-
int got_irap = 0;
211+
int is_irap = 0;
212+
int added_extra = 0;
196213
int i, ret = 0;
197214

198215
ret = ff_bsf_get_packet(ctx, &in);
@@ -207,10 +224,37 @@ static int vvc_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
207224

208225
bytestream2_init(&gb, in->data, in->size);
209226

227+
/* check if this packet contains an IRAP. The extradata will need to be added before any potential PH_NUT */
228+
while (bytestream2_get_bytes_left(&gb)) {
229+
uint32_t nalu_size = 0;
230+
int nalu_type;
231+
232+
if (bytestream2_get_bytes_left(&gb) < s->length_size) {
233+
ret = AVERROR_INVALIDDATA;
234+
goto fail;
235+
}
236+
237+
for (i = 0; i < s->length_size; i++)
238+
nalu_size = (nalu_size << 8) | bytestream2_get_byte(&gb);
239+
240+
if (nalu_size < 2 || nalu_size > bytestream2_get_bytes_left(&gb)) {
241+
ret = AVERROR_INVALIDDATA;
242+
goto fail;
243+
}
244+
245+
nalu_type = (bytestream2_peek_be16(&gb) >> 3) & 0x1f;
246+
is_irap = nalu_type >= VVC_IDR_W_RADL && nalu_type <= VVC_RSV_IRAP_11;
247+
if (is_irap) {
248+
break;
249+
}
250+
bytestream2_seek(&gb, nalu_size, SEEK_CUR);
251+
}
252+
253+
bytestream2_seek(&gb, 0, SEEK_SET);
210254
while (bytestream2_get_bytes_left(&gb)) {
211255
uint32_t nalu_size = 0;
212256
int nalu_type;
213-
int is_irap, add_extradata, extra_size, prev_size;
257+
int add_extradata, extra_size, prev_size;
214258

215259
if (bytestream2_get_bytes_left(&gb) < s->length_size) {
216260
ret = AVERROR_INVALIDDATA;
@@ -228,10 +272,9 @@ static int vvc_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
228272
nalu_type = (bytestream2_peek_be16(&gb) >> 3) & 0x1f;
229273

230274
/* prepend extradata to IRAP frames */
231-
is_irap = nalu_type >= 16 && nalu_type <= 23;
232-
add_extradata = is_irap && !got_irap;
275+
add_extradata = is_irap && nalu_type != VVC_AUD_NUT && !added_extra;
233276
extra_size = add_extradata * ctx->par_out->extradata_size;
234-
got_irap |= is_irap;
277+
added_extra |= add_extradata;
235278

236279
if (FFMIN(INT_MAX, SIZE_MAX) < 4ULL + nalu_size + extra_size) {
237280
ret = AVERROR_INVALIDDATA;

0 commit comments

Comments
 (0)