3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include "bitstream.h"
22 #define MAX_PAYLOAD_SIZE 4096
28 typedef struct PacketDesc {
34 struct PacketDesc *next;
40 int max_buffer_size; /* in bytes */
42 PacketDesc *predecode_packet;
43 PacketDesc *premux_packet;
44 PacketDesc **next_packet;
46 uint8_t lpcm_header[3];
48 uint8_t *fifo_iframe_ptr;
50 int64_t vobu_start_pts;
54 int packet_size; /* required packet size */
56 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
57 int system_header_freq;
58 int system_header_size;
59 int mux_rate; /* bitrate in units of 50 bytes/s */
67 int64_t last_scr; /* current system clock */
69 double vcd_padding_bitrate; //FIXME floats
70 int64_t vcd_padding_bytes_written;
74 #define PACK_START_CODE ((unsigned int)0x000001ba)
75 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
76 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
77 #define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
78 #define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
79 #define ISO_11172_END_CODE ((unsigned int)0x000001b9)
82 #define PROGRAM_STREAM_MAP 0x1bc
83 #define PRIVATE_STREAM_1 0x1bd
84 #define PADDING_STREAM 0x1be
85 #define PRIVATE_STREAM_2 0x1bf
95 #define STREAM_TYPE_VIDEO_MPEG1 0x01
96 #define STREAM_TYPE_VIDEO_MPEG2 0x02
97 #define STREAM_TYPE_AUDIO_MPEG1 0x03
98 #define STREAM_TYPE_AUDIO_MPEG2 0x04
99 #define STREAM_TYPE_PRIVATE_SECTION 0x05
100 #define STREAM_TYPE_PRIVATE_DATA 0x06
101 #define STREAM_TYPE_AUDIO_AAC 0x0f
102 #define STREAM_TYPE_VIDEO_MPEG4 0x10
103 #define STREAM_TYPE_VIDEO_H264 0x1b
105 #define STREAM_TYPE_AUDIO_AC3 0x81
106 #define STREAM_TYPE_AUDIO_DTS 0x8a
108 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
110 #ifdef CONFIG_ENCODERS
111 static AVOutputFormat mpeg1system_mux;
112 static AVOutputFormat mpeg1vcd_mux;
113 static AVOutputFormat mpeg2vob_mux;
114 static AVOutputFormat mpeg2svcd_mux;
115 static AVOutputFormat mpeg2dvd_mux;
117 static int put_pack_header(AVFormatContext *ctx,
118 uint8_t *buf, int64_t timestamp)
120 MpegMuxContext *s = ctx->priv_data;
123 init_put_bits(&pb, buf, 128);
125 put_bits(&pb, 32, PACK_START_CODE);
127 put_bits(&pb, 2, 0x1);
129 put_bits(&pb, 4, 0x2);
131 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
133 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
135 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
138 /* clock extension */
142 put_bits(&pb, 22, s->mux_rate);
146 put_bits(&pb, 5, 0x1f); /* reserved */
147 put_bits(&pb, 3, 0); /* stuffing length */
150 return pbBufPtr(&pb) - pb.buf;
153 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
155 MpegMuxContext *s = ctx->priv_data;
156 int size, i, private_stream_coded, id;
159 init_put_bits(&pb, buf, 128);
161 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
162 put_bits(&pb, 16, 0);
165 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
166 put_bits(&pb, 1, 1); /* marker */
167 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
168 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
171 put_bits(&pb, 6, s->audio_bound);
174 /* see VCD standard, p. IV-7*/
178 put_bits(&pb, 1, 0); /* variable bitrate*/
179 put_bits(&pb, 1, 0); /* non constrainted bit stream */
182 if (s->is_vcd || s->is_dvd) {
183 /* see VCD standard p IV-7 */
184 put_bits(&pb, 1, 1); /* audio locked */
185 put_bits(&pb, 1, 1); /* video locked */
187 put_bits(&pb, 1, 0); /* audio locked */
188 put_bits(&pb, 1, 0); /* video locked */
191 put_bits(&pb, 1, 1); /* marker */
193 if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
194 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
197 put_bits(&pb, 5, s->video_bound);
200 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
201 put_bits(&pb, 7, 0x7f); /* reserved byte */
203 put_bits(&pb, 8, 0xff); /* reserved byte */
205 /* DVD-Video Stream_bound entries
206 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
207 id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
208 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
209 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
212 int P_STD_max_video = 0;
213 int P_STD_max_mpeg_audio = 0;
214 int P_STD_max_mpeg_PS1 = 0;
216 for(i=0;i<ctx->nb_streams;i++) {
217 StreamInfo *stream = ctx->streams[i]->priv_data;
220 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
221 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
222 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
223 P_STD_max_mpeg_audio = stream->max_buffer_size;
224 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
225 P_STD_max_video = stream->max_buffer_size;
230 put_bits(&pb, 8, 0xb9); /* stream ID */
233 put_bits(&pb, 13, P_STD_max_video / 1024);
236 if (P_STD_max_mpeg_audio == 0)
237 P_STD_max_mpeg_audio = 4096;
238 put_bits(&pb, 8, 0xb8); /* stream ID */
241 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
243 /* private stream 1 */
244 put_bits(&pb, 8, 0xbd); /* stream ID */
247 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
249 /* private stream 2 */
250 put_bits(&pb, 8, 0xbf); /* stream ID */
253 put_bits(&pb, 13, 2);
256 /* audio stream info */
257 private_stream_coded = 0;
258 for(i=0;i<ctx->nb_streams;i++) {
259 StreamInfo *stream = ctx->streams[i]->priv_data;
262 /* For VCDs, only include the stream info for the stream
263 that the pack which contains this system belongs to.
264 (see VCD standard p. IV-7) */
265 if ( !s->is_vcd || stream->id==only_for_stream_id
266 || only_for_stream_id==0) {
270 /* special case for private streams (AC3 use that) */
271 if (private_stream_coded)
273 private_stream_coded = 1;
276 put_bits(&pb, 8, id); /* stream ID */
281 put_bits(&pb, 13, stream->max_buffer_size / 128);
285 put_bits(&pb, 13, stream->max_buffer_size / 1024);
292 size = pbBufPtr(&pb) - pb.buf;
293 /* patch packet size */
294 buf[4] = (size - 6) >> 8;
295 buf[5] = (size - 6) & 0xff;
300 static int get_system_header_size(AVFormatContext *ctx)
302 int buf_index, i, private_stream_coded;
304 MpegMuxContext *s = ctx->priv_data;
307 return 18; // DVD-Video system headers are 18 bytes fixed length.
310 private_stream_coded = 0;
311 for(i=0;i<ctx->nb_streams;i++) {
312 stream = ctx->streams[i]->priv_data;
313 if (stream->id < 0xc0) {
314 if (private_stream_coded)
316 private_stream_coded = 1;
323 static int mpeg_mux_init(AVFormatContext *ctx)
325 MpegMuxContext *s = ctx->priv_data;
326 int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
332 s->packet_number = 0;
333 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux);
334 s->is_svcd = (ctx->oformat == &mpeg2svcd_mux);
335 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
336 s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
339 s->packet_size = ctx->packet_size;
341 s->packet_size = 2048;
343 s->vcd_padding_bytes_written = 0;
344 s->vcd_padding_bitrate=0;
354 for(i=0;i<ctx->nb_streams;i++) {
355 st = ctx->streams[i];
356 stream = av_mallocz(sizeof(StreamInfo));
359 st->priv_data = stream;
361 av_set_pts_info(st, 64, 1, 90000);
363 switch(st->codec->codec_type) {
364 case CODEC_TYPE_AUDIO:
365 if (st->codec->codec_id == CODEC_ID_AC3) {
366 stream->id = ac3_id++;
367 } else if (st->codec->codec_id == CODEC_ID_DTS) {
368 stream->id = dts_id++;
369 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
370 stream->id = lpcm_id++;
371 for(j = 0; j < 4; j++) {
372 if (lpcm_freq_tab[j] == st->codec->sample_rate)
377 if (st->codec->channels > 8)
379 stream->lpcm_header[0] = 0x0c;
380 stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
381 stream->lpcm_header[2] = 0x80;
382 stream->lpcm_align = st->codec->channels * 2;
384 stream->id = mpa_id++;
387 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
388 Right now it is also used for everything else.*/
389 stream->max_buffer_size = 4 * 1024;
392 case CODEC_TYPE_VIDEO:
393 stream->id = mpv_id++;
394 if (st->codec->rc_buffer_size)
395 stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
397 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
399 /* see VCD standard, p. IV-7*/
400 stream->max_buffer_size = 46 * 1024;
402 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
403 Right now it is also used for everything else.*/
404 stream->max_buffer_size = 230 * 1024;
408 case CODEC_TYPE_SUBTITLE:
409 stream->id = mps_id++;
410 stream->max_buffer_size = 16 * 1024;
415 fifo_init(&stream->fifo, 16);
420 for(i=0;i<ctx->nb_streams;i++) {
422 st = ctx->streams[i];
423 stream = (StreamInfo*) st->priv_data;
425 if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
426 codec_rate= st->codec->rc_max_rate;
428 codec_rate= st->codec->bit_rate;
431 codec_rate= (1<<21)*8*50/ctx->nb_streams;
433 bitrate += codec_rate;
435 if (stream->id==AUDIO_ID)
436 audio_bitrate += codec_rate;
437 else if (stream->id==VIDEO_ID)
438 video_bitrate += codec_rate;
442 s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
444 /* we increase slightly the bitrate to take into account the
445 headers. XXX: compute it exactly */
446 bitrate += bitrate*5/100;
448 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
452 double overhead_rate;
454 /* The VCD standard mandates that the mux_rate field is 3528
455 (see standard p. IV-6).
456 The value is actually "wrong", i.e. if you calculate
457 it using the normal formula and the 75 sectors per second transfer
458 rate you get a different value because the real pack size is 2324,
459 not 2352. But the standard explicitly specifies that the mux_rate
460 field in the header must have this value.*/
461 // s->mux_rate=2352 * 75 / 50; /* = 3528*/
463 /* The VCD standard states that the muxed stream must be
464 exactly 75 packs / second (the data rate of a single speed cdrom).
465 Since the video bitrate (probably 1150000 bits/sec) will be below
466 the theoretical maximum we have to add some padding packets
467 to make up for the lower data rate.
468 (cf. VCD standard p. IV-6 )*/
470 /* Add the header overhead to the data rate.
471 2279 data bytes per audio pack, 2294 data bytes per video pack*/
472 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
473 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
476 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
477 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
480 if (s->is_vcd || s->is_mpeg2)
482 s->pack_header_freq = 1;
484 /* every 2 seconds */
485 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
487 /* the above seems to make pack_header_freq zero sometimes */
488 if (s->pack_header_freq == 0)
489 s->pack_header_freq = 1;
492 /* every 200 packets. Need to look at the spec. */
493 s->system_header_freq = s->pack_header_freq * 40;
495 /* the standard mandates that there are only two system headers
496 in the whole file: one in the first packet of each stream.
497 (see standard p. IV-7 and IV-8) */
498 s->system_header_freq = 0x7fffffff;
500 s->system_header_freq = s->pack_header_freq * 5;
502 for(i=0;i<ctx->nb_streams;i++) {
503 stream = ctx->streams[i]->priv_data;
504 stream->packet_number = 0;
506 s->system_header_size = get_system_header_size(ctx);
510 for(i=0;i<ctx->nb_streams;i++) {
511 av_free(ctx->streams[i]->priv_data);
516 static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
520 (((timestamp >> 30) & 0x07) << 1) |
522 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
523 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
527 /* return the number of padding bytes that should be inserted into
528 the multiplexed stream.*/
529 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
531 MpegMuxContext *s = ctx->priv_data;
534 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
536 int64_t full_pad_bytes;
538 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
539 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
542 /* might happen if we have already padded to a later timestamp. This
543 can occur if another stream has already advanced further.*/
551 #if 0 /* unused, remove? */
552 /* return the exact available payload size for the next packet for
553 stream 'stream_index'. 'pts' and 'dts' are only used to know if
554 timestamps are needed in the packet header. */
555 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
556 int64_t pts, int64_t dts)
558 MpegMuxContext *s = ctx->priv_data;
562 stream = ctx->streams[stream_index]->priv_data;
565 if (((s->packet_number % s->pack_header_freq) == 0)) {
566 /* pack header size */
573 /* there is exactly one system header for each stream in a VCD MPEG,
574 One in the very first video packet and one in the very first
575 audio packet (see VCD standard p. IV-7 and IV-8).*/
577 if (stream->packet_number==0)
578 /* The system headers refer only to the stream they occur in,
579 so they have a constant size.*/
583 if ((s->packet_number % s->system_header_freq) == 0)
584 buf_index += s->system_header_size;
588 if ((s->is_vcd && stream->packet_number==0)
589 || (s->is_svcd && s->packet_number==0))
590 /* the first pack of each stream contains only the pack header,
591 the system header and some padding (see VCD standard p. IV-6)
592 Add the padding size, so that the actual payload becomes 0.*/
593 buf_index += s->packet_size - buf_index;
595 /* packet header size */
599 if (stream->packet_number==0)
600 buf_index += 3; /* PES extension */
601 buf_index += 1; /* obligatory stuffing byte */
603 if (pts != AV_NOPTS_VALUE) {
614 if (stream->id < 0xc0) {
615 /* AC3/LPCM private data header */
617 if (stream->id >= 0xa0) {
620 /* NOTE: we round the payload size to an integer number of
622 n = (s->packet_size - buf_index) % stream->lpcm_align;
624 buf_index += (stream->lpcm_align - n);
628 if (s->is_vcd && stream->id == AUDIO_ID)
629 /* The VCD standard demands that 20 zero bytes follow
630 each audio packet (see standard p. IV-8).*/
633 return s->packet_size - buf_index;
637 /* Write an MPEG padding packet header. */
638 static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
640 MpegMuxContext *s = ctx->priv_data;
643 put_be32(pb, PADDING_STREAM);
644 put_be16(pb, packet_bytes - 6);
651 for(i=0;i<packet_bytes;i++)
655 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
657 PacketDesc *pkt_desc= stream->premux_packet;
660 if(pkt_desc->size == pkt_desc->unwritten_size)
662 len -= pkt_desc->unwritten_size;
663 pkt_desc= pkt_desc->next;
669 /* flush the packet on stream stream_index */
670 static int flush_packet(AVFormatContext *ctx, int stream_index,
671 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
673 MpegMuxContext *s = ctx->priv_data;
674 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
676 int size, payload_size, startcode, id, stuffing_size, i, header_len;
679 int zero_trail_bytes = 0;
680 int pad_packet_bytes = 0;
682 int general_pack = 0; /*"general" pack without data specific to one stream?*/
688 printf("packet ID=%2x PTS=%0.3f\n",
694 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
695 /* output pack and systems header if needed */
696 size = put_pack_header(ctx, buf_ptr, scr);
701 /* there is exactly one system header for each stream in a VCD MPEG,
702 One in the very first video packet and one in the very first
703 audio packet (see VCD standard p. IV-7 and IV-8).*/
705 if (stream->packet_number==0) {
706 size = put_system_header(ctx, buf_ptr, id);
709 } else if (s->is_dvd) {
710 if (stream->align_iframe || s->packet_number == 0){
712 int PES_bytes_to_fill;
713 if (stream->fifo_iframe_ptr >= stream->fifo.rptr) {
714 bytes_to_iframe = stream->fifo_iframe_ptr - stream->fifo.rptr;
716 bytes_to_iframe = (stream->fifo.end - stream->fifo.rptr) + (stream->fifo_iframe_ptr - stream->fifo.buffer);
718 PES_bytes_to_fill = s->packet_size - size - 10;
720 if (pts != AV_NOPTS_VALUE) {
722 PES_bytes_to_fill -= 5 + 5;
724 PES_bytes_to_fill -= 5;
727 if (bytes_to_iframe == 0 || s->packet_number == 0) {
728 size = put_system_header(ctx, buf_ptr, 0);
730 size = buf_ptr - buffer;
731 put_buffer(&ctx->pb, buffer, size);
733 put_be32(&ctx->pb, PRIVATE_STREAM_2);
734 put_be16(&ctx->pb, 0x03d4); // length
735 put_byte(&ctx->pb, 0x00); // substream ID, 00=PCI
736 for (i = 0; i < 979; i++)
737 put_byte(&ctx->pb, 0x00);
739 put_be32(&ctx->pb, PRIVATE_STREAM_2);
740 put_be16(&ctx->pb, 0x03fa); // length
741 put_byte(&ctx->pb, 0x01); // substream ID, 01=DSI
742 for (i = 0; i < 1017; i++)
743 put_byte(&ctx->pb, 0x00);
745 memset(buffer, 0, 128);
748 stream->align_iframe = 0;
749 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
750 size = put_pack_header(ctx, buf_ptr, scr);
754 } else if (bytes_to_iframe < PES_bytes_to_fill) {
755 pad_packet_bytes = PES_bytes_to_fill - bytes_to_iframe;
759 if ((s->packet_number % s->system_header_freq) == 0) {
760 size = put_system_header(ctx, buf_ptr, 0);
765 size = buf_ptr - buffer;
766 put_buffer(&ctx->pb, buffer, size);
768 packet_size = s->packet_size - size;
770 if (s->is_vcd && id == AUDIO_ID)
771 /* The VCD standard demands that 20 zero bytes follow
772 each audio pack (see standard p. IV-8).*/
773 zero_trail_bytes += 20;
775 if ((s->is_vcd && stream->packet_number==0)
776 || (s->is_svcd && s->packet_number==0)) {
777 /* for VCD the first pack of each stream contains only the pack header,
778 the system header and lots of padding (see VCD standard p. IV-6).
779 In the case of an audio pack, 20 zero bytes are also added at
781 /* For SVCD we fill the very first pack to increase compatibility with
782 some DVD players. Not mandated by the standard.*/
784 general_pack = 1; /* the system header refers to both streams and no stream data*/
785 pad_packet_bytes = packet_size - zero_trail_bytes;
788 packet_size -= pad_packet_bytes + zero_trail_bytes;
790 if (packet_size > 0) {
792 /* packet header size */
798 if (stream->packet_number==0)
799 header_len += 3; /* PES extension */
800 header_len += 1; /* obligatory stuffing byte */
804 if (pts != AV_NOPTS_VALUE) {
814 payload_size = packet_size - header_len;
816 startcode = PRIVATE_STREAM_1;
824 startcode = 0x100 + id;
827 stuffing_size = payload_size - fifo_size(&stream->fifo, stream->fifo.rptr);
829 // first byte doesnt fit -> reset pts/dts + stuffing
830 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
834 if(pts != AV_NOPTS_VALUE)
835 timestamp_len += s->is_mpeg2 ? 5 : 4;
836 pts=dts= AV_NOPTS_VALUE;
837 header_len -= timestamp_len;
838 if (s->is_dvd && stream->align_iframe) {
839 pad_packet_bytes += timestamp_len;
840 packet_size -= timestamp_len;
842 payload_size += timestamp_len;
844 stuffing_size += timestamp_len;
845 if(payload_size > trailer_size)
846 stuffing_size += payload_size - trailer_size;
849 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
850 packet_size += pad_packet_bytes;
851 payload_size += pad_packet_bytes; // undo the previous adjustment
852 if (stuffing_size < 0) {
853 stuffing_size = pad_packet_bytes;
855 stuffing_size += pad_packet_bytes;
857 pad_packet_bytes = 0;
860 if (stuffing_size < 0)
862 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
863 pad_packet_bytes += stuffing_size;
864 packet_size -= stuffing_size;
865 payload_size -= stuffing_size;
869 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
871 put_be32(&ctx->pb, startcode);
873 put_be16(&ctx->pb, packet_size);
876 for(i=0;i<stuffing_size;i++)
877 put_byte(&ctx->pb, 0xff);
880 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
884 if (pts != AV_NOPTS_VALUE) {
890 /* Both the MPEG-2 and the SVCD standards demand that the
891 P-STD_buffer_size field be included in the first packet of
892 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
893 and MPEG-2 standard 2.7.7) */
894 if (stream->packet_number == 0)
897 put_byte(&ctx->pb, pes_flags); /* flags */
898 put_byte(&ctx->pb, header_len - 3 + stuffing_size);
900 if (pes_flags & 0x80) /*write pts*/
901 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
902 if (pes_flags & 0x40) /*write dts*/
903 put_timestamp(&ctx->pb, 0x01, dts);
905 if (pes_flags & 0x01) { /*write pes extension*/
906 put_byte(&ctx->pb, 0x10); /* flags */
908 /* P-STD buffer info */
910 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
912 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
916 if (pts != AV_NOPTS_VALUE) {
918 put_timestamp(&ctx->pb, 0x03, pts);
919 put_timestamp(&ctx->pb, 0x01, dts);
921 put_timestamp(&ctx->pb, 0x02, pts);
924 put_byte(&ctx->pb, 0x0f);
929 /* special stuffing byte that is always written
930 to prevent accidental generation of start codes. */
931 put_byte(&ctx->pb, 0xff);
933 for(i=0;i<stuffing_size;i++)
934 put_byte(&ctx->pb, 0xff);
937 if (startcode == PRIVATE_STREAM_1) {
938 put_byte(&ctx->pb, id);
940 /* LPCM (XXX: check nb_frames) */
941 put_byte(&ctx->pb, 7);
942 put_be16(&ctx->pb, 4); /* skip 3 header bytes */
943 put_byte(&ctx->pb, stream->lpcm_header[0]);
944 put_byte(&ctx->pb, stream->lpcm_header[1]);
945 put_byte(&ctx->pb, stream->lpcm_header[2]);
946 } else if (id >= 0x40) {
948 put_byte(&ctx->pb, nb_frames);
949 put_be16(&ctx->pb, trailer_size+1);
954 if(put_fifo(&ctx->pb, &stream->fifo, payload_size - stuffing_size, &stream->fifo.rptr) < 0)
961 if (pad_packet_bytes > 0)
962 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
964 for(i=0;i<zero_trail_bytes;i++)
965 put_byte(&ctx->pb, 0x00);
967 put_flush_packet(&ctx->pb);
971 /* only increase the stream packet number if this pack actually contains
972 something that is specific to this stream! I.e. a dedicated header
975 stream->packet_number++;
977 return payload_size - stuffing_size;
980 static void put_vcd_padding_sector(AVFormatContext *ctx)
982 /* There are two ways to do this padding: writing a sector/pack
983 of 0 values, or writing an MPEG padding pack. Both seem to
984 work with most decoders, BUT the VCD standard only allows a 0-sector
985 (see standard p. IV-4, IV-5).
986 So a 0-sector it is...*/
988 MpegMuxContext *s = ctx->priv_data;
991 for(i=0;i<s->packet_size;i++)
992 put_byte(&ctx->pb, 0);
994 s->vcd_padding_bytes_written += s->packet_size;
996 put_flush_packet(&ctx->pb);
998 /* increasing the packet number is correct. The SCR of the following packs
999 is calculated from the packet_number and it has to include the padding
1000 sector (it represents the sector index, not the MPEG pack index)
1001 (see VCD standard p. IV-6)*/
1005 #if 0 /* unused, remove? */
1006 static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
1008 MpegMuxContext *s = ctx->priv_data;
1011 /* Since the data delivery rate is constant, SCR is computed
1012 using the formula C + i * 1200 where C is the start constant
1013 and i is the pack index.
1014 It is recommended that SCR 0 is at the beginning of the VCD front
1015 margin (a sequence of empty Form 2 sectors on the CD).
1016 It is recommended that the front margin is 30 sectors long, so
1017 we use C = 30*1200 = 36000
1018 (Note that even if the front margin is not 30 sectors the file
1019 will still be correct according to the standard. It just won't have
1020 the "recommended" value).*/
1021 scr = 36000 + s->packet_number * 1200;
1027 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
1028 // MpegMuxContext *s = ctx->priv_data;
1031 for(i=0; i<ctx->nb_streams; i++){
1032 AVStream *st = ctx->streams[i];
1033 StreamInfo *stream = st->priv_data;
1034 PacketDesc *pkt_desc= stream->predecode_packet;
1036 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
1037 if(stream->buffer_index < pkt_desc->size ||
1038 stream->predecode_packet == stream->premux_packet){
1039 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
1042 stream->buffer_index -= pkt_desc->size;
1044 stream->predecode_packet= pkt_desc->next;
1045 av_freep(&pkt_desc);
1052 static int output_packet(AVFormatContext *ctx, int flush){
1053 MpegMuxContext *s = ctx->priv_data;
1056 int i, avail_space, es_size, trailer_size;
1058 int best_score= INT_MIN;
1059 int ignore_constraints=0;
1060 int64_t scr= s->last_scr;
1061 PacketDesc *timestamp_packet;
1062 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
1065 for(i=0; i<ctx->nb_streams; i++){
1066 AVStream *st = ctx->streams[i];
1067 StreamInfo *stream = st->priv_data;
1068 const int avail_data= fifo_size(&stream->fifo, stream->fifo.rptr);
1069 const int space= stream->max_buffer_size - stream->buffer_index;
1070 int rel_space= 1024*space / stream->max_buffer_size;
1071 PacketDesc *next_pkt= stream->premux_packet;
1073 /* for subtitle, a single PES packet must be generated,
1074 so we flush after every single subtitle packet */
1075 if(s->packet_size > avail_data && !flush
1076 && st->codec->codec_type != CODEC_TYPE_SUBTITLE)
1080 assert(avail_data>0);
1082 if(space < s->packet_size && !ignore_constraints)
1085 if(next_pkt && next_pkt->dts - scr > max_delay)
1088 if(rel_space > best_score){
1089 best_score= rel_space;
1096 int64_t best_dts= INT64_MAX;
1098 for(i=0; i<ctx->nb_streams; i++){
1099 AVStream *st = ctx->streams[i];
1100 StreamInfo *stream = st->priv_data;
1101 PacketDesc *pkt_desc= stream->predecode_packet;
1102 if(pkt_desc && pkt_desc->dts < best_dts)
1103 best_dts= pkt_desc->dts;
1107 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
1108 scr/90000.0, best_dts/90000.0);
1110 if(best_dts == INT64_MAX)
1113 if(scr >= best_dts+1 && !ignore_constraints){
1114 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
1115 ignore_constraints= 1;
1117 scr= FFMAX(best_dts+1, scr);
1118 if(remove_decoded_packets(ctx, scr) < 0)
1123 assert(best_i >= 0);
1125 st = ctx->streams[best_i];
1126 stream = st->priv_data;
1128 assert(fifo_size(&stream->fifo, stream->fifo.rptr) > 0);
1130 assert(avail_space >= s->packet_size || ignore_constraints);
1132 timestamp_packet= stream->premux_packet;
1133 if(timestamp_packet->unwritten_size == timestamp_packet->size){
1136 trailer_size= timestamp_packet->unwritten_size;
1137 timestamp_packet= timestamp_packet->next;
1140 if(timestamp_packet){
1141 //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f scr:%f stream:%d\n", timestamp_packet->dts/90000.0, timestamp_packet->pts/90000.0, scr/90000.0, best_i);
1142 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
1144 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);
1145 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
1149 /* Write one or more padding sectors, if necessary, to reach
1150 the constant overall bitrate.*/
1153 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
1154 put_vcd_padding_sector(ctx);
1155 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1159 stream->buffer_index += es_size;
1160 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1162 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
1163 es_size -= stream->premux_packet->unwritten_size;
1164 stream->premux_packet= stream->premux_packet->next;
1167 stream->premux_packet->unwritten_size -= es_size;
1169 if(remove_decoded_packets(ctx, s->last_scr) < 0)
1175 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
1177 MpegMuxContext *s = ctx->priv_data;
1178 int stream_index= pkt->stream_index;
1179 int size= pkt->size;
1180 uint8_t *buf= pkt->data;
1181 AVStream *st = ctx->streams[stream_index];
1182 StreamInfo *stream = st->priv_data;
1184 PacketDesc *pkt_desc;
1185 const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
1186 const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
1191 if(pts != AV_NOPTS_VALUE) pts += preload;
1192 if(dts != AV_NOPTS_VALUE) dts += preload;
1194 //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);
1195 if (!stream->premux_packet)
1196 stream->next_packet = &stream->premux_packet;
1197 *stream->next_packet=
1198 pkt_desc= av_mallocz(sizeof(PacketDesc));
1201 pkt_desc->unwritten_size=
1202 pkt_desc->size= size;
1203 if(!stream->predecode_packet)
1204 stream->predecode_packet= pkt_desc;
1205 stream->next_packet= &pkt_desc->next;
1207 fifo_realloc(&stream->fifo, fifo_size(&stream->fifo, NULL) + size + 1);
1210 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
1211 stream->fifo_iframe_ptr = stream->fifo.wptr;
1212 stream->align_iframe = 1;
1213 stream->vobu_start_pts = pts;
1215 stream->align_iframe = 0;
1219 fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr);
1222 int ret= output_packet(ctx, 0);
1228 static int mpeg_mux_end(AVFormatContext *ctx)
1230 // MpegMuxContext *s = ctx->priv_data;
1235 int ret= output_packet(ctx, 1);
1242 /* End header according to MPEG1 systems standard. We do not write
1243 it as it is usually not needed by decoders and because it
1244 complicates MPEG stream concatenation. */
1245 //put_be32(&ctx->pb, ISO_11172_END_CODE);
1246 //put_flush_packet(&ctx->pb);
1248 for(i=0;i<ctx->nb_streams;i++) {
1249 stream = ctx->streams[i]->priv_data;
1251 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == 0);
1252 fifo_free(&stream->fifo);
1256 #endif //CONFIG_ENCODERS
1258 /*********************************************/
1261 #define MAX_SYNC_SIZE 100000
1263 static int mpegps_probe(AVProbeData *p)
1266 int size= FFMIN(20, p->buf_size);
1269 /* we search the first start code. If it is a packet start code,
1270 then we decide it is mpeg ps. We do not send highest value to
1271 give a chance to mpegts */
1272 /* NOTE: the search range was restricted to avoid too many false
1275 for (i = 0; i < size; i++) {
1276 code = (code << 8) | p->buf[i];
1277 if ((code & 0xffffff00) == 0x100) {
1278 if (code == PACK_START_CODE ||
1279 code == SYSTEM_HEADER_START_CODE ||
1280 (code >= 0x1e0 && code <= 0x1ef) ||
1281 (code >= 0x1c0 && code <= 0x1df) ||
1282 code == PRIVATE_STREAM_2 ||
1283 code == PROGRAM_STREAM_MAP ||
1284 code == PRIVATE_STREAM_1 ||
1285 code == PADDING_STREAM)
1286 return AVPROBE_SCORE_MAX - 2;
1295 typedef struct MpegDemuxContext {
1297 unsigned char psm_es_type[256];
1300 static int mpegps_read_header(AVFormatContext *s,
1301 AVFormatParameters *ap)
1303 MpegDemuxContext *m = s->priv_data;
1304 m->header_state = 0xff;
1305 s->ctx_flags |= AVFMTCTX_NOHEADER;
1307 /* no need to do more */
1311 static int64_t get_pts(ByteIOContext *pb, int c)
1318 pts = (int64_t)((c >> 1) & 0x07) << 30;
1320 pts |= (int64_t)(val >> 1) << 15;
1322 pts |= (int64_t)(val >> 1);
1326 static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
1327 uint32_t *header_state)
1329 unsigned int state, v;
1332 state = *header_state;
1339 if (state == 0x000001) {
1340 state = ((state << 8) | v) & 0xffffff;
1344 state = ((state << 8) | v) & 0xffffff;
1348 *header_state = state;
1353 #if 0 /* unused, remove? */
1355 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
1357 int64_t pos, pos_start;
1358 int max_size, start_code;
1360 max_size = *size_ptr;
1361 pos_start = url_ftell(pb);
1363 /* in order to go faster, we fill the buffer */
1364 pos = pos_start - 16386;
1367 url_fseek(pb, pos, SEEK_SET);
1373 if (pos < 0 || (pos_start - pos) >= max_size) {
1377 url_fseek(pb, pos, SEEK_SET);
1378 start_code = get_be32(pb);
1379 if ((start_code & 0xffffff00) == 0x100)
1383 *size_ptr = pos_start - pos;
1389 * Extracts stream types from a program stream map
1390 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
1392 * @return number of bytes occupied by PSM in the bitstream
1394 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
1396 int psm_length, ps_info_length, es_map_length;
1398 psm_length = get_be16(pb);
1401 ps_info_length = get_be16(pb);
1403 /* skip program_stream_info */
1404 url_fskip(pb, ps_info_length);
1405 es_map_length = get_be16(pb);
1407 /* at least one es available? */
1408 while (es_map_length >= 4){
1409 unsigned char type = get_byte(pb);
1410 unsigned char es_id = get_byte(pb);
1411 uint16_t es_info_length = get_be16(pb);
1412 /* remember mapping from stream id to stream type */
1413 m->psm_es_type[es_id] = type;
1414 /* skip program_stream_info */
1415 url_fskip(pb, es_info_length);
1416 es_map_length -= 4 + es_info_length;
1418 get_be32(pb); /* crc32 */
1419 return 2 + psm_length;
1422 /* read the next PES header. Return its position in ppos
1423 (if not NULL), and its start code, pts and dts.
1425 static int mpegps_read_pes_header(AVFormatContext *s,
1426 int64_t *ppos, int *pstart_code,
1427 int64_t *ppts, int64_t *pdts)
1429 MpegDemuxContext *m = s->priv_data;
1430 int len, size, startcode, c, flags, header_len;
1431 int64_t pts, dts, last_pos;
1435 /* next start code (should be immediately after) */
1436 m->header_state = 0xff;
1437 size = MAX_SYNC_SIZE;
1438 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
1439 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
1442 if (startcode == PACK_START_CODE)
1444 if (startcode == SYSTEM_HEADER_START_CODE)
1446 if (startcode == PADDING_STREAM ||
1447 startcode == PRIVATE_STREAM_2) {
1449 len = get_be16(&s->pb);
1450 url_fskip(&s->pb, len);
1453 if (startcode == PROGRAM_STREAM_MAP) {
1454 mpegps_psm_parse(m, &s->pb);
1458 /* find matching stream */
1459 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
1460 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
1461 (startcode == 0x1bd)))
1464 *ppos = url_ftell(&s->pb) - 4;
1466 len = get_be16(&s->pb);
1467 pts = AV_NOPTS_VALUE;
1468 dts = AV_NOPTS_VALUE;
1473 c = get_byte(&s->pb);
1475 /* XXX: for mpeg1, should test only bit 7 */
1479 if ((c & 0xc0) == 0x40) {
1480 /* buffer scale & size */
1484 c = get_byte(&s->pb);
1487 if ((c & 0xf0) == 0x20) {
1490 dts = pts = get_pts(&s->pb, c);
1492 } else if ((c & 0xf0) == 0x30) {
1495 pts = get_pts(&s->pb, c);
1496 dts = get_pts(&s->pb, -1);
1498 } else if ((c & 0xc0) == 0x80) {
1500 if ((c & 0x30) != 0) {
1501 /* Encrypted multiplex not handled */
1504 flags = get_byte(&s->pb);
1505 header_len = get_byte(&s->pb);
1507 if (header_len > len)
1509 if ((flags & 0xc0) == 0x80) {
1510 dts = pts = get_pts(&s->pb, -1);
1515 } if ((flags & 0xc0) == 0xc0) {
1516 pts = get_pts(&s->pb, -1);
1517 dts = get_pts(&s->pb, -1);
1518 if (header_len < 10)
1524 while (header_len > 0) {
1532 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
1535 startcode = get_byte(&s->pb);
1537 if (startcode >= 0x80 && startcode <= 0xbf) {
1538 /* audio: skip header */
1547 if(dts != AV_NOPTS_VALUE && ppos){
1549 for(i=0; i<s->nb_streams; i++){
1550 if(startcode == s->streams[i]->id) {
1551 av_add_index_entry(s->streams[i], *ppos, dts, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
1556 *pstart_code = startcode;
1562 static int mpegps_read_packet(AVFormatContext *s,
1565 MpegDemuxContext *m = s->priv_data;
1567 int len, startcode, i, type, codec_id = 0, es_type;
1568 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
1571 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
1575 /* now find stream */
1576 for(i=0;i<s->nb_streams;i++) {
1578 if (st->id == startcode)
1582 es_type = m->psm_es_type[startcode & 0xff];
1584 if(es_type == STREAM_TYPE_VIDEO_MPEG1){
1585 codec_id = CODEC_ID_MPEG2VIDEO;
1586 type = CODEC_TYPE_VIDEO;
1587 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
1588 codec_id = CODEC_ID_MPEG2VIDEO;
1589 type = CODEC_TYPE_VIDEO;
1590 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
1591 es_type == STREAM_TYPE_AUDIO_MPEG2){
1592 codec_id = CODEC_ID_MP3;
1593 type = CODEC_TYPE_AUDIO;
1594 } else if(es_type == STREAM_TYPE_AUDIO_AAC){
1595 codec_id = CODEC_ID_AAC;
1596 type = CODEC_TYPE_AUDIO;
1597 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
1598 codec_id = CODEC_ID_MPEG4;
1599 type = CODEC_TYPE_VIDEO;
1600 } else if(es_type == STREAM_TYPE_VIDEO_H264){
1601 codec_id = CODEC_ID_H264;
1602 type = CODEC_TYPE_VIDEO;
1603 } else if(es_type == STREAM_TYPE_AUDIO_AC3){
1604 codec_id = CODEC_ID_AC3;
1605 type = CODEC_TYPE_AUDIO;
1609 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
1610 type = CODEC_TYPE_VIDEO;
1611 codec_id = CODEC_ID_MPEG2VIDEO;
1612 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
1613 type = CODEC_TYPE_AUDIO;
1614 codec_id = CODEC_ID_MP2;
1615 } else if (startcode >= 0x80 && startcode <= 0x87) {
1616 type = CODEC_TYPE_AUDIO;
1617 codec_id = CODEC_ID_AC3;
1618 } else if (startcode >= 0x88 && startcode <= 0x9f) {
1619 type = CODEC_TYPE_AUDIO;
1620 codec_id = CODEC_ID_DTS;
1621 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
1622 type = CODEC_TYPE_AUDIO;
1623 codec_id = CODEC_ID_PCM_S16BE;
1624 } else if (startcode >= 0x20 && startcode <= 0x3f) {
1625 type = CODEC_TYPE_SUBTITLE;
1626 codec_id = CODEC_ID_DVD_SUBTITLE;
1630 url_fskip(&s->pb, len);
1633 /* no stream found: add a new stream */
1634 st = av_new_stream(s, startcode);
1637 st->codec->codec_type = type;
1638 st->codec->codec_id = codec_id;
1639 if (codec_id != CODEC_ID_PCM_S16BE)
1640 st->need_parsing = 1;
1642 if(st->discard >= AVDISCARD_ALL)
1644 if (startcode >= 0xa0 && startcode <= 0xbf) {
1647 /* for LPCM, we just skip the header and consider it is raw
1651 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
1652 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
1653 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
1655 freq = (b1 >> 4) & 3;
1656 st->codec->sample_rate = lpcm_freq_tab[freq];
1657 st->codec->channels = 1 + (b1 & 7);
1658 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2;
1660 av_new_packet(pkt, len);
1661 get_buffer(&s->pb, pkt->data, pkt->size);
1664 pkt->stream_index = st->index;
1666 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
1667 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size);
1673 static int mpegps_read_close(AVFormatContext *s)
1678 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
1679 int64_t *ppos, int64_t pos_limit)
1682 int64_t pos, pts, dts;
1686 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
1688 url_fseek(&s->pb, pos, SEEK_SET);
1690 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
1693 printf("none (ret=%d)\n", len);
1695 return AV_NOPTS_VALUE;
1697 if (startcode == s->streams[stream_index]->id &&
1698 dts != AV_NOPTS_VALUE) {
1701 url_fskip(&s->pb, len);
1704 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
1710 #ifdef CONFIG_ENCODERS
1711 static AVOutputFormat mpeg1system_mux = {
1713 "MPEG1 System format",
1716 sizeof(MpegMuxContext),
1718 CODEC_ID_MPEG1VIDEO,
1720 mpeg_mux_write_packet,
1724 static AVOutputFormat mpeg1vcd_mux = {
1726 "MPEG1 System format (VCD)",
1729 sizeof(MpegMuxContext),
1731 CODEC_ID_MPEG1VIDEO,
1733 mpeg_mux_write_packet,
1737 static AVOutputFormat mpeg2vob_mux = {
1739 "MPEG2 PS format (VOB)",
1742 sizeof(MpegMuxContext),
1744 CODEC_ID_MPEG2VIDEO,
1746 mpeg_mux_write_packet,
1750 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1751 static AVOutputFormat mpeg2svcd_mux = {
1753 "MPEG2 PS format (VOB)",
1756 sizeof(MpegMuxContext),
1758 CODEC_ID_MPEG2VIDEO,
1760 mpeg_mux_write_packet,
1764 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1765 static AVOutputFormat mpeg2dvd_mux = {
1767 "MPEG2 PS format (DVD VOB)",
1770 sizeof(MpegMuxContext),
1772 CODEC_ID_MPEG2VIDEO,
1774 mpeg_mux_write_packet,
1778 #endif //CONFIG_ENCODERS
1780 AVInputFormat mpegps_demux = {
1783 sizeof(MpegDemuxContext),
1788 NULL, //mpegps_read_seek,
1790 .flags = AVFMT_SHOW_IDS,
1793 int mpegps_init(void)
1795 #ifdef CONFIG_ENCODERS
1796 av_register_output_format(&mpeg1system_mux);
1797 av_register_output_format(&mpeg1vcd_mux);
1798 av_register_output_format(&mpeg2vob_mux);
1799 av_register_output_format(&mpeg2svcd_mux);
1800 av_register_output_format(&mpeg2dvd_mux);
1801 #endif //CONFIG_ENCODERS
1802 av_register_input_format(&mpegps_demux);