[vlc-commits] demux: ogg: use mtime
Francois Cartegnie
git at videolan.org
Fri May 25 11:10:39 CEST 2018
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed May 23 13:55:04 2018 +0200| [c0f850f84760add06d6a9df345f47cb8de298193] | committer: Francois Cartegnie
demux: ogg: use mtime
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c0f850f84760add06d6a9df345f47cb8de298193
---
modules/demux/ogg.c | 59 ++++++++++++++++++++++++++-----------------------
modules/demux/ogg.h | 2 +-
modules/demux/oggseek.c | 46 ++++++++++++++++++--------------------
modules/demux/oggseek.h | 12 +++++-----
4 files changed, 60 insertions(+), 59 deletions(-)
diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c
index 4bee1a31ae..f840dcb8a4 100644
--- a/modules/demux/ogg.c
+++ b/modules/demux/ogg.c
@@ -535,7 +535,7 @@ static int Demux( demux_t * p_demux )
if ( p_stream->prepcr.pp_blocks )
{
- int64_t pagestamp = Oggseek_GranuleToAbsTimestamp( p_stream, ogg_page_granulepos( &p_sys->current_page ), false );
+ mtime_t pagestamp = Oggseek_GranuleToAbsTimestamp( p_stream, ogg_page_granulepos( &p_sys->current_page ), false );
p_stream->i_previous_pcr = pagestamp;
#ifdef HAVE_LIBVORBIS
int i_prev_blocksize = 0;
@@ -587,24 +587,27 @@ static int Demux( demux_t * p_demux )
case VLC_CODEC_SPEEX:
case VLC_CODEC_OPUS:
case VLC_CODEC_VORBIS:
- pagestamp -= CLOCK_FREQ * p_block->i_nb_samples / p_stream->f_rate;
- if ( pagestamp < 0 )
+ if( pagestamp != VLC_TS_INVALID )
+ {
+ pagestamp -= CLOCK_FREQ * p_block->i_nb_samples / p_stream->f_rate;
+ p_block->i_pts = p_sys->i_nzpcr_offset + pagestamp;
+ }
+ else
{
p_block->i_pts = VLC_TS_INVALID;
if( p_sys->i_nzpcr_offset == 0 ) /* not on chained streams */
p_block->i_flags |= BLOCK_FLAG_PREROLL;
}
- else
- p_block->i_pts = VLC_TS_0 + p_sys->i_nzpcr_offset + pagestamp;
b_fixed = true;
break;
default:
if ( p_stream->fmt.i_cat == VIDEO_ES )
{
- pagestamp = pagestamp - ( CLOCK_FREQ / p_stream->f_rate );
- if( pagestamp < 0 )
- pagestamp = 0;
- p_block->i_pts = VLC_TS_0 + p_sys->i_nzpcr_offset + pagestamp;
+ if( pagestamp != VLC_TS_INVALID )
+ {
+ pagestamp = pagestamp - ( CLOCK_FREQ / p_stream->f_rate );
+ p_block->i_pts = p_sys->i_nzpcr_offset + pagestamp;
+ }
b_fixed = true;
}
}
@@ -613,8 +616,7 @@ static int Demux( demux_t * p_demux )
if ( b_fixed )
{
pagestamp = p_stream->i_previous_pcr; /* as set above */
- if ( pagestamp < 0 ) pagestamp = 0;
- p_stream->i_pcr = VLC_TS_0 + pagestamp;
+ p_stream->i_pcr = pagestamp;
p_stream->i_pcr += p_sys->i_nzpcr_offset;
p_stream->i_previous_granulepos = ogg_page_granulepos( &p_sys->current_page );
}
@@ -626,11 +628,11 @@ static int Demux( demux_t * p_demux )
}
- int64_t i_pagestamp = Oggseek_GranuleToAbsTimestamp( p_stream,
- ogg_page_granulepos( &p_sys->current_page ), false );
- if ( i_pagestamp > -1 )
+ mtime_t i_pagestamp = Oggseek_GranuleToAbsTimestamp( p_stream,
+ ogg_page_granulepos( &p_sys->current_page ), false );
+ if ( i_pagestamp != VLC_TS_INVALID )
{
- p_stream->i_pcr = VLC_TS_0 + i_pagestamp;
+ p_stream->i_pcr = i_pagestamp;
p_stream->i_pcr += p_sys->i_nzpcr_offset;
}
@@ -809,7 +811,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
return VLC_EGENERIC;
}
vlc_stream_Control( p_demux->s, STREAM_CAN_FASTSEEK, &b );
- if ( Oggseek_BlindSeektoAbsoluteTime( p_demux, p_stream, i64, b ) )
+ if ( Oggseek_BlindSeektoAbsoluteTime( p_demux, p_stream, VLC_TS_0 + i64, b ) )
{
Ogg_ResetStreamsHelper( p_sys );
if( acc )
@@ -883,7 +885,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
assert( p_sys->i_length > 0 );
i64 = CLOCK_FREQ * p_sys->i_length * f;
Ogg_ResetStreamsHelper( p_sys );
- if ( Oggseek_SeektoAbsolutetime( p_demux, p_stream, i64 ) >= 0 )
+ if ( Oggseek_SeektoAbsolutetime( p_demux, p_stream, VLC_TS_0 + i64 ) >= 0 )
{
if( acc )
es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
@@ -954,7 +956,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
}
vlc_stream_Control( p_demux->s, STREAM_CAN_FASTSEEK, &b );
- if ( Oggseek_BlindSeektoAbsoluteTime( p_demux, p_stream, i64, b ) )
+ if ( Oggseek_BlindSeektoAbsoluteTime( p_demux, p_stream, VLC_TS_0 + i64, b ) )
{
Ogg_ResetStreamsHelper( p_sys );
es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
@@ -1044,7 +1046,7 @@ static void Ogg_UpdatePCR( demux_t *p_demux, logical_stream_t *p_stream,
p_stream->fmt.i_codec == VLC_CODEC_OGGSPOTS ||
(p_stream->b_oggds && p_stream->fmt.i_cat == VIDEO_ES) )
{
- p_stream->i_pcr = VLC_TS_0 + Oggseek_GranuleToAbsTimestamp( p_stream,
+ p_stream->i_pcr = Oggseek_GranuleToAbsTimestamp( p_stream,
p_oggpacket->granulepos, true );
p_stream->i_pcr += p_ogg->i_nzpcr_offset;
}
@@ -1082,7 +1084,7 @@ static void Ogg_UpdatePCR( demux_t *p_demux, logical_stream_t *p_stream,
{
if( p_stream->i_previous_granulepos > 0 )
{
- p_stream->i_pcr = VLC_TS_0 + Oggseek_GranuleToAbsTimestamp( p_stream, ++p_stream->i_previous_granulepos, false );
+ p_stream->i_pcr = Oggseek_GranuleToAbsTimestamp( p_stream, ++p_stream->i_previous_granulepos, false );
p_stream->i_pcr += p_ogg->i_nzpcr_offset;
}
/* First frame in ogm can be -1 (0 0 -1 2 3 -1 5 ...) */
@@ -1121,7 +1123,7 @@ static void Ogg_UpdatePCR( demux_t *p_demux, logical_stream_t *p_stream,
i_duration = p_stream->special.speex.i_framesize *
p_stream->special.speex.i_framesperpacket;
p_oggpacket->granulepos = p_stream->i_previous_granulepos + i_duration;
- p_stream->i_pcr = VLC_TS_0 + Oggseek_GranuleToAbsTimestamp( p_stream,
+ p_stream->i_pcr = Oggseek_GranuleToAbsTimestamp( p_stream,
p_stream->i_previous_granulepos, false );
p_stream->i_pcr += p_ogg->i_nzpcr_offset;
}
@@ -1204,7 +1206,7 @@ static void Ogg_SendOrQueueBlocks( demux_t *p_demux, logical_stream_t *p_stream,
tosend->i_dts, tosend->i_pts, p_stream->i_pcr, p_ogg->i_pcr ); )
es_out_Send( p_demux->out, p_stream->p_es, tosend );
- if ( p_ogg->i_pcr < VLC_TS_0 && i_firstpts != VLC_TS_INVALID )
+ if ( p_ogg->i_pcr == VLC_TS_INVALID && i_firstpts != VLC_TS_INVALID )
{
p_ogg->i_pcr = i_firstpts;
if( likely( !p_ogg->b_slave ) )
@@ -1453,10 +1455,8 @@ static void Ogg_DecodePacket( demux_t *p_demux,
if( p_stream->fmt.i_codec == VLC_CODEC_DIRAC )
{
- ogg_int64_t nzdts = Oggseek_GranuleToAbsTimestamp( p_stream, p_oggpacket->granulepos, false );
- ogg_int64_t nzpts = Oggseek_GranuleToAbsTimestamp( p_stream, p_oggpacket->granulepos, true );
- p_block->i_dts = ( nzdts != VLC_TS_INVALID ) ? VLC_TS_0 + nzdts : nzdts;
- p_block->i_pts = ( nzpts != VLC_TS_INVALID ) ? VLC_TS_0 + nzpts : nzpts;
+ p_block->i_dts = Oggseek_GranuleToAbsTimestamp( p_stream, p_oggpacket->granulepos, false );
+ p_block->i_pts = Oggseek_GranuleToAbsTimestamp( p_stream, p_oggpacket->granulepos, true );
/* granulepos for dirac is possibly broken, this value should be ignored */
if( 0 >= p_oggpacket->granulepos )
{
@@ -3322,12 +3322,15 @@ static void Ogg_ApplySkeleton( logical_stream_t *p_stream )
}
/* Return true if there's a skeleton exact match */
-bool Ogg_GetBoundsUsingSkeletonIndex( logical_stream_t *p_stream, int64_t i_time,
+bool Ogg_GetBoundsUsingSkeletonIndex( logical_stream_t *p_stream, mtime_t i_time,
int64_t *pi_lower, int64_t *pi_upper )
{
- if ( !p_stream || !p_stream->p_skel || !p_stream->p_skel->p_index )
+ if ( !p_stream || !p_stream->p_skel || !p_stream->p_skel->p_index ||
+ i_time == VLC_TS_INVALID )
return false;
+ i_time -= VLC_TS_0;
+
/* Validate range */
if ( i_time < p_stream->p_skel->i_indexfirstnum
* p_stream->p_skel->i_indexstampden ||
diff --git a/modules/demux/ogg.h b/modules/demux/ogg.h
index 4b7d6d256c..d2139d1b6f 100644
--- a/modules/demux/ogg.h
+++ b/modules/demux/ogg.h
@@ -242,5 +242,5 @@ typedef struct
unsigned const char * Read7BitsVariableLE( unsigned const char *,
unsigned const char *,
uint64_t * );
-bool Ogg_GetBoundsUsingSkeletonIndex( logical_stream_t *p_stream, int64_t i_time,
+bool Ogg_GetBoundsUsingSkeletonIndex( logical_stream_t *p_stream, mtime_t i_time,
int64_t *pi_lower, int64_t *pi_upper );
diff --git a/modules/demux/oggseek.c b/modules/demux/oggseek.c
index ddb0a158db..ff4c5f7f7b 100644
--- a/modules/demux/oggseek.c
+++ b/modules/demux/oggseek.c
@@ -96,7 +96,7 @@ static demux_index_entry_t *index_entry_new( void )
/* We insert into index, sorting by pagepos (as a page can match multiple
time stamps) */
const demux_index_entry_t *OggSeek_IndexAdd ( logical_stream_t *p_stream,
- int64_t i_timestamp,
+ mtime_t i_timestamp,
int64_t i_pagepos )
{
demux_index_entry_t *idx;
@@ -106,7 +106,7 @@ const demux_index_entry_t *OggSeek_IndexAdd ( logical_stream_t *p_stream,
idx = p_stream->idx;
- if ( i_timestamp < 1 || i_pagepos < 1 ) return NULL;
+ if ( i_timestamp == VLC_TS_INVALID || i_pagepos < 1 ) return NULL;
if ( idx == NULL )
{
@@ -151,7 +151,7 @@ const demux_index_entry_t *OggSeek_IndexAdd ( logical_stream_t *p_stream,
return idx;
}
-static bool OggSeekIndexFind ( logical_stream_t *p_stream, int64_t i_timestamp,
+static bool OggSeekIndexFind ( logical_stream_t *p_stream, mtime_t i_timestamp,
int64_t *pi_pos_lower, int64_t *pi_pos_upper )
{
demux_index_entry_t *idx = p_stream->idx;
@@ -290,15 +290,16 @@ void Oggseek_ProbeEnd( demux_t *p_demux )
continue;
i_length = Oggseek_GranuleToAbsTimestamp( p_sys->pp_stream[i], i_granule, false );
- p_sys->i_length = __MAX( p_sys->i_length, i_length / 1000000 );
+ if( i_length > VLC_TS_INVALID )
+ p_sys->i_length = __MAX( p_sys->i_length, (i_length - VLC_TS_0) / 1000000 );
break;
}
}
- if ( i_length > 0 ) break;
+ if ( i_length > VLC_TS_INVALID ) break;
}
/* We found at least a page with valid granule */
- if ( i_length > 0 ) break;
+ if ( i_length > VLC_TS_INVALID ) break;
/* Otherwise increase read size, starting earlier */
if ( i_backoffset <= ( UINT_MAX >> 1 ) )
@@ -674,12 +675,12 @@ restart:
}
/* Dont use b_presentation with frames granules ! */
-int64_t Oggseek_GranuleToAbsTimestamp( logical_stream_t *p_stream,
+mtime_t Oggseek_GranuleToAbsTimestamp( logical_stream_t *p_stream,
int64_t i_granule, bool b_presentation )
{
- int64_t i_timestamp = -1;
+ mtime_t i_timestamp = VLC_TS_INVALID;
if ( i_granule < 1 - !!p_stream->b_oggds )
- return -1;
+ return VLC_TS_INVALID;
if ( p_stream->b_oggds )
{
@@ -746,12 +747,12 @@ int64_t Oggseek_GranuleToAbsTimestamp( logical_stream_t *p_stream,
}
}
- return i_timestamp;
+ return i_timestamp != VLC_TS_INVALID ? i_timestamp + VLC_TS_0 : VLC_TS_INVALID;
}
/* returns pos */
static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stream,
- int64_t i_targettime, int64_t i_pos_lower, int64_t i_pos_upper)
+ mtime_t i_targettime, int64_t i_pos_lower, int64_t i_pos_upper)
{
int64_t i_start_pos;
int64_t i_end_pos;
@@ -760,11 +761,11 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre
struct
{
int64_t i_pos;
- int64_t i_timestamp;
+ mtime_t i_timestamp;
int64_t i_granule;
- } bestlower = { p_stream->i_data_start, -1, -1 },
- current = { -1, -1, -1 },
- lowestupper = { -1, -1, -1 };
+ } bestlower = { p_stream->i_data_start, VLC_TS_INVALID, -1 },
+ current = { -1, VLC_TS_INVALID, -1 },
+ lowestupper = { -1, VLC_TS_INVALID, -1 };
demux_sys_t *p_sys = p_demux->p_sys;
@@ -805,15 +806,11 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre
current.i_timestamp = Oggseek_GranuleToAbsTimestamp( p_stream,
current.i_granule, false );
- if ( current.i_timestamp == -1 && current.i_granule > 0 )
+ if ( current.i_timestamp == VLC_TS_INVALID && current.i_granule > 0 )
{
msg_Err( p_demux, "Unmatched granule. New codec ?" );
return -1;
}
- else if ( current.i_timestamp < -1 ) /* due to preskip with some codecs */
- {
- current.i_timestamp = 0;
- }
if ( current.i_pos != -1 && current.i_granule != -1 )
{
@@ -828,7 +825,8 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre
}
else if ( current.i_timestamp > i_targettime )
{
- if ( lowestupper.i_timestamp == -1 || current.i_timestamp < lowestupper.i_timestamp )
+ if ( lowestupper.i_timestamp == VLC_TS_INVALID ||
+ current.i_timestamp < lowestupper.i_timestamp )
lowestupper = current;
/* check lower half of segment */
i_start_pos -= i_segsize;
@@ -895,7 +893,7 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre
*************************************************************************/
int Oggseek_BlindSeektoAbsoluteTime( demux_t *p_demux, logical_stream_t *p_stream,
- int64_t i_time, bool b_fastseek )
+ mtime_t i_time, bool b_fastseek )
{
demux_sys_t *p_sys = p_demux->p_sys;
int64_t i_lowerpos = -1;
@@ -918,7 +916,7 @@ int Oggseek_BlindSeektoAbsoluteTime( demux_t *p_demux, logical_stream_t *p_strea
{
/* But only if there's no keyframe/preload requirements */
/* FIXME: add function to get preload time by codec, ex: opus */
- i_lowerpos = i_time * p_sys->i_bitrate / INT64_C(8000000);
+ i_lowerpos = VLC_TS_0 + (i_time - VLC_TS_0) * p_sys->i_bitrate / INT64_C(8000000);
b_found = true;
}
@@ -991,7 +989,7 @@ int Oggseek_BlindSeektoPosition( demux_t *p_demux, logical_stream_t *p_stream,
}
int Oggseek_SeektoAbsolutetime( demux_t *p_demux, logical_stream_t *p_stream,
- int64_t i_time )
+ mtime_t i_time )
{
demux_sys_t *p_sys = p_demux->p_sys;
diff --git a/modules/demux/oggseek.h b/modules/demux/oggseek.h
index 6db6db7c79..4225a13472 100644
--- a/modules/demux/oggseek.h
+++ b/modules/demux/oggseek.h
@@ -42,7 +42,7 @@ struct oggseek_index_entry
demux_index_entry_t *p_prev;
/* value is highest granulepos for theora, sync frame for dirac */
- int64_t i_value;
+ mtime_t i_value;
int64_t i_pagepos;
/* not used for theora because the granulepos tells us this */
@@ -52,12 +52,12 @@ struct oggseek_index_entry
int64_t Ogg_GetKeyframeGranule ( logical_stream_t *p_stream, int64_t i_granule );
bool Ogg_IsKeyFrame ( logical_stream_t *, ogg_packet * );
-int64_t Oggseek_GranuleToAbsTimestamp ( logical_stream_t *p_stream, int64_t i_granule,
- bool b_presentation );
-int Oggseek_BlindSeektoAbsoluteTime ( demux_t *, logical_stream_t *, int64_t, bool );
+mtime_t Oggseek_GranuleToAbsTimestamp ( logical_stream_t *p_stream, int64_t i_granule,
+ bool b_presentation );
+int Oggseek_BlindSeektoAbsoluteTime ( demux_t *, logical_stream_t *, mtime_t, bool );
int Oggseek_BlindSeektoPosition ( demux_t *, logical_stream_t *, double f, bool );
-int Oggseek_SeektoAbsolutetime ( demux_t *, logical_stream_t *, int64_t i_granulepos );
-const demux_index_entry_t *OggSeek_IndexAdd ( logical_stream_t *, int64_t, int64_t );
+int Oggseek_SeektoAbsolutetime ( demux_t *, logical_stream_t *, mtime_t );
+const demux_index_entry_t *OggSeek_IndexAdd ( logical_stream_t *, mtime_t, int64_t );
void Oggseek_ProbeEnd( demux_t * );
void oggseek_index_entries_free ( demux_index_entry_t * );
More information about the vlc-commits
mailing list