[vlc-commits] [Git][videolan/vlc][master] 2 commits: demux: asf: fix flip4mac multiple packets handling

François Cartegnie (@fcartegnie) gitlab at videolan.org
Fri Sep 25 07:04:20 UTC 2026



François Cartegnie pushed to branch master at VideoLAN / VLC


Commits:
42bd2e50 by François Cartegnie at 2026-09-25T08:51:46+02:00
demux: asf: fix flip4mac multiple packets handling

- - - - -
8fd5f4c1 by François Cartegnie at 2026-09-25T08:51:46+02:00
demux: mp4: fix flip4mac ASF handling

refs samples/mov/flip4mac/video.mov

- - - - -


4 changed files:

- modules/demux/asf/asfpacket.c
- modules/demux/mp4/libmp4.c
- modules/demux/mp4/libmp4.h
- modules/demux/mp4/mp4.c


Changes:

=====================================
modules/demux/asf/asfpacket.c
=====================================
@@ -449,7 +449,7 @@ int DemuxASFPacket( asf_packet_sys_t *p_packetsys,
     pkt.property = p_peek[i_skip]; i_skip++;
     pkt.multiple = !!(i_packet_flags&0x01);
 
-    pkt.length = i_data_packet_min;
+    pkt.length = p_packetsys->b_can_hold_multiple_packets ? i_data_packet_max : i_data_packet_min;
     pkt.padding_length = 0;
 
     if (GetValue2b(&pkt.length, p_peek, &i_skip, i_data_packet_min - i_skip, i_packet_flags >> 5) < 0)
@@ -479,17 +479,22 @@ int DemuxASFPacket( asf_packet_sys_t *p_packetsys,
     pkt.send_time = VLC_TICK_FROM_MS(GetDWLE( p_peek + i_skip )); i_skip += 4;
     /* uint16_t i_packet_duration = GetWLE( p_peek + i_skip ); */ i_skip += 2;
 
+    uint32_t i_read_length = pkt.length;
     if( i_data_end &&
         (pkt.length > i_data_end ||
          i_read_pos > i_data_end - pkt.length) )
     {
-        vlc_warning( p_packetsys->logger, "pkt size %"PRIu32" at %"PRIu64" does not fit data chunk size %"PRIu32,
-                  pkt.length, i_read_pos, i_data_packet_max );
-        return 0;
+        if( !p_packetsys->b_can_hold_multiple_packets )
+        {
+            vlc_warning( p_packetsys->logger, "pkt size %"PRIu32" at %"PRIu64" does not fit data chunk size %"PRIu32,
+                         pkt.length, i_read_pos, i_data_packet_max );
+            return 0;
+        }
+        i_read_length = i_data_end - i_read_pos;
     }
 
-    i_return = vlc_stream_Peek( p_packetsys->s, &p_peek, pkt.length );
-    if( i_return <= 0 || pkt.length == 0 || (size_t)i_return < pkt.length )
+    i_return = vlc_stream_Peek( p_packetsys->s, &p_peek, i_read_length );
+    if( i_return <= 0 || pkt.length == 0 || (size_t)i_return < i_read_length )
     {
         vlc_warning( p_packetsys->logger, "unexpected end of file" );
         return 0;
@@ -512,9 +517,10 @@ int DemuxASFPacket( asf_packet_sys_t *p_packetsys,
 
     pkt.i_skip = i_skip;
     pkt.p_peek = p_peek;
-    pkt.left = pkt.length;
+    pkt.left = i_read_length;
 
-    for( int i_payload = 0; i_payload < i_payload_count ; i_payload++ )
+    for( int i_payload = 0; i_payload < i_payload_count &&
+         (!p_packetsys->b_can_hold_multiple_packets || pkt.left > 0); i_payload++ )
         if (DemuxPayload(p_packetsys, &pkt, i_payload) < 0)
         {
             vlc_warning( p_packetsys->logger, "payload err %d / %d", i_payload + 1, i_payload_count );
@@ -535,7 +541,7 @@ int DemuxASFPacket( asf_packet_sys_t *p_packetsys,
         }
         else if( pkt.left < pkt.padding_length )
         {
-            toskip = 0;
+            toskip = p_packetsys->b_can_hold_multiple_packets ? pkt.left : 0;
 #ifdef ASF_DEBUG
             vlc_warning( p_packetsys->logger, "Read %"PRIu32" too much bytes from the packet",
                                pkt.padding_length - pkt.left );


=====================================
modules/demux/mp4/libmp4.c
=====================================
@@ -2228,8 +2228,10 @@ static int MP4_ReadBox_ASF( stream_t *p_stream, MP4_Box_t *p_box )
     if (i_read != 8)
         MP4_READBOX_EXIT( 0 );
 
-    MP4_GET1BYTE( p_asf->i_stream_number );
-    /* remaining is unknown */
+    MP4_GET4BYTESLE( p_asf->i_stream_number );
+    MP4_GET4BYTESLE( p_asf->i_packet_size );
+    if( p_asf->i_packet_size == 0 )
+        MP4_READBOX_EXIT( 0 );
 
     MP4_READBOX_EXIT( 1 );
 }


=====================================
modules/demux/mp4/libmp4.h
=====================================
@@ -1349,7 +1349,8 @@ typedef struct
 
 typedef struct
 {
-    uint8_t i_stream_number;
+    uint32_t i_stream_number;
+    uint32_t i_packet_size;
 } MP4_Box_data_ASF_t;
 
 typedef union


=====================================
modules/demux/mp4/mp4.c
=====================================
@@ -976,9 +976,11 @@ static void MP4_Block_Send( demux_t *p_demux, mp4_track_t *p_track, block_t *p_b
             do
             {
                 startpos = vlc_stream_Tell(p_sys->asfpacketsys.s);
+                const uint32_t i_packet_size =
+                    p_track->BOXDATA(p_asf)->i_packet_size;
                 DemuxASFPacket( &p_sys->asfpacketsys,
-                                p_block->i_buffer - startpos,
-                                p_block->i_buffer - startpos,
+                                __MIN(p_block->i_buffer - startpos, i_packet_size),
+                                i_packet_size,
                                 0, p_block->i_buffer );
             } while( vlc_stream_Tell(p_sys->asfpacketsys.s) != p_block->i_buffer &&
                      vlc_stream_Tell(p_sys->asfpacketsys.s) != startpos );



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/db5d59a27a4823d751afe2c317b7eaff716195ed...8fd5f4c1aebedb98143ade8bfa96d876dc21307a

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/db5d59a27a4823d751afe2c317b7eaff716195ed...8fd5f4c1aebedb98143ade8bfa96d876dc21307a
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help




More information about the vlc-commits mailing list