changeset 160:9bde37b1a5ce libavformat

try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>) + mpegtsenc.c compile fix by me
author michaelni
date Sat, 28 Jun 2003 23:44:09 +0000
parents 7d698c3213a0
children e01949598794
files mpegts.c mpegts.h mpegtsenc.c
diffstat 3 files changed, 30 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/mpegts.c	Wed Jun 25 10:21:45 2003 +0000
+++ b/mpegts.c	Sat Jun 28 23:44:09 2003 +0000
@@ -348,7 +348,7 @@
 #ifdef DEBUG_SI
     printf("sid=0x%x sec_num=%d/%d\n", h->id, h->sec_num, h->last_sec_num);
 #endif
-    if (h->tid != PMT_TID || h->id != ts->req_sid)
+    if (h->tid != PMT_TID || (ts->req_sid >= 0 && h->id != ts->req_sid) )
         return;
 
     pcr_pid = get16(&p, p_end) & 0x1fff;
@@ -383,8 +383,10 @@
 
         /* now create ffmpeg stream */
         switch(stream_type) {
-        case STREAM_TYPE_AUDIO:
-        case STREAM_TYPE_VIDEO:
+        case STREAM_TYPE_AUDIO_MPEG1:
+        case STREAM_TYPE_AUDIO_MPEG2:
+        case STREAM_TYPE_VIDEO_MPEG1:
+        case STREAM_TYPE_VIDEO_MPEG2:
             add_pes_stream(ts->stream, pid);
             break;
         default:
@@ -429,7 +431,7 @@
         if (sid == 0x0000) {
             /* NIT info */
         } else {
-            if (ts->req_sid == sid) {
+            if (ts->req_sid == sid || ts->req_sid < 0) {
                 ts->pmt_filter = mpegts_open_section_filter(ts, pmt_pid, 
                                                             pmt_cb, ts, 1);
                 goto found;
@@ -861,28 +863,32 @@
     ts->auto_guess = 0;
     
     if (!ts->auto_guess) {
+        int sid = -1;
+        ts->set_service_ret = -1;
 
         /* first do a scaning to get all the services */
         url_fseek(pb, pos, SEEK_SET);
         mpegts_scan_sdt(ts);
         
         handle_packets(s, MAX_SCAN_PACKETS);
-        
-        /* if no service found, no need to do anything */
-        if (ts->nb_services <= 0)
-            return -1;
-        
-        /* now find the info for the first service */
-        
+
+        if (ts->nb_services > 0)
+        {
+            /* tune to first service found */
+            service = ts->services[0];
+            sid = service->sid;
+#ifdef DEBUG_SI
+            printf("tuning to '%s'\n", service->name);
+#endif
+        }
+
+        /* now find the info for the first service if we found any,
+           otherwise try to filter all PATs */
+
         url_fseek(pb, pos, SEEK_SET);
-        service = ts->services[0];
-#ifdef DEBUG_SI
-        printf("tuning to '%s'\n", service->name);
-#endif
-        /* tune to first service found */
         ts->stream = s;
-        mpegts_set_service(ts, service->sid, set_service_cb, ts);
-        
+        mpegts_set_service(ts, sid, set_service_cb, ts);
+
         handle_packets(s, MAX_SCAN_PACKETS);
 
         /* if could not find service, exit */
--- a/mpegts.h	Wed Jun 25 10:21:45 2003 +0000
+++ b/mpegts.h	Sat Jun 28 23:44:09 2003 +0000
@@ -31,8 +31,10 @@
 #define PMT_TID   0x02 
 #define SDT_TID   0x42
 
-#define STREAM_TYPE_VIDEO           0x02
-#define STREAM_TYPE_AUDIO           0x03
+#define STREAM_TYPE_VIDEO_MPEG1     0x01
+#define STREAM_TYPE_VIDEO_MPEG2     0x02
+#define STREAM_TYPE_AUDIO_MPEG1     0x03
+#define STREAM_TYPE_AUDIO_MPEG2     0x04
 #define STREAM_TYPE_PRIVATE_SECTION 0x05
 #define STREAM_TYPE_PRIVATE_DATA    0x06
 
--- a/mpegtsenc.c	Wed Jun 25 10:21:45 2003 +0000
+++ b/mpegtsenc.c	Sat Jun 28 23:44:09 2003 +0000
@@ -259,10 +259,10 @@
         MpegTSWriteStream *ts_st = st->priv_data;
         switch(st->codec.codec_type) {
         case CODEC_TYPE_VIDEO:
-            stream_type = STREAM_TYPE_VIDEO;
+            stream_type = STREAM_TYPE_VIDEO_MPEG2; //XXX/FIXME is this (and the define) correct?
             break;
         case CODEC_TYPE_AUDIO:
-            stream_type = STREAM_TYPE_AUDIO;
+            stream_type = STREAM_TYPE_AUDIO_MPEG1;
             break;
         default:
             stream_type = STREAM_TYPE_PRIVATE_DATA;