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
21 #define MAX_PAYLOAD_SIZE 4096
22 #define PRELOAD 45000 //0.5sec
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];
51 int packet_size
; /* required packet size */
53 int pack_header_freq
; /* frequency (in packets^-1) at which we send pack headers */
54 int system_header_freq
;
55 int system_header_size
;
56 int mux_rate
; /* bitrate in units of 50 bytes/s */
63 int64_t last_scr
; /* current system clock */
65 double vcd_padding_bitrate
; //FIXME floats
66 int64_t vcd_padding_bytes_written
;
70 #define PACK_START_CODE ((unsigned int)0x000001ba)
71 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
72 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
73 #define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
74 #define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
75 #define ISO_11172_END_CODE ((unsigned int)0x000001b9)
78 #define PROGRAM_STREAM_MAP 0x1bc
79 #define PRIVATE_STREAM_1 0x1bd
80 #define PADDING_STREAM 0x1be
81 #define PRIVATE_STREAM_2 0x1bf
90 static const int lpcm_freq_tab
[4] = { 48000, 96000, 44100, 32000 };
92 #ifdef CONFIG_ENCODERS
93 static AVOutputFormat mpeg1system_mux
;
94 static AVOutputFormat mpeg1vcd_mux
;
95 static AVOutputFormat mpeg2vob_mux
;
96 static AVOutputFormat mpeg2svcd_mux
;
98 static int put_pack_header(AVFormatContext
*ctx
,
99 uint8_t *buf
, int64_t timestamp
)
101 MpegMuxContext
*s
= ctx
->priv_data
;
104 init_put_bits(&pb
, buf
, 128);
106 put_bits(&pb
, 32, PACK_START_CODE
);
108 put_bits(&pb
, 2, 0x1);
110 put_bits(&pb
, 4, 0x2);
112 put_bits(&pb
, 3, (uint32_t)((timestamp
>> 30) & 0x07));
114 put_bits(&pb
, 15, (uint32_t)((timestamp
>> 15) & 0x7fff));
116 put_bits(&pb
, 15, (uint32_t)((timestamp
) & 0x7fff));
119 /* clock extension */
123 put_bits(&pb
, 22, s
->mux_rate
);
127 put_bits(&pb
, 5, 0x1f); /* reserved */
128 put_bits(&pb
, 3, 0); /* stuffing length */
131 return pbBufPtr(&pb
) - pb
.buf
;
134 static int put_system_header(AVFormatContext
*ctx
, uint8_t *buf
,int only_for_stream_id
)
136 MpegMuxContext
*s
= ctx
->priv_data
;
137 int size
, i
, private_stream_coded
, id
;
140 init_put_bits(&pb
, buf
, 128);
142 put_bits(&pb
, 32, SYSTEM_HEADER_START_CODE
);
143 put_bits(&pb
, 16, 0);
146 put_bits(&pb
, 22, s
->mux_rate
); /* maximum bit rate of the multiplexed stream */
147 put_bits(&pb
, 1, 1); /* marker */
148 if (s
->is_vcd
&& only_for_stream_id
==VIDEO_ID
) {
149 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
152 put_bits(&pb
, 6, s
->audio_bound
);
155 /* see VCD standard, p. IV-7*/
159 put_bits(&pb
, 1, 0); /* variable bitrate*/
160 put_bits(&pb
, 1, 0); /* non constrainted bit stream */
164 /* see VCD standard p IV-7 */
165 put_bits(&pb
, 1, 1); /* audio locked */
166 put_bits(&pb
, 1, 1); /* video locked */
168 put_bits(&pb
, 1, 0); /* audio locked */
169 put_bits(&pb
, 1, 0); /* video locked */
172 put_bits(&pb
, 1, 1); /* marker */
174 if (s
->is_vcd
&& only_for_stream_id
==AUDIO_ID
) {
175 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
178 put_bits(&pb
, 5, s
->video_bound
);
180 put_bits(&pb
, 8, 0xff); /* reserved byte */
182 /* audio stream info */
183 private_stream_coded
= 0;
184 for(i
=0;i
<ctx
->nb_streams
;i
++) {
185 StreamInfo
*stream
= ctx
->streams
[i
]->priv_data
;
187 /* For VCDs, only include the stream info for the stream
188 that the pack which contains this system belongs to.
189 (see VCD standard p. IV-7) */
190 if ( !s
->is_vcd
|| stream
->id
==only_for_stream_id
191 || only_for_stream_id
==0) {
195 /* special case for private streams (AC3 use that) */
196 if (private_stream_coded
)
198 private_stream_coded
= 1;
201 put_bits(&pb
, 8, id
); /* stream ID */
206 put_bits(&pb
, 13, stream
->max_buffer_size
/ 128);
210 put_bits(&pb
, 13, stream
->max_buffer_size
/ 1024);
215 size
= pbBufPtr(&pb
) - pb
.buf
;
216 /* patch packet size */
217 buf
[4] = (size
- 6) >> 8;
218 buf
[5] = (size
- 6) & 0xff;
223 static int get_system_header_size(AVFormatContext
*ctx
)
225 int buf_index
, i
, private_stream_coded
;
229 private_stream_coded
= 0;
230 for(i
=0;i
<ctx
->nb_streams
;i
++) {
231 stream
= ctx
->streams
[i
]->priv_data
;
232 if (stream
->id
< 0xc0) {
233 if (private_stream_coded
)
235 private_stream_coded
= 1;
242 static int mpeg_mux_init(AVFormatContext
*ctx
)
244 MpegMuxContext
*s
= ctx
->priv_data
;
245 int bitrate
, i
, mpa_id
, mpv_id
, ac3_id
, dts_id
, lpcm_id
, j
;
251 s
->packet_number
= 0;
252 s
->is_vcd
= (ctx
->oformat
== &mpeg1vcd_mux
);
253 s
->is_svcd
= (ctx
->oformat
== &mpeg2svcd_mux
);
254 s
->is_mpeg2
= (ctx
->oformat
== &mpeg2vob_mux
|| ctx
->oformat
== &mpeg2svcd_mux
);
256 if (s
->is_vcd
|| s
->is_svcd
)
257 s
->packet_size
= 2324; /* VCD/SVCD packet size */
259 s
->packet_size
= 2048;
261 s
->vcd_padding_bytes_written
= 0;
262 s
->vcd_padding_bitrate
=0;
271 for(i
=0;i
<ctx
->nb_streams
;i
++) {
272 st
= ctx
->streams
[i
];
273 stream
= av_mallocz(sizeof(StreamInfo
));
276 st
->priv_data
= stream
;
278 av_set_pts_info(st
, 64, 1, 90000);
280 switch(st
->codec
.codec_type
) {
281 case CODEC_TYPE_AUDIO
:
282 if (st
->codec
.codec_id
== CODEC_ID_AC3
) {
283 stream
->id
= ac3_id
++;
284 } else if (st
->codec
.codec_id
== CODEC_ID_DTS
) {
285 stream
->id
= dts_id
++;
286 } else if (st
->codec
.codec_id
== CODEC_ID_PCM_S16BE
) {
287 stream
->id
= lpcm_id
++;
288 for(j
= 0; j
< 4; j
++) {
289 if (lpcm_freq_tab
[j
] == st
->codec
.sample_rate
)
294 if (st
->codec
.channels
> 8)
296 stream
->lpcm_header
[0] = 0x0c;
297 stream
->lpcm_header
[1] = (st
->codec
.channels
- 1) | (j
<< 4);
298 stream
->lpcm_header
[2] = 0x80;
299 stream
->lpcm_align
= st
->codec
.channels
* 2;
301 stream
->id
= mpa_id
++;
304 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
305 Right now it is also used for everything else.*/
306 stream
->max_buffer_size
= 4 * 1024;
309 case CODEC_TYPE_VIDEO
:
310 stream
->id
= mpv_id
++;
311 if (st
->codec
.rc_buffer_size
)
312 stream
->max_buffer_size
= 6*1024 + st
->codec
.rc_buffer_size
/8;
314 stream
->max_buffer_size
= 230*1024; //FIXME this is probably too small as default
316 /* see VCD standard, p. IV-7*/
317 stream
->max_buffer_size
= 46 * 1024;
319 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
320 Right now it is also used for everything else.*/
321 stream
->max_buffer_size
= 230 * 1024;
328 fifo_init(&stream
->fifo
, 2*stream
->max_buffer_size
+ 100*MAX_PAYLOAD_SIZE
); //FIXME think about the size maybe dynamically realloc
329 stream
->next_packet
= &stream
->premux_packet
;
334 for(i
=0;i
<ctx
->nb_streams
;i
++) {
336 st
= ctx
->streams
[i
];
337 stream
= (StreamInfo
*) st
->priv_data
;
339 if(st
->codec
.rc_max_rate
|| stream
->id
==VIDEO_ID
)
340 codec_rate
= st
->codec
.rc_max_rate
;
342 codec_rate
= st
->codec
.bit_rate
;
345 codec_rate
= (1<<21)*8*50/ctx
->nb_streams
;
347 bitrate
+= codec_rate
;
349 if (stream
->id
==AUDIO_ID
)
350 audio_bitrate
+= codec_rate
;
351 else if (stream
->id
==VIDEO_ID
)
352 video_bitrate
+= codec_rate
;
356 double overhead_rate
;
358 /* The VCD standard mandates that the mux_rate field is 3528
359 (see standard p. IV-6).
360 The value is actually "wrong", i.e. if you calculate
361 it using the normal formula and the 75 sectors per second transfer
362 rate you get a different value because the real pack size is 2324,
363 not 2352. But the standard explicitly specifies that the mux_rate
364 field in the header must have this value.*/
365 s
->mux_rate
=2352 * 75 / 50; /* = 3528*/
367 /* The VCD standard states that the muxed stream must be
368 exactly 75 packs / second (the data rate of a single speed cdrom).
369 Since the video bitrate (probably 1150000 bits/sec) will be below
370 the theoretical maximum we have to add some padding packets
371 to make up for the lower data rate.
372 (cf. VCD standard p. IV-6 )*/
374 /* Add the header overhead to the data rate.
375 2279 data bytes per audio pack, 2294 data bytes per video pack*/
376 overhead_rate
= ((audio_bitrate
/ 8.0) / 2279) * (2324 - 2279);
377 overhead_rate
+= ((video_bitrate
/ 8.0) / 2294) * (2324 - 2294);
380 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
381 s
->vcd_padding_bitrate
= 2324 * 75 * 8 - (bitrate
+ overhead_rate
);
384 /* we increase slightly the bitrate to take into account the
385 headers. XXX: compute it exactly */
386 bitrate
+= bitrate
*5/100;
388 s
->mux_rate
= (bitrate
+ (8 * 50) - 1) / (8 * 50);
391 if (s
->is_vcd
|| s
->is_mpeg2
)
393 s
->pack_header_freq
= 1;
395 /* every 2 seconds */
396 s
->pack_header_freq
= 2 * bitrate
/ s
->packet_size
/ 8;
398 /* the above seems to make pack_header_freq zero sometimes */
399 if (s
->pack_header_freq
== 0)
400 s
->pack_header_freq
= 1;
403 /* every 200 packets. Need to look at the spec. */
404 s
->system_header_freq
= s
->pack_header_freq
* 40;
406 /* the standard mandates that there are only two system headers
407 in the whole file: one in the first packet of each stream.
408 (see standard p. IV-7 and IV-8) */
409 s
->system_header_freq
= 0x7fffffff;
411 s
->system_header_freq
= s
->pack_header_freq
* 5;
413 for(i
=0;i
<ctx
->nb_streams
;i
++) {
414 stream
= ctx
->streams
[i
]->priv_data
;
415 stream
->packet_number
= 0;
417 s
->system_header_size
= get_system_header_size(ctx
);
421 for(i
=0;i
<ctx
->nb_streams
;i
++) {
422 av_free(ctx
->streams
[i
]->priv_data
);
427 static inline void put_timestamp(ByteIOContext
*pb
, int id
, int64_t timestamp
)
431 (((timestamp
>> 30) & 0x07) << 1) |
433 put_be16(pb
, (uint16_t)((((timestamp
>> 15) & 0x7fff) << 1) | 1));
434 put_be16(pb
, (uint16_t)((((timestamp
) & 0x7fff) << 1) | 1));
438 /* return the number of padding bytes that should be inserted into
439 the multiplexed stream.*/
440 static int get_vcd_padding_size(AVFormatContext
*ctx
, int64_t pts
)
442 MpegMuxContext
*s
= ctx
->priv_data
;
445 if (s
->vcd_padding_bitrate
> 0 && pts
!=AV_NOPTS_VALUE
)
447 int64_t full_pad_bytes
;
449 full_pad_bytes
= (int64_t)((s
->vcd_padding_bitrate
* (pts
/ 90000.0)) / 8.0); //FIXME this is wrong
450 pad_bytes
= (int) (full_pad_bytes
- s
->vcd_padding_bytes_written
);
453 /* might happen if we have already padded to a later timestamp. This
454 can occur if another stream has already advanced further.*/
462 /* return the exact available payload size for the next packet for
463 stream 'stream_index'. 'pts' and 'dts' are only used to know if
464 timestamps are needed in the packet header. */
465 static int get_packet_payload_size(AVFormatContext
*ctx
, int stream_index
,
466 int64_t pts
, int64_t dts
)
468 MpegMuxContext
*s
= ctx
->priv_data
;
472 stream
= ctx
->streams
[stream_index
]->priv_data
;
475 if (((s
->packet_number
% s
->pack_header_freq
) == 0)) {
476 /* pack header size */
483 /* there is exactly one system header for each stream in a VCD MPEG,
484 One in the very first video packet and one in the very first
485 audio packet (see VCD standard p. IV-7 and IV-8).*/
487 if (stream
->packet_number
==0)
488 /* The system headers refer only to the stream they occur in,
489 so they have a constant size.*/
493 if ((s
->packet_number
% s
->system_header_freq
) == 0)
494 buf_index
+= s
->system_header_size
;
498 if ((s
->is_vcd
&& stream
->packet_number
==0)
499 || (s
->is_svcd
&& s
->packet_number
==0))
500 /* the first pack of each stream contains only the pack header,
501 the system header and some padding (see VCD standard p. IV-6)
502 Add the padding size, so that the actual payload becomes 0.*/
503 buf_index
+= s
->packet_size
- buf_index
;
505 /* packet header size */
509 if (stream
->packet_number
==0)
510 buf_index
+= 3; /* PES extension */
511 buf_index
+= 1; /* obligatory stuffing byte */
513 if (pts
!= AV_NOPTS_VALUE
) {
524 if (stream
->id
< 0xc0) {
525 /* AC3/LPCM private data header */
527 if (stream
->id
>= 0xa0) {
530 /* NOTE: we round the payload size to an integer number of
532 n
= (s
->packet_size
- buf_index
) % stream
->lpcm_align
;
534 buf_index
+= (stream
->lpcm_align
- n
);
538 if (s
->is_vcd
&& stream
->id
== AUDIO_ID
)
539 /* The VCD standard demands that 20 zero bytes follow
540 each audio packet (see standard p. IV-8).*/
543 return s
->packet_size
- buf_index
;
546 /* Write an MPEG padding packet header. */
547 static void put_padding_packet(AVFormatContext
*ctx
, ByteIOContext
*pb
,int packet_bytes
)
549 MpegMuxContext
*s
= ctx
->priv_data
;
552 put_be32(pb
, PADDING_STREAM
);
553 put_be16(pb
, packet_bytes
- 6);
560 for(i
=0;i
<packet_bytes
;i
++)
564 static int get_nb_frames(AVFormatContext
*ctx
, StreamInfo
*stream
, int len
){
566 PacketDesc
*pkt_desc
= stream
->premux_packet
;
569 if(pkt_desc
->size
== pkt_desc
->unwritten_size
)
571 len
-= pkt_desc
->unwritten_size
;
572 pkt_desc
= pkt_desc
->next
;
578 /* flush the packet on stream stream_index */
579 static int flush_packet(AVFormatContext
*ctx
, int stream_index
,
580 int64_t pts
, int64_t dts
, int64_t scr
, int trailer_size
)
582 MpegMuxContext
*s
= ctx
->priv_data
;
583 StreamInfo
*stream
= ctx
->streams
[stream_index
]->priv_data
;
585 int size
, payload_size
, startcode
, id
, stuffing_size
, i
, header_len
;
588 int zero_trail_bytes
= 0;
589 int pad_packet_bytes
= 0;
591 int general_pack
= 0; /*"general" pack without data specific to one stream?*/
597 printf("packet ID=%2x PTS=%0.3f\n",
603 if ((s
->packet_number
% s
->pack_header_freq
) == 0 || s
->last_scr
!= scr
) {
604 /* output pack and systems header if needed */
605 size
= put_pack_header(ctx
, buf_ptr
, scr
);
610 /* there is exactly one system header for each stream in a VCD MPEG,
611 One in the very first video packet and one in the very first
612 audio packet (see VCD standard p. IV-7 and IV-8).*/
614 if (stream
->packet_number
==0) {
615 size
= put_system_header(ctx
, buf_ptr
, id
);
619 if ((s
->packet_number
% s
->system_header_freq
) == 0) {
620 size
= put_system_header(ctx
, buf_ptr
, 0);
625 size
= buf_ptr
- buffer
;
626 put_buffer(&ctx
->pb
, buffer
, size
);
628 packet_size
= s
->packet_size
- size
;
630 if (s
->is_vcd
&& id
== AUDIO_ID
)
631 /* The VCD standard demands that 20 zero bytes follow
632 each audio pack (see standard p. IV-8).*/
633 zero_trail_bytes
+= 20;
635 if ((s
->is_vcd
&& stream
->packet_number
==0)
636 || (s
->is_svcd
&& s
->packet_number
==0)) {
637 /* for VCD the first pack of each stream contains only the pack header,
638 the system header and lots of padding (see VCD standard p. IV-6).
639 In the case of an audio pack, 20 zero bytes are also added at
641 /* For SVCD we fill the very first pack to increase compatibility with
642 some DVD players. Not mandated by the standard.*/
644 general_pack
= 1; /* the system header refers to both streams and no stream data*/
645 pad_packet_bytes
= packet_size
- zero_trail_bytes
;
648 packet_size
-= pad_packet_bytes
+ zero_trail_bytes
;
650 if (packet_size
> 0) {
652 /* packet header size */
658 if (stream
->packet_number
==0)
659 header_len
+= 3; /* PES extension */
660 header_len
+= 1; /* obligatory stuffing byte */
664 if (pts
!= AV_NOPTS_VALUE
) {
674 payload_size
= packet_size
- header_len
;
676 startcode
= PRIVATE_STREAM_1
;
681 startcode
= 0x100 + id
;
684 stuffing_size
= payload_size
- fifo_size(&stream
->fifo
, stream
->fifo
.rptr
);
686 // first byte doesnt fit -> reset pts/dts + stuffing
687 if(payload_size
<= trailer_size
&& pts
!= AV_NOPTS_VALUE
){
691 if(pts
!= AV_NOPTS_VALUE
)
692 timestamp_len
+= s
->is_mpeg2 ?
5 : 4;
693 pts
=dts
= AV_NOPTS_VALUE
;
694 header_len
-= timestamp_len
;
695 payload_size
+= timestamp_len
;
696 stuffing_size
+= timestamp_len
;
697 if(payload_size
> trailer_size
)
698 stuffing_size
+= payload_size
- trailer_size
;
701 if (stuffing_size
< 0)
703 if (stuffing_size
> 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
704 pad_packet_bytes
+= stuffing_size
;
705 packet_size
-= stuffing_size
;
706 payload_size
-= stuffing_size
;
710 nb_frames
= get_nb_frames(ctx
, stream
, payload_size
- stuffing_size
);
712 put_be32(&ctx
->pb
, startcode
);
714 put_be16(&ctx
->pb
, packet_size
);
717 for(i
=0;i
<stuffing_size
;i
++)
718 put_byte(&ctx
->pb
, 0xff);
721 put_byte(&ctx
->pb
, 0x80); /* mpeg2 id */
725 if (pts
!= AV_NOPTS_VALUE
) {
731 /* Both the MPEG-2 and the SVCD standards demand that the
732 P-STD_buffer_size field be included in the first packet of
733 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
734 and MPEG-2 standard 2.7.7) */
735 if (stream
->packet_number
== 0)
738 put_byte(&ctx
->pb
, pes_flags
); /* flags */
739 put_byte(&ctx
->pb
, header_len
- 3 + stuffing_size
);
741 if (pes_flags
& 0x80) /*write pts*/
742 put_timestamp(&ctx
->pb
, (pes_flags
& 0x40) ?
0x03 : 0x02, pts
);
743 if (pes_flags
& 0x40) /*write dts*/
744 put_timestamp(&ctx
->pb
, 0x01, dts
);
746 if (pes_flags
& 0x01) { /*write pes extension*/
747 put_byte(&ctx
->pb
, 0x10); /* flags */
749 /* P-STD buffer info */
751 put_be16(&ctx
->pb
, 0x4000 | stream
->max_buffer_size
/128);
753 put_be16(&ctx
->pb
, 0x6000 | stream
->max_buffer_size
/1024);
757 if (pts
!= AV_NOPTS_VALUE
) {
759 put_timestamp(&ctx
->pb
, 0x03, pts
);
760 put_timestamp(&ctx
->pb
, 0x01, dts
);
762 put_timestamp(&ctx
->pb
, 0x02, pts
);
765 put_byte(&ctx
->pb
, 0x0f);
770 /* special stuffing byte that is always written
771 to prevent accidental generation of start codes. */
772 put_byte(&ctx
->pb
, 0xff);
774 for(i
=0;i
<stuffing_size
;i
++)
775 put_byte(&ctx
->pb
, 0xff);
778 if (startcode
== PRIVATE_STREAM_1
) {
779 put_byte(&ctx
->pb
, id
);
781 /* LPCM (XXX: check nb_frames) */
782 put_byte(&ctx
->pb
, 7);
783 put_be16(&ctx
->pb
, 4); /* skip 3 header bytes */
784 put_byte(&ctx
->pb
, stream
->lpcm_header
[0]);
785 put_byte(&ctx
->pb
, stream
->lpcm_header
[1]);
786 put_byte(&ctx
->pb
, stream
->lpcm_header
[2]);
789 put_byte(&ctx
->pb
, nb_frames
);
790 put_be16(&ctx
->pb
, trailer_size
+1);
795 if(put_fifo(&ctx
->pb
, &stream
->fifo
, payload_size
- stuffing_size
, &stream
->fifo
.rptr
) < 0)
802 if (pad_packet_bytes
> 0)
803 put_padding_packet(ctx
,&ctx
->pb
, pad_packet_bytes
);
805 for(i
=0;i
<zero_trail_bytes
;i
++)
806 put_byte(&ctx
->pb
, 0x00);
808 put_flush_packet(&ctx
->pb
);
812 /* only increase the stream packet number if this pack actually contains
813 something that is specific to this stream! I.e. a dedicated header
816 stream
->packet_number
++;
818 return payload_size
- stuffing_size
;
821 static void put_vcd_padding_sector(AVFormatContext
*ctx
)
823 /* There are two ways to do this padding: writing a sector/pack
824 of 0 values, or writing an MPEG padding pack. Both seem to
825 work with most decoders, BUT the VCD standard only allows a 0-sector
826 (see standard p. IV-4, IV-5).
827 So a 0-sector it is...*/
829 MpegMuxContext
*s
= ctx
->priv_data
;
832 for(i
=0;i
<s
->packet_size
;i
++)
833 put_byte(&ctx
->pb
, 0);
835 s
->vcd_padding_bytes_written
+= s
->packet_size
;
837 put_flush_packet(&ctx
->pb
);
839 /* increasing the packet number is correct. The SCR of the following packs
840 is calculated from the packet_number and it has to include the padding
841 sector (it represents the sector index, not the MPEG pack index)
842 (see VCD standard p. IV-6)*/
846 static int64_t get_vcd_scr(AVFormatContext
*ctx
,int stream_index
,int64_t pts
)
848 MpegMuxContext
*s
= ctx
->priv_data
;
851 /* Since the data delivery rate is constant, SCR is computed
852 using the formula C + i * 1200 where C is the start constant
853 and i is the pack index.
854 It is recommended that SCR 0 is at the beginning of the VCD front
855 margin (a sequence of empty Form 2 sectors on the CD).
856 It is recommended that the front margin is 30 sectors long, so
857 we use C = 30*1200 = 36000
858 (Note that even if the front margin is not 30 sectors the file
859 will still be correct according to the standard. It just won't have
860 the "recommended" value).*/
861 scr
= 36000 + s
->packet_number
* 1200;
866 static int remove_decoded_packets(AVFormatContext
*ctx
, int64_t scr
){
867 // MpegMuxContext *s = ctx->priv_data;
870 for(i
=0; i
<ctx
->nb_streams
; i
++){
871 AVStream
*st
= ctx
->streams
[i
];
872 StreamInfo
*stream
= st
->priv_data
;
873 PacketDesc
*pkt_desc
= stream
->predecode_packet
;
875 while(pkt_desc
&& scr
> pkt_desc
->dts
){ //FIXME > vs >=
876 if(stream
->buffer_index
< pkt_desc
->size
||
877 stream
->predecode_packet
== stream
->premux_packet
){
878 av_log(ctx
, AV_LOG_ERROR
, "buffer underflow\n");
881 stream
->buffer_index
-= pkt_desc
->size
;
883 stream
->predecode_packet
= pkt_desc
->next
;
891 static int output_packet(AVFormatContext
*ctx
, int flush
){
892 MpegMuxContext
*s
= ctx
->priv_data
;
895 int i
, avail_space
, es_size
, trailer_size
;
897 int best_score
= INT_MIN
;
898 int ignore_constraints
=0;
899 int64_t scr
= s
->last_scr
;
900 PacketDesc
*timestamp_packet
;
903 for(i
=0; i
<ctx
->nb_streams
; i
++){
904 AVStream
*st
= ctx
->streams
[i
];
905 StreamInfo
*stream
= st
->priv_data
;
906 const int avail_data
= fifo_size(&stream
->fifo
, stream
->fifo
.rptr
);
907 const int space
= stream
->max_buffer_size
- stream
->buffer_index
;
908 int rel_space
= 1024*space
/ stream
->max_buffer_size
;
910 if(s
->packet_size
> avail_data
&& !flush
)
914 assert(avail_data
>0);
916 if(space
< s
->packet_size
&& !ignore_constraints
)
919 if(rel_space
> best_score
){
920 best_score
= rel_space
;
927 int64_t best_dts
= INT64_MAX
;
929 for(i
=0; i
<ctx
->nb_streams
; i
++){
930 AVStream
*st
= ctx
->streams
[i
];
931 StreamInfo
*stream
= st
->priv_data
;
932 PacketDesc
*pkt_desc
= stream
->predecode_packet
;
933 if(pkt_desc
&& pkt_desc
->dts
< best_dts
)
934 best_dts
= pkt_desc
->dts
;
938 av_log(ctx
, AV_LOG_DEBUG
, "bumping scr, scr:%f, dts:%f\n",
939 scr
/90000.0, best_dts
/90000.0);
941 if(best_dts
== INT64_MAX
)
944 if(scr
>= best_dts
+1 && !ignore_constraints
){
945 av_log(ctx
, AV_LOG_ERROR
, "packet too large, ignoring buffer limits to mux it\n");
946 ignore_constraints
= 1;
948 scr
= FFMAX(best_dts
+1, scr
);
949 if(remove_decoded_packets(ctx
, scr
) < 0)
956 st
= ctx
->streams
[best_i
];
957 stream
= st
->priv_data
;
959 assert(fifo_size(&stream
->fifo
, stream
->fifo
.rptr
) > 0);
961 assert(avail_space
>= s
->packet_size
|| ignore_constraints
);
963 timestamp_packet
= stream
->premux_packet
;
964 if(timestamp_packet
->unwritten_size
== timestamp_packet
->size
){
967 trailer_size
= timestamp_packet
->unwritten_size
;
968 timestamp_packet
= timestamp_packet
->next
;
971 if(timestamp_packet
){
972 es_size
= flush_packet(ctx
, best_i
, timestamp_packet
->pts
, timestamp_packet
->dts
, scr
, trailer_size
);
974 assert(fifo_size(&stream
->fifo
, stream
->fifo
.rptr
) == trailer_size
);
975 es_size
= flush_packet(ctx
, best_i
, AV_NOPTS_VALUE
, AV_NOPTS_VALUE
, scr
, trailer_size
);
979 /* Write one or more padding sectors, if necessary, to reach
980 the constant overall bitrate.*/
983 while((vcd_pad_bytes
= get_vcd_padding_size(ctx
,stream
->premux_packet
->pts
) ) >= s
->packet_size
){ //FIXME pts cannot be correct here
984 put_vcd_padding_sector(ctx
);
985 s
->last_scr
+= s
->packet_size
*90000LL / (s
->mux_rate
*50LL); //FIXME rounding and first few bytes of each packet
989 stream
->buffer_index
+= es_size
;
990 s
->last_scr
+= s
->packet_size
*90000LL / (s
->mux_rate
*50LL); //FIXME rounding and first few bytes of each packet
992 while(stream
->premux_packet
&& stream
->premux_packet
->unwritten_size
<= es_size
){
993 es_size
-= stream
->premux_packet
->unwritten_size
;
994 stream
->premux_packet
= stream
->premux_packet
->next
;
997 stream
->premux_packet
->unwritten_size
-= es_size
;
999 if(remove_decoded_packets(ctx
, s
->last_scr
) < 0)
1005 static int mpeg_mux_write_packet(AVFormatContext
*ctx
, AVPacket
*pkt
)
1007 MpegMuxContext
*s
= ctx
->priv_data
;
1008 int stream_index
= pkt
->stream_index
;
1009 int size
= pkt
->size
;
1010 uint8_t *buf
= pkt
->data
;
1011 AVStream
*st
= ctx
->streams
[stream_index
];
1012 StreamInfo
*stream
= st
->priv_data
;
1014 PacketDesc
*pkt_desc
;
1020 /* We have to offset the PTS, so that it is consistent with the SCR.
1021 SCR starts at 36000, but the first two packs contain only padding
1022 and the first pack from the other stream, respectively, may also have
1023 been written before.
1024 So the real data starts at SCR 36000+3*1200. */
1025 pts
+= 36000 + 3600;
1026 dts
+= 36000 + 3600;
1031 //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index);
1032 *stream
->next_packet
=
1033 pkt_desc
= av_mallocz(sizeof(PacketDesc
));
1036 pkt_desc
->unwritten_size
=
1037 pkt_desc
->size
= size
;
1038 if(!stream
->predecode_packet
)
1039 stream
->predecode_packet
= pkt_desc
;
1040 stream
->next_packet
= &pkt_desc
->next
;
1042 if(stream
->fifo
.end
- stream
->fifo
.buffer
- fifo_size(&stream
->fifo
, stream
->fifo
.rptr
) < size
){
1043 av_log(ctx
, AV_LOG_ERROR
, "fifo overflow\n");
1046 fifo_write(&stream
->fifo
, buf
, size
, &stream
->fifo
.wptr
);
1049 int ret
= output_packet(ctx
, 0);
1055 static int mpeg_mux_end(AVFormatContext
*ctx
)
1057 // MpegMuxContext *s = ctx->priv_data;
1062 int ret
= output_packet(ctx
, 1);
1069 /* End header according to MPEG1 systems standard. We do not write
1070 it as it is usually not needed by decoders and because it
1071 complicates MPEG stream concatenation. */
1072 //put_be32(&ctx->pb, ISO_11172_END_CODE);
1073 //put_flush_packet(&ctx->pb);
1075 for(i
=0;i
<ctx
->nb_streams
;i
++) {
1076 stream
= ctx
->streams
[i
]->priv_data
;
1078 assert(fifo_size(&stream
->fifo
, stream
->fifo
.rptr
) == 0);
1079 fifo_free(&stream
->fifo
);
1083 #endif //CONFIG_ENCODERS
1085 /*********************************************/
1088 #define MAX_SYNC_SIZE 100000
1090 static int mpegps_probe(AVProbeData
*p
)
1093 int size
= FFMIN(20, p
->buf_size
);
1096 /* we search the first start code. If it is a packet start code,
1097 then we decide it is mpeg ps. We do not send highest value to
1098 give a chance to mpegts */
1099 /* NOTE: the search range was restricted to avoid too many false
1102 for (i
= 0; i
< size
; i
++) {
1103 code
= (code
<< 8) | p
->buf
[i
];
1104 if ((code
& 0xffffff00) == 0x100) {
1105 if (code
== PACK_START_CODE
||
1106 code
== SYSTEM_HEADER_START_CODE
||
1107 (code
>= 0x1e0 && code
<= 0x1ef) ||
1108 (code
>= 0x1c0 && code
<= 0x1df) ||
1109 code
== PRIVATE_STREAM_2
||
1110 code
== PROGRAM_STREAM_MAP
||
1111 code
== PRIVATE_STREAM_1
||
1112 code
== PADDING_STREAM
)
1113 return AVPROBE_SCORE_MAX
- 2;
1122 typedef struct MpegDemuxContext
{
1126 static int mpegps_read_header(AVFormatContext
*s
,
1127 AVFormatParameters
*ap
)
1129 MpegDemuxContext
*m
= s
->priv_data
;
1130 m
->header_state
= 0xff;
1131 s
->ctx_flags
|= AVFMTCTX_NOHEADER
;
1133 /* no need to do more */
1137 static int64_t get_pts(ByteIOContext
*pb
, int c
)
1144 pts
= (int64_t)((c
>> 1) & 0x07) << 30;
1146 pts
|= (int64_t)(val
>> 1) << 15;
1148 pts
|= (int64_t)(val
>> 1);
1152 static int find_next_start_code(ByteIOContext
*pb
, int *size_ptr
,
1153 uint32_t *header_state
)
1155 unsigned int state
, v
;
1158 state
= *header_state
;
1165 if (state
== 0x000001) {
1166 state
= ((state
<< 8) | v
) & 0xffffff;
1170 state
= ((state
<< 8) | v
) & 0xffffff;
1174 *header_state
= state
;
1180 static int find_prev_start_code(ByteIOContext
*pb
, int *size_ptr
)
1182 int64_t pos
, pos_start
;
1183 int max_size
, start_code
;
1185 max_size
= *size_ptr
;
1186 pos_start
= url_ftell(pb
);
1188 /* in order to go faster, we fill the buffer */
1189 pos
= pos_start
- 16386;
1192 url_fseek(pb
, pos
, SEEK_SET
);
1198 if (pos
< 0 || (pos_start
- pos
) >= max_size
) {
1202 url_fseek(pb
, pos
, SEEK_SET
);
1203 start_code
= get_be32(pb
);
1204 if ((start_code
& 0xffffff00) == 0x100)
1208 *size_ptr
= pos_start
- pos
;
1212 /* read the next PES header. Return its position in ppos
1213 (if not NULL), and its start code, pts and dts.
1215 static int mpegps_read_pes_header(AVFormatContext
*s
,
1216 int64_t *ppos
, int *pstart_code
,
1217 int64_t *ppts
, int64_t *pdts
)
1219 MpegDemuxContext
*m
= s
->priv_data
;
1220 int len
, size
, startcode
, c
, flags
, header_len
;
1221 int64_t pts
, dts
, last_pos
;
1225 /* next start code (should be immediately after) */
1226 m
->header_state
= 0xff;
1227 size
= MAX_SYNC_SIZE
;
1228 startcode
= find_next_start_code(&s
->pb
, &size
, &m
->header_state
);
1229 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
1232 if (startcode
== PACK_START_CODE
)
1234 if (startcode
== SYSTEM_HEADER_START_CODE
)
1236 if (startcode
== PADDING_STREAM
||
1237 startcode
== PRIVATE_STREAM_2
) {
1239 len
= get_be16(&s
->pb
);
1240 url_fskip(&s
->pb
, len
);
1243 /* find matching stream */
1244 if (!((startcode
>= 0x1c0 && startcode
<= 0x1df) ||
1245 (startcode
>= 0x1e0 && startcode
<= 0x1ef) ||
1246 (startcode
== 0x1bd)))
1249 *ppos
= url_ftell(&s
->pb
) - 4;
1251 len
= get_be16(&s
->pb
);
1252 pts
= AV_NOPTS_VALUE
;
1253 dts
= AV_NOPTS_VALUE
;
1258 c
= get_byte(&s
->pb
);
1260 /* XXX: for mpeg1, should test only bit 7 */
1264 if ((c
& 0xc0) == 0x40) {
1265 /* buffer scale & size */
1269 c
= get_byte(&s
->pb
);
1272 if ((c
& 0xf0) == 0x20) {
1275 dts
= pts
= get_pts(&s
->pb
, c
);
1277 } else if ((c
& 0xf0) == 0x30) {
1280 pts
= get_pts(&s
->pb
, c
);
1281 dts
= get_pts(&s
->pb
, -1);
1283 } else if ((c
& 0xc0) == 0x80) {
1285 if ((c
& 0x30) != 0) {
1286 /* Encrypted multiplex not handled */
1289 flags
= get_byte(&s
->pb
);
1290 header_len
= get_byte(&s
->pb
);
1292 if (header_len
> len
)
1294 if ((flags
& 0xc0) == 0x80) {
1295 dts
= pts
= get_pts(&s
->pb
, -1);
1300 } if ((flags
& 0xc0) == 0xc0) {
1301 pts
= get_pts(&s
->pb
, -1);
1302 dts
= get_pts(&s
->pb
, -1);
1303 if (header_len
< 10)
1309 while (header_len
> 0) {
1317 if (startcode
== 0x1bd) {
1320 startcode
= get_byte(&s
->pb
);
1322 if (startcode
>= 0x80 && startcode
<= 0xbf) {
1323 /* audio: skip header */
1332 if(dts
!= AV_NOPTS_VALUE
&& ppos
){
1334 for(i
=0; i
<s
->nb_streams
; i
++){
1335 if(startcode
== s
->streams
[i
]->id
) {
1336 av_add_index_entry(s
->streams
[i
], *ppos
, dts
, 0, 0 /* FIXME keyframe? */);
1341 *pstart_code
= startcode
;
1347 static int mpegps_read_packet(AVFormatContext
*s
,
1351 int len
, startcode
, i
, type
, codec_id
= 0;
1352 int64_t pts
, dts
, dummy_pos
; //dummy_pos is needed for the index building to work
1355 len
= mpegps_read_pes_header(s
, &dummy_pos
, &startcode
, &pts
, &dts
);
1359 /* now find stream */
1360 for(i
=0;i
<s
->nb_streams
;i
++) {
1362 if (st
->id
== startcode
)
1365 if (startcode
>= 0x1e0 && startcode
<= 0x1ef) {
1366 type
= CODEC_TYPE_VIDEO
;
1367 codec_id
= CODEC_ID_MPEG2VIDEO
;
1368 } else if (startcode
>= 0x1c0 && startcode
<= 0x1df) {
1369 type
= CODEC_TYPE_AUDIO
;
1370 codec_id
= CODEC_ID_MP2
;
1371 } else if (startcode
>= 0x80 && startcode
<= 0x89) {
1372 type
= CODEC_TYPE_AUDIO
;
1373 codec_id
= CODEC_ID_AC3
;
1374 } else if (startcode
>= 0x8a && startcode
<= 0x9f) {
1375 type
= CODEC_TYPE_AUDIO
;
1376 codec_id
= CODEC_ID_DTS
;
1377 } else if (startcode
>= 0xa0 && startcode
<= 0xbf) {
1378 type
= CODEC_TYPE_AUDIO
;
1379 codec_id
= CODEC_ID_PCM_S16BE
;
1383 url_fskip(&s
->pb
, len
);
1386 /* no stream found: add a new stream */
1387 st
= av_new_stream(s
, startcode
);
1390 st
->codec
.codec_type
= type
;
1391 st
->codec
.codec_id
= codec_id
;
1392 if (codec_id
!= CODEC_ID_PCM_S16BE
)
1393 st
->need_parsing
= 1;
1395 if (startcode
>= 0xa0 && startcode
<= 0xbf) {
1398 /* for LPCM, we just skip the header and consider it is raw
1402 get_byte(&s
->pb
); /* emphasis (1), muse(1), reserved(1), frame number(5) */
1403 b1
= get_byte(&s
->pb
); /* quant (2), freq(2), reserved(1), channels(3) */
1404 get_byte(&s
->pb
); /* dynamic range control (0x80 = off) */
1406 freq
= (b1
>> 4) & 3;
1407 st
->codec
.sample_rate
= lpcm_freq_tab
[freq
];
1408 st
->codec
.channels
= 1 + (b1
& 7);
1409 st
->codec
.bit_rate
= st
->codec
.channels
* st
->codec
.sample_rate
* 2;
1411 av_new_packet(pkt
, len
);
1412 get_buffer(&s
->pb
, pkt
->data
, pkt
->size
);
1415 pkt
->stream_index
= st
->index
;
1417 av_log(s
, AV_LOG_DEBUG
, "%d: pts=%0.3f dts=%0.3f\n",
1418 pkt
->stream_index
, pkt
->pts
/ 90000.0, pkt
->dts
/ 90000.0);
1424 static int mpegps_read_close(AVFormatContext
*s
)
1429 static int64_t mpegps_read_dts(AVFormatContext
*s
, int stream_index
,
1430 int64_t *ppos
, int64_t pos_limit
)
1433 int64_t pos
, pts
, dts
;
1437 printf("read_dts: pos=0x%llx next=%d -> ", pos
, find_next
);
1439 url_fseek(&s
->pb
, pos
, SEEK_SET
);
1441 len
= mpegps_read_pes_header(s
, &pos
, &startcode
, &pts
, &dts
);
1444 printf("none (ret=%d)\n", len
);
1446 return AV_NOPTS_VALUE
;
1448 if (startcode
== s
->streams
[stream_index
]->id
&&
1449 dts
!= AV_NOPTS_VALUE
) {
1452 url_fskip(&s
->pb
, len
);
1455 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos
, dts
, dts
/ 90000.0);
1461 #ifdef CONFIG_ENCODERS
1462 static AVOutputFormat mpeg1system_mux
= {
1464 "MPEG1 System format",
1467 sizeof(MpegMuxContext
),
1469 CODEC_ID_MPEG1VIDEO
,
1471 mpeg_mux_write_packet
,
1475 static AVOutputFormat mpeg1vcd_mux
= {
1477 "MPEG1 System format (VCD)",
1480 sizeof(MpegMuxContext
),
1482 CODEC_ID_MPEG1VIDEO
,
1484 mpeg_mux_write_packet
,
1488 static AVOutputFormat mpeg2vob_mux
= {
1490 "MPEG2 PS format (VOB)",
1493 sizeof(MpegMuxContext
),
1495 CODEC_ID_MPEG2VIDEO
,
1497 mpeg_mux_write_packet
,
1501 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1502 static AVOutputFormat mpeg2svcd_mux
= {
1504 "MPEG2 PS format (VOB)",
1507 sizeof(MpegMuxContext
),
1509 CODEC_ID_MPEG2VIDEO
,
1511 mpeg_mux_write_packet
,
1517 #endif //CONFIG_ENCODERS
1519 AVInputFormat mpegps_demux
= {
1522 sizeof(MpegDemuxContext
),
1527 NULL
, //mpegps_read_seek,
1531 int mpegps_init(void)
1533 #ifdef CONFIG_ENCODERS
1534 av_register_output_format(&mpeg1system_mux
);
1535 av_register_output_format(&mpeg1vcd_mux
);
1536 av_register_output_format(&mpeg2vob_mux
);
1537 av_register_output_format(&mpeg2svcd_mux
);
1538 #endif //CONFIG_ENCODERS
1539 av_register_input_format(&mpegps_demux
);