[vlc-devel] [RFC] Don't trust the PCR by default

Jean-Paul Saman jpsaman at videolan.org
Mon Mar 17 08:57:36 CET 2014


On Sun, Mar 16, 2014 at 7:10 PM, Denis Charmet <typx at dinauz.org> wrote:

> The TS demux is PCR master but broken streams may have invalid PCR which
> stops the playback or at least the playback of some tracks.
> Those file can be played with --demux=avformat since it uses the minimum
> dts off all the tracks as PCR.
>
> The following patch implements the same thing.
>
> Any idea/comments on this PoC?
>
> Regards,
> ---
>  modules/demux/ts.c | 25 ++++++++++++++++++++++---
>  1 file changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/modules/demux/ts.c b/modules/demux/ts.c
> index 093618e..04aa8d1 100644
> --- a/modules/demux/ts.c
> +++ b/modules/demux/ts.c
> @@ -140,7 +140,7 @@ vlc_module_begin ()
>      set_subcategory( SUBCAT_INPUT_DEMUX )
>
>      add_string( "ts-extra-pmt", NULL, PMT_TEXT, PMT_LONGTEXT, true )
> -    add_bool( "ts-trust-pcr", true, PCR_TEXT, PCR_LONGTEXT, true )
> +    add_bool( "ts-trust-pcr", false, PCR_TEXT, PCR_LONGTEXT, true )
>

I am not sure it is a good idea to change this default. It will make all
good streams take a different path and am not sure it won't break anything.
IMHO it should be defaulted to true.

         change_safe()
>      add_bool( "ts-es-id-pid", true, PID_TEXT, PID_LONGTEXT, true )
>          change_safe()
> @@ -272,6 +272,8 @@ typedef struct
>      ts_es_t     **extra_es;
>      int         i_extra_es;
>
> +    mtime_t     i_last_dts;
> +
>  } ts_pid_t;
>
>  struct demux_sys_t
> @@ -374,6 +376,7 @@ static int UserPmt( demux_t *p_demux, const char * );
>
>  static int  SetPIDFilter( demux_t *, int i_pid, bool b_selected );
>  static void SetPrgFilter( demux_t *, int i_prg, bool b_selected );
> +static mtime_t AdjustPCRWrapAround( demux_t *p_demux, mtime_t i_pcr );
>
>  #define TS_PACKET_SIZE_188 188
>  #define TS_PACKET_SIZE_192 192
> @@ -1388,6 +1391,7 @@ static void PIDInit( ts_pid_t *pid, bool b_psi,
> ts_psi_t *p_owner )
>      pid->b_scrambled = false;
>      pid->p_owner    = p_owner;
>      pid->i_owner_number = 0;
> +    pid->i_last_dts = VLC_TS_INVALID;
>
>      TAB_INIT( pid->i_extra_es, pid->extra_es );
>
> @@ -1723,9 +1727,24 @@ static void ParsePES( demux_t *p_demux, ts_pid_t
> *pid, block_t *p_pes )
>                           block_Duplicate( p_block ) );
>          }
>
> -        if (!p_sys->b_trust_pcr)
> -            es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts);
> +        pid->i_last_dts = i_dts;
> +        if( !p_sys->b_trust_pcr )
> +        {
> +            mtime_t i_pcr = i_dts;
> +            for( int i = 2 ; i < 8192 ; i++ )
> +            {
> +               ts_pid_t *p_pid = &p_sys->pid[i];
> +               if( pid->b_valid && pid->p_owner == p_pid->p_owner &&
> +                   pid->i_owner_number == p_pid->i_owner_number &&
> +                   i_pcr > p_pid->i_last_dts )
> +               {
> +                   i_pcr = p_pid->i_last_dts;
> +               }
> +            }
> +            es_out_Control( p_demux->out, ES_OUT_SET_GROUP_PCR,
> +                      (int) pid->i_owner_number, (int64_t) i_pcr );
>
> +        }
>          es_out_Send( p_demux->out, pid->es->id, p_block );
>      }
>      else
> --
> 1.9.rc1
>
> Kind regards,

Jean-Paul Saman

> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20140317/00c52748/attachment.html>


More information about the vlc-devel mailing list