# HG changeset patch # User aurel # Date 1118868612 0 # Node ID 411b75055a4326c6b8dfcaba04739dda0e9223d9 # Parent 0f33c9ce24ac125b83d68e4ff78ecd80e3b68d56 add support for muxing subtitles in mpeg-ps diff -r 0f33c9ce24ac -r 411b75055a43 mpeg.c --- a/mpeg.c Thu Jun 09 20:01:02 2005 +0000 +++ b/mpeg.c Wed Jun 15 20:50:12 2005 +0000 @@ -90,6 +90,7 @@ #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 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 @@ ac3_id = AC3_ID; dts_id = DTS_ID; mpv_id = VIDEO_ID; + mps_id = SUB_ID; lpcm_id = LPCM_ID; for(i=0;inb_streams;i++) { st = ctx->streams[i]; @@ -403,11 +405,14 @@ #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 @@ 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 @@ 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 @@ 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 @@ 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;