[FFmpeg-cvslog] r19011 - trunk/libavformat/mpegts.c

bcoudurier subversion
Sun May 31 05:55:23 CEST 2009


Author: bcoudurier
Date: Sun May 31 05:55:23 2009
New Revision: 19011

Log:
add streams even if they are not present in PMT, fix #1092 and #835

Modified:
   trunk/libavformat/mpegts.c

Modified: trunk/libavformat/mpegts.c
==============================================================================
--- trunk/libavformat/mpegts.c	Sun May 31 05:46:24 2009	(r19010)
+++ trunk/libavformat/mpegts.c	Sun May 31 05:55:23 2009	(r19011)
@@ -540,7 +540,7 @@ static void mpegts_find_stream_type(AVSt
     }
 }
 
-static AVStream *new_pes_av_stream(PESContext *pes, uint32_t prog_reg_desc)
+static AVStream *new_pes_av_stream(PESContext *pes, uint32_t prog_reg_desc, uint32_t code)
 {
     AVStream *st = av_new_stream(pes->stream, pes->pid);
 
@@ -564,6 +564,17 @@ static AVStream *new_pes_av_stream(PESCo
     if (st->codec->codec_id == CODEC_ID_PROBE)
         mpegts_find_stream_type(st, pes->stream_type, MISC_types);
 
+    /* stream was not present in PMT, guess based on PES start code */
+    if (st->codec->codec_id == CODEC_ID_PROBE) {
+        if (code >= 0x1c0 && code <= 0x1df) {
+            st->codec->codec_type = CODEC_TYPE_AUDIO;
+            st->codec->codec_id = CODEC_ID_MP2;
+        } else if (code == 0x1bd) {
+            st->codec->codec_type = CODEC_TYPE_AUDIO;
+            st->codec->codec_id = CODEC_ID_AC3;
+        }
+    }
+
     return st;
 }
 
@@ -642,7 +653,7 @@ static void pmt_cb(MpegTSFilter *filter,
             if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably
             pes = add_pes_stream(ts, pid, pcr_pid, stream_type);
             if (pes)
-                st = new_pes_av_stream(pes, prog_reg_desc);
+                st = new_pes_av_stream(pes, prog_reg_desc, 0);
         }
 
         if (!st)
@@ -910,7 +921,14 @@ static int mpegts_push_data(MpegTSFilter
                     pes->header[2] == 0x01) {
                     /* it must be an mpeg2 PES stream */
                     code = pes->header[3] | 0x100;
-                    if (!pes->st || pes->st->discard == AVDISCARD_ALL ||
+
+                    /* stream not present in PMT */
+                    if (!pes->st)
+                        pes->st = new_pes_av_stream(pes, 0, code);
+                    if (!pes->st)
+                        return AVERROR(ENOMEM);
+
+                    if (pes->st->discard == AVDISCARD_ALL ||
                         !((code >= 0x1c0 && code <= 0x1df) ||
                           (code >= 0x1e0 && code <= 0x1ef) ||
                           (code == 0x1bd) || (code == 0x1fd)))



More information about the ffmpeg-cvslog mailing list