vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Fri May 16 17:08:38 2014 +0200| [487825a52f66200ca6f7a44b461f0b761282f846] | committer: Francois Cartegnie
demux: asf: add workaround for audio es delay > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=487825a52f66200ca6f7a44b461f0b761282f846 --- modules/demux/asf/asf.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/modules/demux/asf/asf.c b/modules/demux/asf/asf.c index 7123fe8..21d59a0 100644 --- a/modules/demux/asf/asf.c +++ b/modules/demux/asf/asf.c @@ -239,6 +239,7 @@ static int Demux( demux_t *p_demux ) } /* Set the PCR */ + /* WARN: Don't move it before the end of the whole chunk */ p_sys->i_time = GetMoviePTS( p_sys ); if( p_sys->i_time >= 0 ) { @@ -371,7 +372,7 @@ static void SeekPrepare( demux_t *p_demux ) if( !tk ) continue; - tk->i_time = VLC_TS_INVALID; + tk->i_time = -1; if( tk->p_frame ) block_ChainRelease( tk->p_frame ); tk->p_frame = NULL; @@ -532,7 +533,7 @@ static mtime_t GetMoviePTS( demux_sys_t *p_sys ) /* early fail */ return -1; } - else if ( i_time == -1 || i_time > tk->i_time ) + else if ( tk->i_time > -1 && ( i_time == -1 || i_time > tk->i_time ) ) { i_time = tk->i_time; } @@ -600,7 +601,6 @@ static void SendPacket(demux_t *p_demux, asf_track_t *tk) #ifdef ASF_DEBUG msg_Dbg( p_demux, " sending packet dts %"PRId64" pts %"PRId64" pcr %"PRId64, p_gather->i_dts, p_gather->i_pts, p_sys->i_time ); #endif - es_out_Send( p_demux->out, tk->p_es, p_gather ); tk->p_frame = NULL; } @@ -860,11 +860,18 @@ static int DemuxPayload(demux_t *p_demux, struct asf_packet_t *pkt, int i_payloa if( !tk->p_es ) goto skip; - if ( b_preroll_done ) + bool b_hugedelay = ( p_sys->p_fp->i_preroll * 1000 > CLOCK_FREQ * 3 ); + + if ( b_preroll_done || b_hugedelay ) { - tk->i_time = INT64_C(1000) * pkt->send_time; - tk->i_time -= p_sys->p_fp->i_preroll * 1000; - tk->i_time -= tk->p_sp->i_time_offset * 10; + if ( !b_hugedelay ) + { + tk->i_time = INT64_C(1000) * pkt->send_time; + tk->i_time -= p_sys->p_fp->i_preroll * 1000; + tk->i_time -= tk->p_sp->i_time_offset * 10; + } + else + tk->i_time = i_base_pts; } uint32_t i_subpayload_count = 0; @@ -885,6 +892,9 @@ static int DemuxPayload(demux_t *p_demux, struct asf_packet_t *pkt, int i_payloa i_payload_dts -= p_sys->p_fp->i_preroll * 1000; i_payload_dts -= tk->p_sp->i_time_offset * 10; + if ( b_hugedelay ) + i_payload_dts = i_base_pts; + if ( i_sub_payload_data_length && DemuxSubPayload(p_demux, tk, i_sub_payload_data_length, i_payload_pts, i_payload_dts, i_media_object_offset, _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits