[vlc-devel] [PATCH v2 4/7] demux: ts: handle ES_OUT_SET_GROUP_NPT

Thomas Guillem thomas at gllm.fr
Thu Apr 1 15:30:09 UTC 2021


And remove (soon to be deprecated) DEMUX_GET_NORMAL_TIME handling.
---
 modules/demux/mpeg/ts.c      | 21 +++++++++++++--------
 modules/demux/mpeg/ts_psip.c |  2 ++
 modules/demux/mpeg/ts_si.c   |  2 ++
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index ac8053f5490..af5aab4f1cc 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -1042,14 +1042,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             return VLC_SUCCESS;
         }
         break;
-    case DEMUX_GET_NORMAL_TIME:
-        if ((p_sys->b_access_control && !EITCurrentEventTime( p_pmt, p_sys, NULL, NULL))
-         || (!p_pmt || p_pmt->pcr.i_current == -1 || p_pmt->pcr.i_first == -1))
-            return VLC_EGENERIC; /* use VLC_TICK_0 as Normal Play Time*/
-
-        /* Use the first pcr of the current program as Normal Play Time */
-        *va_arg( args, vlc_tick_t * ) = FROM_SCALE( p_pmt->pcr.i_first );
-        return VLC_SUCCESS;
 
     case DEMUX_GET_LENGTH:
         if( p_sys->b_access_control )
@@ -2052,6 +2044,17 @@ static int SeekToTime( demux_t *p_demux, const ts_pmt_t *p_pmt, stime_t i_scaled
     return VLC_SUCCESS;
 }
 
+static void SetPmtNPT( demux_t *p_demux, const ts_pmt_t *p_pmt )
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+
+    if( p_sys->b_access_control && p_pmt->eit.i_event_start != 0 )
+        return; /* NPT already set to eit.i_event_start */
+
+    es_out_Control( p_demux->out, ES_OUT_SET_GROUP_NPT, p_pmt->i_number,
+                    FROM_SCALE(p_pmt->pcr.i_first) );
+}
+
 static int ProbeChunk( demux_t *p_demux, int i_program, bool b_end, bool *pb_found )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
@@ -2137,6 +2140,7 @@ static int ProbeChunk( demux_t *p_demux, int i_program, bool b_end, bool *pb_fou
                         else if( b_pcrresult && p_pmt->pcr.i_first == -1 )
                         {
                             p_pmt->pcr.i_first = i_pcr;
+                            SetPmtNPT( p_demux, p_pmt );
                         }
                         else if( p_pmt->pcr.i_first_dts == -1 )
                         {
@@ -2264,6 +2268,7 @@ static void ProgramSetPCR( demux_t *p_demux, ts_pmt_t *p_pmt, stime_t i_pcr )
     if( p_pmt->pcr.i_first == -1 )
     {
         p_pmt->pcr.i_first = i_pcr; // now seen
+        SetPmtNPT( p_demux, p_pmt );
     }
 
     if ( p_sys->i_pmt_es )
diff --git a/modules/demux/mpeg/ts_psip.c b/modules/demux/mpeg/ts_psip.c
index 4cae29eb55c..80b2d7f36a3 100644
--- a/modules/demux/mpeg/ts_psip.c
+++ b/modules/demux/mpeg/ts_psip.c
@@ -500,6 +500,8 @@ static void ATSC_EIT_Callback( void *p_pid, dvbpsi_atsc_eit_t* p_eit )
         {
             p_pmt->eit.i_event_start = p_epg->p_current->i_start;
             p_pmt->eit.i_event_length = p_epg->p_current->i_duration;
+            es_out_Control( p_demux->out, ES_OUT_SET_GROUP_NPT, p_pmt->i_number,
+                            p_pmt->eit.i_event_start );
         }
     }
 
diff --git a/modules/demux/mpeg/ts_si.c b/modules/demux/mpeg/ts_si.c
index 3aef96ce96d..631483c16d6 100644
--- a/modules/demux/mpeg/ts_si.c
+++ b/modules/demux/mpeg/ts_si.c
@@ -684,6 +684,8 @@ static void EITCallBack( demux_t *p_demux, dvbpsi_eit_t *p_eit )
             {
                 p_pmt->eit.i_event_start = p_epg->p_current->i_start;
                 p_pmt->eit.i_event_length = p_epg->p_current->i_duration;
+                es_out_Control( p_demux->out, ES_OUT_SET_GROUP_NPT, p_pmt->i_number,
+                                p_pmt->eit.i_event_start );
             }
         }
         p_epg->b_present = (p_eit->i_table_id == 0x4e);
-- 
2.30.0



More information about the vlc-devel mailing list