Jean-Baptiste Kempf pushed to branch 3.0.x at VideoLAN / VLC
Commits: 80708059 by Steve Lhomme at 2021-11-27T09:46:10+00:00 demux: mkv: turn the PCR update into a function (cherry picked from commit 7a5eede42d1a80a1be0171adc813d6310f118186) (edited) edited: * 3.0 branch uses mtime_t instead of vlc_tick_t Signed-off-by: Steve Lhomme <[email protected]> - - - - - 73439b6b by Steve Lhomme at 2021-11-27T09:46:10+00:00 demux: mkv: make sure we send the first valid PCR before we send a valid block Negative or VLC_TICK_INVALID timestamps are not sent as a PCR but there might still be such blocks sent before the PCR. (cherry picked from commit a18356f3f364b8d673b267bddab5dd64f1c12b72) (edited) edited: * vlc 3.0 branches uses VLC_TS_INVALID instead of VLC_TICK_INVALID Signed-off-by: Steve Lhomme <[email protected]> - - - - - 3 changed files: - modules/demux/mkv/mkv.cpp - modules/demux/mkv/util.cpp - modules/demux/mkv/util.hpp Changes: ===================================== modules/demux/mkv/mkv.cpp ===================================== @@ -778,40 +778,12 @@ static int Demux( demux_t *p_demux) } } - /* update pcr */ + if (UpdatePCR( p_demux ) != VLC_SUCCESS) { - int64_t i_pcr = VLC_TS_INVALID; - - typedef matroska_segment_c::tracks_map_t tracks_map_t; - - for( tracks_map_t::const_iterator it = p_segment->tracks.begin(); it != p_segment->tracks.end(); ++it ) - { - mkv_track_t &track = *it->second; - - if( track.i_last_dts == VLC_TS_INVALID ) - continue; - - if( track.fmt.i_cat != VIDEO_ES && track.fmt.i_cat != AUDIO_ES ) - continue; - - if( track.i_last_dts < i_pcr || i_pcr <= VLC_TS_INVALID ) - { - i_pcr = track.i_last_dts; - } - } - - if( i_pcr > VLC_TS_INVALID && i_pcr > p_sys->i_pcr ) - { - if( es_out_SetPCR( p_demux->out, i_pcr ) ) - { - msg_Err( p_demux, "ES_OUT_SET_PCR failed, aborting." ); - delete block; - delete additions; - return 0; - } - - p_sys->i_pcr = i_pcr; - } + msg_Err( p_demux, "ES_OUT_SET_PCR failed, aborting." ); + delete block; + delete additions; + return VLC_DEMUXER_EGENERIC; } /* set pts */ ===================================== modules/demux/mkv/util.cpp ===================================== @@ -310,6 +310,44 @@ error: return NULL; } +int UpdatePCR( demux_t * p_demux ) +{ + demux_sys_t *p_sys = (demux_sys_t *)p_demux->p_sys; + matroska_segment_c *p_segment = p_sys->p_current_vsegment->CurrentSegment(); + + int64_t i_pcr = VLC_TS_INVALID; + + typedef matroska_segment_c::tracks_map_t tracks_map_t; + + for( tracks_map_t::const_iterator it = p_segment->tracks.begin(); it != p_segment->tracks.end(); ++it ) + { + mkv_track_t &track = *it->second; + + if( track.i_last_dts == VLC_TS_INVALID ) + continue; + + if( track.fmt.i_cat != VIDEO_ES && track.fmt.i_cat != AUDIO_ES ) + continue; + + if( track.i_last_dts < i_pcr || i_pcr <= VLC_TS_INVALID ) + { + i_pcr = track.i_last_dts; + } + } + + if( i_pcr > VLC_TS_INVALID && i_pcr > p_sys->i_pcr ) + { + if( es_out_SetPCR( p_demux->out, i_pcr ) ) + { + return VLC_EGENERIC; + } + + p_sys->i_pcr = i_pcr; + } + + return VLC_SUCCESS; +} + void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block, unsigned int i_number_frames, mtime_t i_duration ) { demux_sys_t *p_sys = p_demux->p_sys; @@ -340,6 +378,9 @@ void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block, unsig p_tk->b_discontinuity = false; } + if ( p_sys->i_pcr == VLC_TS_INVALID ) + UpdatePCR( p_demux ); + es_out_Send( p_demux->out, p_tk->p_es, p_block); } ===================================== modules/demux/mkv/util.hpp ===================================== @@ -35,6 +35,7 @@ void handle_real_audio(demux_t * p_demux, mkv_track_t * p_tk, block_t * p_blk, m block_t *WEBVTT_Repack_Sample(block_t *p_block, bool b_webm = false, const uint8_t * = NULL, size_t = 0); void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block, unsigned int i_number_frames, mtime_t i_duration ); +int UpdatePCR( demux_t * p_demux ); struct real_audio_private View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1353e52693d8deb4e629e153d9c73d7dc69afc13...73439b6b5839ec045462a1d98e37192328225bca -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1353e52693d8deb4e629e153d9c73d7dc69afc13...73439b6b5839ec045462a1d98e37192328225bca You're receiving this email because of your account on code.videolan.org.
_______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
