@@ -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