Commit a3382f3b authored by Francois Cartegnie's avatar Francois Cartegnie

demux: mp4: fix PTS delta

CTTS value can be negative on version 0, and match the not found
return value used in GetPTSDelta.
ex: Sintel Smooth Streaming sample
parent fbd0ccb7
...@@ -276,7 +276,8 @@ static inline int64_t MP4_TrackGetDTS( demux_t *p_demux, mp4_track_t *p_track ) ...@@ -276,7 +276,8 @@ static inline int64_t MP4_TrackGetDTS( demux_t *p_demux, mp4_track_t *p_track )
return CLOCK_FREQ * i_dts / p_track->i_timescale; return CLOCK_FREQ * i_dts / p_track->i_timescale;
} }
static inline int64_t MP4_TrackGetPTSDelta( demux_t *p_demux, mp4_track_t *p_track ) static inline bool MP4_TrackGetPTSDelta( demux_t *p_demux, mp4_track_t *p_track,
int64_t *pi_delta )
{ {
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
mp4_chunk_t *ck; mp4_chunk_t *ck;
...@@ -289,16 +290,20 @@ static inline int64_t MP4_TrackGetPTSDelta( demux_t *p_demux, mp4_track_t *p_tra ...@@ -289,16 +290,20 @@ static inline int64_t MP4_TrackGetPTSDelta( demux_t *p_demux, mp4_track_t *p_tra
unsigned int i_sample = p_track->i_sample - ck->i_sample_first; unsigned int i_sample = p_track->i_sample - ck->i_sample_first;
if( ck->p_sample_count_pts == NULL || ck->p_sample_offset_pts == NULL ) if( ck->p_sample_count_pts == NULL || ck->p_sample_offset_pts == NULL )
return -1; return false;
for( i_index = 0;; i_index++ ) for( i_index = 0;; i_index++ )
{ {
if( i_sample < ck->p_sample_count_pts[i_index] ) if( i_sample < ck->p_sample_count_pts[i_index] )
return ck->p_sample_offset_pts[i_index] * CLOCK_FREQ / {
(int64_t)p_track->i_timescale; *pi_delta = ck->p_sample_offset_pts[i_index] * CLOCK_FREQ /
(int64_t)p_track->i_timescale;
return true;
}
i_sample -= ck->p_sample_count_pts[i_index]; i_sample -= ck->p_sample_count_pts[i_index];
} }
return false;
} }
static inline int64_t MP4_GetMoviePTS(demux_sys_t *p_sys ) static inline int64_t MP4_GetMoviePTS(demux_sys_t *p_sys )
...@@ -1092,8 +1097,7 @@ static int Demux( demux_t *p_demux ) ...@@ -1092,8 +1097,7 @@ static int Demux( demux_t *p_demux )
/* dts */ /* dts */
p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk ); p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk );
/* pts */ /* pts */
i_delta = MP4_TrackGetPTSDelta( p_demux, tk ); if( MP4_TrackGetPTSDelta( p_demux, tk, &i_delta ) )
if( i_delta != -1 )
p_block->i_pts = p_block->i_dts + i_delta; p_block->i_pts = p_block->i_dts + i_delta;
else if( tk->fmt.i_cat != VIDEO_ES ) else if( tk->fmt.i_cat != VIDEO_ES )
p_block->i_pts = p_block->i_dts; p_block->i_pts = p_block->i_dts;
...@@ -1731,7 +1735,8 @@ static void LoadChapterApple( demux_t *p_demux, mp4_track_t *tk ) ...@@ -1731,7 +1735,8 @@ static void LoadChapterApple( demux_t *p_demux, mp4_track_t *tk )
for( tk->i_sample = 0; tk->i_sample < tk->i_sample_count; tk->i_sample++ ) for( tk->i_sample = 0; tk->i_sample < tk->i_sample_count; tk->i_sample++ )
{ {
const int64_t i_dts = MP4_TrackGetDTS( p_demux, tk ); const int64_t i_dts = MP4_TrackGetDTS( p_demux, tk );
const int64_t i_pts_delta = MP4_TrackGetPTSDelta( p_demux, tk ); int64_t i_pts_delta = 0;
MP4_TrackGetPTSDelta( p_demux, tk, &i_pts_delta );
uint32_t i_nb_samples = 0; uint32_t i_nb_samples = 0;
const uint32_t i_size = MP4_TrackGetReadSize( tk, &i_nb_samples ); const uint32_t i_size = MP4_TrackGetReadSize( tk, &i_nb_samples );
...@@ -3436,8 +3441,7 @@ static void FlushChunk( demux_t *p_demux, mp4_track_t *tk ) ...@@ -3436,8 +3441,7 @@ static void FlushChunk( demux_t *p_demux, mp4_track_t *tk )
/* dts */ /* dts */
p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk ); p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk );
/* pts */ /* pts */
i_delta = MP4_TrackGetPTSDelta( p_demux, tk ); if( MP4_TrackGetPTSDelta( p_demux, tk, &i_delta ) )
if( i_delta != -1 )
p_block->i_pts = p_block->i_dts + i_delta; p_block->i_pts = p_block->i_dts + i_delta;
else if( tk->fmt.i_cat != VIDEO_ES ) else if( tk->fmt.i_cat != VIDEO_ES )
p_block->i_pts = p_block->i_dts; p_block->i_pts = p_block->i_dts;
...@@ -3900,8 +3904,7 @@ int DemuxFrg( demux_t *p_demux ) ...@@ -3900,8 +3904,7 @@ int DemuxFrg( demux_t *p_demux )
/* dts */ /* dts */
p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk ); p_block->i_dts = VLC_TS_0 + MP4_TrackGetDTS( p_demux, tk );
/* pts */ /* pts */
i_delta = MP4_TrackGetPTSDelta( p_demux, tk ); if( MP4_TrackGetPTSDelta( p_demux, tk, &i_delta ) )
if( i_delta != -1 )
p_block->i_pts = p_block->i_dts + i_delta; p_block->i_pts = p_block->i_dts + i_delta;
else if( tk->fmt.i_cat != VIDEO_ES ) else if( tk->fmt.i_cat != VIDEO_ES )
p_block->i_pts = p_block->i_dts; p_block->i_pts = p_block->i_dts;
...@@ -4692,8 +4695,8 @@ static int LeafParseMDATwithMOOV( demux_t *p_demux ) ...@@ -4692,8 +4695,8 @@ static int LeafParseMDATwithMOOV( demux_t *p_demux )
p_block->i_dts = VLC_TS_0 + CLOCK_FREQ * i_time / p_track->i_timescale; p_block->i_dts = VLC_TS_0 + CLOCK_FREQ * i_time / p_track->i_timescale;
/* pts */ /* pts */
int64_t i_delta = MP4_TrackGetPTSDelta( p_demux, p_track ); int64_t i_delta;
if( i_delta != -1 ) if( MP4_TrackGetPTSDelta( p_demux, p_track, &i_delta ) )
p_block->i_pts = p_block->i_dts + i_delta; p_block->i_pts = p_block->i_dts + i_delta;
else if( p_track->fmt.i_cat != VIDEO_ES ) else if( p_track->fmt.i_cat != VIDEO_ES )
p_block->i_pts = p_block->i_dts; p_block->i_pts = p_block->i_dts;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment