vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Feb 4 19:58:02 2021 +0100| [fa6e7fed73becb9f73362e8013860a2708b6f9dd] | committer: Francois Cartegnie
demux: mp4: refactor getting sample timings > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fa6e7fed73becb9f73362e8013860a2708b6f9dd --- modules/demux/mp4/mp4.c | 103 +++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index 675ce73fae..4ac72e7a88 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -343,24 +343,18 @@ static es_out_id_t * MP4_CreateES( es_out_t *out, const es_format_t *p_fmt, return p_es; } -/* Return time in microsecond of a track */ -static inline vlc_tick_t MP4_TrackGetDTS( demux_t *p_demux, mp4_track_t *p_track ) +static stime_t MP4_ChunkGetSampleDTS( const mp4_chunk_t *p_chunk, + uint32_t i_sample ) { - demux_sys_t *p_sys = p_demux->p_sys; - const mp4_chunk_t *p_chunk = &p_track->chunk[p_track->i_chunk]; - - unsigned int i_index = 0; - unsigned int i_sample = p_track->i_sample - p_chunk->i_sample_first; - int64_t sdts = p_chunk->i_first_dts; - + uint32_t i_index = 0; + stime_t sdts = p_chunk->i_first_dts; while( i_sample > 0 && i_index < p_chunk->i_entries_dts ) { if( i_sample > p_chunk->p_sample_count_dts[i_index] ) { sdts += p_chunk->p_sample_count_dts[i_index] * p_chunk->p_sample_delta_dts[i_index]; - i_sample -= p_chunk->p_sample_count_dts[i_index]; - i_index++; + i_sample -= p_chunk->p_sample_count_dts[i_index++]; } else { @@ -368,55 +362,74 @@ static inline vlc_tick_t MP4_TrackGetDTS( demux_t *p_demux, mp4_track_t *p_track break; } } + return sdts; +} - vlc_tick_t i_dts = MP4_rescale_mtime( sdts, p_track->i_timescale ); - - /* now handle elst */ - if( p_track->p_elst && p_track->BOXDATA(p_elst)->i_entry_count ) +static bool MP4_ChunkGetSampleCTSDelta( const mp4_chunk_t *p_chunk, + uint32_t i_sample, stime_t *pi_delta ) +{ + if( p_chunk->p_sample_count_pts && p_chunk->p_sample_offset_pts ) { - MP4_Box_data_elst_t *elst = p_track->BOXDATA(p_elst); - - /* convert to offset */ - if( ( elst->i_media_rate_integer[p_track->i_elst] > 0 || - elst->i_media_rate_fraction[p_track->i_elst] > 0 ) && - elst->i_media_time[p_track->i_elst] > 0 ) + for( uint32_t i_index = 0; i_index < p_chunk->i_entries_pts ; i_index++ ) { - i_dts -= MP4_rescale_mtime( elst->i_media_time[p_track->i_elst], p_track->i_timescale ); + if( i_sample < p_chunk->p_sample_count_pts[i_index] ) + { + *pi_delta = p_chunk->p_sample_offset_pts[i_index]; + return true; + } + i_sample -= p_chunk->p_sample_count_pts[i_index]; } + } + return false; +} - /* add i_elst_time */ - i_dts += MP4_rescale_mtime( p_track->i_elst_time, p_sys->i_timescale ); +static void MP4_TrackTimeApplyELST( const mp4_track_t *p_track, + stime_t *pi_dts ) +{ + if( !p_track->p_elst || !p_track->BOXDATA(p_elst)->i_entry_count ) + return; - if( i_dts < 0 ) i_dts = 0; + const MP4_Box_data_elst_t *elst = p_track->BOXDATA(p_elst); + + /* convert to offset */ + if( elst->i_media_time[p_track->i_elst] > 0 && + ( elst->i_media_rate_integer[p_track->i_elst] > 0 || + elst->i_media_rate_fraction[p_track->i_elst] > 0 ) ) + { + *pi_dts -= elst->i_media_time[p_track->i_elst]; } - return i_dts; + /* add i_elst_time */ + *pi_dts += p_track->i_elst_time; + + if( *pi_dts < 0 ) *pi_dts = 0; } -static inline bool MP4_TrackGetPTSDelta( demux_t *p_demux, mp4_track_t *p_track, - vlc_tick_t *pi_delta ) +/* Return time in microsecond of a track */ +static inline vlc_tick_t MP4_TrackGetDTS( demux_t *p_demux, mp4_track_t *p_track ) { - VLC_UNUSED( p_demux ); - mp4_chunk_t *ck = &p_track->chunk[p_track->i_chunk]; + VLC_UNUSED(p_demux); + const mp4_chunk_t *p_chunk = &p_track->chunk[p_track->i_chunk]; - unsigned int i_index = 0; - unsigned int i_sample = p_track->i_sample - ck->i_sample_first; + stime_t sdts = MP4_ChunkGetSampleDTS( p_chunk, + p_track->i_sample - p_chunk->i_sample_first ); - if( ck->p_sample_count_pts == NULL || ck->p_sample_offset_pts == NULL ) - return false; + /* now handle elst */ + MP4_TrackTimeApplyELST( p_track, &sdts ); - for( i_index = 0; i_index < ck->i_entries_pts ; i_index++ ) - { - if( i_sample < ck->p_sample_count_pts[i_index] ) - { - *pi_delta = MP4_rescale_mtime( ck->p_sample_offset_pts[i_index], - p_track->i_timescale ); - return true; - } + return MP4_rescale_mtime( sdts, p_track->i_timescale ); +} - i_sample -= ck->p_sample_count_pts[i_index]; - } - return false; +static inline bool MP4_TrackGetPTSDelta( demux_t *p_demux, const mp4_track_t *p_track, + vlc_tick_t *pi_delta ) +{ + VLC_UNUSED( p_demux ); + const mp4_chunk_t *ck = &p_track->chunk[p_track->i_chunk]; + stime_t delta; + if( !MP4_ChunkGetSampleCTSDelta( ck, p_track->i_sample - ck->i_sample_first, &delta ) ) + return false; + *pi_delta = MP4_rescale_mtime( delta, p_track->i_timescale ); + return true; } static inline vlc_tick_t MP4_GetSamplesDuration( demux_t *p_demux, mp4_track_t *p_track, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
