[vlc-devel] commit: Change ES_OUT_SET_NEXT_DISPLAY_TIME parameters. (Laurent Aimar )

git version control git at videolan.org
Fri Oct 10 21:28:58 CEST 2008


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Fri Oct 10 21:05:38 2008 +0200| [426932330da5ef5182008c6331fe504870c57ce8] | committer: Laurent Aimar 

Change ES_OUT_SET_NEXT_DISPLAY_TIME parameters.

It is cleaner but break the ABI.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=426932330da5ef5182008c6331fe504870c57ce8
---

 include/vlc_es_out.h                   |    4 +-
 modules/demux/avi/avi.c                |    3 +-
 modules/demux/flac.c                   |    7 +----
 modules/demux/mkv/matroska_segment.cpp |    3 +-
 modules/demux/mkv/mkv.cpp              |    5 +--
 modules/demux/mp4/mp4.c                |   11 +++------
 src/input/es_out.c                     |   38 +++++++++++---------------------
 7 files changed, 25 insertions(+), 46 deletions(-)

diff --git a/include/vlc_es_out.h b/include/vlc_es_out.h
index 0227131..0ef457b 100644
--- a/include/vlc_es_out.h
+++ b/include/vlc_es_out.h
@@ -86,8 +86,8 @@ enum es_out_query_e
     /* Try not to use this one as it is a bit hacky */
     ES_OUT_SET_FMT,     /* arg1= es_out_id_t* arg2=es_format_t* */
 
-    /* Allow preroll of data (data with dts/pts < i_pts for one ES will be decoded but not displayed */
-    ES_OUT_SET_NEXT_DISPLAY_TIME,   /* arg1=es_out_id_t* arg2=int64_t i_pts(microsecond) */
+    /* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */
+    ES_OUT_SET_NEXT_DISPLAY_TIME,   /* arg1=int64_t i_pts(microsecond) */
     /* Set meta data for group (dynamic) */
     ES_OUT_SET_GROUP_META,  /* arg1=int i_group arg2=vlc_meta_t */
     /* Set epg for group (dynamic) */
diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c
index bc84ec8..eb7cbfb 100644
--- a/modules/demux/avi/avi.c
+++ b/modules/demux/avi/avi.c
@@ -1381,6 +1381,7 @@ static int Seek( demux_t *p_demux, mtime_t i_date, int i_percent )
 
             AVI_TrackSeek( p_demux, i_stream, i_date );
         }
+        es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date );
         p_sys->i_time = i_date;
         msg_Dbg( p_demux, "seek: %"PRId64" seconds", p_sys->i_time /1000000 );
         return VLC_SUCCESS;
@@ -1811,8 +1812,6 @@ static int AVI_TrackSeek( demux_t *p_demux,
                         return VLC_EGENERIC;
                     }
                 }
-                if( p_stream->p_es )
-                    es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_stream->p_es, i_date );
             }
 #if 0
             else
diff --git a/modules/demux/flac.c b/modules/demux/flac.c
index d82efc7..81db480 100644
--- a/modules/demux/flac.c
+++ b/modules/demux/flac.c
@@ -229,10 +229,7 @@ static int Demux( demux_t *p_demux )
             p_block_out->i_dts += p_sys->i_time_offset;
 
             /* set PCR */
-            if( p_block_out->i_dts >= p_sys->i_pts_start + p_sys->i_time_offset )
-                es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts );
-            else
-                es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
+            es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block_out->i_dts );
 
             es_out_Send( p_demux->out, p_sys->p_es, p_block_out );
 
@@ -306,7 +303,7 @@ static int ControlSetTime( demux_t *p_demux, int64_t i_time )
 
         p_sys->i_time_offset = p_sys->seekpoint[i]->i_time_offset - p_sys->i_pts;
         p_sys->i_pts_start = p_sys->i_pts+i_delta_time;
-        es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_sys->p_es, p_sys->i_pts_start + p_sys->i_time_offset );
+        es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, p_sys->i_pts_start + p_sys->i_time_offset );
     }
     else
     {
diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index e1131c8..26ed799 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -1097,9 +1097,8 @@ bool matroska_segment_c::Select( mtime_t i_start_time )
                             ES_OUT_SET_DEFAULT,
                             tracks[i_track]->p_es );
         }
-
-        es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, i_start_time );
     }
+    es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_start_time );
  
     sys.i_start_pts = i_start_time;
     // reset the stream reading to the first cluster of the segment used
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index d0af035..338732f 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -701,8 +701,8 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_
             tracks[i_track]->b_search_keyframe = true;
             i_track_skipping++;
         }
-        es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, i_date );
     }
+    es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date );
 
     while( i_track_skipping > 0 )
     {
@@ -759,8 +759,7 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_
     {
         sys.i_start_pts = sys.i_pts;
 
-        for( i_track = 0; i_track < tracks.size(); i_track++ )
-            es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, sys.i_start_pts );
+        es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, sys.i_start_pts );
     }
 }
 
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 5ad7349..0a09917 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -759,6 +759,9 @@ static int Seek( demux_t *p_demux, mtime_t i_date )
         MP4_TrackSeek( p_demux, tk, i_date );
     }
     MP4_UpdateSeekpoint( p_demux );
+
+    es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date );
+
     return VLC_SUCCESS;
 }
 
