[vlc-devel] [PATCH 04/17] es_out: add a matching time to SET_*_PCR

Thomas Guillem thomas at gllm.fr
Wed Mar 10 13:42:05 UTC 2021


On Wed, Mar 10, 2021, at 12:56, Rémi Denis-Courmont wrote:
> Hi,
> 
> This is wrong IMO. As I think I've pointed out way back when, we should report the mapping from timestamp to NPT, which in practice is an offset that rarely changes.


For the few demuxers that need NPT or matching time, it's a little simpler to send the matching_time (one less subtraction, and use the already implemented GET_TIME code).

I'm OK with both solution.  If we are certain that NPT can't move, then yes, I can send it via a new ES_OUT control only one time, but I don't think that's the case with TS.

The previous implementation was wrong (DEMUX_GET_NPT) since there was possibly a delay of 200ms before getting the correct time (so UI glitch).

> 
> We should *not* tie this to reporting the PCR. In fact, this should probably not tie into the ES output, as it is an input/user thing.
> 
> Le 9 mars 2021 17:15:33 GMT+02:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>> This will replace DEMUX_GET_NORMAL_TIME.
>> 
>> Demux modules should set a valid matching_time if the PCR and the time
>> reported by DEMUX_GET_TIME don't have the same origin.
>> This is the case for mpeg/ts, dvd, bluray, cdda, adaptive. include/vlc_es_out.h                        | 16 +++++++++++++---
>>  modules/demux/adaptive/PlaylistManager.cpp  |  2 +-
>>  modules/demux/adaptive/plumbing/Demuxer.cpp |  2 +-
>>  modules/demux/mpeg/ts.c                     |  2 +-
>>  modules/demux/timestamps_filter.h           |  5 +++--
>>  src/input/es_out_timeshift.c                |  7 +++++--
>>  6 files changed, 24 insertions(+), 10 deletions(-)
>> 
>> diff --git a/include/vlc_es_out.h b/include/vlc_es_out.h
>> index 49635f8594f..a10d2a1a555 100644
>> --- a/include/vlc_es_out.h
>> +++ b/include/vlc_es_out.h
>> @@ -60,9 +60,13 @@ enum es_out_query_e
>>       * to slow down the demuxer so that it reads at the right speed.
>>       * XXX: if you want PREROLL just call ES_OUT_SET_NEXT_DISPLAY_TIME and send
>>       * as you would normally do.
>> +     * Modules should set a valid matching_time (!= VLC_TICK_INVALID) when
>> +     * their PCR is not based on 0 (DEMUX_GET_TIME and PCR are not based on the
>> +     * same origin).
>> +     *
>>       */
>> -    ES_OUT_SET_PCR,             /* arg1=vlc_tick_t i_pcr(microsecond!) (using default group 0)*/
>> -    ES_OUT_SET_GROUP_PCR,       /* arg1= int i_group, arg2=vlc_tick_t i_pcr(microsecond!)*/
>> +    ES_OUT_SET_PCR,             /* arg1=vlc_tick_t i_pcr, arg2=vlc_tick_t i_matching_time (using default group 0) */
>> +    ES_OUT_SET_GROUP_PCR,       /* arg1= int i_group, arg2=vlc_tick_t i_pcr, arg3=vlc_tick_t i_matching_time */
>>      ES_OUT_RESET_PCR,           /* no arg */
>>  
>>      /* This will update the fmt, drain and restart the decoder (if any).
>> @@ -184,7 +188,13 @@ static inline void es_out_Delete( es_out_t *p_out )
>>  
>>  static inline int es_out_SetPCR( es_out_t *out, vlc_tick_t pcr )
>>  {
>> -    return es_out_Control( out, ES_OUT_SET_PCR, pcr );
>> +    return es_out_Control( out, ES_OUT_SET_PCR, pcr, VLC_TICK_INVALID );
>> +}
>> +
>> +static inline int es_out_SetPCRTime( es_out_t *out, vlc_tick_t pcr,
>> +                                     vlc_tick_t matching_time )
>> +{
>> +    return es_out_Control( out, ES_OUT_SET_PCR, pcr, matching_time );
>>  }
>>  
>>  static inline int es_out_ControlSetMeta( es_out_t *out, const vlc_meta_t *p_meta )
>> diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp
>> index e38e4d2fd6d..12773950159 100644
>> --- a/modules/demux/adaptive/PlaylistManager.cpp
>> +++ b/modules/demux/adaptive/PlaylistManager.cpp
>> @@ -505,7 +505,7 @@ int PlaylistManager::doDemux(vlc_tick_t increment)
>>          {
>>              demux.i_nzpcr = i_nzbarrier;
>>              vlc_tick_t pcr = VLC_TICK_0 + std::max(INT64_C(0), demux.i_nzpcr - VLC_TICK_FROM_MS(100));
>> -            es_out_Control(p_demux->out, ES_OUT_SET_GROUP_PCR, 0, pcr);
>> +            es_out_Control(p_demux->out, ES_OUT_SET_GROUP_PCR, 0, pcr, VLC_TICK_INVALID);
>>          }
>>          vlc_mutex_unlock(&demux.lock);
>>          break;
>> diff --git a/modules/demux/adaptive/plumbing/Demuxer.cpp b/modules/demux/adaptive/plumbing/Demuxer.cpp
>> index 0317f7309a5..d00fe280073 100644
>> --- a/modules/demux/adaptive/plumbing/Demuxer.cpp
>> +++ b/modules/demux/adaptive/plumbing/Demuxer.cpp
>> @@ -281,6 +281,6 @@ AbstractDemuxer::Status SlaveDemuxer::demux(vlc_tick_t nz_deadline)
>>          return Status::Eof;
>>      }
>>      Status status = Demuxer::demux(i_next_demux_time);
>> -    es_out_Control(p_es_out, ES_OUT_SET_GROUP_PCR, 0, i_next_demux_time);
>> +    es_out_Control(p_es_out, ES_OUT_SET_GROUP_PCR, 0, i_next_demux_time, VLC_TICK_INVALID);
>>      return status;
>>  }
>> diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
>> index 6361715cc67..52319fd220c 100644
>> --- a/modules/demux/mpeg/ts.c
>> +++ b/modules/demux/mpeg/ts.c
>> @@ -2267,7 +2267,7 @@ static void ProgramSetPCR( demux_t *p_demux, ts_pmt_t *p_pmt, stime_t i_pcr )
>>  
>>      if ( p_sys->i_pmt_es )
>>      {
>> -        es_out_Control( p_demux->out, ES_OUT_SET_GROUP_PCR, p_pmt->i_number, FROM_SCALE(i_pcr) );
>> +        es_out_Control( p_demux->out, ES_OUT_SET_GROUP_PCR, p_pmt->i_number, FROM_SCALE(i_pcr), VLC_TICK_INVALID );
>>          /* growing files/named fifo handling */
>>          if( p_sys->b_access_control == false &&
>>              vlc_stream_Tell( p_sys->stream ) > p_pmt->i_last_dts_byte )
>> diff --git a/modules/demux/timestamps_filter.h b/modules/demux/timestamps_filter.h
>> index a3563326e30..46491021788 100644
>> --- a/modules/demux/timestamps_filter.h
>> +++ b/modules/demux/timestamps_filter.h
>> @@ -171,6 +171,7 @@ static int timestamps_filter_es_out_Control(es_out_t *out, input_source_t *in, i
>>              else
>>                  i_group = 0;
>>              int64_t pcr = va_arg(va_list, int64_t);
>> +            int64_t matching_time = va_arg(va_list, int64_t);
>>  
>>              if(timestamps_filter_push("PCR ", &p_sys->pcrtf, pcr, 0, p_sys->b_discontinuity, true))
>>              {
>> @@ -200,9 +201,9 @@ static int timestamps_filter_es_out_Control(es_out_t *out, input_source_t *in, i
>>              pcr += p_sys->pcrtf.sequence_offset;
>>  
>>              if(i_query == ES_OUT_SET_GROUP_PCR)
>> -                return es_out_Control(p_sys->original_es_out, i_query, i_group, pcr);
>> +                return es_out_Control(p_sys->original_es_out, i_query, i_group, pcr, matching_time);
>>              else
>> -                return es_out_SetPCR(p_sys->original_es_out, pcr);
>> +                return es_out_SetPCRTime(p_sys->original_es_out, pcr, matching_time);
>>          }
>>              break;
>>          case ES_OUT_RESET_PCR:
>> diff --git a/src/input/es_out_timeshift.c b/src/input/es_out_timeshift.c
>> index da01feb8b9c..2ecc7c3b6bd 100644
>> --- a/src/input/es_out_timeshift.c
>> +++ b/src/input/es_out_timeshift.c
>> @@ -1533,11 +1533,13 @@ static int CmdInitControl( ts_cmd_control_t *p_cmd, input_source_t *in,
>>  
>>      case ES_OUT_SET_PCR:
>>          p_cmd->u.int_i64_i64.i_i64_1 = va_arg( args, vlc_tick_t );
>> +        p_cmd->u.int_i64_i64.i_i64_2 = va_arg( args, vlc_tick_t );
>>          break;
>>  
>>      case ES_OUT_SET_GROUP_PCR:          /* arg1= int i_group, arg2=vlc_tick_t i_pcr(microsecond!)*/
>>          p_cmd->u.int_i64_i64.i_int = va_arg( args, int );
>>          p_cmd->u.int_i64_i64.i_i64_1 = va_arg( args, vlc_tick_t );
>> +        p_cmd->u.int_i64_i64.i_i64_2 = va_arg( args, vlc_tick_t );
>>          break;
>>  
>>      case ES_OUT_SET_ES_SCRAMBLED_STATE:
>> @@ -1670,11 +1672,12 @@ static int CmdExecuteControl( es_out_t *p_tsout, ts_cmd_control_t *p_cmd )
>>          return es_out_in_Control( p_sys->p_out, in, i_query, p_cmd->u.i_i64 );
>>  
>>      case ES_OUT_SET_PCR:
>> -        return es_out_in_Control( p_sys->p_out, in, i_query, p_cmd->u.int_i64_i64.i_i64_1 );
>> +        return es_out_in_Control( p_sys->p_out, in, i_query, p_cmd->u.int_i64_i64.i_i64_1,
>> +                                  p_cmd->u.int_i64_i64.i_i64_2 );
>>  
>>      case ES_OUT_SET_GROUP_PCR:          /* arg1= int i_group, arg2=vlc_tick_t i_pcr(microsecond!)*/
>>          return es_out_in_Control( p_sys->p_out, in, i_query, p_cmd->u.int_i64_i64.i_int,
>> -                                  p_cmd->u.int_i64_i64.i_i64_1 );
>> +                                  p_cmd->u.int_i64_i64.i_i64_1, p_cmd->u.int_i64_i64.i_i64_2 );
>>  
>>      case ES_OUT_RESET_PCR:           /* no arg */
>>          return es_out_in_Control( p_sys->p_out, in, i_query );
> 
> -- 
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté. 
> _______________________________________________
> 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/20210310/0714543b/attachment.html>


More information about the vlc-devel mailing list