[vlc-commits] demux: ts: delay es creating until 1st data packet (fix #6175, #4264)
Francois Cartegnie
git at videolan.org
Thu Jan 29 00:09:47 CET 2015
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sun Jan 25 17:02:01 2015 +0100| [5902bad699d5973c17e9746dfbd06e64e8bd61b3] | committer: Francois Cartegnie
demux: ts: delay es creating until 1st data packet (fix #6175, #4264)
Some recorded streams list multiple program but only 1 stream is really
recorder. VLC defaults program to first created ES.
Now creates ES on first data packet, so the default program always
has data.
Fixes all default program selection issues.
All dreambox recordings issues
issues/TS/programselection/
and Header less VDR recordings
issues/TS/TopField/TopField%20TF7700HSCI%20HD%20record.rec
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5902bad699d5973c17e9746dfbd06e64e8bd61b3
---
modules/demux/ts.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 54 insertions(+), 7 deletions(-)
diff --git a/modules/demux/ts.c b/modules/demux/ts.c
index 8ffa124..577c0cc 100644
--- a/modules/demux/ts.c
+++ b/modules/demux/ts.c
@@ -364,6 +364,7 @@ struct demux_sys_t
int i_pmt;
ts_pid_t **pmt;
int i_pmt_es;
+ bool b_delay_es_creation;
/* */
bool b_es_id_pid;
@@ -433,6 +434,7 @@ static inline int PIDGet( block_t *p )
}
static bool GatherData( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk );
+static void AddAndCreateES( demux_t *p_demux, ts_pid_t *pid );
static block_t* ReadTSPacket( demux_t *p_demux );
static int Seek( demux_t *p_demux, double f_percent );
@@ -1079,6 +1081,7 @@ static int Open( vlc_object_t *p_this )
/* Init PMT array */
TAB_INIT( p_sys->i_pmt, p_sys->pmt );
p_sys->i_pmt_es = 0;
+ p_sys->b_delay_es_creation = true;
/* Read config */
p_sys->b_es_id_pid = var_CreateGetBool( p_demux, "ts-es-id-pid" );
@@ -1371,6 +1374,8 @@ static int Demux( demux_t *p_demux )
}
else
{
+ if(p_sys->b_delay_es_creation) /* No longer delay ES since that pid's program sends data */
+ AddAndCreateES( p_demux, NULL );
b_frame = GatherData( p_demux, p_pid, p_pkt );
}
}
@@ -4813,6 +4818,54 @@ static void PMTParseEsIso639( demux_t *p_demux, ts_pid_t *pid,
#endif
}
+static void AddAndCreateES( demux_t *p_demux, ts_pid_t *pid )
+{
+ demux_sys_t *p_sys = p_demux->p_sys;
+ bool b_create_delayed = false;
+
+ if( pid )
+ {
+ if( pid->b_seen && p_sys->b_delay_es_creation )
+ {
+ p_sys->b_delay_es_creation = false;
+ b_create_delayed = true;
+ }
+
+ if( !p_sys->b_delay_es_creation )
+ {
+ pid->es->id = es_out_Add( p_demux->out, &pid->es->fmt );
+ for( int i = 0; i < pid->i_extra_es; i++ )
+ {
+ pid->extra_es[i]->id =
+ es_out_Add( p_demux->out, &pid->extra_es[i]->fmt );
+ }
+ p_sys->i_pmt_es += 1 + pid->i_extra_es;
+ }
+ }
+ else if( p_sys->b_delay_es_creation )
+ {
+ p_sys->b_delay_es_creation = false;
+ b_create_delayed = true;
+ }
+
+ if( b_create_delayed )
+ {
+ for(int i=MIN_ES_PID; i<MAX_ES_PID; i++)
+ {
+ pid = &p_sys->pid[i];
+ if(!pid->es || pid->es->id)
+ continue;
+ pid->es->id = es_out_Add( p_demux->out, &pid->es->fmt );
+ for( int j = 0; j < pid->i_extra_es; j++ )
+ {
+ pid->extra_es[j]->id =
+ es_out_Add( p_demux->out, &pid->extra_es[j]->fmt );
+ }
+ p_sys->i_pmt_es += 1 + pid->i_extra_es;
+ }
+ }
+}
+
static void PMTCallBack( void *data, dvbpsi_pmt_t *p_pmt )
{
demux_t *p_demux = data;
@@ -5160,13 +5213,7 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_pmt )
}
else
{
- pid->es->id = es_out_Add( p_demux->out, &pid->es->fmt );
- for( int i = 0; i < pid->i_extra_es; i++ )
- {
- pid->extra_es[i]->id =
- es_out_Add( p_demux->out, &pid->extra_es[i]->fmt );
- }
- p_sys->i_pmt_es += 1 + pid->i_extra_es;
+ AddAndCreateES( p_demux, pid );
}
}
More information about the vlc-commits
mailing list