]> git.sesse.net Git - vlc/blobdiff - modules/mux/mpeg/ts.c
For consistency, remove references to vlc from libvlc
[vlc] / modules / mux / mpeg / ts.c
index a77853fcb0f927d430cebea8a89b3cd2157e6411..018790081ce96ea20fb5e55ef17b099e60e97d7b 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * ts.c: MPEG-II TS Muxer
  *****************************************************************************
- * Copyright (C) 2001-2005 VideoLAN (Centrale Réseaux) and its contributors
+ * Copyright (C) 2001-2005 the VideoLAN team
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
@@ -113,7 +113,7 @@ static void    Close  ( vlc_object_t * );
 
 #define ALIGNMENT_TEXT N_("Data alignment")
 #define ALIGNMENT_LONGTEXT N_("Enforces alignment of all access units on " \
-  "PES boundaries. This is a waste of bandwidth.")
+  "PES boundaries. Disabling this might save some bandwidth but introduce incompatibilities.")
 
 #define SHAPING_TEXT N_("Shaping delay (ms)")
 #define SHAPING_LONGTEXT N_("Cut the " \
@@ -199,7 +199,7 @@ vlc_module_begin();
 #ifdef HAVE_DVBPSI_SDT
     add_string( SOUT_CFG_PREFIX "sdtdesc", NULL, NULL, SDTDESC_TEXT, SDTDESC_LONGTEXT, VLC_TRUE );
 #endif
-    add_bool( SOUT_CFG_PREFIX "alignment", 0, NULL, ALIGNMENT_TEXT,
+    add_bool( SOUT_CFG_PREFIX "alignment", VLC_TRUE, NULL, ALIGNMENT_TEXT,
               ALIGNMENT_LONGTEXT, VLC_TRUE );
 
     add_integer( SOUT_CFG_PREFIX "shaping", 200, NULL,SHAPING_TEXT,
@@ -337,7 +337,8 @@ typedef struct ts_stream_t
     uint8_t         *p_decoder_specific_info;
 
     /* language is iso639-2T */
-    uint8_t         lang[3];
+    int             i_langs;
+    uint8_t         *lang;
 
     sout_buffer_chain_t chain_pes;
     mtime_t             i_pes_dts;
@@ -885,6 +886,7 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
 {
     sout_mux_sys_t      *p_sys = p_mux->p_sys;
     ts_stream_t         *p_stream;
+    int                  i;
 
     p_input->p_sys = p_stream = malloc( sizeof( ts_stream_t ) );
 
@@ -1013,6 +1015,9 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
             return VLC_EGENERIC;
     }
 
+    p_stream->i_langs = 1+p_input->p_fmt->i_extra_languages;
+    p_stream->lang = malloc(p_stream->i_langs*3);
+    i = 1;
     p_stream->lang[0] =
     p_stream->lang[1] =
     p_stream->lang[2] = '\0';
@@ -1040,9 +1045,41 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
             p_stream->lang[2] = pl->psz_iso639_2T[2];
 
             msg_Dbg( p_mux, "    - lang=%c%c%c",
-                     p_stream->lang[0], p_stream->lang[1], p_stream->lang[2] );
+                     p_stream->lang[0], p_stream->lang[1],
+                     p_stream->lang[2] );
         }
     }
+    while( i < p_stream->i_langs ) {
+        if( p_input->p_fmt->p_extra_languages[i-1].psz_language )
+        {
+            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 );
+            }
+            else if( strlen( psz ) == 3 )
+            {
+                pl = GetLang_2B( psz );
+                if( !strcmp( pl->psz_iso639_1, "??" ) )
+                {
+                    pl = GetLang_2T( psz );
+                }
+            }
+            if( pl && strcmp( pl->psz_iso639_1, "??" ) )
+            {
+                p_stream->lang[i*3+0] = pl->psz_iso639_2T[0];
+                p_stream->lang[i*3+1] = pl->psz_iso639_2T[1];
+                p_stream->lang[i*3+2] = pl->psz_iso639_2T[2];
+                
+                msg_Dbg( p_mux, "    - lang=%c%c%c",
+                         p_stream->lang[i*3+0], p_stream->lang[i*3+1],
+                         p_stream->lang[i*3+2] );
+            }
+        }
+        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;
@@ -1183,6 +1220,10 @@ 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 );
 
+    if( p_stream->lang )
+    {
+        free(p_stream->lang);
+    }
     if( p_stream->p_decoder_specific_info )
     {
         free( p_stream->p_decoder_specific_info );
@@ -1244,6 +1285,11 @@ static int Mux( sout_mux_t *p_mux )
 
     if( p_sys->i_pcr_pid == 0x1fff )
     {
+        int i;
+        for( i = 0; i < p_mux->i_nb_inputs; i++ )
+        {
+            block_FifoEmpty( p_mux->pp_inputs[i]->p_fifo );
+        }
         msg_Dbg( p_mux, "waiting for PCR streams" );
         msleep( 1000 );
         return VLC_SUCCESS;
@@ -1607,7 +1653,7 @@ static block_t *FixPES( sout_mux_t *p_mux, block_fifo_t *p_fifo )
     else if( i_size > STD_PES_PAYLOAD )
     {
         block_t *p_new = block_New( p_mux, STD_PES_PAYLOAD );
-        p_mux->p_vlc->pf_memcpy( p_new->p_buffer, p_data->p_buffer, STD_PES_PAYLOAD );
+        p_mux->p_libvlc->pf_memcpy( p_new->p_buffer, p_data->p_buffer, STD_PES_PAYLOAD );
         p_new->i_pts = p_data->i_pts;
         p_new->i_dts = p_data->i_dts;
         p_new->i_length = p_data->i_length * STD_PES_PAYLOAD
@@ -1636,7 +1682,7 @@ static block_t *FixPES( sout_mux_t *p_mux, block_fifo_t *p_fifo )
         }
         i_copy = __MIN( STD_PES_PAYLOAD - i_size, p_next->i_buffer );
 
-        p_mux->p_vlc->pf_memcpy( &p_data->p_buffer[i_size], p_next->p_buffer,
+        p_mux->p_libvlc->pf_memcpy( &p_data->p_buffer[i_size], p_next->p_buffer,
                                  i_copy );
         p_next->i_pts += p_next->i_length * i_copy / p_next->i_buffer;
         p_next->i_dts += p_next->i_length * i_copy / p_next->i_buffer;
@@ -2480,16 +2526,18 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
 
         if( p_stream->lang[0] != 0 )
         {
-            uint8_t data[4];
+            uint8_t data[4*p_stream->i_langs];
 
             /* I construct the content myself, way faster than looking at
              * over complicated/mind broken libdvbpsi way */
-            data[0] = p_stream->lang[0];
-            data[1] = p_stream->lang[1];
-            data[2] = p_stream->lang[2];
-            data[3] = 0x00; /* audio type: 0x00 undefined */
-
-            dvbpsi_PMTESAddDescriptor( p_es, 0x0a, 4, data );
+            for(i = 0; i < p_stream->i_langs; i++ )
+            {
+                data[i*4+0] = p_stream->lang[i*3+0];
+                data[i*4+1] = p_stream->lang[i*3+1];
+                data[i*4+2] = p_stream->lang[i*3+2];
+                data[i*4+3] = 0x00; /* audio type: 0x00 undefined */
+            }
+            dvbpsi_PMTESAddDescriptor( p_es, 0x0a, 4*p_stream->i_langs, data );
         }
     }