[vlc-commits] demux: ts: handle SCTE-18 / EAS

Francois Cartegnie git at videolan.org
Sun Jan 24 01:24:21 CET 2016


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Jan 22 22:40:06 2016 +0100| [b4294e3e97ad49c1aa8fb7230e46cc8bf4f1e894] | committer: Francois Cartegnie

demux: ts: handle SCTE-18 / EAS

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b4294e3e97ad49c1aa8fb7230e46cc8bf4f1e894
---

 modules/demux/Makefile.am |    1 +
 modules/demux/mpeg/ts.c   |   52 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am
index b9007e0..a9a2a6a 100644
--- a/modules/demux/Makefile.am
+++ b/modules/demux/Makefile.am
@@ -235,6 +235,7 @@ libts_plugin_la_SOURCES = demux/mpeg/ts.c demux/mpeg/ts.h \
 	mux/mpeg/csa.c mux/mpeg/dvbpsi_compat.h \
 	mux/mpeg/streams.h mux/mpeg/tables.c mux/mpeg/tables.h \
 	mux/mpeg/tsutil.c mux/mpeg/tsutil.h \
+        codec/scte18.h \
 	demux/dvb-text.h codec/opus_header.c demux/opus.h
 libts_plugin_la_CFLAGS = $(AM_CFLAGS) $(DVBPSI_CFLAGS)
 libts_plugin_la_LIBADD = $(DVBPSI_LIBS) $(SOCKET_LIBS)
diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 1c27f0c..cd6336f 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -69,6 +69,7 @@
 #include "../../mux/mpeg/tables.h"
 
 #include "../../codec/opus_header.h"
+#include "../../codec/scte18.h"
 
 #include "../opus.h"
 
@@ -176,6 +177,8 @@ vlc_module_begin ()
     add_integer( "ts-arib", ARIBMODE_AUTO, SUPPORT_ARIB_TEXT, SUPPORT_ARIB_LONGTEXT, false )
         change_integer_list( arib_mode_list, arib_mode_list_text )
 
+    add_bool( "ts-eas", false, SCTE18_DESCRIPTION, NULL, false )
+
     add_obsolete_bool( "ts-silent" );
 
     set_capability( "demux", 10 )
@@ -370,6 +373,7 @@ struct demux_sys_t
 
     bool        b_force_seek_per_percent;
 
+    bool        b_atsc_eas;
     struct
     {
         arib_modes_e e_mode;
@@ -1147,6 +1151,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->b_canfastseek = false;
     p_sys->b_force_seek_per_percent = var_InheritBool( p_demux, "ts-seek-percent" );
 
+    p_sys->b_atsc_eas = var_InheritBool( p_demux, "ts-eas" );
     p_sys->arib.e_mode = var_InheritInteger( p_demux, "ts-arib" );
 
     stream_Control( p_sys->stream, STREAM_CAN_SEEK, &p_sys->b_canseek );
@@ -2470,6 +2475,27 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
     }
 }
 
+static void SCTE18_Section_Handler( demux_t *p_demux, ts_pid_t *pid, block_t *p_content )
+{
+    assert( pid->u.p_pes->p_es->fmt.i_codec == VLC_CODEC_SCTE_18 );
+    ts_pmt_t *p_pmt = pid->u.p_pes->p_es->p_program;
+    mtime_t i_date = TimeStampWrapAround( p_pmt, p_pmt->pcr.i_current );
+
+    int i_priority = scte18_get_EAS_priority( p_content->p_buffer, p_content->i_buffer );
+    msg_Dbg( p_demux, "Received EAS Alert with priority %d", i_priority );
+    /* We need to extract the truncated pts stored inside the payload */
+    ts_pes_es_t *p_es = pid->u.p_pes->p_es;
+    if( p_es->id )
+    {
+        if( i_priority == EAS_PRIORITY_HIGH || i_priority == EAS_PRIORITY_MAX )
+            es_out_Control( p_demux->out, ES_OUT_SET_ES_STATE, p_es->id, true );
+        p_content->i_dts = p_content->i_pts = FROM_SCALE( i_date );
+        es_out_Send( p_demux->out, p_es->id, p_content );
+    }
+    else
+        block_Release( p_content );
+}
+
 static void SCTE27_Section_Handler( demux_t *p_demux, ts_pid_t *pid, block_t *p_content )
 {
     assert( pid->u.p_pes->p_es->fmt.i_codec == VLC_CODEC_SCTE_27 );
@@ -5403,6 +5429,10 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt )
     dvbpsi_pmt_es_t *p_dvbpsies;
     for( p_dvbpsies = p_dvbpsipmt->p_first_es; p_dvbpsies != NULL; p_dvbpsies = p_dvbpsies->p_next )
     {
+        /* Do not mix with arbitrary pid if any */
+        if( p_sys->b_atsc_eas && p_dvbpsies->i_pid == SCTE18_SI_BASE_PID )
+            continue;
+
         ts_pid_t *pespid = GetPID(p_sys, p_dvbpsies->i_pid);
         if ( pespid->type != TYPE_PES && pespid->type != TYPE_FREE )
         {
@@ -5612,6 +5642,28 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt )
         } else dvbpsi_pmt_delete( p_dvbpsipmt );
     }
 
+     /* Add arbitrary PID from here */
+    if ( p_sys->b_atsc_eas && p_pmt->e_streams.i_size )
+    {
+        ts_pid_t *easpid = GetPID(p_sys, SCTE18_SI_BASE_PID);
+        if ( PIDSetup( p_demux, TYPE_PES, easpid, pmtpid ) )
+        {
+            ARRAY_APPEND( p_pmt->e_streams, easpid );
+            ts_pes_t *p_easpes = easpid->u.p_pes;
+            p_easpes->data_type = TS_ES_DATA_TABLE_SECTION;
+            p_easpes->p_es->fmt.i_codec = VLC_CODEC_SCTE_18;
+            p_easpes->p_es->fmt.i_cat = SPU_ES;
+            p_easpes->p_es->fmt.i_id = SCTE18_SI_BASE_PID;
+            p_easpes->p_es->fmt.i_group = p_pmt->i_number;
+            p_easpes->p_es->fmt.psz_description = strdup(SCTE18_DESCRIPTION);
+            p_easpes->b_always_receive = true;
+            ts_sections_processor_Add( &p_easpes->p_sections_proc,
+                                       SCTE18_TABLE_ID, 0x00,
+                                       false, SCTE18_Section_Handler );
+            msg_Dbg( p_demux, "  * pid=%d listening for EAS events", easpid->i_pid );
+        }
+    }
+
     /* Decref or clean now unused es */
     for( int i = 0; i < old_es_rm.i_size; i++ )
         PIDRelease( p_demux, old_es_rm.p_elems[i] );



More information about the vlc-commits mailing list