diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c index c4f18bfaae..9414af1284 100644 --- a/modules/demux/mpeg/ts.c +++ b/modules/demux/mpeg/ts.c @@ -439,9 +439,13 @@ static int Open( vlc_object_t *p_this ) /* We handle description of an extra PMT */ char* psz_string = var_CreateGetString( p_demux, "ts-extra-pmt" ); - p_sys->b_user_pmt = false; - if( psz_string && *psz_string ) - UserPmt( p_demux, psz_string ); + const char* psz_fmt = psz_string; + if( psz_fmt && !strncmp(psz_fmt, "temp:", 5) ) + psz_fmt += 5; + if( psz_fmt && *psz_fmt && UserPmt( p_demux, psz_fmt ) == VLC_SUCCESS ) + p_sys->program_source = (psz_fmt == psz_string) ? USER_PMT : USER_TEMPPMT; + else + p_sys->program_source = STREAM_PATPMT; free( psz_string ); psz_string = var_CreateGetStringCommand( p_demux, "ts-csa-ck" ); diff --git a/modules/demux/mpeg/ts.h b/modules/demux/mpeg/ts.h index 45d2730b01..747a70a9e6 100644 --- a/modules/demux/mpeg/ts.h +++ b/modules/demux/mpeg/ts.h @@ -86,7 +86,12 @@ struct demux_sys_t /* All pid */ ts_pid_list_t pids; - bool b_user_pmt; + enum + { + STREAM_PATPMT, + USER_PMT, + USER_TEMPPMT, + } program_source; int i_pmt_es; enum diff --git a/modules/demux/mpeg/ts_psi.c b/modules/demux/mpeg/ts_psi.c index 13a04c29a3..868b7ca2b7 100644 --- a/modules/demux/mpeg/ts_psi.c +++ b/modules/demux/mpeg/ts_psi.c @@ -102,8 +102,9 @@ static void PATCallBack( void *data, dvbpsi_pat_t *p_dvbpsipat ) } /* override hotfixes */ - if( p_pat->b_generated ) + if( p_pat->b_generated || p_sys->program_source == USER_TEMPPMT ) { + p_sys->program_source = STREAM_PATPMT; p_pat->b_generated = false; p_pat->i_version = -1; p_pat->i_ts_id = -1; @@ -112,15 +113,15 @@ static void PATCallBack( void *data, dvbpsi_pat_t *p_dvbpsipat ) /* check versioning changes */ if( ( p_pat->i_version != -1 && p_dvbpsipat->i_version == p_pat->i_version ) || - ( p_pat->i_ts_id != -1 && p_dvbpsipat->i_ts_id != p_pat->i_ts_id ) ) + ( p_pat->i_ts_id != -1 && p_dvbpsipat->i_ts_id != p_pat->i_ts_id ) || + p_sys->program_source == USER_PMT ) { dvbpsi_pat_delete( p_dvbpsipat ); return; } /* check content */ - if( !p_dvbpsipat->b_current_next || p_sys->b_user_pmt || - PATCheck( p_demux, p_dvbpsipat ) ) + if( !p_dvbpsipat->b_current_next || PATCheck( p_demux, p_dvbpsipat ) ) { dvbpsi_pat_delete( p_dvbpsipat ); return; @@ -2317,7 +2318,6 @@ int UserPmt( demux_t *p_demux, const char *psz_fmt ) psz = psz_next; } - p_sys->b_user_pmt = true; free( psz_dup ); return VLC_SUCCESS;