blob: 772a4df30e89c2014ab3fb3a04fa64e110cb504b [file] [log] [blame]
Fabrice Bellardde6d9b62001-07-22 14:18:561/*
Fabrice Bellardfb7566d2002-10-15 10:22:232 * MPEG1/2 mux/demux
Fabrice Bellard19720f12002-05-25 22:34:323 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
Fabrice Bellardde6d9b62001-07-22 14:18:564 *
Fabrice Bellard19720f12002-05-25 22:34:325 * 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.
Fabrice Bellardde6d9b62001-07-22 14:18:569 *
Fabrice Bellard19720f12002-05-25 22:34:3210 * This library is distributed in the hope that it will be useful,
Fabrice Bellardde6d9b62001-07-22 14:18:5611 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellard19720f12002-05-25 22:34:3212 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
Fabrice Bellardde6d9b62001-07-22 14:18:5614 *
Fabrice Bellard19720f12002-05-25 22:34:3215 * 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
Fabrice Bellardde6d9b62001-07-22 14:18:5618 */
Fabrice Bellardde6d9b62001-07-22 14:18:5619#include "avformat.h"
20
21#define MAX_PAYLOAD_SIZE 4096
Michael Niedermayer7000a172004-10-03 02:42:0122#define PRELOAD 45000 //0.5sec
Fabrice Bellard27f388a2003-11-10 18:47:5223//#define DEBUG_SEEK
Fabrice Bellardde6d9b62001-07-22 14:18:5624
Michael Niedermayerb7549782004-01-13 22:02:4925#undef NDEBUG
26#include <assert.h>
27
Michael Niedermayer7000a172004-10-03 02:42:0128typedef struct PacketDesc {
29 int64_t pts;
30 int64_t dts;
31 int size;
32 int unwritten_size;
33 int flags;
34 struct PacketDesc *next;
35} PacketDesc;
36
Fabrice Bellardde6d9b62001-07-22 14:18:5637typedef struct {
Michael Niedermayer7000a172004-10-03 02:42:0138 FifoBuffer fifo;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4839 uint8_t id;
Fabrice Bellardde6d9b62001-07-22 14:18:5640 int max_buffer_size; /* in bytes */
Michael Niedermayer7000a172004-10-03 02:42:0141 int buffer_index;
42 PacketDesc *predecode_packet;
43 PacketDesc *premux_packet;
44 PacketDesc **next_packet;
Fabrice Bellardde6d9b62001-07-22 14:18:5645 int packet_number;
Fabrice Bellard044007c2003-12-16 14:00:1846 uint8_t lpcm_header[3];
47 int lpcm_align;
Fabrice Bellardde6d9b62001-07-22 14:18:5648} StreamInfo;
49
50typedef struct {
51 int packet_size; /* required packet size */
Fabrice Bellardde6d9b62001-07-22 14:18:5652 int packet_number;
53 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
54 int system_header_freq;
Fabrice Bellard0dbb48d2003-12-16 11:25:3055 int system_header_size;
Fabrice Bellardde6d9b62001-07-22 14:18:5656 int mux_rate; /* bitrate in units of 50 bytes/s */
57 /* stream info */
58 int audio_bound;
59 int video_bound;
Fabrice Bellardfb7566d2002-10-15 10:22:2360 int is_mpeg2;
61 int is_vcd;
Hauke Duden24515922004-02-19 22:34:1362 int is_svcd;
Paul Curtis78a0efb2004-10-03 18:21:4563 int is_dvd;
Michel Bardiaux27a206e2003-12-09 18:06:1864 int64_t last_scr; /* current system clock */
Hauke Duden24515922004-02-19 22:34:1365
Michael Niedermayerd8b5abf2004-10-01 20:05:0466 double vcd_padding_bitrate; //FIXME floats
Hauke Duden24515922004-02-19 22:34:1367 int64_t vcd_padding_bytes_written;
68
Fabrice Bellardde6d9b62001-07-22 14:18:5669} MpegMuxContext;
70
71#define PACK_START_CODE ((unsigned int)0x000001ba)
72#define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
Juanjo92b3e122002-05-12 21:38:5473#define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
Fabrice Bellardde6d9b62001-07-22 14:18:5674#define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
75#define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
76#define ISO_11172_END_CODE ((unsigned int)0x000001b9)
77
78/* mpeg2 */
79#define PROGRAM_STREAM_MAP 0x1bc
80#define PRIVATE_STREAM_1 0x1bd
81#define PADDING_STREAM 0x1be
82#define PRIVATE_STREAM_2 0x1bf
83
84
85#define AUDIO_ID 0xc0
86#define VIDEO_ID 0xe0
Fabrice Bellard044007c2003-12-16 14:00:1887#define AC3_ID 0x80
Michael Niedermayer23c99252004-07-14 01:32:1488#define DTS_ID 0x8a
Fabrice Bellard044007c2003-12-16 14:00:1889#define LPCM_ID 0xa0
Fabrice Bellardde6d9b62001-07-22 14:18:5690
Michael Niedermayer8a05bca2004-01-17 22:02:0791static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
92
Mike Melanson764ef402003-10-14 04:15:5393#ifdef CONFIG_ENCODERS
Falk Hüffner79060852004-03-24 23:32:4894static AVOutputFormat mpeg1system_mux;
95static AVOutputFormat mpeg1vcd_mux;
96static AVOutputFormat mpeg2vob_mux;
97static AVOutputFormat mpeg2svcd_mux;
Paul Curtis78a0efb2004-10-03 18:21:4598static AVOutputFormat mpeg2dvd_mux;
Fabrice Bellardfb7566d2002-10-15 10:22:2399
Fabrice Bellardde6d9b62001-07-22 14:18:56100static int put_pack_header(AVFormatContext *ctx,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48101 uint8_t *buf, int64_t timestamp)
Fabrice Bellardde6d9b62001-07-22 14:18:56102{
103 MpegMuxContext *s = ctx->priv_data;
104 PutBitContext pb;
105
Alex Beregszaszi117a5492003-10-13 10:59:57106 init_put_bits(&pb, buf, 128);
Fabrice Bellardde6d9b62001-07-22 14:18:56107
108 put_bits(&pb, 32, PACK_START_CODE);
Fabrice Bellardb2cac182002-10-21 15:57:21109 if (s->is_mpeg2) {
Måns Rullgård8683e4a2003-07-15 22:15:37110 put_bits(&pb, 2, 0x1);
Fabrice Bellardb2cac182002-10-21 15:57:21111 } else {
112 put_bits(&pb, 4, 0x2);
113 }
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48114 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
Fabrice Bellardde6d9b62001-07-22 14:18:56115 put_bits(&pb, 1, 1);
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48116 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
Fabrice Bellardde6d9b62001-07-22 14:18:56117 put_bits(&pb, 1, 1);
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48118 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
Fabrice Bellardde6d9b62001-07-22 14:18:56119 put_bits(&pb, 1, 1);
Fabrice Bellardb2cac182002-10-21 15:57:21120 if (s->is_mpeg2) {
121 /* clock extension */
122 put_bits(&pb, 9, 0);
Fabrice Bellardb2cac182002-10-21 15:57:21123 }
Fabrice Bellardde6d9b62001-07-22 14:18:56124 put_bits(&pb, 1, 1);
125 put_bits(&pb, 22, s->mux_rate);
126 put_bits(&pb, 1, 1);
Fabrice Bellardb2cac182002-10-21 15:57:21127 if (s->is_mpeg2) {
Michael Niedermayer4aa533b2004-02-01 13:06:46128 put_bits(&pb, 1, 1);
Fabrice Bellardb2cac182002-10-21 15:57:21129 put_bits(&pb, 5, 0x1f); /* reserved */
130 put_bits(&pb, 3, 0); /* stuffing length */
131 }
Fabrice Bellardde6d9b62001-07-22 14:18:56132 flush_put_bits(&pb);
Michael Niedermayer17592472002-02-12 15:43:16133 return pbBufPtr(&pb) - pb.buf;
Fabrice Bellardde6d9b62001-07-22 14:18:56134}
135
Hauke Duden24515922004-02-19 22:34:13136static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
Fabrice Bellardde6d9b62001-07-22 14:18:56137{
138 MpegMuxContext *s = ctx->priv_data;
Michael Niedermayer7000a172004-10-03 02:42:01139 int size, i, private_stream_coded, id;
Fabrice Bellardde6d9b62001-07-22 14:18:56140 PutBitContext pb;
141
Alex Beregszaszi117a5492003-10-13 10:59:57142 init_put_bits(&pb, buf, 128);
Fabrice Bellardde6d9b62001-07-22 14:18:56143
144 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
145 put_bits(&pb, 16, 0);
146 put_bits(&pb, 1, 1);
147
Michael Niedermayer7000a172004-10-03 02:42:01148 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
Fabrice Bellardde6d9b62001-07-22 14:18:56149 put_bits(&pb, 1, 1); /* marker */
Hauke Duden24515922004-02-19 22:34:13150 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
151 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
152 put_bits(&pb, 6, 0);
153 } else
154 put_bits(&pb, 6, s->audio_bound);
Fabrice Bellardde6d9b62001-07-22 14:18:56155
Hauke Duden22494482004-04-26 22:16:06156 if (s->is_vcd) {
157 /* see VCD standard, p. IV-7*/
158 put_bits(&pb, 1, 0);
159 put_bits(&pb, 1, 1);
160 } else {
161 put_bits(&pb, 1, 0); /* variable bitrate*/
162 put_bits(&pb, 1, 0); /* non constrainted bit stream */
163 }
Fabrice Bellardde6d9b62001-07-22 14:18:56164
Hauke Duden24515922004-02-19 22:34:13165 if (s->is_vcd) {
166 /* see VCD standard p IV-7 */
167 put_bits(&pb, 1, 1); /* audio locked */
168 put_bits(&pb, 1, 1); /* video locked */
169 } else {
170 put_bits(&pb, 1, 0); /* audio locked */
171 put_bits(&pb, 1, 0); /* video locked */
172 }
173
Fabrice Bellardde6d9b62001-07-22 14:18:56174 put_bits(&pb, 1, 1); /* marker */
175
Hauke Duden24515922004-02-19 22:34:13176 if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
177 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
178 put_bits(&pb, 5, 0);
179 } else
180 put_bits(&pb, 5, s->video_bound);
181
Fabrice Bellardde6d9b62001-07-22 14:18:56182 put_bits(&pb, 8, 0xff); /* reserved byte */
183
184 /* audio stream info */
185 private_stream_coded = 0;
186 for(i=0;i<ctx->nb_streams;i++) {
187 StreamInfo *stream = ctx->streams[i]->priv_data;
Hauke Duden24515922004-02-19 22:34:13188
189 /* For VCDs, only include the stream info for the stream
190 that the pack which contains this system belongs to.
191 (see VCD standard p. IV-7) */
192 if ( !s->is_vcd || stream->id==only_for_stream_id
193 || only_for_stream_id==0) {
194
195 id = stream->id;
196 if (id < 0xc0) {
197 /* special case for private streams (AC3 use that) */
198 if (private_stream_coded)
199 continue;
200 private_stream_coded = 1;
201 id = 0xbd;
202 }
203 put_bits(&pb, 8, id); /* stream ID */
204 put_bits(&pb, 2, 3);
205 if (id < 0xe0) {
206 /* audio */
207 put_bits(&pb, 1, 0);
208 put_bits(&pb, 13, stream->max_buffer_size / 128);
209 } else {
210 /* video */
211 put_bits(&pb, 1, 1);
212 put_bits(&pb, 13, stream->max_buffer_size / 1024);
213 }
Fabrice Bellardde6d9b62001-07-22 14:18:56214 }
215 }
216 flush_put_bits(&pb);
Michael Niedermayer17592472002-02-12 15:43:16217 size = pbBufPtr(&pb) - pb.buf;
Fabrice Bellardde6d9b62001-07-22 14:18:56218 /* patch packet size */
219 buf[4] = (size - 6) >> 8;
220 buf[5] = (size - 6) & 0xff;
221
222 return size;
223}
224
Fabrice Bellard0dbb48d2003-12-16 11:25:30225static int get_system_header_size(AVFormatContext *ctx)
226{
227 int buf_index, i, private_stream_coded;
228 StreamInfo *stream;
229
230 buf_index = 12;
231 private_stream_coded = 0;
232 for(i=0;i<ctx->nb_streams;i++) {
233 stream = ctx->streams[i]->priv_data;
234 if (stream->id < 0xc0) {
235 if (private_stream_coded)
236 continue;
237 private_stream_coded = 1;
238 }
239 buf_index += 3;
240 }
241 return buf_index;
242}
243
Fabrice Bellardde6d9b62001-07-22 14:18:56244static int mpeg_mux_init(AVFormatContext *ctx)
245{
Fabrice Bellarddb7f1f92002-05-20 16:29:40246 MpegMuxContext *s = ctx->priv_data;
Michael Niedermayer23c99252004-07-14 01:32:14247 int bitrate, i, mpa_id, mpv_id, ac3_id, dts_id, lpcm_id, j;
Fabrice Bellardde6d9b62001-07-22 14:18:56248 AVStream *st;
249 StreamInfo *stream;
Hauke Duden24515922004-02-19 22:34:13250 int audio_bitrate;
251 int video_bitrate;
Fabrice Bellardde6d9b62001-07-22 14:18:56252
Fabrice Bellardde6d9b62001-07-22 14:18:56253 s->packet_number = 0;
Fabrice Bellardfb7566d2002-10-15 10:22:23254 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux);
Hauke Duden24515922004-02-19 22:34:13255 s->is_svcd = (ctx->oformat == &mpeg2svcd_mux);
Paul Curtis78a0efb2004-10-03 18:21:45256 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
257 s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
Fabrice Bellardfb7566d2002-10-15 10:22:23258
Michael Niedermayer2db3c632004-10-06 22:29:30259 if(ctx->packet_size)
260 s->packet_size = ctx->packet_size;
Juanjo92b3e122002-05-12 21:38:54261 else
262 s->packet_size = 2048;
Michael Niedermayer2db3c632004-10-06 22:29:30263
Hauke Duden24515922004-02-19 22:34:13264 s->vcd_padding_bytes_written = 0;
265 s->vcd_padding_bitrate=0;
Juanjo92b3e122002-05-12 21:38:54266
Fabrice Bellardde6d9b62001-07-22 14:18:56267 s->audio_bound = 0;
268 s->video_bound = 0;
269 mpa_id = AUDIO_ID;
Fabrice Bellard044007c2003-12-16 14:00:18270 ac3_id = AC3_ID;
Michael Niedermayer23c99252004-07-14 01:32:14271 dts_id = DTS_ID;
Fabrice Bellardde6d9b62001-07-22 14:18:56272 mpv_id = VIDEO_ID;
Fabrice Bellard044007c2003-12-16 14:00:18273 lpcm_id = LPCM_ID;
Fabrice Bellardde6d9b62001-07-22 14:18:56274 for(i=0;i<ctx->nb_streams;i++) {
275 st = ctx->streams[i];
276 stream = av_mallocz(sizeof(StreamInfo));
277 if (!stream)
278 goto fail;
279 st->priv_data = stream;
280
Michael Niedermayer2031ba12004-10-03 12:17:46281 av_set_pts_info(st, 64, 1, 90000);
282
Fabrice Bellardde6d9b62001-07-22 14:18:56283 switch(st->codec.codec_type) {
284 case CODEC_TYPE_AUDIO:
Fabrice Bellard044007c2003-12-16 14:00:18285 if (st->codec.codec_id == CODEC_ID_AC3) {
Fabrice Bellardde6d9b62001-07-22 14:18:56286 stream->id = ac3_id++;
Michael Niedermayer23c99252004-07-14 01:32:14287 } else if (st->codec.codec_id == CODEC_ID_DTS) {
288 stream->id = dts_id++;
Fabrice Bellard044007c2003-12-16 14:00:18289 } else if (st->codec.codec_id == CODEC_ID_PCM_S16BE) {
290 stream->id = lpcm_id++;
291 for(j = 0; j < 4; j++) {
292 if (lpcm_freq_tab[j] == st->codec.sample_rate)
293 break;
294 }
295 if (j == 4)
296 goto fail;
297 if (st->codec.channels > 8)
298 return -1;
299 stream->lpcm_header[0] = 0x0c;
300 stream->lpcm_header[1] = (st->codec.channels - 1) | (j << 4);
301 stream->lpcm_header[2] = 0x80;
302 stream->lpcm_align = st->codec.channels * 2;
303 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:56304 stream->id = mpa_id++;
Fabrice Bellard044007c2003-12-16 14:00:18305 }
Hauke Duden22494482004-04-26 22:16:06306
307 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
308 Right now it is also used for everything else.*/
Fabrice Bellardde6d9b62001-07-22 14:18:56309 stream->max_buffer_size = 4 * 1024;
310 s->audio_bound++;
311 break;
312 case CODEC_TYPE_VIDEO:
Fabrice Bellardde6d9b62001-07-22 14:18:56313 stream->id = mpv_id++;
Michael Niedermayer7e051552004-10-03 03:14:09314 if (st->codec.rc_buffer_size)
315 stream->max_buffer_size = 6*1024 + st->codec.rc_buffer_size/8;
316 else
317 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
318#if 0
Hauke Duden22494482004-04-26 22:16:06319 /* see VCD standard, p. IV-7*/
320 stream->max_buffer_size = 46 * 1024;
321 else
322 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
323 Right now it is also used for everything else.*/
324 stream->max_buffer_size = 230 * 1024;
Michael Niedermayer7e051552004-10-03 03:14:09325#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56326 s->video_bound++;
327 break;
Philip Gladstoneac5e6a52002-05-09 01:19:33328 default:
Michael Niedermayer71c32f12004-10-01 13:16:16329 return -1;
Fabrice Bellardde6d9b62001-07-22 14:18:56330 }
Michael Niedermayer7000a172004-10-03 02:42:01331 fifo_init(&stream->fifo, 2*stream->max_buffer_size + 100*MAX_PAYLOAD_SIZE); //FIXME think about the size maybe dynamically realloc
332 stream->next_packet= &stream->premux_packet;
Fabrice Bellardde6d9b62001-07-22 14:18:56333 }
Hauke Duden24515922004-02-19 22:34:13334 bitrate = 0;
335 audio_bitrate = 0;
336 video_bitrate = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56337 for(i=0;i<ctx->nb_streams;i++) {
Michael Niedermayer7000a172004-10-03 02:42:01338 int codec_rate;
Fabrice Bellardde6d9b62001-07-22 14:18:56339 st = ctx->streams[i];
Hauke Duden24515922004-02-19 22:34:13340 stream = (StreamInfo*) st->priv_data;
Michael Niedermayer7000a172004-10-03 02:42:01341
342 if(st->codec.rc_max_rate || stream->id==VIDEO_ID)
343 codec_rate= st->codec.rc_max_rate;
344 else
345 codec_rate= st->codec.bit_rate;
346
347 if(!codec_rate)
348 codec_rate= (1<<21)*8*50/ctx->nb_streams;
349
350 bitrate += codec_rate;
Hauke Duden24515922004-02-19 22:34:13351
352 if (stream->id==AUDIO_ID)
Michael Niedermayer7000a172004-10-03 02:42:01353 audio_bitrate += codec_rate;
Hauke Duden24515922004-02-19 22:34:13354 else if (stream->id==VIDEO_ID)
Michael Niedermayer7000a172004-10-03 02:42:01355 video_bitrate += codec_rate;
Fabrice Bellardde6d9b62001-07-22 14:18:56356 }
Michael Niedermayer2db3c632004-10-06 22:29:30357
358 if(ctx->mux_rate){
359 s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
360 } else {
361 /* we increase slightly the bitrate to take into account the
362 headers. XXX: compute it exactly */
363 bitrate += bitrate*5/100;
364 bitrate += 10000;
365 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
366 }
Hauke Duden24515922004-02-19 22:34:13367
368 if (s->is_vcd) {
369 double overhead_rate;
370
371 /* The VCD standard mandates that the mux_rate field is 3528
372 (see standard p. IV-6).
373 The value is actually "wrong", i.e. if you calculate
374 it using the normal formula and the 75 sectors per second transfer
375 rate you get a different value because the real pack size is 2324,
376 not 2352. But the standard explicitly specifies that the mux_rate
377 field in the header must have this value.*/
Michael Niedermayer2db3c632004-10-06 22:29:30378// s->mux_rate=2352 * 75 / 50; /* = 3528*/
Hauke Duden24515922004-02-19 22:34:13379
380 /* The VCD standard states that the muxed stream must be
381 exactly 75 packs / second (the data rate of a single speed cdrom).
382 Since the video bitrate (probably 1150000 bits/sec) will be below
383 the theoretical maximum we have to add some padding packets
384 to make up for the lower data rate.
385 (cf. VCD standard p. IV-6 )*/
386
387 /* Add the header overhead to the data rate.
388 2279 data bytes per audio pack, 2294 data bytes per video pack*/
389 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
390 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
391 overhead_rate *= 8;
392
393 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
394 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
Hauke Duden24515922004-02-19 22:34:13395 }
Juanjo92b3e122002-05-12 21:38:54396
Fabrice Bellardfb7566d2002-10-15 10:22:23397 if (s->is_vcd || s->is_mpeg2)
Juanjo92b3e122002-05-12 21:38:54398 /* every packet */
399 s->pack_header_freq = 1;
400 else
401 /* every 2 seconds */
402 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
Michael Niedermayerb623bbc2003-10-28 10:55:15403
404 /* the above seems to make pack_header_freq zero sometimes */
405 if (s->pack_header_freq == 0)
406 s->pack_header_freq = 1;
Juanjo92b3e122002-05-12 21:38:54407
Fabrice Bellardb2cac182002-10-21 15:57:21408 if (s->is_mpeg2)
409 /* every 200 packets. Need to look at the spec. */
410 s->system_header_freq = s->pack_header_freq * 40;
411 else if (s->is_vcd)
Hauke Duden24515922004-02-19 22:34:13412 /* the standard mandates that there are only two system headers
413 in the whole file: one in the first packet of each stream.
414 (see standard p. IV-7 and IV-8) */
415 s->system_header_freq = 0x7fffffff;
Juanjo92b3e122002-05-12 21:38:54416 else
Juanjo92b3e122002-05-12 21:38:54417 s->system_header_freq = s->pack_header_freq * 5;
418
Fabrice Bellardde6d9b62001-07-22 14:18:56419 for(i=0;i<ctx->nb_streams;i++) {
420 stream = ctx->streams[i]->priv_data;
Fabrice Bellardde6d9b62001-07-22 14:18:56421 stream->packet_number = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56422 }
Fabrice Bellard0dbb48d2003-12-16 11:25:30423 s->system_header_size = get_system_header_size(ctx);
Michel Bardiaux27a206e2003-12-09 18:06:18424 s->last_scr = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56425 return 0;
426 fail:
427 for(i=0;i<ctx->nb_streams;i++) {
Fabrice Bellard1ea4f592002-05-18 23:11:09428 av_free(ctx->streams[i]->priv_data);
Fabrice Bellardde6d9b62001-07-22 14:18:56429 }
Fabrice Bellardde6d9b62001-07-22 14:18:56430 return -ENOMEM;
431}
432
Michel Bardiaux27a206e2003-12-09 18:06:18433static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
434{
435 put_byte(pb,
436 (id << 4) |
437 (((timestamp >> 30) & 0x07) << 1) |
438 1);
439 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
440 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
441}
442
Fabrice Bellard0dbb48d2003-12-16 11:25:30443
Hauke Duden24515922004-02-19 22:34:13444/* return the number of padding bytes that should be inserted into
445 the multiplexed stream.*/
446static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
447{
448 MpegMuxContext *s = ctx->priv_data;
449 int pad_bytes = 0;
450
451 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
452 {
453 int64_t full_pad_bytes;
454
Michael Niedermayer7000a172004-10-03 02:42:01455 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
Hauke Duden24515922004-02-19 22:34:13456 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
457
458 if (pad_bytes<0)
459 /* might happen if we have already padded to a later timestamp. This
460 can occur if another stream has already advanced further.*/
461 pad_bytes=0;
462 }
463
464 return pad_bytes;
465}
466
467
Fabrice Bellard0dbb48d2003-12-16 11:25:30468/* return the exact available payload size for the next packet for
469 stream 'stream_index'. 'pts' and 'dts' are only used to know if
470 timestamps are needed in the packet header. */
471static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
472 int64_t pts, int64_t dts)
473{
474 MpegMuxContext *s = ctx->priv_data;
475 int buf_index;
476 StreamInfo *stream;
477
Hauke Duden24515922004-02-19 22:34:13478 stream = ctx->streams[stream_index]->priv_data;
479
Fabrice Bellard0dbb48d2003-12-16 11:25:30480 buf_index = 0;
481 if (((s->packet_number % s->pack_header_freq) == 0)) {
482 /* pack header size */
483 if (s->is_mpeg2)
484 buf_index += 14;
485 else
486 buf_index += 12;
Hauke Duden24515922004-02-19 22:34:13487
488 if (s->is_vcd) {
489 /* there is exactly one system header for each stream in a VCD MPEG,
490 One in the very first video packet and one in the very first
491 audio packet (see VCD standard p. IV-7 and IV-8).*/
492
493 if (stream->packet_number==0)
494 /* The system headers refer only to the stream they occur in,
495 so they have a constant size.*/
496 buf_index += 15;
497
498 } else {
499 if ((s->packet_number % s->system_header_freq) == 0)
500 buf_index += s->system_header_size;
501 }
Fabrice Bellard0dbb48d2003-12-16 11:25:30502 }
503
Hauke Duden22494482004-04-26 22:16:06504 if ((s->is_vcd && stream->packet_number==0)
505 || (s->is_svcd && s->packet_number==0))
Hauke Duden24515922004-02-19 22:34:13506 /* the first pack of each stream contains only the pack header,
507 the system header and some padding (see VCD standard p. IV-6)
508 Add the padding size, so that the actual payload becomes 0.*/
509 buf_index += s->packet_size - buf_index;
510 else {
511 /* packet header size */
512 buf_index += 6;
Hauke Duden22494482004-04-26 22:16:06513 if (s->is_mpeg2) {
Fabrice Bellard044007c2003-12-16 14:00:18514 buf_index += 3;
Hauke Duden22494482004-04-26 22:16:06515 if (stream->packet_number==0)
516 buf_index += 3; /* PES extension */
517 buf_index += 1; /* obligatory stuffing byte */
518 }
Hauke Duden24515922004-02-19 22:34:13519 if (pts != AV_NOPTS_VALUE) {
520 if (dts != pts)
521 buf_index += 5 + 5;
522 else
523 buf_index += 5;
524
525 } else {
526 if (!s->is_mpeg2)
527 buf_index++;
Fabrice Bellard044007c2003-12-16 14:00:18528 }
Hauke Duden24515922004-02-19 22:34:13529
530 if (stream->id < 0xc0) {
531 /* AC3/LPCM private data header */
532 buf_index += 4;
533 if (stream->id >= 0xa0) {
534 int n;
535 buf_index += 3;
536 /* NOTE: we round the payload size to an integer number of
537 LPCM samples */
538 n = (s->packet_size - buf_index) % stream->lpcm_align;
539 if (n)
540 buf_index += (stream->lpcm_align - n);
541 }
542 }
543
544 if (s->is_vcd && stream->id == AUDIO_ID)
545 /* The VCD standard demands that 20 zero bytes follow
546 each audio packet (see standard p. IV-8).*/
547 buf_index+=20;
Fabrice Bellard0dbb48d2003-12-16 11:25:30548 }
549 return s->packet_size - buf_index;
550}
551
Hauke Duden24515922004-02-19 22:34:13552/* Write an MPEG padding packet header. */
Hauke Duden24515922004-02-19 22:34:13553static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
554{
Michael Niedermayerd8b5abf2004-10-01 20:05:04555 MpegMuxContext *s = ctx->priv_data;
556 int i;
Hauke Duden24515922004-02-19 22:34:13557
Michael Niedermayerd8b5abf2004-10-01 20:05:04558 put_be32(pb, PADDING_STREAM);
559 put_be16(pb, packet_bytes - 6);
560 if (!s->is_mpeg2) {
561 put_byte(pb, 0x0f);
562 packet_bytes -= 7;
563 } else
564 packet_bytes -= 6;
Hauke Duden24515922004-02-19 22:34:13565
566 for(i=0;i<packet_bytes;i++)
567 put_byte(pb, 0xff);
568}
569
Michael Niedermayer7000a172004-10-03 02:42:01570static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
571 int nb_frames=0;
572 PacketDesc *pkt_desc= stream->premux_packet;
573
574 while(len>0){
575 if(pkt_desc->size == pkt_desc->unwritten_size)
576 nb_frames++;
577 len -= pkt_desc->unwritten_size;
578 pkt_desc= pkt_desc->next;
579 }
580
581 return nb_frames;
582}
Hauke Duden24515922004-02-19 22:34:13583
Fabrice Bellardde6d9b62001-07-22 14:18:56584/* flush the packet on stream stream_index */
Michael Niedermayer7000a172004-10-03 02:42:01585static int flush_packet(AVFormatContext *ctx, int stream_index,
586 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
Fabrice Bellardde6d9b62001-07-22 14:18:56587{
588 MpegMuxContext *s = ctx->priv_data;
589 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48590 uint8_t *buf_ptr;
Fabrice Bellard0dbb48d2003-12-16 11:25:30591 int size, payload_size, startcode, id, stuffing_size, i, header_len;
592 int packet_size;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48593 uint8_t buffer[128];
Hauke Duden24515922004-02-19 22:34:13594 int zero_trail_bytes = 0;
595 int pad_packet_bytes = 0;
Hauke Duden22494482004-04-26 22:16:06596 int pes_flags;
597 int general_pack = 0; /*"general" pack without data specific to one stream?*/
Michael Niedermayer7000a172004-10-03 02:42:01598 int nb_frames;
Juanjo92b3e122002-05-12 21:38:54599
Fabrice Bellardde6d9b62001-07-22 14:18:56600 id = stream->id;
Michel Bardiaux27a206e2003-12-09 18:06:18601
Fabrice Bellardde6d9b62001-07-22 14:18:56602#if 0
603 printf("packet ID=%2x PTS=%0.3f\n",
Michel Bardiaux27a206e2003-12-09 18:06:18604 id, pts / 90000.0);
Fabrice Bellardde6d9b62001-07-22 14:18:56605#endif
606
607 buf_ptr = buffer;
Hauke Duden24515922004-02-19 22:34:13608
Michael Niedermayer7000a172004-10-03 02:42:01609 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
Fabrice Bellardde6d9b62001-07-22 14:18:56610 /* output pack and systems header if needed */
Michel Bardiaux27a206e2003-12-09 18:06:18611 size = put_pack_header(ctx, buf_ptr, scr);
Fabrice Bellardde6d9b62001-07-22 14:18:56612 buf_ptr += size;
Michael Niedermayer7000a172004-10-03 02:42:01613 s->last_scr= scr;
Hauke Duden24515922004-02-19 22:34:13614
615 if (s->is_vcd) {
616 /* there is exactly one system header for each stream in a VCD MPEG,
617 One in the very first video packet and one in the very first
618 audio packet (see VCD standard p. IV-7 and IV-8).*/
619
620 if (stream->packet_number==0) {
621 size = put_system_header(ctx, buf_ptr, id);
622 buf_ptr += size;
623 }
624 } else {
625 if ((s->packet_number % s->system_header_freq) == 0) {
626 size = put_system_header(ctx, buf_ptr, 0);
627 buf_ptr += size;
628 }
Fabrice Bellardde6d9b62001-07-22 14:18:56629 }
630 }
631 size = buf_ptr - buffer;
632 put_buffer(&ctx->pb, buffer, size);
633
Hauke Duden24515922004-02-19 22:34:13634 packet_size = s->packet_size - size;
635
636 if (s->is_vcd && id == AUDIO_ID)
637 /* The VCD standard demands that 20 zero bytes follow
638 each audio pack (see standard p. IV-8).*/
639 zero_trail_bytes += 20;
640
Hauke Duden22494482004-04-26 22:16:06641 if ((s->is_vcd && stream->packet_number==0)
642 || (s->is_svcd && s->packet_number==0)) {
643 /* for VCD the first pack of each stream contains only the pack header,
Hauke Duden24515922004-02-19 22:34:13644 the system header and lots of padding (see VCD standard p. IV-6).
645 In the case of an audio pack, 20 zero bytes are also added at
646 the end.*/
Hauke Duden22494482004-04-26 22:16:06647 /* For SVCD we fill the very first pack to increase compatibility with
648 some DVD players. Not mandated by the standard.*/
649 if (s->is_svcd)
650 general_pack = 1; /* the system header refers to both streams and no stream data*/
Hauke Duden24515922004-02-19 22:34:13651 pad_packet_bytes = packet_size - zero_trail_bytes;
Fabrice Bellardfb7566d2002-10-15 10:22:23652 }
Hauke Duden24515922004-02-19 22:34:13653
654 packet_size -= pad_packet_bytes + zero_trail_bytes;
655
656 if (packet_size > 0) {
657
658 /* packet header size */
659 packet_size -= 6;
660
661 /* packet header */
662 if (s->is_mpeg2) {
663 header_len = 3;
Hauke Duden22494482004-04-26 22:16:06664 if (stream->packet_number==0)
665 header_len += 3; /* PES extension */
666 header_len += 1; /* obligatory stuffing byte */
Hauke Duden24515922004-02-19 22:34:13667 } else {
668 header_len = 0;
669 }
670 if (pts != AV_NOPTS_VALUE) {
671 if (dts != pts)
672 header_len += 5 + 5;
673 else
674 header_len += 5;
675 } else {
676 if (!s->is_mpeg2)
677 header_len++;
678 }
679
680 payload_size = packet_size - header_len;
681 if (id < 0xc0) {
682 startcode = PRIVATE_STREAM_1;
683 payload_size -= 4;
684 if (id >= 0xa0)
685 payload_size -= 3;
686 } else {
687 startcode = 0x100 + id;
688 }
689
Michael Niedermayer7000a172004-10-03 02:42:01690 stuffing_size = payload_size - fifo_size(&stream->fifo, stream->fifo.rptr);
691
692 // first byte doesnt fit -> reset pts/dts + stuffing
693 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
694 int timestamp_len=0;
695 if(dts != pts)
696 timestamp_len += 5;
697 if(pts != AV_NOPTS_VALUE)
698 timestamp_len += s->is_mpeg2 ? 5 : 4;
699 pts=dts= AV_NOPTS_VALUE;
700 header_len -= timestamp_len;
701 payload_size += timestamp_len;
702 stuffing_size += timestamp_len;
703 if(payload_size > trailer_size)
704 stuffing_size += payload_size - trailer_size;
705 }
706
Hauke Duden24515922004-02-19 22:34:13707 if (stuffing_size < 0)
708 stuffing_size = 0;
Hauke Duden22494482004-04-26 22:16:06709 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
710 pad_packet_bytes += stuffing_size;
711 packet_size -= stuffing_size;
712 payload_size -= stuffing_size;
713 stuffing_size = 0;
714 }
Michael Niedermayer7000a172004-10-03 02:42:01715
716 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
Hauke Duden22494482004-04-26 22:16:06717
Hauke Duden24515922004-02-19 22:34:13718 put_be32(&ctx->pb, startcode);
719
720 put_be16(&ctx->pb, packet_size);
721
Michel Bardiaux27a206e2003-12-09 18:06:18722 if (!s->is_mpeg2)
Hauke Duden24515922004-02-19 22:34:13723 for(i=0;i<stuffing_size;i++)
724 put_byte(&ctx->pb, 0xff);
Michel Bardiaux27a206e2003-12-09 18:06:18725
Hauke Duden24515922004-02-19 22:34:13726 if (s->is_mpeg2) {
727 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
Fabrice Bellard0dbb48d2003-12-16 11:25:30728
Hauke Duden22494482004-04-26 22:16:06729 pes_flags=0;
730
Hauke Duden24515922004-02-19 22:34:13731 if (pts != AV_NOPTS_VALUE) {
Hauke Duden22494482004-04-26 22:16:06732 pes_flags |= 0x80;
733 if (dts != pts)
734 pes_flags |= 0x40;
Michel Bardiaux27a206e2003-12-09 18:06:18735 }
Hauke Duden22494482004-04-26 22:16:06736
737 /* Both the MPEG-2 and the SVCD standards demand that the
738 P-STD_buffer_size field be included in the first packet of
739 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
740 and MPEG-2 standard 2.7.7) */
741 if (stream->packet_number == 0)
742 pes_flags |= 0x01;
743
744 put_byte(&ctx->pb, pes_flags); /* flags */
745 put_byte(&ctx->pb, header_len - 3 + stuffing_size);
746
747 if (pes_flags & 0x80) /*write pts*/
748 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
749 if (pes_flags & 0x40) /*write dts*/
750 put_timestamp(&ctx->pb, 0x01, dts);
751
752 if (pes_flags & 0x01) { /*write pes extension*/
753 put_byte(&ctx->pb, 0x10); /* flags */
754
755 /* P-STD buffer info */
756 if (id == AUDIO_ID)
757 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
758 else
759 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
760 }
761
Michel Bardiaux27a206e2003-12-09 18:06:18762 } else {
Hauke Duden24515922004-02-19 22:34:13763 if (pts != AV_NOPTS_VALUE) {
764 if (dts != pts) {
765 put_timestamp(&ctx->pb, 0x03, pts);
766 put_timestamp(&ctx->pb, 0x01, dts);
767 } else {
768 put_timestamp(&ctx->pb, 0x02, pts);
769 }
Michel Bardiaux27a206e2003-12-09 18:06:18770 } else {
Hauke Duden24515922004-02-19 22:34:13771 put_byte(&ctx->pb, 0x0f);
Michel Bardiaux27a206e2003-12-09 18:06:18772 }
Michel Bardiaux27a206e2003-12-09 18:06:18773 }
Hauke Duden24515922004-02-19 22:34:13774
Sidik Isani9e9080b2004-05-25 23:06:00775 if (s->is_mpeg2) {
776 /* special stuffing byte that is always written
777 to prevent accidental generation of start codes. */
778 put_byte(&ctx->pb, 0xff);
779
780 for(i=0;i<stuffing_size;i++)
781 put_byte(&ctx->pb, 0xff);
782 }
783
Hauke Duden24515922004-02-19 22:34:13784 if (startcode == PRIVATE_STREAM_1) {
785 put_byte(&ctx->pb, id);
786 if (id >= 0xa0) {
787 /* LPCM (XXX: check nb_frames) */
788 put_byte(&ctx->pb, 7);
789 put_be16(&ctx->pb, 4); /* skip 3 header bytes */
790 put_byte(&ctx->pb, stream->lpcm_header[0]);
791 put_byte(&ctx->pb, stream->lpcm_header[1]);
792 put_byte(&ctx->pb, stream->lpcm_header[2]);
793 } else {
794 /* AC3 */
Michael Niedermayer7000a172004-10-03 02:42:01795 put_byte(&ctx->pb, nb_frames);
796 put_be16(&ctx->pb, trailer_size+1);
Hauke Duden24515922004-02-19 22:34:13797 }
798 }
799
Hauke Duden24515922004-02-19 22:34:13800 /* output data */
Michael Niedermayer7000a172004-10-03 02:42:01801 if(put_fifo(&ctx->pb, &stream->fifo, payload_size - stuffing_size, &stream->fifo.rptr) < 0)
802 return -1;
803 }else{
804 payload_size=
805 stuffing_size= 0;
Fabrice Bellardfb7566d2002-10-15 10:22:23806 }
Fabrice Bellardde6d9b62001-07-22 14:18:56807
Hauke Duden24515922004-02-19 22:34:13808 if (pad_packet_bytes > 0)
809 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
Fabrice Bellardde6d9b62001-07-22 14:18:56810
Hauke Duden24515922004-02-19 22:34:13811 for(i=0;i<zero_trail_bytes;i++)
812 put_byte(&ctx->pb, 0x00);
813
Fabrice Bellardde6d9b62001-07-22 14:18:56814 put_flush_packet(&ctx->pb);
815
Fabrice Bellardde6d9b62001-07-22 14:18:56816 s->packet_number++;
Hauke Duden22494482004-04-26 22:16:06817
818 /* only increase the stream packet number if this pack actually contains
819 something that is specific to this stream! I.e. a dedicated header
820 or some data.*/
821 if (!general_pack)
822 stream->packet_number++;
Michael Niedermayer7000a172004-10-03 02:42:01823
824 return payload_size - stuffing_size;
Fabrice Bellardde6d9b62001-07-22 14:18:56825}
826
Hauke Duden24515922004-02-19 22:34:13827static void put_vcd_padding_sector(AVFormatContext *ctx)
828{
829 /* There are two ways to do this padding: writing a sector/pack
830 of 0 values, or writing an MPEG padding pack. Both seem to
831 work with most decoders, BUT the VCD standard only allows a 0-sector
832 (see standard p. IV-4, IV-5).
833 So a 0-sector it is...*/
834
835 MpegMuxContext *s = ctx->priv_data;
836 int i;
837
838 for(i=0;i<s->packet_size;i++)
839 put_byte(&ctx->pb, 0);
840
841 s->vcd_padding_bytes_written += s->packet_size;
842
843 put_flush_packet(&ctx->pb);
844
845 /* increasing the packet number is correct. The SCR of the following packs
846 is calculated from the packet_number and it has to include the padding
847 sector (it represents the sector index, not the MPEG pack index)
848 (see VCD standard p. IV-6)*/
849 s->packet_number++;
850}
851
Michael Niedermayer92050932004-10-03 02:57:42852static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
Hauke Duden24515922004-02-19 22:34:13853{
854 MpegMuxContext *s = ctx->priv_data;
855 int64_t scr;
Hauke Duden24515922004-02-19 22:34:13856
Hauke Duden24515922004-02-19 22:34:13857 /* Since the data delivery rate is constant, SCR is computed
858 using the formula C + i * 1200 where C is the start constant
859 and i is the pack index.
860 It is recommended that SCR 0 is at the beginning of the VCD front
861 margin (a sequence of empty Form 2 sectors on the CD).
862 It is recommended that the front margin is 30 sectors long, so
863 we use C = 30*1200 = 36000
864 (Note that even if the front margin is not 30 sectors the file
865 will still be correct according to the standard. It just won't have
866 the "recommended" value).*/
867 scr = 36000 + s->packet_number * 1200;
Hauke Duden22494482004-04-26 22:16:06868
Hauke Duden24515922004-02-19 22:34:13869 return scr;
870}
871
Michael Niedermayer7000a172004-10-03 02:42:01872static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
873// MpegMuxContext *s = ctx->priv_data;
874 int i;
875
876 for(i=0; i<ctx->nb_streams; i++){
877 AVStream *st = ctx->streams[i];
878 StreamInfo *stream = st->priv_data;
879 PacketDesc *pkt_desc= stream->predecode_packet;
880
881 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
882 if(stream->buffer_index < pkt_desc->size ||
883 stream->predecode_packet == stream->premux_packet){
884 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
885 break;
886 }
887 stream->buffer_index -= pkt_desc->size;
888
889 stream->predecode_packet= pkt_desc->next;
890 av_freep(&pkt_desc);
891 }
892 }
893
894 return 0;
895}
896
897static int output_packet(AVFormatContext *ctx, int flush){
898 MpegMuxContext *s = ctx->priv_data;
899 AVStream *st;
900 StreamInfo *stream;
901 int i, avail_space, es_size, trailer_size;
902 int best_i= -1;
903 int best_score= INT_MIN;
904 int ignore_constraints=0;
905 int64_t scr= s->last_scr;
Michael Niedermayerbc3429e2004-10-03 11:16:40906 PacketDesc *timestamp_packet;
Michael Niedermayer7000a172004-10-03 02:42:01907
908retry:
909 for(i=0; i<ctx->nb_streams; i++){
910 AVStream *st = ctx->streams[i];
911 StreamInfo *stream = st->priv_data;
912 const int avail_data= fifo_size(&stream->fifo, stream->fifo.rptr);
913 const int space= stream->max_buffer_size - stream->buffer_index;
914 int rel_space= 1024*space / stream->max_buffer_size;
915
916 if(s->packet_size > avail_data && !flush)
917 return 0;
918 if(avail_data==0)
919 continue;
920 assert(avail_data>0);
921
922 if(space < s->packet_size && !ignore_constraints)
923 continue;
924
925 if(rel_space > best_score){
926 best_score= rel_space;
927 best_i = i;
928 avail_space= space;
929 }
930 }
931
932 if(best_i < 0){
933 int64_t best_dts= INT64_MAX;
934
935 for(i=0; i<ctx->nb_streams; i++){
936 AVStream *st = ctx->streams[i];
937 StreamInfo *stream = st->priv_data;
938 PacketDesc *pkt_desc= stream->predecode_packet;
939 if(pkt_desc && pkt_desc->dts < best_dts)
940 best_dts= pkt_desc->dts;
941 }
942
943#if 0
944 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
945 scr/90000.0, best_dts/90000.0);
946#endif
947 if(best_dts == INT64_MAX)
948 return 0;
949
950 if(scr >= best_dts+1 && !ignore_constraints){
951 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
952 ignore_constraints= 1;
953 }
954 scr= FFMAX(best_dts+1, scr);
955 if(remove_decoded_packets(ctx, scr) < 0)
956 return -1;
957 goto retry;
958 }
959
960 assert(best_i >= 0);
961
962 st = ctx->streams[best_i];
963 stream = st->priv_data;
964
965 assert(fifo_size(&stream->fifo, stream->fifo.rptr) > 0);
966
967 assert(avail_space >= s->packet_size || ignore_constraints);
968
Michael Niedermayerbc3429e2004-10-03 11:16:40969 timestamp_packet= stream->premux_packet;
970 if(timestamp_packet->unwritten_size == timestamp_packet->size){
Michael Niedermayer7000a172004-10-03 02:42:01971 trailer_size= 0;
Michael Niedermayerbc3429e2004-10-03 11:16:40972 }else{
973 trailer_size= timestamp_packet->unwritten_size;
974 timestamp_packet= timestamp_packet->next;
975 }
Michael Niedermayer7000a172004-10-03 02:42:01976
Michael Niedermayerbc3429e2004-10-03 11:16:40977 if(timestamp_packet){
Michael Niedermayer2db3c632004-10-06 22:29:30978//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);
Michael Niedermayerbc3429e2004-10-03 11:16:40979 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
980 }else{
981 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);
982 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
983 }
Michael Niedermayer7000a172004-10-03 02:42:01984
985 if (s->is_vcd) {
986 /* Write one or more padding sectors, if necessary, to reach
987 the constant overall bitrate.*/
988 int vcd_pad_bytes;
989
Michael Niedermayer92050932004-10-03 02:57:42990 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
Michael Niedermayer7000a172004-10-03 02:42:01991 put_vcd_padding_sector(ctx);
992 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
993 }
994 }
995
996 stream->buffer_index += es_size;
997 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
998
999 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
1000 es_size -= stream->premux_packet->unwritten_size;
1001 stream->premux_packet= stream->premux_packet->next;
1002 }
1003 if(es_size)
1004 stream->premux_packet->unwritten_size -= es_size;
1005
1006 if(remove_decoded_packets(ctx, s->last_scr) < 0)
1007 return -1;
1008
1009 return 1;
1010}
Hauke Duden24515922004-02-19 22:34:131011
Michael Niedermayere9286492004-05-29 02:06:321012static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
Fabrice Bellardde6d9b62001-07-22 14:18:561013{
1014 MpegMuxContext *s = ctx->priv_data;
Michael Niedermayere9286492004-05-29 02:06:321015 int stream_index= pkt->stream_index;
1016 int size= pkt->size;
1017 uint8_t *buf= pkt->data;
Fabrice Bellardde6d9b62001-07-22 14:18:561018 AVStream *st = ctx->streams[stream_index];
1019 StreamInfo *stream = st->priv_data;
Michael Niedermayer92050932004-10-03 02:57:421020 int64_t pts, dts;
Michael Niedermayer7000a172004-10-03 02:42:011021 PacketDesc *pkt_desc;
Hauke Duden24515922004-02-19 22:34:131022
Michael Niedermayere9286492004-05-29 02:06:321023 pts= pkt->pts;
1024 dts= pkt->dts;
Fabrice Bellarde45f1942003-12-18 13:03:371025
Hauke Duden22494482004-04-26 22:16:061026 if(s->is_vcd) {
1027 /* We have to offset the PTS, so that it is consistent with the SCR.
1028 SCR starts at 36000, but the first two packs contain only padding
1029 and the first pack from the other stream, respectively, may also have
1030 been written before.
1031 So the real data starts at SCR 36000+3*1200. */
Michael Niedermayer6c55b272004-10-07 01:55:341032 if(pts != AV_NOPTS_VALUE) pts += 36000 + 3600;
1033 if(dts != AV_NOPTS_VALUE) dts += 36000 + 3600;
Michael Niedermayer7000a172004-10-03 02:42:011034 }else{
Michael Niedermayer6c55b272004-10-07 01:55:341035 if(pts != AV_NOPTS_VALUE) pts += PRELOAD;
1036 if(dts != AV_NOPTS_VALUE) dts += PRELOAD;
Michael Niedermayer7000a172004-10-03 02:42:011037 }
Michael Niedermayer6c55b272004-10-07 01:55:341038//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);
Michael Niedermayer7000a172004-10-03 02:42:011039 *stream->next_packet=
1040 pkt_desc= av_mallocz(sizeof(PacketDesc));
1041 pkt_desc->pts= pts;
1042 pkt_desc->dts= dts;
1043 pkt_desc->unwritten_size=
1044 pkt_desc->size= size;
1045 if(!stream->predecode_packet)
1046 stream->predecode_packet= pkt_desc;
1047 stream->next_packet= &pkt_desc->next;
1048
1049 if(stream->fifo.end - stream->fifo.buffer - fifo_size(&stream->fifo, stream->fifo.rptr) < size){
1050 av_log(ctx, AV_LOG_ERROR, "fifo overflow\n");
1051 return -1;
1052 }
1053 fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr);
1054
1055 for(;;){
1056 int ret= output_packet(ctx, 0);
Michael Niedermayer92050932004-10-03 02:57:421057 if(ret<=0)
Michael Niedermayer7000a172004-10-03 02:42:011058 return ret;
Hauke Duden22494482004-04-26 22:16:061059 }
Fabrice Bellardde6d9b62001-07-22 14:18:561060}
1061
1062static int mpeg_mux_end(AVFormatContext *ctx)
1063{
Michael Niedermayer7000a172004-10-03 02:42:011064// MpegMuxContext *s = ctx->priv_data;
Fabrice Bellardde6d9b62001-07-22 14:18:561065 StreamInfo *stream;
1066 int i;
Michael Niedermayer7000a172004-10-03 02:42:011067
1068 for(;;){
1069 int ret= output_packet(ctx, 1);
1070 if(ret<0)
1071 return ret;
1072 else if(ret==0)
1073 break;
Fabrice Bellardde6d9b62001-07-22 14:18:561074 }
1075
Fabrice Bellardfa0f62c2003-09-10 22:44:301076 /* End header according to MPEG1 systems standard. We do not write
1077 it as it is usually not needed by decoders and because it
1078 complicates MPEG stream concatenation. */
Juanjo92b3e122002-05-12 21:38:541079 //put_be32(&ctx->pb, ISO_11172_END_CODE);
1080 //put_flush_packet(&ctx->pb);
Michael Niedermayer9d90c372003-09-09 19:32:521081
Michael Niedermayer7000a172004-10-03 02:42:011082 for(i=0;i<ctx->nb_streams;i++) {
1083 stream = ctx->streams[i]->priv_data;
1084
1085 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == 0);
1086 fifo_free(&stream->fifo);
1087 }
Fabrice Bellardde6d9b62001-07-22 14:18:561088 return 0;
1089}
Mike Melanson764ef402003-10-14 04:15:531090#endif //CONFIG_ENCODERS
Fabrice Bellardde6d9b62001-07-22 14:18:561091
1092/*********************************************/
1093/* demux code */
1094
1095#define MAX_SYNC_SIZE 100000
1096
Fabrice Bellarddb7f1f92002-05-20 16:29:401097static int mpegps_probe(AVProbeData *p)
1098{
Michael Niedermayer95f97de2004-10-01 16:00:001099 int i;
1100 int size= FFMIN(20, p->buf_size);
1101 uint32_t code=0xFF;
Fabrice Bellarddb7f1f92002-05-20 16:29:401102
Fabrice Bellarddb7f1f92002-05-20 16:29:401103 /* we search the first start code. If it is a packet start code,
1104 then we decide it is mpeg ps. We do not send highest value to
1105 give a chance to mpegts */
Fabrice Bellardfa7773212003-02-02 20:04:031106 /* NOTE: the search range was restricted to avoid too many false
1107 detections */
1108
Michael Niedermayer95f97de2004-10-01 16:00:001109 for (i = 0; i < size; i++) {
1110 code = (code << 8) | p->buf[i];
Isaac Richardsec23a472003-07-10 09:04:041111 if ((code & 0xffffff00) == 0x100) {
1112 if (code == PACK_START_CODE ||
1113 code == SYSTEM_HEADER_START_CODE ||
1114 (code >= 0x1e0 && code <= 0x1ef) ||
1115 (code >= 0x1c0 && code <= 0x1df) ||
1116 code == PRIVATE_STREAM_2 ||
1117 code == PROGRAM_STREAM_MAP ||
1118 code == PRIVATE_STREAM_1 ||
1119 code == PADDING_STREAM)
Michael Niedermayer149f7c02003-09-01 18:30:021120 return AVPROBE_SCORE_MAX - 2;
Isaac Richardsec23a472003-07-10 09:04:041121 else
1122 return 0;
1123 }
Fabrice Bellarddb7f1f92002-05-20 16:29:401124 }
1125 return 0;
1126}
1127
1128
Fabrice Bellardde6d9b62001-07-22 14:18:561129typedef struct MpegDemuxContext {
1130 int header_state;
Fabrice Bellardde6d9b62001-07-22 14:18:561131} MpegDemuxContext;
1132
Fabrice Bellard27f388a2003-11-10 18:47:521133static int mpegps_read_header(AVFormatContext *s,
1134 AVFormatParameters *ap)
1135{
1136 MpegDemuxContext *m = s->priv_data;
1137 m->header_state = 0xff;
1138 s->ctx_flags |= AVFMTCTX_NOHEADER;
1139
1140 /* no need to do more */
1141 return 0;
1142}
1143
1144static int64_t get_pts(ByteIOContext *pb, int c)
1145{
1146 int64_t pts;
1147 int val;
1148
1149 if (c < 0)
1150 c = get_byte(pb);
1151 pts = (int64_t)((c >> 1) & 0x07) << 30;
1152 val = get_be16(pb);
1153 pts |= (int64_t)(val >> 1) << 15;
1154 val = get_be16(pb);
1155 pts |= (int64_t)(val >> 1);
1156 return pts;
1157}
1158
1159static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
1160 uint32_t *header_state)
Fabrice Bellardde6d9b62001-07-22 14:18:561161{
1162 unsigned int state, v;
1163 int val, n;
1164
1165 state = *header_state;
1166 n = *size_ptr;
1167 while (n > 0) {
1168 if (url_feof(pb))
1169 break;
1170 v = get_byte(pb);
1171 n--;
1172 if (state == 0x000001) {
1173 state = ((state << 8) | v) & 0xffffff;
1174 val = state;
1175 goto found;
1176 }
1177 state = ((state << 8) | v) & 0xffffff;
1178 }
1179 val = -1;
1180 found:
1181 *header_state = state;
1182 *size_ptr = n;
1183 return val;
1184}
1185
Fabrice Bellard27f388a2003-11-10 18:47:521186/* XXX: optimize */
1187static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
Juanjo001e3f52002-03-17 17:44:451188{
Fabrice Bellard27f388a2003-11-10 18:47:521189 int64_t pos, pos_start;
1190 int max_size, start_code;
Fabrice Bellardda24c5e2003-10-29 14:20:561191
Fabrice Bellard27f388a2003-11-10 18:47:521192 max_size = *size_ptr;
1193 pos_start = url_ftell(pb);
1194
1195 /* in order to go faster, we fill the buffer */
1196 pos = pos_start - 16386;
1197 if (pos < 0)
1198 pos = 0;
1199 url_fseek(pb, pos, SEEK_SET);
1200 get_byte(pb);
1201
1202 pos = pos_start;
1203 for(;;) {
1204 pos--;
1205 if (pos < 0 || (pos_start - pos) >= max_size) {
1206 start_code = -1;
1207 goto the_end;
1208 }
1209 url_fseek(pb, pos, SEEK_SET);
1210 start_code = get_be32(pb);
1211 if ((start_code & 0xffffff00) == 0x100)
1212 break;
1213 }
1214 the_end:
1215 *size_ptr = pos_start - pos;
1216 return start_code;
Fabrice Bellardde6d9b62001-07-22 14:18:561217}
1218
Michael Niedermayer8d14a252004-04-12 16:50:031219/* read the next PES header. Return its position in ppos
Fabrice Bellard27f388a2003-11-10 18:47:521220 (if not NULL), and its start code, pts and dts.
1221 */
1222static int mpegps_read_pes_header(AVFormatContext *s,
1223 int64_t *ppos, int *pstart_code,
Michael Niedermayer8d14a252004-04-12 16:50:031224 int64_t *ppts, int64_t *pdts)
Fabrice Bellardde6d9b62001-07-22 14:18:561225{
1226 MpegDemuxContext *m = s->priv_data;
Fabrice Bellard27f388a2003-11-10 18:47:521227 int len, size, startcode, c, flags, header_len;
1228 int64_t pts, dts, last_pos;
Fabrice Bellardde6d9b62001-07-22 14:18:561229
Fabrice Bellard27f388a2003-11-10 18:47:521230 last_pos = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561231 redo:
Fabrice Bellard27f388a2003-11-10 18:47:521232 /* next start code (should be immediately after) */
1233 m->header_state = 0xff;
1234 size = MAX_SYNC_SIZE;
1235 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
Juanjo001e3f52002-03-17 17:44:451236 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
Fabrice Bellardde6d9b62001-07-22 14:18:561237 if (startcode < 0)
Mike Melanson0bd586c2004-06-19 03:59:341238 return AVERROR_IO;
Fabrice Bellardde6d9b62001-07-22 14:18:561239 if (startcode == PACK_START_CODE)
1240 goto redo;
1241 if (startcode == SYSTEM_HEADER_START_CODE)
1242 goto redo;
1243 if (startcode == PADDING_STREAM ||
1244 startcode == PRIVATE_STREAM_2) {
1245 /* skip them */
1246 len = get_be16(&s->pb);
1247 url_fskip(&s->pb, len);
1248 goto redo;
1249 }
1250 /* find matching stream */
1251 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
1252 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
1253 (startcode == 0x1bd)))
1254 goto redo;
Fabrice Bellard27f388a2003-11-10 18:47:521255 if (ppos) {
1256 *ppos = url_ftell(&s->pb) - 4;
1257 }
Fabrice Bellardde6d9b62001-07-22 14:18:561258 len = get_be16(&s->pb);
Fabrice Bellardb2cac182002-10-21 15:57:211259 pts = AV_NOPTS_VALUE;
1260 dts = AV_NOPTS_VALUE;
Fabrice Bellardde6d9b62001-07-22 14:18:561261 /* stuffing */
1262 for(;;) {
Fabrice Bellard27f388a2003-11-10 18:47:521263 if (len < 1)
1264 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561265 c = get_byte(&s->pb);
1266 len--;
1267 /* XXX: for mpeg1, should test only bit 7 */
1268 if (c != 0xff)
1269 break;
1270 }
1271 if ((c & 0xc0) == 0x40) {
1272 /* buffer scale & size */
Fabrice Bellard27f388a2003-11-10 18:47:521273 if (len < 2)
1274 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561275 get_byte(&s->pb);
1276 c = get_byte(&s->pb);
1277 len -= 2;
1278 }
1279 if ((c & 0xf0) == 0x20) {
Fabrice Bellard27f388a2003-11-10 18:47:521280 if (len < 4)
1281 goto redo;
1282 dts = pts = get_pts(&s->pb, c);
Fabrice Bellardde6d9b62001-07-22 14:18:561283 len -= 4;
Fabrice Bellardde6d9b62001-07-22 14:18:561284 } else if ((c & 0xf0) == 0x30) {
Fabrice Bellard27f388a2003-11-10 18:47:521285 if (len < 9)
1286 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561287 pts = get_pts(&s->pb, c);
1288 dts = get_pts(&s->pb, -1);
1289 len -= 9;
1290 } else if ((c & 0xc0) == 0x80) {
1291 /* mpeg 2 PES */
1292 if ((c & 0x30) != 0) {
Fabrice Bellard27f388a2003-11-10 18:47:521293 /* Encrypted multiplex not handled */
1294 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561295 }
1296 flags = get_byte(&s->pb);
1297 header_len = get_byte(&s->pb);
1298 len -= 2;
1299 if (header_len > len)
1300 goto redo;
Fabrice Bellard1e5c6672002-10-04 15:46:591301 if ((flags & 0xc0) == 0x80) {
Fabrice Bellard27f388a2003-11-10 18:47:521302 dts = pts = get_pts(&s->pb, -1);
1303 if (header_len < 5)
1304 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561305 header_len -= 5;
1306 len -= 5;
1307 } if ((flags & 0xc0) == 0xc0) {
1308 pts = get_pts(&s->pb, -1);
1309 dts = get_pts(&s->pb, -1);
Fabrice Bellard27f388a2003-11-10 18:47:521310 if (header_len < 10)
1311 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561312 header_len -= 10;
1313 len -= 10;
1314 }
1315 len -= header_len;
1316 while (header_len > 0) {
1317 get_byte(&s->pb);
1318 header_len--;
1319 }
1320 }
Dmitry Borisovdf70de12004-04-23 21:02:011321 else if( c!= 0xf )
1322 goto redo;
1323
Fabrice Bellardde6d9b62001-07-22 14:18:561324 if (startcode == 0x1bd) {
Fabrice Bellard27f388a2003-11-10 18:47:521325 if (len < 1)
1326 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561327 startcode = get_byte(&s->pb);
1328 len--;
1329 if (startcode >= 0x80 && startcode <= 0xbf) {
1330 /* audio: skip header */
Fabrice Bellard27f388a2003-11-10 18:47:521331 if (len < 3)
1332 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561333 get_byte(&s->pb);
1334 get_byte(&s->pb);
1335 get_byte(&s->pb);
1336 len -= 3;
1337 }
1338 }
Michael Niedermayerb7549782004-01-13 22:02:491339 if(dts != AV_NOPTS_VALUE && ppos){
1340 int i;
1341 for(i=0; i<s->nb_streams; i++){
1342 if(startcode == s->streams[i]->id) {
Michael Niedermayercdd50342004-05-23 16:26:121343 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0 /* FIXME keyframe? */);
Michael Niedermayerb7549782004-01-13 22:02:491344 }
1345 }
1346 }
1347
Fabrice Bellard27f388a2003-11-10 18:47:521348 *pstart_code = startcode;
1349 *ppts = pts;
1350 *pdts = dts;
1351 return len;
1352}
1353
1354static int mpegps_read_packet(AVFormatContext *s,
1355 AVPacket *pkt)
1356{
1357 AVStream *st;
Mike Melanson0bd586c2004-06-19 03:59:341358 int len, startcode, i, type, codec_id = 0;
Michael Niedermayerb7549782004-01-13 22:02:491359 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
Fabrice Bellard27f388a2003-11-10 18:47:521360
1361 redo:
Michael Niedermayer8d14a252004-04-12 16:50:031362 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
Fabrice Bellard27f388a2003-11-10 18:47:521363 if (len < 0)
1364 return len;
Michel Bardiaux27a206e2003-12-09 18:06:181365
Fabrice Bellardde6d9b62001-07-22 14:18:561366 /* now find stream */
1367 for(i=0;i<s->nb_streams;i++) {
1368 st = s->streams[i];
1369 if (st->id == startcode)
1370 goto found;
1371 }
Fabrice Bellarddb7f1f92002-05-20 16:29:401372 if (startcode >= 0x1e0 && startcode <= 0x1ef) {
1373 type = CODEC_TYPE_VIDEO;
Fabrice Bellard0dbb48d2003-12-16 11:25:301374 codec_id = CODEC_ID_MPEG2VIDEO;
Fabrice Bellarddb7f1f92002-05-20 16:29:401375 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
1376 type = CODEC_TYPE_AUDIO;
1377 codec_id = CODEC_ID_MP2;
Michael Niedermayer23c99252004-07-14 01:32:141378 } else if (startcode >= 0x80 && startcode <= 0x89) {
Fabrice Bellarddb7f1f92002-05-20 16:29:401379 type = CODEC_TYPE_AUDIO;
1380 codec_id = CODEC_ID_AC3;
Michael Niedermayer23c99252004-07-14 01:32:141381 } else if (startcode >= 0x8a && startcode <= 0x9f) {
1382 type = CODEC_TYPE_AUDIO;
1383 codec_id = CODEC_ID_DTS;
Fabrice Bellard9ec05e32003-01-31 17:04:461384 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
1385 type = CODEC_TYPE_AUDIO;
1386 codec_id = CODEC_ID_PCM_S16BE;
Fabrice Bellarddb7f1f92002-05-20 16:29:401387 } else {
1388 skip:
1389 /* skip packet */
1390 url_fskip(&s->pb, len);
1391 goto redo;
1392 }
Fabrice Bellard1e5c6672002-10-04 15:46:591393 /* no stream found: add a new stream */
1394 st = av_new_stream(s, startcode);
1395 if (!st)
1396 goto skip;
Fabrice Bellarddb7f1f92002-05-20 16:29:401397 st->codec.codec_type = type;
1398 st->codec.codec_id = codec_id;
Fabrice Bellard27f388a2003-11-10 18:47:521399 if (codec_id != CODEC_ID_PCM_S16BE)
1400 st->need_parsing = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561401 found:
Fabrice Bellard9ec05e32003-01-31 17:04:461402 if (startcode >= 0xa0 && startcode <= 0xbf) {
1403 int b1, freq;
Fabrice Bellard9ec05e32003-01-31 17:04:461404
1405 /* for LPCM, we just skip the header and consider it is raw
1406 audio data */
1407 if (len <= 3)
1408 goto skip;
1409 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
1410 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
1411 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
1412 len -= 3;
1413 freq = (b1 >> 4) & 3;
1414 st->codec.sample_rate = lpcm_freq_tab[freq];
1415 st->codec.channels = 1 + (b1 & 7);
1416 st->codec.bit_rate = st->codec.channels * st->codec.sample_rate * 2;
1417 }
Fabrice Bellardde6d9b62001-07-22 14:18:561418 av_new_packet(pkt, len);
1419 get_buffer(&s->pb, pkt->data, pkt->size);
1420 pkt->pts = pts;
Fabrice Bellard27f388a2003-11-10 18:47:521421 pkt->dts = dts;
Fabrice Bellarddb7f1f92002-05-20 16:29:401422 pkt->stream_index = st->index;
Michel Bardiaux27a206e2003-12-09 18:06:181423#if 0
Michael Niedermayer3c895fc2004-05-29 18:50:311424 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f\n",
Michel Bardiaux27a206e2003-12-09 18:06:181425 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0);
1426#endif
Mike Melanson0bd586c2004-06-19 03:59:341427
Fabrice Bellardde6d9b62001-07-22 14:18:561428 return 0;
1429}
1430
Fabrice Bellarddb7f1f92002-05-20 16:29:401431static int mpegps_read_close(AVFormatContext *s)
Juanjo001e3f52002-03-17 17:44:451432{
Fabrice Bellardde6d9b62001-07-22 14:18:561433 return 0;
1434}
1435
Fabrice Bellard27f388a2003-11-10 18:47:521436static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
Michael Niedermayer8d14a252004-04-12 16:50:031437 int64_t *ppos, int64_t pos_limit)
Fabrice Bellard27f388a2003-11-10 18:47:521438{
1439 int len, startcode;
1440 int64_t pos, pts, dts;
1441
1442 pos = *ppos;
1443#ifdef DEBUG_SEEK
1444 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
1445#endif
1446 url_fseek(&s->pb, pos, SEEK_SET);
1447 for(;;) {
Michael Niedermayer8d14a252004-04-12 16:50:031448 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
Fabrice Bellard27f388a2003-11-10 18:47:521449 if (len < 0) {
1450#ifdef DEBUG_SEEK
1451 printf("none (ret=%d)\n", len);
1452#endif
1453 return AV_NOPTS_VALUE;
1454 }
1455 if (startcode == s->streams[stream_index]->id &&
1456 dts != AV_NOPTS_VALUE) {
1457 break;
1458 }
Michael Niedermayer8d14a252004-04-12 16:50:031459 url_fskip(&s->pb, len);
Fabrice Bellard27f388a2003-11-10 18:47:521460 }
1461#ifdef DEBUG_SEEK
1462 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
1463#endif
1464 *ppos = pos;
Michael Niedermayercdd50342004-05-23 16:26:121465 return dts;
Fabrice Bellard27f388a2003-11-10 18:47:521466}
1467
Mike Melanson764ef402003-10-14 04:15:531468#ifdef CONFIG_ENCODERS
Fabrice Bellardfb7566d2002-10-15 10:22:231469static AVOutputFormat mpeg1system_mux = {
Fabrice Bellardde6d9b62001-07-22 14:18:561470 "mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231471 "MPEG1 System format",
Ryutaroh Matsumotoc6c11cb2002-12-20 23:10:581472 "video/mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231473 "mpg,mpeg",
1474 sizeof(MpegMuxContext),
1475 CODEC_ID_MP2,
1476 CODEC_ID_MPEG1VIDEO,
1477 mpeg_mux_init,
1478 mpeg_mux_write_packet,
1479 mpeg_mux_end,
1480};
1481
1482static AVOutputFormat mpeg1vcd_mux = {
1483 "vcd",
1484 "MPEG1 System format (VCD)",
Ryutaroh Matsumotoc6c11cb2002-12-20 23:10:581485 "video/mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231486 NULL,
1487 sizeof(MpegMuxContext),
1488 CODEC_ID_MP2,
1489 CODEC_ID_MPEG1VIDEO,
1490 mpeg_mux_init,
1491 mpeg_mux_write_packet,
1492 mpeg_mux_end,
1493};
1494
1495static AVOutputFormat mpeg2vob_mux = {
1496 "vob",
1497 "MPEG2 PS format (VOB)",
Ryutaroh Matsumotoc6c11cb2002-12-20 23:10:581498 "video/mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231499 "vob",
Fabrice Bellarddb7f1f92002-05-20 16:29:401500 sizeof(MpegMuxContext),
Fabrice Bellardde6d9b62001-07-22 14:18:561501 CODEC_ID_MP2,
Fabrice Bellard0dbb48d2003-12-16 11:25:301502 CODEC_ID_MPEG2VIDEO,
Fabrice Bellardde6d9b62001-07-22 14:18:561503 mpeg_mux_init,
1504 mpeg_mux_write_packet,
1505 mpeg_mux_end,
Fabrice Bellardde6d9b62001-07-22 14:18:561506};
Hauke Duden24515922004-02-19 22:34:131507
1508/* Same as mpeg2vob_mux except that the pack size is 2324 */
1509static AVOutputFormat mpeg2svcd_mux = {
1510 "svcd",
1511 "MPEG2 PS format (VOB)",
1512 "video/mpeg",
1513 "vob",
1514 sizeof(MpegMuxContext),
1515 CODEC_ID_MP2,
1516 CODEC_ID_MPEG2VIDEO,
1517 mpeg_mux_init,
1518 mpeg_mux_write_packet,
1519 mpeg_mux_end,
1520};
1521
Paul Curtis78a0efb2004-10-03 18:21:451522/* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1523static AVOutputFormat mpeg2dvd_mux = {
1524 "dvd",
1525 "MPEG2 PS format (DVD VOB)",
1526 "video/mpeg",
1527 "dvd",
1528 sizeof(MpegMuxContext),
1529 CODEC_ID_MP2,
1530 CODEC_ID_MPEG2VIDEO,
1531 mpeg_mux_init,
1532 mpeg_mux_write_packet,
1533 mpeg_mux_end,
1534};
Hauke Duden24515922004-02-19 22:34:131535
Mike Melanson764ef402003-10-14 04:15:531536#endif //CONFIG_ENCODERS
Fabrice Bellarddb7f1f92002-05-20 16:29:401537
Fabrice Bellard32f38cb2003-08-08 17:54:051538AVInputFormat mpegps_demux = {
Fabrice Bellarddb7f1f92002-05-20 16:29:401539 "mpeg",
1540 "MPEG PS format",
1541 sizeof(MpegDemuxContext),
1542 mpegps_probe,
1543 mpegps_read_header,
1544 mpegps_read_packet,
1545 mpegps_read_close,
Michael Niedermayer8d14a252004-04-12 16:50:031546 NULL, //mpegps_read_seek,
1547 mpegps_read_dts,
Fabrice Bellarddb7f1f92002-05-20 16:29:401548};
1549
1550int mpegps_init(void)
1551{
Mike Melanson764ef402003-10-14 04:15:531552#ifdef CONFIG_ENCODERS
Fabrice Bellardfb7566d2002-10-15 10:22:231553 av_register_output_format(&mpeg1system_mux);
1554 av_register_output_format(&mpeg1vcd_mux);
1555 av_register_output_format(&mpeg2vob_mux);
Hauke Duden24515922004-02-19 22:34:131556 av_register_output_format(&mpeg2svcd_mux);
Paul Curtis78a0efb2004-10-03 18:21:451557 av_register_output_format(&mpeg2dvd_mux);
Mike Melanson764ef402003-10-14 04:15:531558#endif //CONFIG_ENCODERS
Fabrice Bellarddb7f1f92002-05-20 16:29:401559 av_register_input_format(&mpegps_demux);
1560 return 0;
1561}