]> git.sesse.net Git - vlc/blobdiff - modules/mux/mpeg/ts.c
Merge branch 'master' of git@git.videolan.org:vlc
[vlc] / modules / mux / mpeg / ts.c
index 7c588fa2cc39bc53fe0a2112723aaf42b98f01ff..99bdcfd3e587edf6a39dc188f5ac936f39080b80 100644 (file)
  * Preamble
  *****************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
 #include <vlc_sout.h>
 #include <vlc_codecs.h>
@@ -303,8 +307,7 @@ static inline block_t *BufferChainPeek( sout_buffer_chain_t *c )
     return b;
 }
 
-static inline void BufferChainClean( sout_instance_t *p_sout,
-                                     sout_buffer_chain_t *c )
+static inline void BufferChainClean( sout_buffer_chain_t *c )
 {
     block_t *b;
 
@@ -853,29 +856,30 @@ static void Close( vlc_object_t * p_this )
  *****************************************************************************/
 static int Control( sout_mux_t *p_mux, int i_query, va_list args )
 {
+    VLC_UNUSED(p_mux);
     vlc_bool_t *pb_bool;
     char **ppsz;
 
-   switch( i_query )
-   {
-       case MUX_CAN_ADD_STREAM_WHILE_MUXING:
-           pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
-           *pb_bool = VLC_TRUE;
-           return VLC_SUCCESS;
+    switch( i_query )
+    {
+        case MUX_CAN_ADD_STREAM_WHILE_MUXING:
+            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
+            *pb_bool = VLC_TRUE;
+            return VLC_SUCCESS;
 
-       case MUX_GET_ADD_STREAM_WAIT:
-           pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
-           *pb_bool = VLC_FALSE;
-           return VLC_SUCCESS;
+        case MUX_GET_ADD_STREAM_WAIT:
+            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
+            *pb_bool = VLC_FALSE;
+            return VLC_SUCCESS;
 
-       case MUX_GET_MIME:
-           ppsz = (char**)va_arg( args, char ** );
-           *ppsz = strdup( "video/mpeg" );  /* FIXME not sure */
-           return VLC_SUCCESS;
+        case MUX_GET_MIME:
+            ppsz = (char**)va_arg( args, char ** );
+            *ppsz = strdup( "video/mpeg" );  /* FIXME not sure */
+            return VLC_SUCCESS;
 
         default:
             return VLC_EGENERIC;
-   }
+    }
 }
 
 /*****************************************************************************
@@ -888,6 +892,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
     int                  i;
 
     p_input->p_sys = p_stream = malloc( sizeof( ts_stream_t ) );
+    if( !p_input->p_sys )
+        return VLC_ENOMEM;
 
     /* Init this new stream */
     if ( p_sys->b_es_id_pid )
@@ -952,6 +958,7 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
             switch( p_input->p_fmt->i_codec )
             {
                 case VLC_FOURCC( 'm', 'p','g', 'a' ):
+                case VLC_FOURCC( 'm', 'p', '3', ' ' ):
                     p_stream->i_stream_type =
                         p_input->p_fmt->audio.i_rate >= 32000 ? 0x03 : 0x04;
                     p_stream->i_stream_id = 0xc0;
@@ -1016,6 +1023,12 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
 
     p_stream->i_langs = 1+p_input->p_fmt->i_extra_languages;
     p_stream->lang = malloc(p_stream->i_langs*3);
+    if( !p_stream->lang )
+    {
+        p_stream->i_langs = 0;
+        free( p_stream );
+        return VLC_ENOMEM;
+    }
     i = 1;
     p_stream->lang[0] =
     p_stream->lang[1] =
@@ -1053,7 +1066,7 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
         {
             char *psz = p_input->p_fmt->p_extra_languages[i-1].psz_language;
             const iso639_lang_t *pl = NULL;
+
             if( strlen( psz ) == 2 )
             {
                 pl = GetLang_1( psz );
@@ -1080,17 +1093,6 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
         i++;
     }
 
-    /* Copy extra data (VOL for MPEG-4 and extra BitMapInfoHeader for VFW */
-    p_stream->i_decoder_specific_info = p_input->p_fmt->i_extra;
-    if( p_stream->i_decoder_specific_info > 0 )
-    {
-        p_stream->p_decoder_specific_info =
-            malloc( p_stream->i_decoder_specific_info );
-        memcpy( p_stream->p_decoder_specific_info,
-                p_input->p_fmt->p_extra,
-                p_input->p_fmt->i_extra );
-    }
-
     /* Create decoder specific info for subt */
     if( p_stream->i_codec == VLC_FOURCC( 's', 'u','b', 't' ) )
     {
@@ -1099,44 +1101,64 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
         p_stream->i_decoder_specific_info = 55;
         p_stream->p_decoder_specific_info = p =
             malloc( p_stream->i_decoder_specific_info );
-
-        p[0] = 0x10;    /* textFormat, 0x10 for 3GPP TS 26.245 */
-        p[1] = 0x00;    /* flags: 1b: associated video info flag
-                                  3b: reserved
-                                  1b: duration flag
-                                  3b: reserved */
-        p[2] = 52;      /* remaining size */
-
-        p += 3;
-
-        p[0] = p[1] = p[2] = p[3] = 0; p+=4;    /* display flags */
-        *p++ = 0;  /* horizontal justification (-1: left, 0 center, 1 right) */
-        *p++ = 1;  /* vertical   justification (-1: top, 0 center, 1 bottom) */
-
-        p[0] = p[1] = p[2] = 0x00; p+=3;/* background rgb */
-        *p++ = 0xff;                    /* background a */
-
-        p[0] = p[1] = 0; p += 2;        /* text box top */
-        p[0] = p[1] = 0; p += 2;        /* text box left */
-        p[0] = p[1] = 0; p += 2;        /* text box bottom */
-        p[0] = p[1] = 0; p += 2;        /* text box right */
-
-        p[0] = p[1] = 0; p += 2;        /* start char */
-        p[0] = p[1] = 0; p += 2;        /* end char */
-        p[0] = p[1] = 0; p += 2;        /* default font id */
-
-        *p++ = 0;                       /* font style flags */
-        *p++ = 12;                      /* font size */
-
-        p[0] = p[1] = p[2] = 0x00; p+=3;/* foreground rgb */
-        *p++ = 0x00;                    /* foreground a */
-
-        p[0] = p[1] = p[2] = 0; p[3] = 22; p += 4;
-        memcpy( p, "ftab", 4 ); p += 4;
-        *p++ = 0; *p++ = 1;             /* entry count */
-        p[0] = p[1] = 0; p += 2;        /* font id */
-        *p++ = 9;                       /* font name length */
-        memcpy( p, "Helvetica", 9 );    /* font name */
+        if( p )
+        {
+            p[0] = 0x10;    /* textFormat, 0x10 for 3GPP TS 26.245 */
+            p[1] = 0x00;    /* flags: 1b: associated video info flag
+                                    3b: reserved
+                                    1b: duration flag
+                                    3b: reserved */
+            p[2] = 52;      /* remaining size */
+
+            p += 3;
+
+            p[0] = p[1] = p[2] = p[3] = 0; p+=4;    /* display flags */
+            *p++ = 0;  /* horizontal justification (-1: left, 0 center, 1 right) */
+            *p++ = 1;  /* vertical   justification (-1: top, 0 center, 1 bottom) */
+
+            p[0] = p[1] = p[2] = 0x00; p+=3;/* background rgb */
+            *p++ = 0xff;                    /* background a */
+
+            p[0] = p[1] = 0; p += 2;        /* text box top */
+            p[0] = p[1] = 0; p += 2;        /* text box left */
+            p[0] = p[1] = 0; p += 2;        /* text box bottom */
+            p[0] = p[1] = 0; p += 2;        /* text box right */
+
+            p[0] = p[1] = 0; p += 2;        /* start char */
+            p[0] = p[1] = 0; p += 2;        /* end char */
+            p[0] = p[1] = 0; p += 2;        /* default font id */
+
+            *p++ = 0;                       /* font style flags */
+            *p++ = 12;                      /* font size */
+
+            p[0] = p[1] = p[2] = 0x00; p+=3;/* foreground rgb */
+            *p++ = 0x00;                    /* foreground a */
+
+            p[0] = p[1] = p[2] = 0; p[3] = 22; p += 4;
+            memcpy( p, "ftab", 4 ); p += 4;
+            *p++ = 0; *p++ = 1;             /* entry count */
+            p[0] = p[1] = 0; p += 2;        /* font id */
+            *p++ = 9;                       /* font name length */
+            memcpy( p, "Helvetica", 9 );    /* font name */
+        }
+        else p_stream->i_decoder_specific_info = 0;
+    }
+    else
+    {
+        /* Copy extra data (VOL for MPEG-4 and extra BitMapInfoHeader for VFW */
+        p_stream->i_decoder_specific_info = p_input->p_fmt->i_extra;
+        if( p_stream->i_decoder_specific_info > 0 )
+        {
+            p_stream->p_decoder_specific_info =
+                malloc( p_stream->i_decoder_specific_info );
+            if( p_stream->p_decoder_specific_info )
+            {
+                memcpy( p_stream->p_decoder_specific_info,
+                        p_input->p_fmt->p_extra,
+                        p_input->p_fmt->i_extra );
+            }
+            else p_stream->i_decoder_specific_info = 0;
+        }
     }
 
     /* Init pes chain */
@@ -1217,7 +1239,7 @@ static int DelStream( sout_mux_t *p_mux, sout_input_t *p_input )
     }
 
     /* Empty all data in chain_pes */
-    BufferChainClean( p_mux->p_sout, &p_stream->chain_pes );
+    BufferChainClean( &p_stream->chain_pes );
 
     if( p_stream->lang )
     {
@@ -1370,8 +1392,7 @@ static int Mux( sout_mux_t *p_mux )
                             if ( ( i_spu_delay >= I64C(100000000) ) ||
                                  ( i_spu_delay < I64C(10000) ) )
                             {
-                                BufferChainClean( p_mux->p_sout,
-                                                  &p_stream->chain_pes );
+                                BufferChainClean( &p_stream->chain_pes );
                                 p_stream->i_pes_dts = 0;
                                 p_stream->i_pes_used = 0;
                                 p_stream->i_pes_length = 0;
@@ -1413,16 +1434,14 @@ static int Mux( sout_mux_t *p_mux )
                                   p_pcr_stream->i_pes_dts );
                         block_Release( p_data );
 
-                        BufferChainClean( p_mux->p_sout,
-                                          &p_stream->chain_pes );
+                        BufferChainClean( &p_stream->chain_pes );
                         p_stream->i_pes_dts = 0;
                         p_stream->i_pes_used = 0;
                         p_stream->i_pes_length = 0;
 
                         if( p_input->p_fmt->i_cat != SPU_ES )
                         {
-                            BufferChainClean( p_mux->p_sout,
-                                              &p_pcr_stream->chain_pes );
+                            BufferChainClean( &p_pcr_stream->chain_pes );
                             p_pcr_stream->i_pes_dts = 0;
                             p_pcr_stream->i_pes_used = 0;
                             p_pcr_stream->i_pes_length = 0;
@@ -2231,7 +2250,13 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
 #endif
 
     if( p_sys->dvbpmt == NULL )
+    {
         p_sys->dvbpmt = malloc( p_sys->i_num_pmt * sizeof(dvbpsi_pmt_t) );
+        if( !p_sys->dvbpmt )
+        {
+            return;
+        }
+    }
 #ifdef HAVE_DVBPSI_SDT
     if( p_sys->b_sdt )
         dvbpsi_InitSDT( &sdt, p_sys->i_tsid, 1, 1, p_sys->i_netid );