@@ -2321,15 +2324,9 @@ static int MP4_TrackSeek( demux_t *p_demux, mp4_track_t *p_track,
 
     p_track->b_selected = true;
 
-    if( TrackGotoChunkSample( p_demux, p_track, i_chunk, i_sample ) ==
-        VLC_SUCCESS )
-    {
+    if( !TrackGotoChunkSample( p_demux, p_track, i_chunk, i_sample ) )
         p_track->b_selected = true;
 
-        es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
-                        p_track->p_es, i_start );
-    }
-
     return p_track->b_selected ? VLC_SUCCESS : VLC_EGENERIC;
 }
 
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 909661f..8940e04 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -77,9 +77,6 @@ struct es_out_id_t
     int       i_id;
     es_out_pgrm_t *p_pgrm;
 
-    /* Misc. */
-    int64_t i_preroll_end;
-
     /* Channel in the track type */
     int         i_channel;
     es_format_t fmt;
@@ -140,6 +137,9 @@ struct es_out_sys_t
     /* Rate used for clock */
     int         i_rate;
 
+    /* Current preroll */
+    int64_t     i_preroll_end;
+
     /* Used for buffering */
     bool        b_buffering;
 
@@ -282,6 +282,7 @@ es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate )
     p_sys->i_rate = i_rate;
 
     p_sys->b_buffering = true;
+    p_sys->i_preroll_end = -1;
 
     p_sys->p_sout_record = NULL;
 
@@ -511,6 +512,7 @@ void input_EsOutChangePosition( es_out_t *out )
         input_clock_Reset( p_sys->pgrm[i]->p_clock );
 
     p_sys->b_buffering = true;
+    p_sys->i_preroll_end = -1;
 }
 
 bool input_EsOutDecodersIsEmpty( es_out_t *out )
@@ -562,16 +564,8 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced )
         return;
 
     mtime_t i_preroll_duration = 0;
-    mtime_t i_preroll_end = 0;
-    for( int i = 0; i < p_sys->i_es; i++ )
-    {
-        es_out_id_t *p_es = p_sys->es[i];
-
-        if( p_es->p_dec && p_es->i_preroll_end > 0 )
-            i_preroll_end = __MAX( i_preroll_end, p_es->i_preroll_end );
-    }
-    if( i_preroll_end > 0 )
-        i_preroll_duration = __MAX( i_preroll_end - i_stream_start, 0 );
+    if( p_sys->i_preroll_end >= 0 )
+        i_preroll_duration = __MAX( p_sys->i_preroll_end - i_stream_start, 0 );
 
     if( i_stream_duration <= p_sys->p_input->i_pts_delay + i_preroll_duration && !b_forced )
     {
@@ -582,14 +576,13 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced )
     msg_Dbg( p_sys->p_input, "Stream buffering done (%d ms in %d ms)",
               (int)(i_stream_duration/1000), (int)(i_system_duration/1000) );
     p_sys->b_buffering = false;
+    p_sys->i_preroll_end = -1;
 
     const mtime_t i_decoder_buffering_start = mdate();
     for( int i = 0; i < p_sys->i_es; i++ )
     {
         es_out_id_t *p_es = p_sys->es[i];
 
-        p_es->i_preroll_end = -1;
-
         if( !p_es->p_dec )
             continue;
         input_DecoderWaitBuffering( p_es->p_dec );
@@ -1196,7 +1189,6 @@ static es_out_id_t *EsOutAdd( es_out_t *out, es_format_t *fmt )
     es->i_id = fmt->i_id;
     es->p_pgrm = p_pgrm;
     es_format_Copy( &es->fmt, fmt );
-    es->i_preroll_end = -1;
 
     switch( fmt->i_cat )
     {
@@ -1390,7 +1382,6 @@ static void EsSelect( es_out_t *out, es_out_id_t *es )
             }
         }
 
-        es->i_preroll_end = -1;
         EsCreateDecoder( out, es );
 
         if( es->p_dec == NULL || es->p_pgrm != p_sys->p_pgrm )
@@ -1677,13 +1668,13 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block )
     }
 
     /* Mark preroll blocks */
-    if( es->i_preroll_end >= 0 )
+    if( p_sys->i_preroll_end >= 0 )
     {
         int64_t i_date = p_block->i_pts;
         if( i_date <= 0 )
             i_date = p_block->i_dts;
 
-        if( i_date < es->i_preroll_end )
+        if( i_date < p_sys->i_preroll_end )
             p_block->i_flags |= BLOCK_FLAG_PREROLL;
     }
 
@@ -2106,15 +2097,12 @@ static int EsOutControl( es_out_t *out, int i_query, va_list args )
 
         case ES_OUT_SET_NEXT_DISPLAY_TIME:
         {
-            int64_t i_date;
-
-            es = (es_out_id_t*) va_arg( args, es_out_id_t * );
-            i_date = (int64_t)va_arg( args, int64_t );
+            const int64_t i_date = (int64_t)va_arg( args, int64_t );
 
-            if( !es || !es->p_dec )
+            if( i_date < 0 )
                 return VLC_EGENERIC;
 
-            es->i_preroll_end = i_date;
+            p_sys->i_preroll_end = i_date;
 
             return VLC_SUCCESS;
         }




More information about the vlc-devel mailing list