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