Browse Source

demux: mp4: ensure PCR updates are sent with large buffering sequence

pull/199/head
François Cartegnie 2 months ago
committed by Jean-Baptiste Kempf
parent
commit
fa7e1cdd3e
  1. 27
      modules/demux/mp4/mp4.c

27
modules/demux/mp4/mp4.c

@ -1782,6 +1782,7 @@ static int DemuxMoov( demux_t *p_demux )
{ {
mp4_track_t *tk = NULL; mp4_track_t *tk = NULL;
i_status = VLC_DEMUXER_EOS; i_status = VLC_DEMUXER_EOS;
vlc_tick_t i_minnzdts = VLC_TICK_MAX;
/* First pass, find any track within our target increment, ordered by position */ /* First pass, find any track within our target increment, ordered by position */
for( i_track = 0; i_track < p_sys->i_tracks; i_track++ ) for( i_track = 0; i_track < p_sys->i_tracks; i_track++ )
@ -1795,11 +1796,13 @@ static int DemuxMoov( demux_t *p_demux )
/* At least still have data to demux on this or next turns */ /* At least still have data to demux on this or next turns */
i_status = VLC_DEMUXER_SUCCESS; i_status = VLC_DEMUXER_SUCCESS;
if ( MP4_TrackGetDTSPTS( p_demux, tk_tmp, NULL ) <= i_nztime + DEMUX_INCREMENT ) vlc_tick_t i_nzdts = MP4_TrackGetDTSPTS( p_demux, tk_tmp, NULL );
if ( i_nzdts <= i_nztime + DEMUX_INCREMENT )
{ {
if( tk == NULL || MP4_TrackGetPos( tk_tmp ) < MP4_TrackGetPos( tk ) ) if( tk == NULL || MP4_TrackGetPos( tk_tmp ) < MP4_TrackGetPos( tk ) )
tk = tk_tmp; tk = tk_tmp;
} }
i_minnzdts = __MIN(i_minnzdts, i_nzdts);
} }
if( tk ) if( tk )
@ -1833,12 +1836,18 @@ static int DemuxMoov( demux_t *p_demux )
i_status = VLC_DEMUXER_SUCCESS; i_status = VLC_DEMUXER_SUCCESS;
} }
if( i_minnzdts != VLC_TICK_MAX && VLC_TICK_0 + i_minnzdts > p_sys->i_pcr )
{
p_sys->i_pcr = VLC_TICK_0 + i_minnzdts;
es_out_SetPCR( p_demux->out, p_sys->i_pcr );
}
if( i_status != VLC_DEMUXER_SUCCESS || !tk ) if( i_status != VLC_DEMUXER_SUCCESS || !tk )
break; break;
} }
p_sys->i_nztime += DEMUX_INCREMENT; p_sys->i_nztime += DEMUX_INCREMENT;
if( p_sys->i_pcr != VLC_TICK_INVALID ) if( p_sys->i_pcr != VLC_TICK_INVALID && VLC_TICK_0 + p_sys->i_nztime > p_sys->i_pcr )
{ {
p_sys->i_pcr = VLC_TICK_0 + p_sys->i_nztime; p_sys->i_pcr = VLC_TICK_0 + p_sys->i_nztime;
es_out_SetPCR( p_demux->out, p_sys->i_pcr ); es_out_SetPCR( p_demux->out, p_sys->i_pcr );
@ -5089,6 +5098,7 @@ static int DemuxMoof( demux_t *p_demux )
{ {
mp4_track_t *tk = NULL; mp4_track_t *tk = NULL;
i_status = VLC_DEMUXER_EOS; i_status = VLC_DEMUXER_EOS;
vlc_tick_t i_minnzdts = VLC_TICK_MAX;
/* First pass, find any track within our target increment, ordered by position */ /* First pass, find any track within our target increment, ordered by position */
for( unsigned i = 0; i < p_sys->i_tracks; i++ ) for( unsigned i = 0; i < p_sys->i_tracks; i++ )
@ -5104,11 +5114,13 @@ static int DemuxMoof( demux_t *p_demux )
/* At least still have data to demux on this or next turns */ /* At least still have data to demux on this or next turns */
i_status = VLC_DEMUXER_SUCCESS; i_status = VLC_DEMUXER_SUCCESS;
if( MP4_rescale_mtime( tk_tmp->i_time, tk_tmp->i_timescale ) <= i_nztime + DEMUX_INCREMENT ) vlc_tick_t i_nzdts = MP4_rescale_mtime( tk_tmp->i_time, tk_tmp->i_timescale );
if( i_nzdts <= i_nztime + DEMUX_INCREMENT )
{ {
if( tk == NULL || tk_tmp->context.i_trun_sample_pos < tk->context.i_trun_sample_pos ) if( tk == NULL || tk_tmp->context.i_trun_sample_pos < tk->context.i_trun_sample_pos )
tk = tk_tmp; tk = tk_tmp;
} }
i_minnzdts = __MIN(i_minnzdts, i_nzdts);
} }
if( tk ) if( tk )
@ -5145,6 +5157,12 @@ static int DemuxMoof( demux_t *p_demux )
i_status = VLC_DEMUXER_EOF; i_status = VLC_DEMUXER_EOF;
} }
if( i_minnzdts != VLC_TICK_MAX && VLC_TICK_0 + i_minnzdts > p_sys->i_pcr )
{
p_sys->i_pcr = VLC_TICK_0 + i_minnzdts;
es_out_SetPCR( p_demux->out, p_sys->i_pcr );
}
if( i_status != VLC_DEMUXER_SUCCESS || !tk ) if( i_status != VLC_DEMUXER_SUCCESS || !tk )
break; break;
} }
@ -5152,7 +5170,8 @@ static int DemuxMoof( demux_t *p_demux )
if( i_status != VLC_DEMUXER_EOS ) if( i_status != VLC_DEMUXER_EOS )
{ {
p_sys->i_nztime += DEMUX_INCREMENT; p_sys->i_nztime += DEMUX_INCREMENT;
p_sys->i_pcr = VLC_TICK_0 + p_sys->i_nztime; if ( VLC_TICK_0 + p_sys->i_nztime > p_sys->i_pcr )
p_sys->i_pcr = VLC_TICK_0 + p_sys->i_nztime;
es_out_SetPCR( p_demux->out, p_sys->i_pcr ); es_out_SetPCR( p_demux->out, p_sys->i_pcr );
} }
else else

Loading…
Cancel
Save