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

Rémi Denis-Courmont remi at remlab.net
Wed Mar 10 11:56:45 UTC 2021


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.

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 );
>-- 
>2.30.0
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20210310/a6362f40/attachment.html>


More information about the vlc-devel mailing list