[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