support more codecs in MPEG-TS patch by (mru at kth dot se (Måns Rullgård))
authorMåns Rullgård <mans@mansr.com>
Wed, 12 Nov 2003 21:56:57 +0000 (21:56 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 12 Nov 2003 21:56:57 +0000 (21:56 +0000)
Originally committed as revision 2511 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/mpegts.c
libavformat/mpegts.h
libavformat/mpegtsenc.c

index e7ec00f..311653c 100644 (file)
@@ -30,7 +30,7 @@
    synchronisation is lost */
 #define MAX_RESYNC_SIZE 4096
 
-static int add_pes_stream(MpegTSContext *ts, int pid);
+static int add_pes_stream(MpegTSContext *ts, int pid, int stream_type);
 
 enum MpegTSFilterType {
     MPEGTS_PES,
@@ -403,8 +403,11 @@ static void pmt_cb(void *opaque, const uint8_t *section, int section_len)
         case STREAM_TYPE_AUDIO_MPEG2:
         case STREAM_TYPE_VIDEO_MPEG1:
         case STREAM_TYPE_VIDEO_MPEG2:
+        case STREAM_TYPE_VIDEO_MPEG4:
+        case STREAM_TYPE_VIDEO_H264:
+        case STREAM_TYPE_AUDIO_AAC:
         case STREAM_TYPE_AUDIO_AC3:
-            add_pes_stream(ts, pid);
+            add_pes_stream(ts, pid, stream_type);
             break;
         default:
             /* we ignore the other streams */
@@ -632,6 +635,7 @@ enum MpegTSState {
 
 typedef struct PESContext {
     int pid;
+    int stream_type;
     MpegTSContext *ts;
     AVFormatContext *stream;
     AVStream *st;
@@ -698,15 +702,45 @@ static void mpegts_push_data(void *opaque,
                         goto skip;
                     if (!pes->st) {
                         /* allocate stream */
-                        if (code >= 0x1c0 && code <= 0x1df) {
+                        switch(pes->stream_type){
+                        case STREAM_TYPE_AUDIO_MPEG1:
+                        case STREAM_TYPE_AUDIO_MPEG2:
                             codec_type = CODEC_TYPE_AUDIO;
-                            codec_id = CODEC_ID_MP2;
-                        } else if (code == 0x1bd) {
+                            codec_id = CODEC_ID_MP3;
+                            break;
+                        case STREAM_TYPE_VIDEO_MPEG1:
+                        case STREAM_TYPE_VIDEO_MPEG2:
+                            codec_type = CODEC_TYPE_VIDEO;
+                            codec_id = CODEC_ID_MPEG2VIDEO;
+                            break;
+                        case STREAM_TYPE_VIDEO_MPEG4:
+                            codec_type = CODEC_TYPE_VIDEO;
+                            codec_id = CODEC_ID_MPEG4;
+                            break;
+                        case STREAM_TYPE_VIDEO_H264:
+                            codec_type = CODEC_TYPE_VIDEO;
+                            codec_id = CODEC_ID_H264;
+                            break;
+                        case STREAM_TYPE_AUDIO_AAC:
+                            codec_type = CODEC_TYPE_AUDIO;
+                            codec_id = CODEC_ID_AAC;
+                            break;
+                        case STREAM_TYPE_AUDIO_AC3:
                             codec_type = CODEC_TYPE_AUDIO;
                             codec_id = CODEC_ID_AC3;
-                        } else {
-                            codec_type = CODEC_TYPE_VIDEO;
-                            codec_id = CODEC_ID_MPEG1VIDEO;
+                            break;
+                        default:
+                            if (code >= 0x1c0 && code <= 0x1df) {
+                                codec_type = CODEC_TYPE_AUDIO;
+                                codec_id = CODEC_ID_MP2;
+                            } else if (code == 0x1bd) {
+                                codec_type = CODEC_TYPE_AUDIO;
+                                codec_id = CODEC_ID_AC3;
+                            } else {
+                                codec_type = CODEC_TYPE_VIDEO;
+                                codec_id = CODEC_ID_MPEG1VIDEO;
+                            }
+                            break;
                         }
                         st = av_new_stream(pes->stream, pes->pid);
                         if (st) {
@@ -794,7 +828,7 @@ static void mpegts_push_data(void *opaque,
     }
 }
 
-static int add_pes_stream(MpegTSContext *ts, int pid)
+static int add_pes_stream(MpegTSContext *ts, int pid, int stream_type)
 {
     MpegTSFilter *tss;
     PESContext *pes;
@@ -806,6 +840,7 @@ static int add_pes_stream(MpegTSContext *ts, int pid)
     pes->ts = ts;
     pes->stream = ts->stream;
     pes->pid = pid;
+    pes->stream_type = stream_type;
     tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
     if (!tss) {
         av_free(pes);
@@ -826,7 +861,7 @@ static void handle_packet(MpegTSContext *ts, const uint8_t *packet)
     is_start = packet[1] & 0x40;
     tss = ts->pids[pid];
     if (ts->auto_guess && tss == NULL && is_start) {
-        add_pes_stream(ts, pid);
+        add_pes_stream(ts, pid, 0);
         tss = ts->pids[pid];
     }
     if (!tss)
index 6ffb756..145b0eb 100644 (file)
@@ -37,6 +37,9 @@
 #define STREAM_TYPE_AUDIO_MPEG2     0x04
 #define STREAM_TYPE_PRIVATE_SECTION 0x05
 #define STREAM_TYPE_PRIVATE_DATA    0x06
+#define STREAM_TYPE_AUDIO_AAC       0x0f
+#define STREAM_TYPE_VIDEO_MPEG4     0x10
+#define STREAM_TYPE_VIDEO_H264      0x1a
 
 #define STREAM_TYPE_AUDIO_AC3       0x81
 
index e4d7f3d..7a20f85 100644 (file)
@@ -258,13 +258,27 @@ static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
     for(i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
         MpegTSWriteStream *ts_st = st->priv_data;
-        switch(st->codec.codec_type) {
-        case CODEC_TYPE_VIDEO:
-            stream_type = STREAM_TYPE_VIDEO_MPEG2; //XXX/FIXME is this (and the define) correct?
+        switch(st->codec.codec_id) {
+        case CODEC_ID_MPEG1VIDEO:
+        case CODEC_ID_MPEG2VIDEO:
+            stream_type = STREAM_TYPE_VIDEO_MPEG2;
             break;
-        case CODEC_TYPE_AUDIO:
+        case CODEC_ID_MPEG4:
+            stream_type = STREAM_TYPE_VIDEO_MPEG4;
+            break;
+        case CODEC_ID_H264:
+            stream_type = STREAM_TYPE_VIDEO_H264;
+            break;
+        case CODEC_ID_MP2:
+        case CODEC_ID_MP3:
             stream_type = STREAM_TYPE_AUDIO_MPEG1;
             break;
+        case CODEC_ID_AAC:
+            stream_type = STREAM_TYPE_AUDIO_AAC;
+            break;
+        case CODEC_ID_AC3:
+            stream_type = STREAM_TYPE_AUDIO_AC3;
+            break;
         default:
             stream_type = STREAM_TYPE_PRIVATE_DATA;
             break;