comparison src/ffmpeg/libavformat/mpeg.c @ 808:e8776388b02a trunk

[svn] - add ffmpeg
author nenolod
date Mon, 12 Mar 2007 11:18:54 -0700
parents
children
comparison
equal deleted inserted replaced
807:0f9c8d4d3ac4 808:e8776388b02a
1 /*
2 * MPEG1/2 mux/demux
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21 #include "avformat.h"
22 #include "bitstream.h"
23 #include "fifo.h"
24
25 #define MAX_PAYLOAD_SIZE 4096
26 //#define DEBUG_SEEK
27
28 #undef NDEBUG
29 #include <assert.h>
30
31 typedef struct PacketDesc {
32 int64_t pts;
33 int64_t dts;
34 int size;
35 int unwritten_size;
36 int flags;
37 struct PacketDesc *next;
38 } PacketDesc;
39
40 typedef struct {
41 AVFifoBuffer fifo;
42 uint8_t id;
43 int max_buffer_size; /* in bytes */
44 int buffer_index;
45 PacketDesc *predecode_packet;
46 PacketDesc *premux_packet;
47 PacketDesc **next_packet;
48 int packet_number;
49 uint8_t lpcm_header[3];
50 int lpcm_align;
51 int bytes_to_iframe;
52 int align_iframe;
53 int64_t vobu_start_pts;
54 } StreamInfo;
55
56 typedef struct {
57 int packet_size; /* required packet size */
58 int packet_number;
59 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
60 int system_header_freq;
61 int system_header_size;
62 int mux_rate; /* bitrate in units of 50 bytes/s */
63 /* stream info */
64 int audio_bound;
65 int video_bound;
66 int is_mpeg2;
67 int is_vcd;
68 int is_svcd;
69 int is_dvd;
70 int64_t last_scr; /* current system clock */
71
72 double vcd_padding_bitrate; //FIXME floats
73 int64_t vcd_padding_bytes_written;
74
75 } MpegMuxContext;
76
77 #define PACK_START_CODE ((unsigned int)0x000001ba)
78 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
79 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
80 #define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
81 #define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
82 #define ISO_11172_END_CODE ((unsigned int)0x000001b9)
83
84 /* mpeg2 */
85 #define PROGRAM_STREAM_MAP 0x1bc
86 #define PRIVATE_STREAM_1 0x1bd
87 #define PADDING_STREAM 0x1be
88 #define PRIVATE_STREAM_2 0x1bf
89
90
91 #define AUDIO_ID 0xc0
92 #define VIDEO_ID 0xe0
93 #define AC3_ID 0x80
94 #define DTS_ID 0x8a
95 #define LPCM_ID 0xa0
96 #define SUB_ID 0x20
97
98 #define STREAM_TYPE_VIDEO_MPEG1 0x01
99 #define STREAM_TYPE_VIDEO_MPEG2 0x02
100 #define STREAM_TYPE_AUDIO_MPEG1 0x03
101 #define STREAM_TYPE_AUDIO_MPEG2 0x04
102 #define STREAM_TYPE_PRIVATE_SECTION 0x05
103 #define STREAM_TYPE_PRIVATE_DATA 0x06
104 #define STREAM_TYPE_AUDIO_AAC 0x0f
105 #define STREAM_TYPE_VIDEO_MPEG4 0x10
106 #define STREAM_TYPE_VIDEO_H264 0x1b
107
108 #define STREAM_TYPE_AUDIO_AC3 0x81
109 #define STREAM_TYPE_AUDIO_DTS 0x8a
110
111 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
112
113 #ifdef CONFIG_MUXERS
114 AVOutputFormat mpeg1system_muxer;
115 AVOutputFormat mpeg1vcd_muxer;
116 AVOutputFormat mpeg2vob_muxer;
117 AVOutputFormat mpeg2svcd_muxer;
118 AVOutputFormat mpeg2dvd_muxer;
119
120 static int put_pack_header(AVFormatContext *ctx,
121 uint8_t *buf, int64_t timestamp)
122 {
123 MpegMuxContext *s = ctx->priv_data;
124 PutBitContext pb;
125
126 init_put_bits(&pb, buf, 128);
127
128 put_bits(&pb, 32, PACK_START_CODE);
129 if (s->is_mpeg2) {
130 put_bits(&pb, 2, 0x1);
131 } else {
132 put_bits(&pb, 4, 0x2);
133 }
134 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
135 put_bits(&pb, 1, 1);
136 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
137 put_bits(&pb, 1, 1);
138 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
139 put_bits(&pb, 1, 1);
140 if (s->is_mpeg2) {
141 /* clock extension */
142 put_bits(&pb, 9, 0);
143 }
144 put_bits(&pb, 1, 1);
145 put_bits(&pb, 22, s->mux_rate);
146 put_bits(&pb, 1, 1);
147 if (s->is_mpeg2) {
148 put_bits(&pb, 1, 1);
149 put_bits(&pb, 5, 0x1f); /* reserved */
150 put_bits(&pb, 3, 0); /* stuffing length */
151 }
152 flush_put_bits(&pb);
153 return pbBufPtr(&pb) - pb.buf;
154 }
155
156 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
157 {
158 MpegMuxContext *s = ctx->priv_data;
159 int size, i, private_stream_coded, id;
160 PutBitContext pb;
161
162 init_put_bits(&pb, buf, 128);
163
164 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
165 put_bits(&pb, 16, 0);
166 put_bits(&pb, 1, 1);
167
168 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
169 put_bits(&pb, 1, 1); /* marker */
170 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
171 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
172 put_bits(&pb, 6, 0);
173 } else
174 put_bits(&pb, 6, s->audio_bound);
175
176 if (s->is_vcd) {
177 /* see VCD standard, p. IV-7*/
178 put_bits(&pb, 1, 0);
179 put_bits(&pb, 1, 1);
180 } else {
181 put_bits(&pb, 1, 0); /* variable bitrate*/
182 put_bits(&pb, 1, 0); /* non constrainted bit stream */
183 }
184
185 if (s->is_vcd || s->is_dvd) {
186 /* see VCD standard p IV-7 */
187 put_bits(&pb, 1, 1); /* audio locked */
188 put_bits(&pb, 1, 1); /* video locked */
189 } else {
190 put_bits(&pb, 1, 0); /* audio locked */
191 put_bits(&pb, 1, 0); /* video locked */
192 }
193
194 put_bits(&pb, 1, 1); /* marker */
195
196 if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
197 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
198 put_bits(&pb, 5, 0);
199 } else
200 put_bits(&pb, 5, s->video_bound);
201
202 if (s->is_dvd) {
203 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
204 put_bits(&pb, 7, 0x7f); /* reserved byte */
205 } else
206 put_bits(&pb, 8, 0xff); /* reserved byte */
207
208 /* DVD-Video Stream_bound entries
209 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
210 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)
211 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
212 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
213 if (s->is_dvd) {
214
215 int P_STD_max_video = 0;
216 int P_STD_max_mpeg_audio = 0;
217 int P_STD_max_mpeg_PS1 = 0;
218
219 for(i=0;i<ctx->nb_streams;i++) {
220 StreamInfo *stream = ctx->streams[i]->priv_data;
221
222 id = stream->id;
223 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
224 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
225 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
226 P_STD_max_mpeg_audio = stream->max_buffer_size;
227 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
228 P_STD_max_video = stream->max_buffer_size;
229 }
230 }
231
232 /* video */
233 put_bits(&pb, 8, 0xb9); /* stream ID */
234 put_bits(&pb, 2, 3);
235 put_bits(&pb, 1, 1);
236 put_bits(&pb, 13, P_STD_max_video / 1024);
237
238 /* audio */
239 if (P_STD_max_mpeg_audio == 0)
240 P_STD_max_mpeg_audio = 4096;
241 put_bits(&pb, 8, 0xb8); /* stream ID */
242 put_bits(&pb, 2, 3);
243 put_bits(&pb, 1, 0);
244 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
245
246 /* private stream 1 */
247 put_bits(&pb, 8, 0xbd); /* stream ID */
248 put_bits(&pb, 2, 3);
249 put_bits(&pb, 1, 0);
250 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
251
252 /* private stream 2 */
253 put_bits(&pb, 8, 0xbf); /* stream ID */
254 put_bits(&pb, 2, 3);
255 put_bits(&pb, 1, 1);
256 put_bits(&pb, 13, 2);
257 }
258 else {
259 /* audio stream info */
260 private_stream_coded = 0;
261 for(i=0;i<ctx->nb_streams;i++) {
262 StreamInfo *stream = ctx->streams[i]->priv_data;
263
264
265 /* For VCDs, only include the stream info for the stream
266 that the pack which contains this system belongs to.
267 (see VCD standard p. IV-7) */
268 if ( !s->is_vcd || stream->id==only_for_stream_id
269 || only_for_stream_id==0) {
270
271 id = stream->id;
272 if (id < 0xc0) {
273 /* special case for private streams (AC3 use that) */
274 if (private_stream_coded)
275 continue;
276 private_stream_coded = 1;
277 id = 0xbd;
278 }
279 put_bits(&pb, 8, id); /* stream ID */
280 put_bits(&pb, 2, 3);
281 if (id < 0xe0) {
282 /* audio */
283 put_bits(&pb, 1, 0);
284 put_bits(&pb, 13, stream->max_buffer_size / 128);
285 } else {
286 /* video */
287 put_bits(&pb, 1, 1);
288 put_bits(&pb, 13, stream->max_buffer_size / 1024);
289 }
290 }
291 }
292 }
293
294 flush_put_bits(&pb);
295 size = pbBufPtr(&pb) - pb.buf;
296 /* patch packet size */
297 buf[4] = (size - 6) >> 8;
298 buf[5] = (size - 6) & 0xff;
299
300 return size;
301 }
302
303 static int get_system_header_size(AVFormatContext *ctx)
304 {
305 int buf_index, i, private_stream_coded;
306 StreamInfo *stream;
307 MpegMuxContext *s = ctx->priv_data;
308
309 if (s->is_dvd)
310 return 18; // DVD-Video system headers are 18 bytes fixed length.
311
312 buf_index = 12;
313 private_stream_coded = 0;
314 for(i=0;i<ctx->nb_streams;i++) {
315 stream = ctx->streams[i]->priv_data;
316 if (stream->id < 0xc0) {
317 if (private_stream_coded)
318 continue;
319 private_stream_coded = 1;
320 }
321 buf_index += 3;
322 }
323 return buf_index;
324 }
325
326 static int mpeg_mux_init(AVFormatContext *ctx)
327 {
328 MpegMuxContext *s = ctx->priv_data;
329 int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
330 AVStream *st;
331 StreamInfo *stream;
332 int audio_bitrate;
333 int video_bitrate;
334
335 s->packet_number = 0;
336 s->is_vcd = (ctx->oformat == &mpeg1vcd_muxer);
337 s->is_svcd = (ctx->oformat == &mpeg2svcd_muxer);
338 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_muxer || ctx->oformat == &mpeg2svcd_muxer || ctx->oformat == &mpeg2dvd_muxer);
339 s->is_dvd = (ctx->oformat == &mpeg2dvd_muxer);
340
341 if(ctx->packet_size)
342 s->packet_size = ctx->packet_size;
343 else
344 s->packet_size = 2048;
345
346 s->vcd_padding_bytes_written = 0;
347 s->vcd_padding_bitrate=0;
348
349 s->audio_bound = 0;
350 s->video_bound = 0;
351 mpa_id = AUDIO_ID;
352 ac3_id = AC3_ID;
353 dts_id = DTS_ID;
354 mpv_id = VIDEO_ID;
355 mps_id = SUB_ID;
356 lpcm_id = LPCM_ID;
357 for(i=0;i<ctx->nb_streams;i++) {
358 st = ctx->streams[i];
359 stream = av_mallocz(sizeof(StreamInfo));
360 if (!stream)
361 goto fail;
362 st->priv_data = stream;
363
364 av_set_pts_info(st, 64, 1, 90000);
365
366 switch(st->codec->codec_type) {
367 case CODEC_TYPE_AUDIO:
368 if (st->codec->codec_id == CODEC_ID_AC3) {
369 stream->id = ac3_id++;
370 } else if (st->codec->codec_id == CODEC_ID_DTS) {
371 stream->id = dts_id++;
372 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
373 stream->id = lpcm_id++;
374 for(j = 0; j < 4; j++) {
375 if (lpcm_freq_tab[j] == st->codec->sample_rate)
376 break;
377 }
378 if (j == 4)
379 goto fail;
380 if (st->codec->channels > 8)
381 return -1;
382 stream->lpcm_header[0] = 0x0c;
383 stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
384 stream->lpcm_header[2] = 0x80;
385 stream->lpcm_align = st->codec->channels * 2;
386 } else {
387 stream->id = mpa_id++;
388 }
389
390 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
391 Right now it is also used for everything else.*/
392 stream->max_buffer_size = 4 * 1024;
393 s->audio_bound++;
394 break;
395 case CODEC_TYPE_VIDEO:
396 stream->id = mpv_id++;
397 if (st->codec->rc_buffer_size)
398 stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
399 else
400 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
401 #if 0
402 /* see VCD standard, p. IV-7*/
403 stream->max_buffer_size = 46 * 1024;
404 else
405 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
406 Right now it is also used for everything else.*/
407 stream->max_buffer_size = 230 * 1024;
408 #endif
409 s->video_bound++;
410 break;
411 case CODEC_TYPE_SUBTITLE:
412 stream->id = mps_id++;
413 stream->max_buffer_size = 16 * 1024;
414 break;
415 default:
416 return -1;
417 }
418 av_fifo_init(&stream->fifo, 16);
419 }
420 bitrate = 0;
421 audio_bitrate = 0;
422 video_bitrate = 0;
423 for(i=0;i<ctx->nb_streams;i++) {
424 int codec_rate;
425 st = ctx->streams[i];
426 stream = (StreamInfo*) st->priv_data;
427
428 if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
429 codec_rate= st->codec->rc_max_rate;
430 else
431 codec_rate= st->codec->bit_rate;
432
433 if(!codec_rate)
434 codec_rate= (1<<21)*8*50/ctx->nb_streams;
435
436 bitrate += codec_rate;
437
438 if (stream->id==AUDIO_ID)
439 audio_bitrate += codec_rate;
440 else if (stream->id==VIDEO_ID)
441 video_bitrate += codec_rate;
442 }
443
444 if(ctx->mux_rate){
445 s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
446 } else {
447 /* we increase slightly the bitrate to take into account the
448 headers. XXX: compute it exactly */
449 bitrate += bitrate*5/100;
450 bitrate += 10000;
451 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
452 }
453
454 if (s->is_vcd) {
455 double overhead_rate;
456
457 /* The VCD standard mandates that the mux_rate field is 3528
458 (see standard p. IV-6).
459 The value is actually "wrong", i.e. if you calculate
460 it using the normal formula and the 75 sectors per second transfer
461 rate you get a different value because the real pack size is 2324,
462 not 2352. But the standard explicitly specifies that the mux_rate
463 field in the header must have this value.*/
464 // s->mux_rate=2352 * 75 / 50; /* = 3528*/
465
466 /* The VCD standard states that the muxed stream must be
467 exactly 75 packs / second (the data rate of a single speed cdrom).
468 Since the video bitrate (probably 1150000 bits/sec) will be below
469 the theoretical maximum we have to add some padding packets
470 to make up for the lower data rate.
471 (cf. VCD standard p. IV-6 )*/
472
473 /* Add the header overhead to the data rate.
474 2279 data bytes per audio pack, 2294 data bytes per video pack*/
475 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
476 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
477 overhead_rate *= 8;
478
479 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
480 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
481 }
482
483 if (s->is_vcd || s->is_mpeg2)
484 /* every packet */
485 s->pack_header_freq = 1;
486 else
487 /* every 2 seconds */
488 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
489
490 /* the above seems to make pack_header_freq zero sometimes */
491 if (s->pack_header_freq == 0)
492 s->pack_header_freq = 1;
493
494 if (s->is_mpeg2)
495 /* every 200 packets. Need to look at the spec. */
496 s->system_header_freq = s->pack_header_freq * 40;
497 else if (s->is_vcd)
498 /* the standard mandates that there are only two system headers
499 in the whole file: one in the first packet of each stream.
500 (see standard p. IV-7 and IV-8) */
501 s->system_header_freq = 0x7fffffff;
502 else
503 s->system_header_freq = s->pack_header_freq * 5;
504
505 for(i=0;i<ctx->nb_streams;i++) {
506 stream = ctx->streams[i]->priv_data;
507 stream->packet_number = 0;
508 }
509 s->system_header_size = get_system_header_size(ctx);
510 s->last_scr = 0;
511 return 0;
512 fail:
513 for(i=0;i<ctx->nb_streams;i++) {
514 av_free(ctx->streams[i]->priv_data);
515 }
516 return -ENOMEM;
517 }
518
519 static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
520 {
521 put_byte(pb,
522 (id << 4) |
523 (((timestamp >> 30) & 0x07) << 1) |
524 1);
525 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
526 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
527 }
528
529
530 /* return the number of padding bytes that should be inserted into
531 the multiplexed stream.*/
532 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
533 {
534 MpegMuxContext *s = ctx->priv_data;
535 int pad_bytes = 0;
536
537 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
538 {
539 int64_t full_pad_bytes;
540
541 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
542 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
543
544 if (pad_bytes<0)
545 /* might happen if we have already padded to a later timestamp. This
546 can occur if another stream has already advanced further.*/
547 pad_bytes=0;
548 }
549
550 return pad_bytes;
551 }
552
553
554 #if 0 /* unused, remove? */
555 /* return the exact available payload size for the next packet for
556 stream 'stream_index'. 'pts' and 'dts' are only used to know if
557 timestamps are needed in the packet header. */
558 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
559 int64_t pts, int64_t dts)
560 {
561 MpegMuxContext *s = ctx->priv_data;
562 int buf_index;
563 StreamInfo *stream;
564
565 stream = ctx->streams[stream_index]->priv_data;
566
567 buf_index = 0;
568 if (((s->packet_number % s->pack_header_freq) == 0)) {
569 /* pack header size */
570 if (s->is_mpeg2)
571 buf_index += 14;
572 else
573 buf_index += 12;
574
575 if (s->is_vcd) {
576 /* there is exactly one system header for each stream in a VCD MPEG,
577 One in the very first video packet and one in the very first
578 audio packet (see VCD standard p. IV-7 and IV-8).*/
579
580 if (stream->packet_number==0)
581 /* The system headers refer only to the stream they occur in,
582 so they have a constant size.*/
583 buf_index += 15;
584
585 } else {
586 if ((s->packet_number % s->system_header_freq) == 0)
587 buf_index += s->system_header_size;
588 }
589 }
590
591 if ((s->is_vcd && stream->packet_number==0)
592 || (s->is_svcd && s->packet_number==0))
593 /* the first pack of each stream contains only the pack header,
594 the system header and some padding (see VCD standard p. IV-6)
595 Add the padding size, so that the actual payload becomes 0.*/
596 buf_index += s->packet_size - buf_index;
597 else {
598 /* packet header size */
599 buf_index += 6;
600 if (s->is_mpeg2) {
601 buf_index += 3;
602 if (stream->packet_number==0)
603 buf_index += 3; /* PES extension */
604 buf_index += 1; /* obligatory stuffing byte */
605 }
606 if (pts != AV_NOPTS_VALUE) {
607 if (dts != pts)
608 buf_index += 5 + 5;
609 else
610 buf_index += 5;
611
612 } else {
613 if (!s->is_mpeg2)
614 buf_index++;
615 }
616
617 if (stream->id < 0xc0) {
618 /* AC3/LPCM private data header */
619 buf_index += 4;
620 if (stream->id >= 0xa0) {
621 int n;
622 buf_index += 3;
623 /* NOTE: we round the payload size to an integer number of
624 LPCM samples */
625 n = (s->packet_size - buf_index) % stream->lpcm_align;
626 if (n)
627 buf_index += (stream->lpcm_align - n);
628 }
629 }
630
631 if (s->is_vcd && stream->id == AUDIO_ID)
632 /* The VCD standard demands that 20 zero bytes follow
633 each audio packet (see standard p. IV-8).*/
634 buf_index+=20;
635 }
636 return s->packet_size - buf_index;
637 }
638 #endif
639
640 /* Write an MPEG padding packet header. */
641 static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
642 {
643 MpegMuxContext *s = ctx->priv_data;
644 int i;
645
646 put_be32(pb, PADDING_STREAM);
647 put_be16(pb, packet_bytes - 6);
648 if (!s->is_mpeg2) {
649 put_byte(pb, 0x0f);
650 packet_bytes -= 7;
651 } else
652 packet_bytes -= 6;
653
654 for(i=0;i<packet_bytes;i++)
655 put_byte(pb, 0xff);
656 }
657
658 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
659 int nb_frames=0;
660 PacketDesc *pkt_desc= stream->premux_packet;
661
662 while(len>0){
663 if(pkt_desc->size == pkt_desc->unwritten_size)
664 nb_frames++;
665 len -= pkt_desc->unwritten_size;
666 pkt_desc= pkt_desc->next;
667 }
668
669 return nb_frames;
670 }
671
672 /* flush the packet on stream stream_index */
673 static int flush_packet(AVFormatContext *ctx, int stream_index,
674 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
675 {
676 MpegMuxContext *s = ctx->priv_data;
677 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
678 uint8_t *buf_ptr;
679 int size, payload_size, startcode, id, stuffing_size, i, header_len;
680 int packet_size;
681 uint8_t buffer[128];
682 int zero_trail_bytes = 0;
683 int pad_packet_bytes = 0;
684 int pes_flags;
685 int general_pack = 0; /*"general" pack without data specific to one stream?*/
686 int nb_frames;
687
688 id = stream->id;
689
690 #if 0
691 printf("packet ID=%2x PTS=%0.3f\n",
692 id, pts / 90000.0);
693 #endif
694
695 buf_ptr = buffer;
696
697 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
698 /* output pack and systems header if needed */
699 size = put_pack_header(ctx, buf_ptr, scr);
700 buf_ptr += size;
701 s->last_scr= scr;
702
703 if (s->is_vcd) {
704 /* there is exactly one system header for each stream in a VCD MPEG,
705 One in the very first video packet and one in the very first
706 audio packet (see VCD standard p. IV-7 and IV-8).*/
707
708 if (stream->packet_number==0) {
709 size = put_system_header(ctx, buf_ptr, id);
710 buf_ptr += size;
711 }
712 } else if (s->is_dvd) {
713 if (stream->align_iframe || s->packet_number == 0){
714 int PES_bytes_to_fill = s->packet_size - size - 10;
715
716 if (pts != AV_NOPTS_VALUE) {
717 if (dts != pts)
718 PES_bytes_to_fill -= 5 + 5;
719 else
720 PES_bytes_to_fill -= 5;
721 }
722
723 if (stream->bytes_to_iframe == 0 || s->packet_number == 0) {
724 size = put_system_header(ctx, buf_ptr, 0);
725 buf_ptr += size;
726 size = buf_ptr - buffer;
727 put_buffer(&ctx->pb, buffer, size);
728
729 put_be32(&ctx->pb, PRIVATE_STREAM_2);
730 put_be16(&ctx->pb, 0x03d4); // length
731 put_byte(&ctx->pb, 0x00); // substream ID, 00=PCI
732 for (i = 0; i < 979; i++)
733 put_byte(&ctx->pb, 0x00);
734
735 put_be32(&ctx->pb, PRIVATE_STREAM_2);
736 put_be16(&ctx->pb, 0x03fa); // length
737 put_byte(&ctx->pb, 0x01); // substream ID, 01=DSI
738 for (i = 0; i < 1017; i++)
739 put_byte(&ctx->pb, 0x00);
740
741 memset(buffer, 0, 128);
742 buf_ptr = buffer;
743 s->packet_number++;
744 stream->align_iframe = 0;
745 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
746 size = put_pack_header(ctx, buf_ptr, scr);
747 s->last_scr= scr;
748 buf_ptr += size;
749 /* GOP Start */
750 } else if (stream->bytes_to_iframe < PES_bytes_to_fill) {
751 pad_packet_bytes = PES_bytes_to_fill - stream->bytes_to_iframe;
752 }
753 }
754 } else {
755 if ((s->packet_number % s->system_header_freq) == 0) {
756 size = put_system_header(ctx, buf_ptr, 0);
757 buf_ptr += size;
758 }
759 }
760 }
761 size = buf_ptr - buffer;
762 put_buffer(&ctx->pb, buffer, size);
763
764 packet_size = s->packet_size - size;
765
766 if (s->is_vcd && id == AUDIO_ID)
767 /* The VCD standard demands that 20 zero bytes follow
768 each audio pack (see standard p. IV-8).*/
769 zero_trail_bytes += 20;
770
771 if ((s->is_vcd && stream->packet_number==0)
772 || (s->is_svcd && s->packet_number==0)) {
773 /* for VCD the first pack of each stream contains only the pack header,
774 the system header and lots of padding (see VCD standard p. IV-6).
775 In the case of an audio pack, 20 zero bytes are also added at
776 the end.*/
777 /* For SVCD we fill the very first pack to increase compatibility with
778 some DVD players. Not mandated by the standard.*/
779 if (s->is_svcd)
780 general_pack = 1; /* the system header refers to both streams and no stream data*/
781 pad_packet_bytes = packet_size - zero_trail_bytes;
782 }
783
784 packet_size -= pad_packet_bytes + zero_trail_bytes;
785
786 if (packet_size > 0) {
787
788 /* packet header size */
789 packet_size -= 6;
790
791 /* packet header */
792 if (s->is_mpeg2) {
793 header_len = 3;
794 if (stream->packet_number==0)
795 header_len += 3; /* PES extension */
796 header_len += 1; /* obligatory stuffing byte */
797 } else {
798 header_len = 0;
799 }
800 if (pts != AV_NOPTS_VALUE) {
801 if (dts != pts)
802 header_len += 5 + 5;
803 else
804 header_len += 5;
805 } else {
806 if (!s->is_mpeg2)
807 header_len++;
808 }
809
810 payload_size = packet_size - header_len;
811 if (id < 0xc0) {
812 startcode = PRIVATE_STREAM_1;
813 payload_size -= 1;
814 if (id >= 0x40) {
815 payload_size -= 3;
816 if (id >= 0xa0)
817 payload_size -= 3;
818 }
819 } else {
820 startcode = 0x100 + id;
821 }
822
823 stuffing_size = payload_size - av_fifo_size(&stream->fifo);
824
825 // first byte doesnt fit -> reset pts/dts + stuffing
826 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
827 int timestamp_len=0;
828 if(dts != pts)
829 timestamp_len += 5;
830 if(pts != AV_NOPTS_VALUE)
831 timestamp_len += s->is_mpeg2 ? 5 : 4;
832 pts=dts= AV_NOPTS_VALUE;
833 header_len -= timestamp_len;
834 if (s->is_dvd && stream->align_iframe) {
835 pad_packet_bytes += timestamp_len;
836 packet_size -= timestamp_len;
837 } else {
838 payload_size += timestamp_len;
839 }
840 stuffing_size += timestamp_len;
841 if(payload_size > trailer_size)
842 stuffing_size += payload_size - trailer_size;
843 }
844
845 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
846 packet_size += pad_packet_bytes;
847 payload_size += pad_packet_bytes; // undo the previous adjustment
848 if (stuffing_size < 0) {
849 stuffing_size = pad_packet_bytes;
850 } else {
851 stuffing_size += pad_packet_bytes;
852 }
853 pad_packet_bytes = 0;
854 }
855
856 if (stuffing_size < 0)
857 stuffing_size = 0;
858 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
859 pad_packet_bytes += stuffing_size;
860 packet_size -= stuffing_size;
861 payload_size -= stuffing_size;
862 stuffing_size = 0;
863 }
864
865 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
866
867 put_be32(&ctx->pb, startcode);
868
869 put_be16(&ctx->pb, packet_size);
870
871 if (!s->is_mpeg2)
872 for(i=0;i<stuffing_size;i++)
873 put_byte(&ctx->pb, 0xff);
874
875 if (s->is_mpeg2) {
876 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
877
878 pes_flags=0;
879
880 if (pts != AV_NOPTS_VALUE) {
881 pes_flags |= 0x80;
882 if (dts != pts)
883 pes_flags |= 0x40;
884 }
885
886 /* Both the MPEG-2 and the SVCD standards demand that the
887 P-STD_buffer_size field be included in the first packet of
888 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
889 and MPEG-2 standard 2.7.7) */
890 if (stream->packet_number == 0)
891 pes_flags |= 0x01;
892
893 put_byte(&ctx->pb, pes_flags); /* flags */
894 put_byte(&ctx->pb, header_len - 3 + stuffing_size);
895
896 if (pes_flags & 0x80) /*write pts*/
897 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
898 if (pes_flags & 0x40) /*write dts*/
899 put_timestamp(&ctx->pb, 0x01, dts);
900
901 if (pes_flags & 0x01) { /*write pes extension*/
902 put_byte(&ctx->pb, 0x10); /* flags */
903
904 /* P-STD buffer info */
905 if (id == AUDIO_ID)
906 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
907 else
908 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
909 }
910
911 } else {
912 if (pts != AV_NOPTS_VALUE) {
913 if (dts != pts) {
914 put_timestamp(&ctx->pb, 0x03, pts);
915 put_timestamp(&ctx->pb, 0x01, dts);
916 } else {
917 put_timestamp(&ctx->pb, 0x02, pts);
918 }
919 } else {
920 put_byte(&ctx->pb, 0x0f);
921 }
922 }
923
924 if (s->is_mpeg2) {
925 /* special stuffing byte that is always written
926 to prevent accidental generation of start codes. */
927 put_byte(&ctx->pb, 0xff);
928
929 for(i=0;i<stuffing_size;i++)
930 put_byte(&ctx->pb, 0xff);
931 }
932
933 if (startcode == PRIVATE_STREAM_1) {
934 put_byte(&ctx->pb, id);
935 if (id >= 0xa0) {
936 /* LPCM (XXX: check nb_frames) */
937 put_byte(&ctx->pb, 7);
938 put_be16(&ctx->pb, 4); /* skip 3 header bytes */
939 put_byte(&ctx->pb, stream->lpcm_header[0]);
940 put_byte(&ctx->pb, stream->lpcm_header[1]);
941 put_byte(&ctx->pb, stream->lpcm_header[2]);
942 } else if (id >= 0x40) {
943 /* AC3 */
944 put_byte(&ctx->pb, nb_frames);
945 put_be16(&ctx->pb, trailer_size+1);
946 }
947 }
948
949 /* output data */
950 if(av_fifo_generic_read(&stream->fifo, payload_size - stuffing_size, &put_buffer, &ctx->pb) < 0)
951 return -1;
952 stream->bytes_to_iframe -= payload_size - stuffing_size;
953 }else{
954 payload_size=
955 stuffing_size= 0;
956 }
957
958 if (pad_packet_bytes > 0)
959 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
960
961 for(i=0;i<zero_trail_bytes;i++)
962 put_byte(&ctx->pb, 0x00);
963
964 put_flush_packet(&ctx->pb);
965
966 s->packet_number++;
967
968 /* only increase the stream packet number if this pack actually contains
969 something that is specific to this stream! I.e. a dedicated header
970 or some data.*/
971 if (!general_pack)
972 stream->packet_number++;
973
974 return payload_size - stuffing_size;
975 }
976
977 static void put_vcd_padding_sector(AVFormatContext *ctx)
978 {
979 /* There are two ways to do this padding: writing a sector/pack
980 of 0 values, or writing an MPEG padding pack. Both seem to
981 work with most decoders, BUT the VCD standard only allows a 0-sector
982 (see standard p. IV-4, IV-5).
983 So a 0-sector it is...*/
984
985 MpegMuxContext *s = ctx->priv_data;
986 int i;
987
988 for(i=0;i<s->packet_size;i++)
989 put_byte(&ctx->pb, 0);
990
991 s->vcd_padding_bytes_written += s->packet_size;
992
993 put_flush_packet(&ctx->pb);
994
995 /* increasing the packet number is correct. The SCR of the following packs
996 is calculated from the packet_number and it has to include the padding
997 sector (it represents the sector index, not the MPEG pack index)
998 (see VCD standard p. IV-6)*/
999 s->packet_number++;
1000 }
1001
1002 #if 0 /* unused, remove? */
1003 static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
1004 {
1005 MpegMuxContext *s = ctx->priv_data;
1006 int64_t scr;
1007
1008 /* Since the data delivery rate is constant, SCR is computed
1009 using the formula C + i * 1200 where C is the start constant
1010 and i is the pack index.
1011 It is recommended that SCR 0 is at the beginning of the VCD front
1012 margin (a sequence of empty Form 2 sectors on the CD).
1013 It is recommended that the front margin is 30 sectors long, so
1014 we use C = 30*1200 = 36000
1015 (Note that even if the front margin is not 30 sectors the file
1016 will still be correct according to the standard. It just won't have
1017 the "recommended" value).*/
1018 scr = 36000 + s->packet_number * 1200;
1019
1020 return scr;
1021 }
1022 #endif
1023
1024 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
1025 // MpegMuxContext *s = ctx->priv_data;
1026 int i;
1027
1028 for(i=0; i<ctx->nb_streams; i++){
1029 AVStream *st = ctx->streams[i];
1030 StreamInfo *stream = st->priv_data;
1031 PacketDesc *pkt_desc= stream->predecode_packet;
1032
1033 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
1034 if(stream->buffer_index < pkt_desc->size ||
1035 stream->predecode_packet == stream->premux_packet){
1036 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
1037 break;
1038 }
1039 stream->buffer_index -= pkt_desc->size;
1040
1041 stream->predecode_packet= pkt_desc->next;
1042 av_freep(&pkt_desc);
1043 }
1044 }
1045
1046 return 0;
1047 }
1048
1049 static int output_packet(AVFormatContext *ctx, int flush){
1050 MpegMuxContext *s = ctx->priv_data;
1051 AVStream *st;
1052 StreamInfo *stream;
1053 int i, avail_space, es_size, trailer_size;
1054 int best_i= -1;
1055 int best_score= INT_MIN;
1056 int ignore_constraints=0;
1057 int64_t scr= s->last_scr;
1058 PacketDesc *timestamp_packet;
1059 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
1060
1061 retry:
1062 for(i=0; i<ctx->nb_streams; i++){
1063 AVStream *st = ctx->streams[i];
1064 StreamInfo *stream = st->priv_data;
1065 const int avail_data= av_fifo_size(&stream->fifo);
1066 const int space= stream->max_buffer_size - stream->buffer_index;
1067 int rel_space= 1024*space / stream->max_buffer_size;
1068 PacketDesc *next_pkt= stream->premux_packet;
1069
1070 /* for subtitle, a single PES packet must be generated,
1071 so we flush after every single subtitle packet */
1072 if(s->packet_size > avail_data && !flush
1073 && st->codec->codec_type != CODEC_TYPE_SUBTITLE)
1074 return 0;
1075 if(avail_data==0)
1076 continue;
1077 assert(avail_data>0);
1078
1079 if(space < s->packet_size && !ignore_constraints)
1080 continue;
1081
1082 if(next_pkt && next_pkt->dts - scr > max_delay)
1083 continue;
1084
1085 if(rel_space > best_score){
1086 best_score= rel_space;
1087 best_i = i;
1088 avail_space= space;
1089 }
1090 }
1091
1092 if(best_i < 0){
1093 int64_t best_dts= INT64_MAX;
1094
1095 for(i=0; i<ctx->nb_streams; i++){
1096 AVStream *st = ctx->streams[i];
1097 StreamInfo *stream = st->priv_data;
1098 PacketDesc *pkt_desc= stream->predecode_packet;
1099 if(pkt_desc && pkt_desc->dts < best_dts)
1100 best_dts= pkt_desc->dts;
1101 }
1102
1103 #if 0
1104 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
1105 scr/90000.0, best_dts/90000.0);
1106 #endif
1107 if(best_dts == INT64_MAX)
1108 return 0;
1109
1110 if(scr >= best_dts+1 && !ignore_constraints){
1111 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
1112 ignore_constraints= 1;
1113 }
1114 scr= FFMAX(best_dts+1, scr);
1115 if(remove_decoded_packets(ctx, scr) < 0)
1116 return -1;
1117 goto retry;
1118 }
1119
1120 assert(best_i >= 0);
1121
1122 st = ctx->streams[best_i];
1123 stream = st->priv_data;
1124
1125 assert(av_fifo_size(&stream->fifo) > 0);
1126
1127 assert(avail_space >= s->packet_size || ignore_constraints);
1128
1129 timestamp_packet= stream->premux_packet;
1130 if(timestamp_packet->unwritten_size == timestamp_packet->size){
1131 trailer_size= 0;
1132 }else{
1133 trailer_size= timestamp_packet->unwritten_size;
1134 timestamp_packet= timestamp_packet->next;
1135 }
1136
1137 if(timestamp_packet){
1138 //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);
1139 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
1140 }else{
1141 assert(av_fifo_size(&stream->fifo) == trailer_size);
1142 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
1143 }
1144
1145 if (s->is_vcd) {
1146 /* Write one or more padding sectors, if necessary, to reach
1147 the constant overall bitrate.*/
1148 int vcd_pad_bytes;
1149
1150 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
1151 put_vcd_padding_sector(ctx);
1152 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1153 }
1154 }
1155
1156 stream->buffer_index += es_size;
1157 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1158
1159 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
1160 es_size -= stream->premux_packet->unwritten_size;
1161 stream->premux_packet= stream->premux_packet->next;
1162 }
1163 if(es_size)
1164 stream->premux_packet->unwritten_size -= es_size;
1165
1166 if(remove_decoded_packets(ctx, s->last_scr) < 0)
1167 return -1;
1168
1169 return 1;
1170 }
1171
1172 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
1173 {
1174 MpegMuxContext *s = ctx->priv_data;
1175 int stream_index= pkt->stream_index;
1176 int size= pkt->size;
1177 uint8_t *buf= pkt->data;
1178 AVStream *st = ctx->streams[stream_index];
1179 StreamInfo *stream = st->priv_data;
1180 int64_t pts, dts;
1181 PacketDesc *pkt_desc;
1182 const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
1183 const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
1184
1185 pts= pkt->pts;
1186 dts= pkt->dts;
1187
1188 if(pts != AV_NOPTS_VALUE) pts += preload;
1189 if(dts != AV_NOPTS_VALUE) dts += preload;
1190
1191 //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);
1192 if (!stream->premux_packet)
1193 stream->next_packet = &stream->premux_packet;
1194 *stream->next_packet=
1195 pkt_desc= av_mallocz(sizeof(PacketDesc));
1196 pkt_desc->pts= pts;
1197 pkt_desc->dts= dts;
1198 pkt_desc->unwritten_size=
1199 pkt_desc->size= size;
1200 if(!stream->predecode_packet)
1201 stream->predecode_packet= pkt_desc;
1202 stream->next_packet= &pkt_desc->next;
1203
1204 av_fifo_realloc(&stream->fifo, av_fifo_size(&stream->fifo) + size + 1);
1205
1206 if (s->is_dvd){
1207 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
1208 stream->bytes_to_iframe = av_fifo_size(&stream->fifo);
1209 stream->align_iframe = 1;
1210 stream->vobu_start_pts = pts;
1211 } else {
1212 stream->align_iframe = 0;
1213 }
1214 }
1215
1216 av_fifo_write(&stream->fifo, buf, size);
1217
1218 for(;;){
1219 int ret= output_packet(ctx, 0);
1220 if(ret<=0)
1221 return ret;
1222 }
1223 }
1224
1225 static int mpeg_mux_end(AVFormatContext *ctx)
1226 {
1227 // MpegMuxContext *s = ctx->priv_data;
1228 StreamInfo *stream;
1229 int i;
1230
1231 for(;;){
1232 int ret= output_packet(ctx, 1);
1233 if(ret<0)
1234 return ret;
1235 else if(ret==0)
1236 break;
1237 }
1238
1239 /* End header according to MPEG1 systems standard. We do not write
1240 it as it is usually not needed by decoders and because it
1241 complicates MPEG stream concatenation. */
1242 //put_be32(&ctx->pb, ISO_11172_END_CODE);
1243 //put_flush_packet(&ctx->pb);
1244
1245 for(i=0;i<ctx->nb_streams;i++) {
1246 stream = ctx->streams[i]->priv_data;
1247
1248 assert(av_fifo_size(&stream->fifo) == 0);
1249 av_fifo_free(&stream->fifo);
1250 }
1251 return 0;
1252 }
1253 #endif //CONFIG_MUXERS
1254
1255 /*********************************************/
1256 /* demux code */
1257
1258 #define MAX_SYNC_SIZE 100000
1259
1260 static int cdxa_probe(AVProbeData *p)
1261 {
1262 /* check file header */
1263 if (p->buf_size <= 32)
1264 return 0;
1265 if (p->buf[0] == 'R' && p->buf[1] == 'I' &&
1266 p->buf[2] == 'F' && p->buf[3] == 'F' &&
1267 p->buf[8] == 'C' && p->buf[9] == 'D' &&
1268 p->buf[10] == 'X' && p->buf[11] == 'A')
1269 return AVPROBE_SCORE_MAX;
1270 else
1271 return 0;
1272 }
1273
1274 static int mpegps_probe(AVProbeData *p)
1275 {
1276 uint32_t code= -1;
1277 int sys=0, pspack=0, priv1=0, vid=0, audio=0;
1278 int i;
1279 int score=0;
1280
1281 score = cdxa_probe(p);
1282 if (score > 0) return score;
1283
1284 /* Search for MPEG stream */
1285 for(i=0; i<p->buf_size; i++){
1286 code = (code<<8) + p->buf[i];
1287 if ((code & 0xffffff00) == 0x100) {
1288 if(code == SYSTEM_HEADER_START_CODE) sys++;
1289 else if(code == PRIVATE_STREAM_1) priv1++;
1290 else if(code == PACK_START_CODE) pspack++;
1291 else if((code & 0xf0) == VIDEO_ID) vid++;
1292 else if((code & 0xe0) == AUDIO_ID) audio++;
1293 }
1294 }
1295
1296 if(vid || audio) /* invalid VDR files nd short PES streams */
1297 score= AVPROBE_SCORE_MAX/4;
1298
1299 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d\n", sys, priv1, pspack,vid, audio);
1300 if(sys && sys*9 <= pspack*10)
1301 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
1302 if((priv1 || vid || audio) && (priv1+vid+audio)*9 <= pspack*10)
1303 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
1304 if((!!vid ^ !!audio) && (audio+vid > 1) && !sys && !pspack) /* PES stream */
1305 return AVPROBE_SCORE_MAX/2+2;
1306
1307 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
1308 return score;
1309 }
1310
1311
1312 typedef struct MpegDemuxContext {
1313 int32_t header_state;
1314 unsigned char psm_es_type[256];
1315 } MpegDemuxContext;
1316
1317 static int mpegps_read_header(AVFormatContext *s,
1318 AVFormatParameters *ap)
1319 {
1320 MpegDemuxContext *m = s->priv_data;
1321 m->header_state = 0xff;
1322 s->ctx_flags |= AVFMTCTX_NOHEADER;
1323
1324 /* no need to do more */
1325 return 0;
1326 }
1327
1328 static int64_t get_pts(ByteIOContext *pb, int c)
1329 {
1330 int64_t pts;
1331 int val;
1332
1333 if (c < 0)
1334 c = get_byte(pb);
1335 pts = (int64_t)((c >> 1) & 0x07) << 30;
1336 val = get_be16(pb);
1337 pts |= (int64_t)(val >> 1) << 15;
1338 val = get_be16(pb);
1339 pts |= (int64_t)(val >> 1);
1340 return pts;
1341 }
1342
1343 static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
1344 int32_t *header_state)
1345 {
1346 unsigned int state, v;
1347 int val, n;
1348
1349 state = *header_state;
1350 n = *size_ptr;
1351 while (n > 0) {
1352 if (url_feof(pb))
1353 break;
1354 v = get_byte(pb);
1355 n--;
1356 if (state == 0x000001) {
1357 state = ((state << 8) | v) & 0xffffff;
1358 val = state;
1359 goto found;
1360 }
1361 state = ((state << 8) | v) & 0xffffff;
1362 }
1363 val = -1;
1364 found:
1365 *header_state = state;
1366 *size_ptr = n;
1367 return val;
1368 }
1369
1370 #if 0 /* unused, remove? */
1371 /* XXX: optimize */
1372 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
1373 {
1374 int64_t pos, pos_start;
1375 int max_size, start_code;
1376
1377 max_size = *size_ptr;
1378 pos_start = url_ftell(pb);
1379
1380 /* in order to go faster, we fill the buffer */
1381 pos = pos_start - 16386;
1382 if (pos < 0)
1383 pos = 0;
1384 url_fseek(pb, pos, SEEK_SET);
1385 get_byte(pb);
1386
1387 pos = pos_start;
1388 for(;;) {
1389 pos--;
1390 if (pos < 0 || (pos_start - pos) >= max_size) {
1391 start_code = -1;
1392 goto the_end;
1393 }
1394 url_fseek(pb, pos, SEEK_SET);
1395 start_code = get_be32(pb);
1396 if ((start_code & 0xffffff00) == 0x100)
1397 break;
1398 }
1399 the_end:
1400 *size_ptr = pos_start - pos;
1401 return start_code;
1402 }
1403 #endif
1404
1405 /**
1406 * Extracts stream types from a program stream map
1407 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
1408 *
1409 * @return number of bytes occupied by PSM in the bitstream
1410 */
1411 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
1412 {
1413 int psm_length, ps_info_length, es_map_length;
1414
1415 psm_length = get_be16(pb);
1416 get_byte(pb);
1417 get_byte(pb);
1418 ps_info_length = get_be16(pb);
1419
1420 /* skip program_stream_info */
1421 url_fskip(pb, ps_info_length);
1422 es_map_length = get_be16(pb);
1423
1424 /* at least one es available? */
1425 while (es_map_length >= 4){
1426 unsigned char type = get_byte(pb);
1427 unsigned char es_id = get_byte(pb);
1428 uint16_t es_info_length = get_be16(pb);
1429 /* remember mapping from stream id to stream type */
1430 m->psm_es_type[es_id] = type;
1431 /* skip program_stream_info */
1432 url_fskip(pb, es_info_length);
1433 es_map_length -= 4 + es_info_length;
1434 }
1435 get_be32(pb); /* crc32 */
1436 return 2 + psm_length;
1437 }
1438
1439 /* read the next PES header. Return its position in ppos
1440 (if not NULL), and its start code, pts and dts.
1441 */
1442 static int mpegps_read_pes_header(AVFormatContext *s,
1443 int64_t *ppos, int *pstart_code,
1444 int64_t *ppts, int64_t *pdts)
1445 {
1446 MpegDemuxContext *m = s->priv_data;
1447 int len, size, startcode, c, flags, header_len;
1448 int64_t pts, dts, last_pos;
1449
1450 last_pos = -1;
1451 redo:
1452 /* next start code (should be immediately after) */
1453 m->header_state = 0xff;
1454 size = MAX_SYNC_SIZE;
1455 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
1456 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
1457 if (startcode < 0)
1458 return AVERROR_IO;
1459 if (startcode == PACK_START_CODE)
1460 goto redo;
1461 if (startcode == SYSTEM_HEADER_START_CODE)
1462 goto redo;
1463 if (startcode == PADDING_STREAM ||
1464 startcode == PRIVATE_STREAM_2) {
1465 /* skip them */
1466 len = get_be16(&s->pb);
1467 url_fskip(&s->pb, len);
1468 goto redo;
1469 }
1470 if (startcode == PROGRAM_STREAM_MAP) {
1471 mpegps_psm_parse(m, &s->pb);
1472 goto redo;
1473 }
1474
1475 /* find matching stream */
1476 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
1477 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
1478 (startcode == 0x1bd)))
1479 goto redo;
1480 if (ppos) {
1481 *ppos = url_ftell(&s->pb) - 4;
1482 }
1483 len = get_be16(&s->pb);
1484 pts = AV_NOPTS_VALUE;
1485 dts = AV_NOPTS_VALUE;
1486 /* stuffing */
1487 for(;;) {
1488 if (len < 1)
1489 goto redo;
1490 c = get_byte(&s->pb);
1491 len--;
1492 /* XXX: for mpeg1, should test only bit 7 */
1493 if (c != 0xff)
1494 break;
1495 }
1496 if ((c & 0xc0) == 0x40) {
1497 /* buffer scale & size */
1498 if (len < 2)
1499 goto redo;
1500 get_byte(&s->pb);
1501 c = get_byte(&s->pb);
1502 len -= 2;
1503 }
1504 if ((c & 0xf0) == 0x20) {
1505 if (len < 4)
1506 goto redo;
1507 dts = pts = get_pts(&s->pb, c);
1508 len -= 4;
1509 } else if ((c & 0xf0) == 0x30) {
1510 if (len < 9)
1511 goto redo;
1512 pts = get_pts(&s->pb, c);
1513 dts = get_pts(&s->pb, -1);
1514 len -= 9;
1515 } else if ((c & 0xc0) == 0x80) {
1516 /* mpeg 2 PES */
1517 #if 0 /* some streams have this field set for no apparent reason */
1518 if ((c & 0x30) != 0) {
1519 /* Encrypted multiplex not handled */
1520 goto redo;
1521 }
1522 #endif
1523 flags = get_byte(&s->pb);
1524 header_len = get_byte(&s->pb);
1525 len -= 2;
1526 if (header_len > len)
1527 goto redo;
1528 if ((flags & 0xc0) == 0x80) {
1529 dts = pts = get_pts(&s->pb, -1);
1530 if (header_len < 5)
1531 goto redo;
1532 header_len -= 5;
1533 len -= 5;
1534 } if ((flags & 0xc0) == 0xc0) {
1535 pts = get_pts(&s->pb, -1);
1536 dts = get_pts(&s->pb, -1);
1537 if (header_len < 10)
1538 goto redo;
1539 header_len -= 10;
1540 len -= 10;
1541 }
1542 len -= header_len;
1543 while (header_len > 0) {
1544 get_byte(&s->pb);
1545 header_len--;
1546 }
1547 }
1548 else if( c!= 0xf )
1549 goto redo;
1550
1551 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
1552 if (len < 1)
1553 goto redo;
1554 startcode = get_byte(&s->pb);
1555 len--;
1556 if (startcode >= 0x80 && startcode <= 0xbf) {
1557 /* audio: skip header */
1558 if (len < 3)
1559 goto redo;
1560 get_byte(&s->pb);
1561 get_byte(&s->pb);
1562 get_byte(&s->pb);
1563 len -= 3;
1564 }
1565 }
1566 if(dts != AV_NOPTS_VALUE && ppos){
1567 int i;
1568 for(i=0; i<s->nb_streams; i++){
1569 if(startcode == s->streams[i]->id) {
1570 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
1571 }
1572 }
1573 }
1574
1575 *pstart_code = startcode;
1576 *ppts = pts;
1577 *pdts = dts;
1578 return len;
1579 }
1580
1581 static int mpegps_read_packet(AVFormatContext *s,
1582 AVPacket *pkt)
1583 {
1584 MpegDemuxContext *m = s->priv_data;
1585 AVStream *st;
1586 int len, startcode, i, type, codec_id = 0, es_type;
1587 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
1588
1589 redo:
1590 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
1591 if (len < 0)
1592 return len;
1593
1594 /* now find stream */
1595 for(i=0;i<s->nb_streams;i++) {
1596 st = s->streams[i];
1597 if (st->id == startcode)
1598 goto found;
1599 }
1600
1601 es_type = m->psm_es_type[startcode & 0xff];
1602 if(es_type > 0){
1603 if(es_type == STREAM_TYPE_VIDEO_MPEG1){
1604 codec_id = CODEC_ID_MPEG2VIDEO;
1605 type = CODEC_TYPE_VIDEO;
1606 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
1607 codec_id = CODEC_ID_MPEG2VIDEO;
1608 type = CODEC_TYPE_VIDEO;
1609 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
1610 es_type == STREAM_TYPE_AUDIO_MPEG2){
1611 codec_id = CODEC_ID_MP3;
1612 type = CODEC_TYPE_AUDIO;
1613 } else if(es_type == STREAM_TYPE_AUDIO_AAC){
1614 codec_id = CODEC_ID_AAC;
1615 type = CODEC_TYPE_AUDIO;
1616 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
1617 codec_id = CODEC_ID_MPEG4;
1618 type = CODEC_TYPE_VIDEO;
1619 } else if(es_type == STREAM_TYPE_VIDEO_H264){
1620 codec_id = CODEC_ID_H264;
1621 type = CODEC_TYPE_VIDEO;
1622 } else if(es_type == STREAM_TYPE_AUDIO_AC3){
1623 codec_id = CODEC_ID_AC3;
1624 type = CODEC_TYPE_AUDIO;
1625 } else {
1626 goto skip;
1627 }
1628 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
1629 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
1630 unsigned char buf[8];
1631 get_buffer(&s->pb, buf, 8);
1632 url_fseek(&s->pb, -8, SEEK_CUR);
1633 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
1634 codec_id = CODEC_ID_CAVS;
1635 else
1636 codec_id = CODEC_ID_MPEG2VIDEO;
1637 type = CODEC_TYPE_VIDEO;
1638 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
1639 type = CODEC_TYPE_AUDIO;
1640 codec_id = CODEC_ID_MP2;
1641 } else if (startcode >= 0x80 && startcode <= 0x87) {
1642 type = CODEC_TYPE_AUDIO;
1643 codec_id = CODEC_ID_AC3;
1644 } else if (startcode >= 0x88 && startcode <= 0x9f) {
1645 type = CODEC_TYPE_AUDIO;
1646 codec_id = CODEC_ID_DTS;
1647 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
1648 type = CODEC_TYPE_AUDIO;
1649 codec_id = CODEC_ID_PCM_S16BE;
1650 } else if (startcode >= 0x20 && startcode <= 0x3f) {
1651 type = CODEC_TYPE_SUBTITLE;
1652 codec_id = CODEC_ID_DVD_SUBTITLE;
1653 } else {
1654 skip:
1655 /* skip packet */
1656 url_fskip(&s->pb, len);
1657 goto redo;
1658 }
1659 /* no stream found: add a new stream */
1660 st = av_new_stream(s, startcode);
1661 if (!st)
1662 goto skip;
1663 st->codec->codec_type = type;
1664 st->codec->codec_id = codec_id;
1665 if (codec_id != CODEC_ID_PCM_S16BE)
1666 st->need_parsing = 1;
1667 found:
1668 if(st->discard >= AVDISCARD_ALL)
1669 goto skip;
1670 if (startcode >= 0xa0 && startcode <= 0xbf) {
1671 int b1, freq;
1672
1673 /* for LPCM, we just skip the header and consider it is raw
1674 audio data */
1675 if (len <= 3)
1676 goto skip;
1677 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
1678 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
1679 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
1680 len -= 3;
1681 freq = (b1 >> 4) & 3;
1682 st->codec->sample_rate = lpcm_freq_tab[freq];
1683 st->codec->channels = 1 + (b1 & 7);
1684 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2;
1685 }
1686 av_new_packet(pkt, len);
1687 get_buffer(&s->pb, pkt->data, pkt->size);
1688 pkt->pts = pts;
1689 pkt->dts = dts;
1690 pkt->stream_index = st->index;
1691 #if 0
1692 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
1693 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size);
1694 #endif
1695
1696 return 0;
1697 }
1698
1699 static int mpegps_read_close(AVFormatContext *s)
1700 {
1701 return 0;
1702 }
1703
1704 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
1705 int64_t *ppos, int64_t pos_limit)
1706 {
1707 int len, startcode;
1708 int64_t pos, pts, dts;
1709
1710 pos = *ppos;
1711 #ifdef DEBUG_SEEK
1712 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
1713 #endif
1714 url_fseek(&s->pb, pos, SEEK_SET);
1715 for(;;) {
1716 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
1717 if (len < 0) {
1718 #ifdef DEBUG_SEEK
1719 printf("none (ret=%d)\n", len);
1720 #endif
1721 return AV_NOPTS_VALUE;
1722 }
1723 if (startcode == s->streams[stream_index]->id &&
1724 dts != AV_NOPTS_VALUE) {
1725 break;
1726 }
1727 url_fskip(&s->pb, len);
1728 }
1729 #ifdef DEBUG_SEEK
1730 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
1731 #endif
1732 *ppos = pos;
1733 return dts;
1734 }
1735
1736 #ifdef CONFIG_MPEG1SYSTEM_MUXER
1737 AVOutputFormat mpeg1system_muxer = {
1738 "mpeg",
1739 "MPEG1 System format",
1740 "video/mpeg",
1741 "mpg,mpeg",
1742 sizeof(MpegMuxContext),
1743 CODEC_ID_MP2,
1744 CODEC_ID_MPEG1VIDEO,
1745 mpeg_mux_init,
1746 mpeg_mux_write_packet,
1747 mpeg_mux_end,
1748 };
1749 #endif
1750 #ifdef CONFIG_MPEG1VCD_MUXER
1751 AVOutputFormat mpeg1vcd_muxer = {
1752 "vcd",
1753 "MPEG1 System format (VCD)",
1754 "video/mpeg",
1755 NULL,
1756 sizeof(MpegMuxContext),
1757 CODEC_ID_MP2,
1758 CODEC_ID_MPEG1VIDEO,
1759 mpeg_mux_init,
1760 mpeg_mux_write_packet,
1761 mpeg_mux_end,
1762 };
1763 #endif
1764 #ifdef CONFIG_MPEG2VOB_MUXER
1765 AVOutputFormat mpeg2vob_muxer = {
1766 "vob",
1767 "MPEG2 PS format (VOB)",
1768 "video/mpeg",
1769 "vob",
1770 sizeof(MpegMuxContext),
1771 CODEC_ID_MP2,
1772 CODEC_ID_MPEG2VIDEO,
1773 mpeg_mux_init,
1774 mpeg_mux_write_packet,
1775 mpeg_mux_end,
1776 };
1777 #endif
1778
1779 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1780 #ifdef CONFIG_MPEG2SVCD_MUXER
1781 AVOutputFormat mpeg2svcd_muxer = {
1782 "svcd",
1783 "MPEG2 PS format (VOB)",
1784 "video/mpeg",
1785 "vob",
1786 sizeof(MpegMuxContext),
1787 CODEC_ID_MP2,
1788 CODEC_ID_MPEG2VIDEO,
1789 mpeg_mux_init,
1790 mpeg_mux_write_packet,
1791 mpeg_mux_end,
1792 };
1793 #endif
1794
1795 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1796 #ifdef CONFIG_MPEG2DVD_MUXER
1797 AVOutputFormat mpeg2dvd_muxer = {
1798 "dvd",
1799 "MPEG2 PS format (DVD VOB)",
1800 "video/mpeg",
1801 "dvd",
1802 sizeof(MpegMuxContext),
1803 CODEC_ID_MP2,
1804 CODEC_ID_MPEG2VIDEO,
1805 mpeg_mux_init,
1806 mpeg_mux_write_packet,
1807 mpeg_mux_end,
1808 };
1809 #endif
1810
1811 #ifdef CONFIG_MPEGPS_DEMUXER
1812 AVInputFormat mpegps_demuxer = {
1813 "mpeg",
1814 "MPEG PS format",
1815 sizeof(MpegDemuxContext),
1816 mpegps_probe,
1817 mpegps_read_header,
1818 mpegps_read_packet,
1819 mpegps_read_close,
1820 NULL, //mpegps_read_seek,
1821 mpegps_read_dts,
1822 .flags = AVFMT_SHOW_IDS,
1823 };
1824 #endif