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
94 #define STREAM_TYPE_VIDEO_MPEG1 0x01
95 #define STREAM_TYPE_VIDEO_MPEG2 0x02
96 #define STREAM_TYPE_AUDIO_MPEG1 0x03
97 #define STREAM_TYPE_AUDIO_MPEG2 0x04
98 #define STREAM_TYPE_PRIVATE_SECTION 0x05
99 #define STREAM_TYPE_PRIVATE_DATA 0x06
100 #define STREAM_TYPE_AUDIO_AAC 0x0f
101 #define STREAM_TYPE_VIDEO_MPEG4 0x10
102 #define STREAM_TYPE_VIDEO_H264 0x1b
104 #define STREAM_TYPE_AUDIO_AC3 0x81
105 #define STREAM_TYPE_AUDIO_DTS 0x8a
107 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
109 #ifdef CONFIG_ENCODERS
110 static AVOutputFormat mpeg1system_mux;
111 static AVOutputFormat mpeg1vcd_mux;
112 static AVOutputFormat mpeg2vob_mux;
113 static AVOutputFormat mpeg2svcd_mux;
114 static AVOutputFormat mpeg2dvd_mux;
116 static int put_pack_header(AVFormatContext *ctx,
117 uint8_t *buf, int64_t timestamp)
119 MpegMuxContext *s = ctx->priv_data;
122 init_put_bits(&pb, buf, 128);
124 put_bits(&pb, 32, PACK_START_CODE);
126 put_bits(&pb, 2, 0x1);
128 put_bits(&pb, 4, 0x2);
130 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
132 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
134 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
137 /* clock extension */
141 put_bits(&pb, 22, s->mux_rate);
145 put_bits(&pb, 5, 0x1f); /* reserved */
146 put_bits(&pb, 3, 0); /* stuffing length */
149 return pbBufPtr(&pb) - pb.buf;
152 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
154 MpegMuxContext *s = ctx->priv_data;
155 int size, i, private_stream_coded, id;
158 init_put_bits(&pb, buf, 128);
160 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
161 put_bits(&pb, 16, 0);
164 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
165 put_bits(&pb, 1, 1); /* marker */
166 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
167 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
170 put_bits(&pb, 6, s->audio_bound);
173 /* see VCD standard, p. IV-7*/
177 put_bits(&pb, 1, 0); /* variable bitrate*/
178 put_bits(&pb, 1, 0); /* non constrainted bit stream */
181 if (s->is_vcd || s->is_dvd) {
182 /* see VCD standard p IV-7 */
183 put_bits(&pb, 1, 1); /* audio locked */
184 put_bits(&pb, 1, 1); /* video locked */
186 put_bits(&pb, 1, 0); /* audio locked */
187 put_bits(&pb, 1, 0); /* video locked */
190 put_bits(&pb, 1, 1); /* marker */
192 if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
193 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
196 put_bits(&pb, 5, s->video_bound);
199 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
200 put_bits(&pb, 7, 0x7f); /* reserved byte */
202 put_bits(&pb, 8, 0xff); /* reserved byte */
204 /* DVD-Video Stream_bound entries
205 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
206 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)
207 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
208 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
211 int P_STD_max_video = 0;
212 int P_STD_max_mpeg_audio = 0;
213 int P_STD_max_mpeg_PS1 = 0;
215 for(i=0;i<ctx->nb_streams;i++) {
216 StreamInfo *stream = ctx->streams[i]->priv_data;
219 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
220 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
221 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
222 P_STD_max_mpeg_audio = stream->max_buffer_size;
223 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
224 P_STD_max_video = stream->max_buffer_size;
229 put_bits(&pb, 8, 0xb9); /* stream ID */
232 put_bits(&pb, 13, P_STD_max_video / 1024);
235 if (P_STD_max_mpeg_audio == 0)
236 P_STD_max_mpeg_audio = 4096;
237 put_bits(&pb, 8, 0xb8); /* stream ID */
240 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
242 /* private stream 1 */
243 put_bits(&pb, 8, 0xbd); /* stream ID */
246 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
248 /* private stream 2 */
249 put_bits(&pb, 8, 0xbf); /* stream ID */
252 put_bits(&pb, 13, 2);
255 /* audio stream info */
256 private_stream_coded = 0;
257 for(i=0;i<ctx->nb_streams;i++) {
258 StreamInfo *stream = ctx->streams[i]->priv_data;
261 /* For VCDs, only include the stream info for the stream
262 that the pack which contains this system belongs to.
263 (see VCD standard p. IV-7) */
264 if ( !s->is_vcd || stream->id==only_for_stream_id
265 || only_for_stream_id==0) {
269 /* special case for private streams (AC3 use that) */
270 if (private_stream_coded)
272 private_stream_coded = 1;
275 put_bits(&pb, 8, id); /* stream ID */
280 put_bits(&pb, 13, stream->max_buffer_size / 128);
284 put_bits(&pb, 13, stream->max_buffer_size / 1024);
291 size = pbBufPtr(&pb) - pb.buf;
292 /* patch packet size */
293 buf[4] = (size - 6) >> 8;
294 buf[5] = (size - 6) & 0xff;
299 static int get_system_header_size(AVFormatContext *ctx)
301 int buf_index, i, private_stream_coded;
303 MpegMuxContext *s = ctx->priv_data;
306 return 18; // DVD-Video system headers are 18 bytes fixed length.
309 private_stream_coded = 0;
310 for(i=0;i<ctx->nb_streams;i++) {
311 stream = ctx->streams[i]->priv_data;
312 if (stream->id < 0xc0) {
313 if (private_stream_coded)
315 private_stream_coded = 1;
322 static int mpeg_mux_init(AVFormatContext *ctx)
324 MpegMuxContext *s = ctx->priv_data;
325 int bitrate, i, mpa_id, mpv_id, ac3_id, dts_id, lpcm_id, j;
331 s->packet_number = 0;
332 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux);
333 s->is_svcd = (ctx->oformat == &mpeg2svcd_mux);
334 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
335 s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
338 s->packet_size = ctx->packet_size;
340 s->packet_size = 2048;
342 s->vcd_padding_bytes_written = 0;
343 s->vcd_padding_bitrate=0;
352 for(i=0;i<ctx->nb_streams;i++) {
353 st = ctx->streams[i];
354 stream = av_mallocz(sizeof(StreamInfo));
357 st->priv_data = stream;
359 av_set_pts_info(st, 64, 1, 90000);
361 switch(st->codec.codec_type) {
362 case CODEC_TYPE_AUDIO:
363 if (st->codec.codec_id == CODEC_ID_AC3) {
364 stream->id = ac3_id++;
365 } else if (st->codec.codec_id == CODEC_ID_DTS) {
366 stream->id = dts_id++;
367 } else if (st->codec.codec_id == CODEC_ID_PCM_S16BE) {
368 stream->id = lpcm_id++;
369 for(j = 0; j < 4; j++) {
370 if (lpcm_freq_tab[j] == st->codec.sample_rate)
375 if (st->codec.channels > 8)
377 stream->lpcm_header[0] = 0x0c;
378 stream->lpcm_header[1] = (st->codec.channels - 1) | (j << 4);
379 stream->lpcm_header[2] = 0x80;
380 stream->lpcm_align = st->codec.channels * 2;
382 stream->id = mpa_id++;
385 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
386 Right now it is also used for everything else.*/
387 stream->max_buffer_size = 4 * 1024;
390 case CODEC_TYPE_VIDEO:
391 stream->id = mpv_id++;
392 if (st->codec.rc_buffer_size)
393 stream->max_buffer_size = 6*1024 + st->codec.rc_buffer_size/8;
395 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
397 /* see VCD standard, p. IV-7*/
398 stream->max_buffer_size = 46 * 1024;
400 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
401 Right now it is also used for everything else.*/
402 stream->max_buffer_size = 230 * 1024;
409 fifo_init(&stream->fifo, 16);
410 stream->next_packet= &stream->premux_packet;
415 for(i=0;i<ctx->nb_streams;i++) {
417 st = ctx->streams[i];
418 stream = (StreamInfo*) st->priv_data;
420 if(st->codec.rc_max_rate || stream->id==VIDEO_ID)
421 codec_rate= st->codec.rc_max_rate;
423 codec_rate= st->codec.bit_rate;
426 codec_rate= (1<<21)*8*50/ctx->nb_streams;
428 bitrate += codec_rate;
430 if (stream->id==AUDIO_ID)
431 audio_bitrate += codec_rate;
432 else if (stream->id==VIDEO_ID)
433 video_bitrate += codec_rate;
437 s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
439 /* we increase slightly the bitrate to take into account the
440 headers. XXX: compute it exactly */
441 bitrate += bitrate*5/100;
443 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
447 double overhead_rate;
449 /* The VCD standard mandates that the mux_rate field is 3528
450 (see standard p. IV-6).
451 The value is actually "wrong", i.e. if you calculate
452 it using the normal formula and the 75 sectors per second transfer
453 rate you get a different value because the real pack size is 2324,
454 not 2352. But the standard explicitly specifies that the mux_rate
455 field in the header must have this value.*/
456 // s->mux_rate=2352 * 75 / 50; /* = 3528*/
458 /* The VCD standard states that the muxed stream must be
459 exactly 75 packs / second (the data rate of a single speed cdrom).
460 Since the video bitrate (probably 1150000 bits/sec) will be below
461 the theoretical maximum we have to add some padding packets
462 to make up for the lower data rate.
463 (cf. VCD standard p. IV-6 )*/
465 /* Add the header overhead to the data rate.
466 2279 data bytes per audio pack, 2294 data bytes per video pack*/
467 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
468 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
471 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
472 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
475 if (s->is_vcd || s->is_mpeg2)
477 s->pack_header_freq = 1;
479 /* every 2 seconds */
480 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
482 /* the above seems to make pack_header_freq zero sometimes */
483 if (s->pack_header_freq == 0)
484 s->pack_header_freq = 1;
487 /* every 200 packets. Need to look at the spec. */
488 s->system_header_freq = s->pack_header_freq * 40;
490 /* the standard mandates that there are only two system headers
491 in the whole file: one in the first packet of each stream.
492 (see standard p. IV-7 and IV-8) */
493 s->system_header_freq = 0x7fffffff;
495 s->system_header_freq = s->pack_header_freq * 5;
497 for(i=0;i<ctx->nb_streams;i++) {
498 stream = ctx->streams[i]->priv_data;
499 stream->packet_number = 0;
501 s->system_header_size = get_system_header_size(ctx);
505 for(i=0;i<ctx->nb_streams;i++) {
506 av_free(ctx->streams[i]->priv_data);
511 static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
515 (((timestamp >> 30) & 0x07) << 1) |
517 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
518 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
522 /* return the number of padding bytes that should be inserted into
523 the multiplexed stream.*/
524 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
526 MpegMuxContext *s = ctx->priv_data;
529 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
531 int64_t full_pad_bytes;
533 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
534 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
537 /* might happen if we have already padded to a later timestamp. This
538 can occur if another stream has already advanced further.*/
546 #if 0 /* unused, remove? */
547 /* return the exact available payload size for the next packet for
548 stream 'stream_index'. 'pts' and 'dts' are only used to know if
549 timestamps are needed in the packet header. */
550 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
551 int64_t pts, int64_t dts)
553 MpegMuxContext *s = ctx->priv_data;
557 stream = ctx->streams[stream_index]->priv_data;
560 if (((s->packet_number % s->pack_header_freq) == 0)) {
561 /* pack header size */
568 /* there is exactly one system header for each stream in a VCD MPEG,
569 One in the very first video packet and one in the very first
570 audio packet (see VCD standard p. IV-7 and IV-8).*/
572 if (stream->packet_number==0)
573 /* The system headers refer only to the stream they occur in,
574 so they have a constant size.*/
578 if ((s->packet_number % s->system_header_freq) == 0)
579 buf_index += s->system_header_size;
583 if ((s->is_vcd && stream->packet_number==0)
584 || (s->is_svcd && s->packet_number==0))
585 /* the first pack of each stream contains only the pack header,
586 the system header and some padding (see VCD standard p. IV-6)
587 Add the padding size, so that the actual payload becomes 0.*/
588 buf_index += s->packet_size - buf_index;
590 /* packet header size */
594 if (stream->packet_number==0)
595 buf_index += 3; /* PES extension */
596 buf_index += 1; /* obligatory stuffing byte */
598 if (pts != AV_NOPTS_VALUE) {
609 if (stream->id < 0xc0) {
610 /* AC3/LPCM private data header */
612 if (stream->id >= 0xa0) {
615 /* NOTE: we round the payload size to an integer number of
617 n = (s->packet_size - buf_index) % stream->lpcm_align;
619 buf_index += (stream->lpcm_align - n);
623 if (s->is_vcd && stream->id == AUDIO_ID)
624 /* The VCD standard demands that 20 zero bytes follow
625 each audio packet (see standard p. IV-8).*/
628 return s->packet_size - buf_index;
632 /* Write an MPEG padding packet header. */
633 static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
635 MpegMuxContext *s = ctx->priv_data;
638 put_be32(pb, PADDING_STREAM);
639 put_be16(pb, packet_bytes - 6);
646 for(i=0;i<packet_bytes;i++)
650 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
652 PacketDesc *pkt_desc= stream->premux_packet;
655 if(pkt_desc->size == pkt_desc->unwritten_size)
657 len -= pkt_desc->unwritten_size;
658 pkt_desc= pkt_desc->next;
664 /* flush the packet on stream stream_index */
665 static int flush_packet(AVFormatContext *ctx, int stream_index,
666 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
668 MpegMuxContext *s = ctx->priv_data;
669 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
671 int size, payload_size, startcode, id, stuffing_size, i, header_len;
674 int zero_trail_bytes = 0;
675 int pad_packet_bytes = 0;
677 int general_pack = 0; /*"general" pack without data specific to one stream?*/
683 printf("packet ID=%2x PTS=%0.3f\n",
689 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
690 /* output pack and systems header if needed */
691 size = put_pack_header(ctx, buf_ptr, scr);
696 /* there is exactly one system header for each stream in a VCD MPEG,
697 One in the very first video packet and one in the very first
698 audio packet (see VCD standard p. IV-7 and IV-8).*/
700 if (stream->packet_number==0) {
701 size = put_system_header(ctx, buf_ptr, id);
704 } else if (s->is_dvd) {
705 if (stream->align_iframe || s->packet_number == 0){
707 int PES_bytes_to_fill;
708 if (stream->fifo_iframe_ptr >= stream->fifo.rptr) {
709 bytes_to_iframe = stream->fifo_iframe_ptr - stream->fifo.rptr;
711 bytes_to_iframe = (stream->fifo.end - stream->fifo.rptr) + (stream->fifo_iframe_ptr - stream->fifo.buffer);
713 PES_bytes_to_fill = s->packet_size - size - 10;
715 if (pts != AV_NOPTS_VALUE) {
717 PES_bytes_to_fill -= 5 + 5;
719 PES_bytes_to_fill -= 5;
722 if (bytes_to_iframe == 0 || s->packet_number == 0) {
723 size = put_system_header(ctx, buf_ptr, 0);
725 size = buf_ptr - buffer;
726 put_buffer(&ctx->pb, buffer, size);
728 put_be32(&ctx->pb, PRIVATE_STREAM_2);
729 put_be16(&ctx->pb, 0x03d4); // length
730 put_byte(&ctx->pb, 0x00); // substream ID, 00=PCI
731 for (i = 0; i < 979; i++)
732 put_byte(&ctx->pb, 0x00);
734 put_be32(&ctx->pb, PRIVATE_STREAM_2);
735 put_be16(&ctx->pb, 0x03fa); // length
736 put_byte(&ctx->pb, 0x01); // substream ID, 01=DSI
737 for (i = 0; i < 1017; i++)
738 put_byte(&ctx->pb, 0x00);
740 memset(buffer, 0, 128);
743 stream->align_iframe = 0;
744 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
745 size = put_pack_header(ctx, buf_ptr, scr);
749 } else if (bytes_to_iframe < PES_bytes_to_fill) {
750 pad_packet_bytes = PES_bytes_to_fill - bytes_to_iframe;
754 if ((s->packet_number % s->system_header_freq) == 0) {
755 size = put_system_header(ctx, buf_ptr, 0);
760 size = buf_ptr - buffer;
761 put_buffer(&ctx->pb, buffer, size);
763 packet_size = s->packet_size - size;
765 if (s->is_vcd && id == AUDIO_ID)
766 /* The VCD standard demands that 20 zero bytes follow
767 each audio pack (see standard p. IV-8).*/
768 zero_trail_bytes += 20;
770 if ((s->is_vcd && stream->packet_number==0)
771 || (s->is_svcd && s->packet_number==0)) {
772 /* for VCD the first pack of each stream contains only the pack header,
773 the system header and lots of padding (see VCD standard p. IV-6).
774 In the case of an audio pack, 20 zero bytes are also added at
776 /* For SVCD we fill the very first pack to increase compatibility with
777 some DVD players. Not mandated by the standard.*/
779 general_pack = 1; /* the system header refers to both streams and no stream data*/
780 pad_packet_bytes = packet_size - zero_trail_bytes;
783 packet_size -= pad_packet_bytes + zero_trail_bytes;
785 if (packet_size > 0) {
787 /* packet header size */
793 if (stream->packet_number==0)
794 header_len += 3; /* PES extension */
795 header_len += 1; /* obligatory stuffing byte */
799 if (pts != AV_NOPTS_VALUE) {
809 payload_size = packet_size - header_len;
811 startcode = PRIVATE_STREAM_1;
816 startcode = 0x100 + id;
819 stuffing_size = payload_size - fifo_size(&stream->fifo, stream->fifo.rptr);
821 // first byte doesnt fit -> reset pts/dts + stuffing
822 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
826 if(pts != AV_NOPTS_VALUE)
827 timestamp_len += s->is_mpeg2 ? 5 : 4;
828 pts=dts= AV_NOPTS_VALUE;
829 header_len -= timestamp_len;
830 if (s->is_dvd && stream->align_iframe) {
831 pad_packet_bytes += timestamp_len;
832 packet_size -= timestamp_len;
834 payload_size += timestamp_len;
836 stuffing_size += timestamp_len;
837 if(payload_size > trailer_size)
838 stuffing_size += payload_size - trailer_size;
841 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
842 packet_size += pad_packet_bytes;
843 payload_size += pad_packet_bytes; // undo the previous adjustment
844 if (stuffing_size < 0) {
845 stuffing_size = pad_packet_bytes;
847 stuffing_size += pad_packet_bytes;
849 pad_packet_bytes = 0;
852 if (stuffing_size < 0)
854 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
855 pad_packet_bytes += stuffing_size;
856 packet_size -= stuffing_size;
857 payload_size -= stuffing_size;
861 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
863 put_be32(&ctx->pb, startcode);
865 put_be16(&ctx->pb, packet_size);
868 for(i=0;i<stuffing_size;i++)
869 put_byte(&ctx->pb, 0xff);
872 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
876 if (pts != AV_NOPTS_VALUE) {
882 /* Both the MPEG-2 and the SVCD standards demand that the
883 P-STD_buffer_size field be included in the first packet of
884 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
885 and MPEG-2 standard 2.7.7) */
886 if (stream->packet_number == 0)
889 put_byte(&ctx->pb, pes_flags); /* flags */
890 put_byte(&ctx->pb, header_len - 3 + stuffing_size);
892 if (pes_flags & 0x80) /*write pts*/
893 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
894 if (pes_flags & 0x40) /*write dts*/
895 put_timestamp(&ctx->pb, 0x01, dts);
897 if (pes_flags & 0x01) { /*write pes extension*/
898 put_byte(&ctx->pb, 0x10); /* flags */
900 /* P-STD buffer info */
902 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
904 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
908 if (pts != AV_NOPTS_VALUE) {
910 put_timestamp(&ctx->pb, 0x03, pts);
911 put_timestamp(&ctx->pb, 0x01, dts);
913 put_timestamp(&ctx->pb, 0x02, pts);
916 put_byte(&ctx->pb, 0x0f);
921 /* special stuffing byte that is always written
922 to prevent accidental generation of start codes. */
923 put_byte(&ctx->pb, 0xff);
925 for(i=0;i<stuffing_size;i++)
926 put_byte(&ctx->pb, 0xff);
929 if (startcode == PRIVATE_STREAM_1) {
930 put_byte(&ctx->pb, id);
932 /* LPCM (XXX: check nb_frames) */
933 put_byte(&ctx->pb, 7);
934 put_be16(&ctx->pb, 4); /* skip 3 header bytes */
935 put_byte(&ctx->pb, stream->lpcm_header[0]);
936 put_byte(&ctx->pb, stream->lpcm_header[1]);
937 put_byte(&ctx->pb, stream->lpcm_header[2]);
940 put_byte(&ctx->pb, nb_frames);
941 put_be16(&ctx->pb, trailer_size+1);
946 if(put_fifo(&ctx->pb, &stream->fifo, payload_size - stuffing_size, &stream->fifo.rptr) < 0)
953 if (pad_packet_bytes > 0)
954 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
956 for(i=0;i<zero_trail_bytes;i++)
957 put_byte(&ctx->pb, 0x00);
959 put_flush_packet(&ctx->pb);
963 /* only increase the stream packet number if this pack actually contains
964 something that is specific to this stream! I.e. a dedicated header
967 stream->packet_number++;
969 return payload_size - stuffing_size;
972 static void put_vcd_padding_sector(AVFormatContext *ctx)
974 /* There are two ways to do this padding: writing a sector/pack
975 of 0 values, or writing an MPEG padding pack. Both seem to
976 work with most decoders, BUT the VCD standard only allows a 0-sector
977 (see standard p. IV-4, IV-5).
978 So a 0-sector it is...*/
980 MpegMuxContext *s = ctx->priv_data;
983 for(i=0;i<s->packet_size;i++)
984 put_byte(&ctx->pb, 0);
986 s->vcd_padding_bytes_written += s->packet_size;
988 put_flush_packet(&ctx->pb);
990 /* increasing the packet number is correct. The SCR of the following packs
991 is calculated from the packet_number and it has to include the padding
992 sector (it represents the sector index, not the MPEG pack index)
993 (see VCD standard p. IV-6)*/
997 #if 0 /* unused, remove? */
998 static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
1000 MpegMuxContext *s = ctx->priv_data;
1003 /* Since the data delivery rate is constant, SCR is computed
1004 using the formula C + i * 1200 where C is the start constant
1005 and i is the pack index.
1006 It is recommended that SCR 0 is at the beginning of the VCD front
1007 margin (a sequence of empty Form 2 sectors on the CD).
1008 It is recommended that the front margin is 30 sectors long, so
1009 we use C = 30*1200 = 36000
1010 (Note that even if the front margin is not 30 sectors the file
1011 will still be correct according to the standard. It just won't have
1012 the "recommended" value).*/
1013 scr = 36000 + s->packet_number * 1200;
1019 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
1020 // MpegMuxContext *s = ctx->priv_data;
1023 for(i=0; i<ctx->nb_streams; i++){
1024 AVStream *st = ctx->streams[i];
1025 StreamInfo *stream = st->priv_data;
1026 PacketDesc *pkt_desc= stream->predecode_packet;
1028 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
1029 if(stream->buffer_index < pkt_desc->size ||
1030 stream->predecode_packet == stream->premux_packet){
1031 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
1034 stream->buffer_index -= pkt_desc->size;
1036 stream->predecode_packet= pkt_desc->next;
1037 av_freep(&pkt_desc);
1044 static int output_packet(AVFormatContext *ctx, int flush){
1045 MpegMuxContext *s = ctx->priv_data;
1048 int i, avail_space, es_size, trailer_size;
1050 int best_score= INT_MIN;
1051 int ignore_constraints=0;
1052 int64_t scr= s->last_scr;
1053 PacketDesc *timestamp_packet;
1054 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
1057 for(i=0; i<ctx->nb_streams; i++){
1058 AVStream *st = ctx->streams[i];
1059 StreamInfo *stream = st->priv_data;
1060 const int avail_data= fifo_size(&stream->fifo, stream->fifo.rptr);
1061 const int space= stream->max_buffer_size - stream->buffer_index;
1062 int rel_space= 1024*space / stream->max_buffer_size;
1063 PacketDesc *next_pkt= stream->premux_packet;
1065 if(s->packet_size > avail_data && !flush)
1069 assert(avail_data>0);
1071 if(space < s->packet_size && !ignore_constraints)
1074 if(next_pkt && next_pkt->dts - scr > max_delay)
1077 if(rel_space > best_score){
1078 best_score= rel_space;
1085 int64_t best_dts= INT64_MAX;
1087 for(i=0; i<ctx->nb_streams; i++){
1088 AVStream *st = ctx->streams[i];
1089 StreamInfo *stream = st->priv_data;
1090 PacketDesc *pkt_desc= stream->predecode_packet;
1091 if(pkt_desc && pkt_desc->dts < best_dts)
1092 best_dts= pkt_desc->dts;
1096 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
1097 scr/90000.0, best_dts/90000.0);
1099 if(best_dts == INT64_MAX)
1102 if(scr >= best_dts+1 && !ignore_constraints){
1103 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
1104 ignore_constraints= 1;
1106 scr= FFMAX(best_dts+1, scr);
1107 if(remove_decoded_packets(ctx, scr) < 0)
1112 assert(best_i >= 0);
1114 st = ctx->streams[best_i];
1115 stream = st->priv_data;
1117 assert(fifo_size(&stream->fifo, stream->fifo.rptr) > 0);
1119 assert(avail_space >= s->packet_size || ignore_constraints);
1121 timestamp_packet= stream->premux_packet;
1122 if(timestamp_packet->unwritten_size == timestamp_packet->size){
1125 trailer_size= timestamp_packet->unwritten_size;
1126 timestamp_packet= timestamp_packet->next;
1129 if(timestamp_packet){
1130 //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);
1131 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
1133 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);
1134 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
1138 /* Write one or more padding sectors, if necessary, to reach
1139 the constant overall bitrate.*/
1142 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
1143 put_vcd_padding_sector(ctx);
1144 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1148 stream->buffer_index += es_size;
1149 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1151 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
1152 es_size -= stream->premux_packet->unwritten_size;
1153 stream->premux_packet= stream->premux_packet->next;
1156 stream->premux_packet->unwritten_size -= es_size;
1158 if(remove_decoded_packets(ctx, s->last_scr) < 0)
1164 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
1166 MpegMuxContext *s = ctx->priv_data;
1167 int stream_index= pkt->stream_index;
1168 int size= pkt->size;
1169 uint8_t *buf= pkt->data;
1170 AVStream *st = ctx->streams[stream_index];
1171 StreamInfo *stream = st->priv_data;
1173 PacketDesc *pkt_desc;
1174 const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
1175 const int is_iframe = st->codec.codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
1180 if(pts != AV_NOPTS_VALUE) pts += preload;
1181 if(dts != AV_NOPTS_VALUE) dts += preload;
1183 //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);
1184 *stream->next_packet=
1185 pkt_desc= av_mallocz(sizeof(PacketDesc));
1188 pkt_desc->unwritten_size=
1189 pkt_desc->size= size;
1190 if(!stream->predecode_packet)
1191 stream->predecode_packet= pkt_desc;
1192 stream->next_packet= &pkt_desc->next;
1194 fifo_realloc(&stream->fifo, fifo_size(&stream->fifo, NULL) + size + 1);
1197 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
1198 stream->fifo_iframe_ptr = stream->fifo.wptr;
1199 stream->align_iframe = 1;
1200 stream->vobu_start_pts = pts;
1202 stream->align_iframe = 0;
1206 fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr);
1209 int ret= output_packet(ctx, 0);
1215 static int mpeg_mux_end(AVFormatContext *ctx)
1217 // MpegMuxContext *s = ctx->priv_data;
1222 int ret= output_packet(ctx, 1);
1229 /* End header according to MPEG1 systems standard. We do not write
1230 it as it is usually not needed by decoders and because it
1231 complicates MPEG stream concatenation. */
1232 //put_be32(&ctx->pb, ISO_11172_END_CODE);
1233 //put_flush_packet(&ctx->pb);
1235 for(i=0;i<ctx->nb_streams;i++) {
1236 stream = ctx->streams[i]->priv_data;
1238 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == 0);
1239 fifo_free(&stream->fifo);
1243 #endif //CONFIG_ENCODERS
1245 /*********************************************/
1248 #define MAX_SYNC_SIZE 100000
1250 static int mpegps_probe(AVProbeData *p)
1253 int size= FFMIN(20, p->buf_size);
1256 /* we search the first start code. If it is a packet start code,
1257 then we decide it is mpeg ps. We do not send highest value to
1258 give a chance to mpegts */
1259 /* NOTE: the search range was restricted to avoid too many false
1262 for (i = 0; i < size; i++) {
1263 code = (code << 8) | p->buf[i];
1264 if ((code & 0xffffff00) == 0x100) {
1265 if (code == PACK_START_CODE ||
1266 code == SYSTEM_HEADER_START_CODE ||
1267 (code >= 0x1e0 && code <= 0x1ef) ||
1268 (code >= 0x1c0 && code <= 0x1df) ||
1269 code == PRIVATE_STREAM_2 ||
1270 code == PROGRAM_STREAM_MAP ||
1271 code == PRIVATE_STREAM_1 ||
1272 code == PADDING_STREAM)
1273 return AVPROBE_SCORE_MAX - 2;
1282 typedef struct MpegDemuxContext {
1284 unsigned char psm_es_type[256];
1287 static int mpegps_read_header(AVFormatContext *s,
1288 AVFormatParameters *ap)
1290 MpegDemuxContext *m = s->priv_data;
1291 m->header_state = 0xff;
1292 s->ctx_flags |= AVFMTCTX_NOHEADER;
1294 /* no need to do more */
1298 static int64_t get_pts(ByteIOContext *pb, int c)
1305 pts = (int64_t)((c >> 1) & 0x07) << 30;
1307 pts |= (int64_t)(val >> 1) << 15;
1309 pts |= (int64_t)(val >> 1);
1313 static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
1314 uint32_t *header_state)
1316 unsigned int state, v;
1319 state = *header_state;
1326 if (state == 0x000001) {
1327 state = ((state << 8) | v) & 0xffffff;
1331 state = ((state << 8) | v) & 0xffffff;
1335 *header_state = state;
1340 #if 0 /* unused, remove? */
1342 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
1344 int64_t pos, pos_start;
1345 int max_size, start_code;
1347 max_size = *size_ptr;
1348 pos_start = url_ftell(pb);
1350 /* in order to go faster, we fill the buffer */
1351 pos = pos_start - 16386;
1354 url_fseek(pb, pos, SEEK_SET);
1360 if (pos < 0 || (pos_start - pos) >= max_size) {
1364 url_fseek(pb, pos, SEEK_SET);
1365 start_code = get_be32(pb);
1366 if ((start_code & 0xffffff00) == 0x100)
1370 *size_ptr = pos_start - pos;
1376 * Extracts stream types from a program stream map
1377 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
1379 * @return number of bytes occupied by PSM in the bitstream
1381 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
1383 int psm_length, ps_info_length, es_map_length;
1385 psm_length = get_be16(pb);
1388 ps_info_length = get_be16(pb);
1390 /* skip program_stream_info */
1391 url_fskip(pb, ps_info_length);
1392 es_map_length = get_be16(pb);
1394 /* at least one es available? */
1395 while (es_map_length >= 4){
1396 unsigned char type = get_byte(pb);
1397 unsigned char es_id = get_byte(pb);
1398 uint16_t es_info_length = get_be16(pb);
1399 /* remember mapping from stream id to stream type */
1400 m->psm_es_type[es_id] = type;
1401 /* skip program_stream_info */
1402 url_fskip(pb, es_info_length);
1403 es_map_length -= 4 + es_info_length;
1405 get_be32(pb); /* crc32 */
1406 return 2 + psm_length;
1409 /* read the next PES header. Return its position in ppos
1410 (if not NULL), and its start code, pts and dts.
1412 static int mpegps_read_pes_header(AVFormatContext *s,
1413 int64_t *ppos, int *pstart_code,
1414 int64_t *ppts, int64_t *pdts)
1416 MpegDemuxContext *m = s->priv_data;
1417 int len, size, startcode, c, flags, header_len;
1418 int64_t pts, dts, last_pos;
1422 /* next start code (should be immediately after) */
1423 m->header_state = 0xff;
1424 size = MAX_SYNC_SIZE;
1425 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
1426 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
1429 if (startcode == PACK_START_CODE)
1431 if (startcode == SYSTEM_HEADER_START_CODE)
1433 if (startcode == PADDING_STREAM ||
1434 startcode == PRIVATE_STREAM_2) {
1436 len = get_be16(&s->pb);
1437 url_fskip(&s->pb, len);
1440 if (startcode == PROGRAM_STREAM_MAP) {
1441 mpegps_psm_parse(m, &s->pb);
1445 /* find matching stream */
1446 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
1447 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
1448 (startcode == 0x1bd)))
1451 *ppos = url_ftell(&s->pb) - 4;
1453 len = get_be16(&s->pb);
1454 pts = AV_NOPTS_VALUE;
1455 dts = AV_NOPTS_VALUE;
1460 c = get_byte(&s->pb);
1462 /* XXX: for mpeg1, should test only bit 7 */
1466 if ((c & 0xc0) == 0x40) {
1467 /* buffer scale & size */
1471 c = get_byte(&s->pb);
1474 if ((c & 0xf0) == 0x20) {
1477 dts = pts = get_pts(&s->pb, c);
1479 } else if ((c & 0xf0) == 0x30) {
1482 pts = get_pts(&s->pb, c);
1483 dts = get_pts(&s->pb, -1);
1485 } else if ((c & 0xc0) == 0x80) {
1487 if ((c & 0x30) != 0) {
1488 /* Encrypted multiplex not handled */
1491 flags = get_byte(&s->pb);
1492 header_len = get_byte(&s->pb);
1494 if (header_len > len)
1496 if ((flags & 0xc0) == 0x80) {
1497 dts = pts = get_pts(&s->pb, -1);
1502 } if ((flags & 0xc0) == 0xc0) {
1503 pts = get_pts(&s->pb, -1);
1504 dts = get_pts(&s->pb, -1);
1505 if (header_len < 10)
1511 while (header_len > 0) {
1519 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
1522 startcode = get_byte(&s->pb);
1524 if (startcode >= 0x80 && startcode <= 0xbf) {
1525 /* audio: skip header */
1534 if(dts != AV_NOPTS_VALUE && ppos){
1536 for(i=0; i<s->nb_streams; i++){
1537 if(startcode == s->streams[i]->id) {
1538 av_add_index_entry(s->streams[i], *ppos, dts, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
1543 *pstart_code = startcode;
1549 static int mpegps_read_packet(AVFormatContext *s,
1552 MpegDemuxContext *m = s->priv_data;
1554 int len, startcode, i, type, codec_id = 0, es_type;
1555 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
1558 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
1562 /* now find stream */
1563 for(i=0;i<s->nb_streams;i++) {
1565 if (st->id == startcode)
1569 es_type = m->psm_es_type[startcode & 0xff];
1571 if(es_type == STREAM_TYPE_VIDEO_MPEG1){
1572 codec_id = CODEC_ID_MPEG2VIDEO;
1573 type = CODEC_TYPE_VIDEO;
1574 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
1575 codec_id = CODEC_ID_MPEG2VIDEO;
1576 type = CODEC_TYPE_VIDEO;
1577 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
1578 es_type == STREAM_TYPE_AUDIO_MPEG2){
1579 codec_id = CODEC_ID_MP3;
1580 type = CODEC_TYPE_AUDIO;
1581 } else if(es_type == STREAM_TYPE_AUDIO_AAC){
1582 codec_id = CODEC_ID_AAC;
1583 type = CODEC_TYPE_AUDIO;
1584 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
1585 codec_id = CODEC_ID_MPEG4;
1586 type = CODEC_TYPE_VIDEO;
1587 } else if(es_type == STREAM_TYPE_VIDEO_H264){
1588 codec_id = CODEC_ID_H264;
1589 type = CODEC_TYPE_VIDEO;
1590 } else if(es_type == STREAM_TYPE_AUDIO_AC3){
1591 codec_id = CODEC_ID_AC3;
1592 type = CODEC_TYPE_AUDIO;
1596 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
1597 type = CODEC_TYPE_VIDEO;
1598 codec_id = CODEC_ID_MPEG2VIDEO;
1599 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
1600 type = CODEC_TYPE_AUDIO;
1601 codec_id = CODEC_ID_MP2;
1602 } else if (startcode >= 0x80 && startcode <= 0x89) {
1603 type = CODEC_TYPE_AUDIO;
1604 codec_id = CODEC_ID_AC3;
1605 } else if (startcode >= 0x8a && startcode <= 0x9f) {
1606 type = CODEC_TYPE_AUDIO;
1607 codec_id = CODEC_ID_DTS;
1608 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
1609 type = CODEC_TYPE_AUDIO;
1610 codec_id = CODEC_ID_PCM_S16BE;
1614 url_fskip(&s->pb, len);
1617 /* no stream found: add a new stream */
1618 st = av_new_stream(s, startcode);
1621 st->codec.codec_type = type;
1622 st->codec.codec_id = codec_id;
1623 if (codec_id != CODEC_ID_PCM_S16BE)
1624 st->need_parsing = 1;
1626 if(st->discard >= AVDISCARD_ALL)
1628 if (startcode >= 0xa0 && startcode <= 0xbf) {
1631 /* for LPCM, we just skip the header and consider it is raw
1635 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
1636 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
1637 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
1639 freq = (b1 >> 4) & 3;
1640 st->codec.sample_rate = lpcm_freq_tab[freq];
1641 st->codec.channels = 1 + (b1 & 7);
1642 st->codec.bit_rate = st->codec.channels * st->codec.sample_rate * 2;
1644 av_new_packet(pkt, len);
1645 get_buffer(&s->pb, pkt->data, pkt->size);
1648 pkt->stream_index = st->index;
1650 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
1651 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size);
1657 static int mpegps_read_close(AVFormatContext *s)
1662 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
1663 int64_t *ppos, int64_t pos_limit)
1666 int64_t pos, pts, dts;
1670 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
1672 url_fseek(&s->pb, pos, SEEK_SET);
1674 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
1677 printf("none (ret=%d)\n", len);
1679 return AV_NOPTS_VALUE;
1681 if (startcode == s->streams[stream_index]->id &&
1682 dts != AV_NOPTS_VALUE) {
1685 url_fskip(&s->pb, len);
1688 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
1694 #ifdef CONFIG_ENCODERS
1695 static AVOutputFormat mpeg1system_mux = {
1697 "MPEG1 System format",
1700 sizeof(MpegMuxContext),
1702 CODEC_ID_MPEG1VIDEO,
1704 mpeg_mux_write_packet,
1708 static AVOutputFormat mpeg1vcd_mux = {
1710 "MPEG1 System format (VCD)",
1713 sizeof(MpegMuxContext),
1715 CODEC_ID_MPEG1VIDEO,
1717 mpeg_mux_write_packet,
1721 static AVOutputFormat mpeg2vob_mux = {
1723 "MPEG2 PS format (VOB)",
1726 sizeof(MpegMuxContext),
1728 CODEC_ID_MPEG2VIDEO,
1730 mpeg_mux_write_packet,
1734 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1735 static AVOutputFormat mpeg2svcd_mux = {
1737 "MPEG2 PS format (VOB)",
1740 sizeof(MpegMuxContext),
1742 CODEC_ID_MPEG2VIDEO,
1744 mpeg_mux_write_packet,
1748 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1749 static AVOutputFormat mpeg2dvd_mux = {
1751 "MPEG2 PS format (DVD VOB)",
1754 sizeof(MpegMuxContext),
1756 CODEC_ID_MPEG2VIDEO,
1758 mpeg_mux_write_packet,
1762 #endif //CONFIG_ENCODERS
1764 AVInputFormat mpegps_demux = {
1767 sizeof(MpegDemuxContext),
1772 NULL, //mpegps_read_seek,
1776 int mpegps_init(void)
1778 #ifdef CONFIG_ENCODERS
1779 av_register_output_format(&mpeg1system_mux);
1780 av_register_output_format(&mpeg1vcd_mux);
1781 av_register_output_format(&mpeg2vob_mux);
1782 av_register_output_format(&mpeg2svcd_mux);
1783 av_register_output_format(&mpeg2dvd_mux);
1784 #endif //CONFIG_ENCODERS
1785 av_register_input_format(&mpegps_demux);