add support for muxing subtitles in mpeg-ps
authorAurelien Jacobs <aurel@gnuage.org>
Wed, 15 Jun 2005 20:50:12 +0000 (20:50 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Wed, 15 Jun 2005 20:50:12 +0000 (20:50 +0000)
Originally committed as revision 4380 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/mpeg.c

index 6dcbef0..9404df0 100644 (file)
@@ -90,6 +90,7 @@ typedef struct {
 #define AC3_ID   0x80
 #define DTS_ID   0x8a
 #define LPCM_ID  0xa0
+#define SUB_ID   0x20
 
 #define STREAM_TYPE_VIDEO_MPEG1     0x01
 #define STREAM_TYPE_VIDEO_MPEG2     0x02
@@ -322,7 +323,7 @@ static int get_system_header_size(AVFormatContext *ctx)
 static int mpeg_mux_init(AVFormatContext *ctx)
 {
     MpegMuxContext *s = ctx->priv_data;
-    int bitrate, i, mpa_id, mpv_id, ac3_id, dts_id, lpcm_id, j;
+    int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
     AVStream *st;
     StreamInfo *stream;
     int audio_bitrate;
@@ -348,6 +349,7 @@ static int mpeg_mux_init(AVFormatContext *ctx)
     ac3_id = AC3_ID;
     dts_id = DTS_ID;
     mpv_id = VIDEO_ID;
+    mps_id = SUB_ID;
     lpcm_id = LPCM_ID;
     for(i=0;i<ctx->nb_streams;i++) {
         st = ctx->streams[i];
@@ -403,11 +405,14 @@ static int mpeg_mux_init(AVFormatContext *ctx)
 #endif
             s->video_bound++;
             break;
+        case CODEC_TYPE_SUBTITLE:
+            stream->id = mps_id++;
+            stream->max_buffer_size = 16 * 1024;
+            break;
         default:
             return -1;
         }
         fifo_init(&stream->fifo, 16);
-        stream->next_packet= &stream->premux_packet;
     }
     bitrate = 0;
     audio_bitrate = 0;
@@ -809,9 +814,12 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
         payload_size = packet_size - header_len;
         if (id < 0xc0) {
             startcode = PRIVATE_STREAM_1;
-            payload_size -= 4;
-            if (id >= 0xa0)
+            payload_size -= 1;
+            if (id >= 0x40) {
                 payload_size -= 3;
+                if (id >= 0xa0)
+                    payload_size -= 3;
+            }
         } else {
             startcode = 0x100 + id;
         }
@@ -935,7 +943,7 @@ static int flush_packet(AVFormatContext *ctx, int stream_index,
                 put_byte(&ctx->pb, stream->lpcm_header[0]);
                 put_byte(&ctx->pb, stream->lpcm_header[1]);
                 put_byte(&ctx->pb, stream->lpcm_header[2]);
-            } else {
+            } else if (id >= 0x40) {
                 /* AC3 */
                 put_byte(&ctx->pb, nb_frames);
                 put_be16(&ctx->pb, trailer_size+1);
@@ -1062,7 +1070,10 @@ retry:
         int rel_space= 1024*space / stream->max_buffer_size;
         PacketDesc *next_pkt= stream->premux_packet;
 
-        if(s->packet_size > avail_data && !flush)
+        /* for subtitle, a single PES packet must be generated,
+           so we flush after every single subtitle packet */
+        if(s->packet_size > avail_data && !flush
+           && st->codec.codec_type != CODEC_TYPE_SUBTITLE)
             return 0;
         if(avail_data==0)
             continue;
@@ -1181,6 +1192,8 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
     if(dts != AV_NOPTS_VALUE) dts += preload;
 
 //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index, pts != AV_NOPTS_VALUE);
+    if (!stream->premux_packet)
+        stream->next_packet = &stream->premux_packet;
     *stream->next_packet=
     pkt_desc= av_mallocz(sizeof(PacketDesc));
     pkt_desc->pts= pts;