[vlc-commits] mux/mpeg/ts.c: support for libdvbpsi >= 1.0.0

Jean-Paul Saman git at videolan.org
Fri May 17 11:20:41 CEST 2013


vlc | branch: master | Jean-Paul Saman <jpsaman at videolan.org> | Mon Apr 22 13:13:37 2013 +0200| [cbe6eace23b5127594f8563d6a0e05c785247a34] | committer: Jean-Paul Saman

mux/mpeg/ts.c:  support for libdvbpsi >= 1.0.0

Allow compiling against libdvbpsi 1.0.0 or greater.

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

 modules/mux/Modules.am           |    2 +-
 modules/mux/mpeg/dvbpsi_compat.h |   82 ++++++++++++++++++++++++++++++++++++++
 modules/mux/mpeg/ts.c            |   52 ++++++++++++++++++++++--
 3 files changed, 132 insertions(+), 4 deletions(-)

diff --git a/modules/mux/Modules.am b/modules/mux/Modules.am
index dec871c..85aed68 100644
--- a/modules/mux/Modules.am
+++ b/modules/mux/Modules.am
@@ -25,7 +25,7 @@ libvlc_LTLIBRARIES += libmux_ps_plugin.la
 libmux_ts_plugin_la_SOURCES = \
 	mpeg/pes.c mpeg/pes.h \
 	mpeg/csa.c mpeg/csa.h \
-	mpeg/ts.c mpeg/bits.h
+	mpeg/ts.c mpeg/bits.h mpeg/dvbpsi_compat.h
 libmux_ts_plugin_la_CFLAGS = $(AM_CFLAGS) $(DVBPSI_CFLAGS)
 libmux_ts_plugin_la_LIBADD = $(AM_LIBADD) $(DVBPSI_LIBS)
 if HAVE_DVBPSI
diff --git a/modules/mux/mpeg/dvbpsi_compat.h b/modules/mux/mpeg/dvbpsi_compat.h
new file mode 100644
index 0000000..120605f
--- /dev/null
+++ b/modules/mux/mpeg/dvbpsi_compat.h
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ * dvbpsi_compat.h: Compatibility headerfile
+ *****************************************************************************
+ * Copyright (C) 2013 VideoLAN Association
+ *
+ * Authors: Jean-Paul Saman <jpsaman at videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef DVBPSI_COMPAT_H
+#define DVBPSI_COMPAT_H
+
+/*
+ * dvbpsi compatibility macros:
+ * dvbpsi version 1.0.0 and above returns a struct 'dvbpsi_t' as handle
+ */
+#define DVBPSI_VERSION_WANTED(major,minor,bugfix) (((major)<<16)+((minor)<<8)+(bugfix))
+
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+# define dvbpsi_handle dvbpsi_t*
+# define dvbpsi_PushPacket(handle,data) dvbpsi_packet_push((handle),(data))
+/* PAT */
+# define dvbpsi_InitPAT(pat,id,version,next) dvbpsi_pat_init((pat),(id),(version),(bool)(next))
+# define dvbpsi_PATAddProgram(pat,nr,pid)    dvbpsi_pat_program_add((pat),(nr),(pid))
+# define dvbpsi_EmptyPAT(pat)                dvbpsi_pat_empty((pat))
+# define dvbpsi_DeletePAT(table)             dvbpsi_pat_delete((table))
+# define dvbpsi_DetachPAT(pat)               dvbpsi_pat_detach((pat))
+/* PMT */
+# define dvbpsi_InitPMT(pmt,program,version,next,pcr) \
+         dvbpsi_pmt_init((pmt),(program),(version),(bool)(next),(pcr))
+# define dvbpsi_PMTAddDescriptor(pmt,tag,length,data) \
+         dvbpsi_pmt_descriptor_add((pmt),(tag),(length),(data))
+# define dvbpsi_PMTAddES(pmt,type,pid) \
+         dvbpsi_pmt_es_add((pmt),(type),(pid))
+# define dvbpsi_PMTESAddDescriptor(es,tag,length,data) \
+         dvbpsi_pmt_es_descriptor_add((es),(tag),(length),(data))
+# define dvbpsi_EmptyPMT(pmt) dvbpsi_pmt_empty((pmt))
+# define dvbpsi_DeletePMT(table)        dvbpsi_pmt_delete((table))
+# define dvbpsi_DetachPMT(pmt)          dvbpsi_pmt_detach((pmt))
+/* SDT */
+# define dvbpsi_InitSDT(sdt,id,version,curnext,netid) \
+         dvbpsi_sdt_init((sdt),(id),(0),(version),(bool)(curnext),(netid))
+# define dvbpsi_SDTAddService(sdt,id,schedule,present,status,ca) \
+         dvbpsi_sdt_service_add((sdt),(id),(bool)(schedule),(bool)(present),(status),(bool)(ca))
+# define dvbpsi_EmptySDT(sdt) dvbpsi_sdt_empty((sdt))
+# define dvbpsi_DeleteSDT(table)        dvbpsi_sdt_delete((table))
+/* TOT */
+# define dvbpsi_DeleteTOT(table)        dvbpsi_tot_delete((table))
+/* EIT */
+# define dvbpsi_DeleteEIT(table)        dvbpsi_eit_delete((table))
+/* NIT */
+# define dvbpsi_DeleteNIT(table)        dvbpsi_nit_delete((table))
+
+static void dvbpsi_message(dvbpsi_t *p_dvbpsi, const dvbpsi_msg_level_t level, const char* msg)
+{
+    vlc_object_t *obj = (vlc_object_t *)p_dvbpsi->p_sys;
+
+    /* See dvbpsi.h for the definition of these log levels.*/
+    switch(level)
+    {
+        case DVBPSI_MSG_ERROR: msg_Err( obj, "%s", msg ); break;
+        case DVBPSI_MSG_WARN:  msg_Warn( obj, "%s", msg ); break;
+        case DVBPSI_MSG_DEBUG: msg_Dbg( obj, "%s", msg ); break;
+        default: msg_Info( obj, "%s", msg ); break;
+    }
+}
+#endif
+
+#endif
diff --git a/modules/mux/mpeg/ts.c b/modules/mux/mpeg/ts.c
index 578ada3..21cd336 100644
--- a/modules/mux/mpeg/ts.c
+++ b/modules/mux/mpeg/ts.c
@@ -55,6 +55,8 @@
 # include <dvbpsi/dr.h>
 # include <dvbpsi/psi.h>
 
+#include "dvbpsi_compat.h"
+
 /*
  * TODO:
  *  - check PCR frequency requirement
@@ -340,6 +342,9 @@ struct sout_mux_sys_t
 
     vlc_mutex_t     csa_lock;
 
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+    dvbpsi_t        *p_dvbpsi;
+#endif
     bool            b_es_id_pid;
     bool            b_sdt;
     int             i_pid_video;
@@ -517,6 +522,16 @@ static int Open( vlc_object_t *p_this )
     p_mux->pf_mux       = Mux;
     p_mux->p_sys        = p_sys;
 
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+    p_sys->p_dvbpsi = dvbpsi_new( &dvbpsi_message, DVBPSI_MSG_DEBUG );
+    if( !p_sys->p_dvbpsi )
+    {
+        free( p_sys );
+        return VLC_ENOMEM;
+    }
+    p_sys->p_dvbpsi->p_sys = (void *) p_mux;
+#endif
+
     p_sys->b_es_id_pid = var_GetBool( p_mux, SOUT_CFG_PREFIX "es-id-pid" );
 
     /*
@@ -725,6 +740,11 @@ static void Close( vlc_object_t * p_this )
     sout_mux_t          *p_mux = (sout_mux_t*)p_this;
     sout_mux_sys_t      *p_sys = p_mux->p_sys;
 
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+    if( p_sys->p_dvbpsi )
+        dvbpsi_delete( p_sys->p_dvbpsi );
+#endif
+
     if( p_sys->csa )
     {
         var_DelCallback( p_mux, SOUT_CFG_PREFIX "csa-ck", ChangeKeyCallback, NULL );
@@ -1991,6 +2011,8 @@ static block_t *WritePSISection( dvbpsi_psi_section_t* p_section )
                   (p_section->b_syntax_indicator ? 4 : 0);
 
         p_psi = block_Alloc( i_size + 1 );
+        if( !p_psi )
+            goto error;
         p_psi->i_pts = 0;
         p_psi->i_dts = 0;
         p_psi->i_length = 0;
@@ -2007,6 +2029,11 @@ static block_t *WritePSISection( dvbpsi_psi_section_t* p_section )
     }
 
     return( p_first );
+
+error:
+    if( p_first )
+        block_ChainRelease( p_first );
+    return NULL;
 }
 
 static void GetPAT( sout_mux_t *p_mux,
@@ -2024,8 +2051,11 @@ static void GetPAT( sout_mux_t *p_mux,
         dvbpsi_PATAddProgram( &pat, p_sys->i_pmt_program_number[i],
                               p_sys->pmt[i].i_pid );
 
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+    p_section = dvbpsi_pat_sections_generate( p_sys->p_dvbpsi, &pat, 0 );
+#else
     p_section = dvbpsi_GenPATSections( &pat, 0 /* max program per section */ );
-
+#endif
     p_pat = WritePSISection( p_section );
 
     PEStoTS( c, p_pat, &p_sys->pat );
@@ -2232,8 +2262,14 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
         psz_sdt_desc[ 2 + provlen ] = (char)servlen;
         memcpy( &psz_sdt_desc[3+provlen], psz_sdtserv, servlen );
 
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+        dvbpsi_sdt_service_descriptor_add( p_service, 0x48,
+                                           (3 + provlen + servlen),
+                                           psz_sdt_desc );
+#else
         dvbpsi_SDTServiceAddDescriptor( p_service, 0x48,
                 3 + provlen + servlen, psz_sdt_desc );
+#endif
     }
 
     if( p_sys->i_mpeg4_streams > 0 )
@@ -2362,7 +2398,12 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
 
     for (unsigned i = 0; i < p_sys->i_num_pmt; i++ )
     {
-        dvbpsi_psi_section_t *sect = dvbpsi_GenPMTSections( &p_sys->dvbpmt[i] );
+        dvbpsi_psi_section_t *sect;
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+        sect = dvbpsi_pmt_sections_generate( p_sys->p_dvbpsi, &p_sys->dvbpmt[i] );
+#else
+        sect = dvbpsi_GenPMTSections( &p_sys->dvbpmt[i] );
+#endif
         block_t *pmt = WritePSISection( sect );
         PEStoTS( c, pmt, &p_sys->pmt[i] );
         dvbpsi_DeletePSISections(sect);
@@ -2371,7 +2412,12 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
 
     if( p_sys->b_sdt )
     {
-        dvbpsi_psi_section_t *sect = dvbpsi_GenSDTSections( &sdt );
+        dvbpsi_psi_section_t *sect;
+#if (DVBPSI_VERSION_INT >= DVBPSI_VERSION_WANTED(1,0,0))
+        sect = dvbpsi_sdt_sections_generate( p_sys->p_dvbpsi, &sdt );
+#else
+        sect = dvbpsi_GenSDTSections( &sdt );
+#endif
         block_t *p_sdt = WritePSISection( sect );
         PEStoTS( c, p_sdt, &p_sys->sdt );
         dvbpsi_DeletePSISections( sect );



More information about the vlc-commits mailing list