]> git.sesse.net Git - vlc/blobdiff - modules/demux/ts.c
MKV: parse segment cleanup
[vlc] / modules / demux / ts.c
index b0731608e76dfbbfe08785b9e97ca00091959520..2f1293a9826b64dd31c06211c776a3d99854fc69 100644 (file)
@@ -43,6 +43,7 @@
 #include <vlc_iso_lang.h>
 #include <vlc_network.h>
 #include <vlc_charset.h>
+#include <vlc_fs.h>
 
 #include "../mux/mpeg/csa.h"
 
@@ -608,7 +609,7 @@ static int Open( vlc_object_t *p_this )
             msg_Info( p_demux, "dumping raw stream to standard output" );
             p_sys->p_file = stdout;
         }
-        else if( ( p_sys->p_file = utf8_fopen( p_sys->psz_file, psz_mode ) ) == NULL )
+        else if( ( p_sys->p_file = vlc_fopen( p_sys->psz_file, psz_mode ) ) == NULL )
         {
             msg_Err( p_demux, "cannot create `%s' for writing", p_sys->psz_file );
             p_sys->b_file_out = false;
@@ -884,7 +885,7 @@ static void Close( vlc_object_t *p_this )
     /* If in dump mode, then close the file */
     if( p_sys->b_file_out )
     {
-        msg_Info( p_demux ,"closing %s (%"PRId64" Kbytes dumped)",
+        msg_Info( p_demux ,"closing %s (%"PRId64" KiB dumped)",
                   p_sys->psz_file, p_sys->i_write / 1024 );
 
         if( p_sys->p_file != stdout )
@@ -1989,7 +1990,7 @@ static bool GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
             pid->i_cc = i_cc;
             if( pid->es->p_pes && pid->es->fmt.i_cat != VIDEO_ES )
             {
-                /* Small video artifacts are usually better then
+                /* Small video artifacts are usually better than
                  * dropping full frames */
                 pid->es->p_pes->i_flags |= BLOCK_FLAG_CORRUPTED;
             }
@@ -3011,7 +3012,9 @@ static void EITCallBack( demux_t *p_demux,
             {
                 dvbpsi_short_event_dr_t *pE = dvbpsi_DecodeShortEventDr( p_dr );
 
-                if( pE )
+                /* Only take first description, as we don't handle language-info
+                   for epg atm*/
+                if( pE && psz_name == NULL)
                 {
                     psz_name = EITConvertToUTF8( pE->i_event_name, pE->i_event_name_length,
                                                  p_sys->b_broken_charset );
@@ -3450,6 +3453,7 @@ static void PMTSetupEsTeletext( demux_t *p_demux, ts_pid_t *pid,
 
             /* */
             const ts_teletext_page_t *p = &p_page[i];
+            p_es->fmt.i_priority = (p->i_type == 0x02 || p->i_type == 0x05) ? 0 : -1;
             p_es->fmt.psz_language = strndup( p->p_iso639, 3 );
             p_es->fmt.psz_description = strdup(vlc_gettext(ppsz_teletext_type[p->i_type]));
             p_es->fmt.subs.teletext.i_magazine = p->i_magazine;
@@ -3779,6 +3783,38 @@ static void PMTSetupEsHDMV( demux_t *p_demux, ts_pid_t *pid,
         break;
     }
 }
+
+static void PMTSetupEsRegistration( demux_t *p_demux, ts_pid_t *pid,
+                                    const dvbpsi_pmt_es_t *p_es )
+{
+    static const struct
+    {
+        char         psz_tag[5];
+        int          i_cat;
+        vlc_fourcc_t i_codec;
+    } p_regs[] = {
+        { "AC-3", AUDIO_ES, VLC_CODEC_A52   },
+        { "DTS1", AUDIO_ES, VLC_CODEC_DTS   },
+        { "DTS2", AUDIO_ES, VLC_CODEC_DTS   },
+        { "DTS3", AUDIO_ES, VLC_CODEC_DTS   },
+        { "BSSD", AUDIO_ES, VLC_CODEC_302M  },
+        { "VC-1", VIDEO_ES, VLC_CODEC_VC1   },
+        { "drac", VIDEO_ES, VLC_CODEC_DIRAC },
+        { "", UNKNOWN_ES, 0 }
+    };
+    es_format_t *p_fmt = &pid->es->fmt;
+
+    for( int i = 0; p_regs[i].i_cat != UNKNOWN_ES; i++ )
+    {
+        if( PMTEsHasRegistration( p_demux, p_es, p_regs[i].psz_tag ) )
+        {
+            p_fmt->i_cat   = p_regs[i].i_cat;
+            p_fmt->i_codec = p_regs[i].i_codec;
+            break;
+        }
+    }
+}
+
 static void PMTParseEsIso639( demux_t *p_demux, ts_pid_t *pid,
                               const dvbpsi_pmt_es_t *p_es )
 {
@@ -4066,6 +4102,10 @@ static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt )
         {
             PMTSetupEsHDMV( p_demux, pid, p_es );
         }
+        else if( p_es->i_type >= 0x80 )
+        {
+            PMTSetupEsRegistration( p_demux, pid, p_es );
+        }
 
         if( pid->es->fmt.i_cat == AUDIO_ES ||
             ( pid->es->fmt.i_cat == SPU_ES &&