blob: 4bebdba6fafbe259b5e73a857548b88b1d4d7580 [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"
Michael Niedermayer2de77952004-12-29 18:31:2820#include "bitstream.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5621
22#define MAX_PAYLOAD_SIZE 4096
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;
Michael Niedermayercbb6e402004-11-21 03:37:3348 uint8_t *fifo_iframe_ptr;
49 int align_iframe;
Chriss7be806f2005-02-09 03:00:5050 int64_t vobu_start_pts;
Fabrice Bellardde6d9b62001-07-22 14:18:5651} StreamInfo;
52
53typedef struct {
54 int packet_size; /* required packet size */
Fabrice Bellardde6d9b62001-07-22 14:18:5655 int packet_number;
56 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
57 int system_header_freq;
Fabrice Bellard0dbb48d2003-12-16 11:25:3058 int system_header_size;
Fabrice Bellardde6d9b62001-07-22 14:18:5659 int mux_rate; /* bitrate in units of 50 bytes/s */
60 /* stream info */
61 int audio_bound;
62 int video_bound;
Fabrice Bellardfb7566d2002-10-15 10:22:2363 int is_mpeg2;
64 int is_vcd;
Hauke Duden24515922004-02-19 22:34:1365 int is_svcd;
Paul Curtis78a0efb2004-10-03 18:21:4566 int is_dvd;
Michel Bardiaux27a206e2003-12-09 18:06:1867 int64_t last_scr; /* current system clock */
Hauke Duden24515922004-02-19 22:34:1368
Michael Niedermayerd8b5abf2004-10-01 20:05:0469 double vcd_padding_bitrate; //FIXME floats
Hauke Duden24515922004-02-19 22:34:1370 int64_t vcd_padding_bytes_written;
71
Fabrice Bellardde6d9b62001-07-22 14:18:5672} MpegMuxContext;
73
74#define PACK_START_CODE ((unsigned int)0x000001ba)
75#define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
Juanjo92b3e122002-05-12 21:38:5476#define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
Fabrice Bellardde6d9b62001-07-22 14:18:5677#define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
78#define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
79#define ISO_11172_END_CODE ((unsigned int)0x000001b9)
Diego Biurrun115329f2005-12-17 18:14:3880
Fabrice Bellardde6d9b62001-07-22 14:18:5681/* mpeg2 */
82#define PROGRAM_STREAM_MAP 0x1bc
83#define PRIVATE_STREAM_1 0x1bd
84#define PADDING_STREAM 0x1be
85#define PRIVATE_STREAM_2 0x1bf
86
87
88#define AUDIO_ID 0xc0
89#define VIDEO_ID 0xe0
Fabrice Bellard044007c2003-12-16 14:00:1890#define AC3_ID 0x80
Michael Niedermayer23c99252004-07-14 01:32:1491#define DTS_ID 0x8a
Fabrice Bellard044007c2003-12-16 14:00:1892#define LPCM_ID 0xa0
Aurelien Jacobs9ba73f12005-06-15 20:50:1293#define SUB_ID 0x20
Fabrice Bellardde6d9b62001-07-22 14:18:5694
Måns Rullgårde3d1cd82005-03-28 17:33:2195#define STREAM_TYPE_VIDEO_MPEG1 0x01
96#define STREAM_TYPE_VIDEO_MPEG2 0x02
97#define STREAM_TYPE_AUDIO_MPEG1 0x03
98#define STREAM_TYPE_AUDIO_MPEG2 0x04
99#define STREAM_TYPE_PRIVATE_SECTION 0x05
100#define STREAM_TYPE_PRIVATE_DATA 0x06
101#define STREAM_TYPE_AUDIO_AAC 0x0f
102#define STREAM_TYPE_VIDEO_MPEG4 0x10
103#define STREAM_TYPE_VIDEO_H264 0x1b
104
105#define STREAM_TYPE_AUDIO_AC3 0x81
106#define STREAM_TYPE_AUDIO_DTS 0x8a
107
Michael Niedermayer8a05bca2004-01-17 22:02:07108static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
109
Diego Biurruna9e350952005-09-23 00:25:41110#ifdef CONFIG_MUXERS
Falk Hüffner79060852004-03-24 23:32:48111static AVOutputFormat mpeg1system_mux;
112static AVOutputFormat mpeg1vcd_mux;
113static AVOutputFormat mpeg2vob_mux;
114static AVOutputFormat mpeg2svcd_mux;
Paul Curtis78a0efb2004-10-03 18:21:45115static AVOutputFormat mpeg2dvd_mux;
Fabrice Bellardfb7566d2002-10-15 10:22:23116
Diego Biurrun115329f2005-12-17 18:14:38117static int put_pack_header(AVFormatContext *ctx,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48118 uint8_t *buf, int64_t timestamp)
Fabrice Bellardde6d9b62001-07-22 14:18:56119{
120 MpegMuxContext *s = ctx->priv_data;
121 PutBitContext pb;
Diego Biurrun115329f2005-12-17 18:14:38122
Alex Beregszaszi117a5492003-10-13 10:59:57123 init_put_bits(&pb, buf, 128);
Fabrice Bellardde6d9b62001-07-22 14:18:56124
125 put_bits(&pb, 32, PACK_START_CODE);
Fabrice Bellardb2cac182002-10-21 15:57:21126 if (s->is_mpeg2) {
Måns Rullgård8683e4a2003-07-15 22:15:37127 put_bits(&pb, 2, 0x1);
Fabrice Bellardb2cac182002-10-21 15:57:21128 } else {
129 put_bits(&pb, 4, 0x2);
130 }
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48131 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
Fabrice Bellardde6d9b62001-07-22 14:18:56132 put_bits(&pb, 1, 1);
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48133 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
Fabrice Bellardde6d9b62001-07-22 14:18:56134 put_bits(&pb, 1, 1);
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48135 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
Fabrice Bellardde6d9b62001-07-22 14:18:56136 put_bits(&pb, 1, 1);
Fabrice Bellardb2cac182002-10-21 15:57:21137 if (s->is_mpeg2) {
138 /* clock extension */
139 put_bits(&pb, 9, 0);
Fabrice Bellardb2cac182002-10-21 15:57:21140 }
Fabrice Bellardde6d9b62001-07-22 14:18:56141 put_bits(&pb, 1, 1);
142 put_bits(&pb, 22, s->mux_rate);
143 put_bits(&pb, 1, 1);
Fabrice Bellardb2cac182002-10-21 15:57:21144 if (s->is_mpeg2) {
Michael Niedermayer4aa533b2004-02-01 13:06:46145 put_bits(&pb, 1, 1);
Fabrice Bellardb2cac182002-10-21 15:57:21146 put_bits(&pb, 5, 0x1f); /* reserved */
147 put_bits(&pb, 3, 0); /* stuffing length */
148 }
Fabrice Bellardde6d9b62001-07-22 14:18:56149 flush_put_bits(&pb);
Michael Niedermayer17592472002-02-12 15:43:16150 return pbBufPtr(&pb) - pb.buf;
Fabrice Bellardde6d9b62001-07-22 14:18:56151}
152
Hauke Duden24515922004-02-19 22:34:13153static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
Fabrice Bellardde6d9b62001-07-22 14:18:56154{
155 MpegMuxContext *s = ctx->priv_data;
Michael Niedermayer7000a172004-10-03 02:42:01156 int size, i, private_stream_coded, id;
Fabrice Bellardde6d9b62001-07-22 14:18:56157 PutBitContext pb;
158
Alex Beregszaszi117a5492003-10-13 10:59:57159 init_put_bits(&pb, buf, 128);
Fabrice Bellardde6d9b62001-07-22 14:18:56160
161 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
162 put_bits(&pb, 16, 0);
163 put_bits(&pb, 1, 1);
Diego Biurrun115329f2005-12-17 18:14:38164
Michael Niedermayer7000a172004-10-03 02:42:01165 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
Fabrice Bellardde6d9b62001-07-22 14:18:56166 put_bits(&pb, 1, 1); /* marker */
Hauke Duden24515922004-02-19 22:34:13167 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
168 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
169 put_bits(&pb, 6, 0);
170 } else
171 put_bits(&pb, 6, s->audio_bound);
Fabrice Bellardde6d9b62001-07-22 14:18:56172
Hauke Duden22494482004-04-26 22:16:06173 if (s->is_vcd) {
174 /* see VCD standard, p. IV-7*/
Diego Biurrun115329f2005-12-17 18:14:38175 put_bits(&pb, 1, 0);
Hauke Duden22494482004-04-26 22:16:06176 put_bits(&pb, 1, 1);
177 } else {
178 put_bits(&pb, 1, 0); /* variable bitrate*/
179 put_bits(&pb, 1, 0); /* non constrainted bit stream */
180 }
Diego Biurrun115329f2005-12-17 18:14:38181
Michael Niedermayercbb6e402004-11-21 03:37:33182 if (s->is_vcd || s->is_dvd) {
Hauke Duden24515922004-02-19 22:34:13183 /* see VCD standard p IV-7 */
184 put_bits(&pb, 1, 1); /* audio locked */
185 put_bits(&pb, 1, 1); /* video locked */
186 } else {
187 put_bits(&pb, 1, 0); /* audio locked */
188 put_bits(&pb, 1, 0); /* video locked */
189 }
190
Fabrice Bellardde6d9b62001-07-22 14:18:56191 put_bits(&pb, 1, 1); /* marker */
192
Hauke Duden24515922004-02-19 22:34:13193 if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
194 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
195 put_bits(&pb, 5, 0);
196 } else
197 put_bits(&pb, 5, s->video_bound);
Diego Biurrun115329f2005-12-17 18:14:38198
Michael Niedermayercbb6e402004-11-21 03:37:33199 if (s->is_dvd) {
200 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
201 put_bits(&pb, 7, 0x7f); /* reserved byte */
202 } else
203 put_bits(&pb, 8, 0xff); /* reserved byte */
Diego Biurrun115329f2005-12-17 18:14:38204
Michael Niedermayercbb6e402004-11-21 03:37:33205 /* DVD-Video Stream_bound entries
Diego Biurrun115329f2005-12-17 18:14:38206 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
207 id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
208 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
Michael Niedermayercbb6e402004-11-21 03:37:33209 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
210 if (s->is_dvd) {
Diego Biurrun115329f2005-12-17 18:14:38211
Michael Niedermayercbb6e402004-11-21 03:37:33212 int P_STD_max_video = 0;
213 int P_STD_max_mpeg_audio = 0;
214 int P_STD_max_mpeg_PS1 = 0;
Diego Biurrun115329f2005-12-17 18:14:38215
Michael Niedermayercbb6e402004-11-21 03:37:33216 for(i=0;i<ctx->nb_streams;i++) {
217 StreamInfo *stream = ctx->streams[i]->priv_data;
Hauke Duden24515922004-02-19 22:34:13218
219 id = stream->id;
Michael Niedermayercbb6e402004-11-21 03:37:33220 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
221 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
222 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
223 P_STD_max_mpeg_audio = stream->max_buffer_size;
224 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
225 P_STD_max_video = stream->max_buffer_size;
Hauke Duden24515922004-02-19 22:34:13226 }
Michael Niedermayercbb6e402004-11-21 03:37:33227 }
228
229 /* video */
230 put_bits(&pb, 8, 0xb9); /* stream ID */
231 put_bits(&pb, 2, 3);
232 put_bits(&pb, 1, 1);
233 put_bits(&pb, 13, P_STD_max_video / 1024);
234
235 /* audio */
236 if (P_STD_max_mpeg_audio == 0)
237 P_STD_max_mpeg_audio = 4096;
238 put_bits(&pb, 8, 0xb8); /* stream ID */
239 put_bits(&pb, 2, 3);
240 put_bits(&pb, 1, 0);
241 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
242
243 /* private stream 1 */
244 put_bits(&pb, 8, 0xbd); /* stream ID */
245 put_bits(&pb, 2, 3);
246 put_bits(&pb, 1, 0);
247 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
248
249 /* private stream 2 */
250 put_bits(&pb, 8, 0xbf); /* stream ID */
251 put_bits(&pb, 2, 3);
252 put_bits(&pb, 1, 1);
253 put_bits(&pb, 13, 2);
254 }
255 else {
256 /* audio stream info */
257 private_stream_coded = 0;
258 for(i=0;i<ctx->nb_streams;i++) {
259 StreamInfo *stream = ctx->streams[i]->priv_data;
Diego Biurrun115329f2005-12-17 18:14:38260
Michael Niedermayercbb6e402004-11-21 03:37:33261
262 /* For VCDs, only include the stream info for the stream
263 that the pack which contains this system belongs to.
264 (see VCD standard p. IV-7) */
265 if ( !s->is_vcd || stream->id==only_for_stream_id
266 || only_for_stream_id==0) {
267
268 id = stream->id;
269 if (id < 0xc0) {
270 /* special case for private streams (AC3 use that) */
271 if (private_stream_coded)
272 continue;
273 private_stream_coded = 1;
274 id = 0xbd;
275 }
276 put_bits(&pb, 8, id); /* stream ID */
277 put_bits(&pb, 2, 3);
278 if (id < 0xe0) {
279 /* audio */
280 put_bits(&pb, 1, 0);
281 put_bits(&pb, 13, stream->max_buffer_size / 128);
282 } else {
283 /* video */
284 put_bits(&pb, 1, 1);
285 put_bits(&pb, 13, stream->max_buffer_size / 1024);
286 }
Hauke Duden24515922004-02-19 22:34:13287 }
Fabrice Bellardde6d9b62001-07-22 14:18:56288 }
289 }
Michael Niedermayercbb6e402004-11-21 03:37:33290
Fabrice Bellardde6d9b62001-07-22 14:18:56291 flush_put_bits(&pb);
Michael Niedermayer17592472002-02-12 15:43:16292 size = pbBufPtr(&pb) - pb.buf;
Fabrice Bellardde6d9b62001-07-22 14:18:56293 /* patch packet size */
294 buf[4] = (size - 6) >> 8;
295 buf[5] = (size - 6) & 0xff;
296
297 return size;
298}
299
Fabrice Bellard0dbb48d2003-12-16 11:25:30300static int get_system_header_size(AVFormatContext *ctx)
301{
302 int buf_index, i, private_stream_coded;
303 StreamInfo *stream;
Michael Niedermayercbb6e402004-11-21 03:37:33304 MpegMuxContext *s = ctx->priv_data;
305
306 if (s->is_dvd)
307 return 18; // DVD-Video system headers are 18 bytes fixed length.
Fabrice Bellard0dbb48d2003-12-16 11:25:30308
309 buf_index = 12;
310 private_stream_coded = 0;
311 for(i=0;i<ctx->nb_streams;i++) {
312 stream = ctx->streams[i]->priv_data;
313 if (stream->id < 0xc0) {
314 if (private_stream_coded)
315 continue;
316 private_stream_coded = 1;
317 }
318 buf_index += 3;
319 }
320 return buf_index;
321}
322
Fabrice Bellardde6d9b62001-07-22 14:18:56323static int mpeg_mux_init(AVFormatContext *ctx)
324{
Fabrice Bellarddb7f1f92002-05-20 16:29:40325 MpegMuxContext *s = ctx->priv_data;
Aurelien Jacobs9ba73f12005-06-15 20:50:12326 int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
Fabrice Bellardde6d9b62001-07-22 14:18:56327 AVStream *st;
328 StreamInfo *stream;
Hauke Duden24515922004-02-19 22:34:13329 int audio_bitrate;
330 int video_bitrate;
Fabrice Bellardde6d9b62001-07-22 14:18:56331
Fabrice Bellardde6d9b62001-07-22 14:18:56332 s->packet_number = 0;
Fabrice Bellardfb7566d2002-10-15 10:22:23333 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux);
Hauke Duden24515922004-02-19 22:34:13334 s->is_svcd = (ctx->oformat == &mpeg2svcd_mux);
Paul Curtis78a0efb2004-10-03 18:21:45335 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
336 s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
Diego Biurrun115329f2005-12-17 18:14:38337
Michael Niedermayer2db3c632004-10-06 22:29:30338 if(ctx->packet_size)
339 s->packet_size = ctx->packet_size;
Juanjo92b3e122002-05-12 21:38:54340 else
341 s->packet_size = 2048;
Diego Biurrun115329f2005-12-17 18:14:38342
Hauke Duden24515922004-02-19 22:34:13343 s->vcd_padding_bytes_written = 0;
344 s->vcd_padding_bitrate=0;
Diego Biurrun115329f2005-12-17 18:14:38345
Fabrice Bellardde6d9b62001-07-22 14:18:56346 s->audio_bound = 0;
347 s->video_bound = 0;
348 mpa_id = AUDIO_ID;
Fabrice Bellard044007c2003-12-16 14:00:18349 ac3_id = AC3_ID;
Michael Niedermayer23c99252004-07-14 01:32:14350 dts_id = DTS_ID;
Fabrice Bellardde6d9b62001-07-22 14:18:56351 mpv_id = VIDEO_ID;
Aurelien Jacobs9ba73f12005-06-15 20:50:12352 mps_id = SUB_ID;
Fabrice Bellard044007c2003-12-16 14:00:18353 lpcm_id = LPCM_ID;
Fabrice Bellardde6d9b62001-07-22 14:18:56354 for(i=0;i<ctx->nb_streams;i++) {
355 st = ctx->streams[i];
356 stream = av_mallocz(sizeof(StreamInfo));
357 if (!stream)
358 goto fail;
359 st->priv_data = stream;
360
Michael Niedermayer2031ba12004-10-03 12:17:46361 av_set_pts_info(st, 64, 1, 90000);
362
Michael Niedermayer01f48952005-07-17 22:24:36363 switch(st->codec->codec_type) {
Fabrice Bellardde6d9b62001-07-22 14:18:56364 case CODEC_TYPE_AUDIO:
Michael Niedermayer01f48952005-07-17 22:24:36365 if (st->codec->codec_id == CODEC_ID_AC3) {
Fabrice Bellardde6d9b62001-07-22 14:18:56366 stream->id = ac3_id++;
Michael Niedermayer01f48952005-07-17 22:24:36367 } else if (st->codec->codec_id == CODEC_ID_DTS) {
Michael Niedermayer23c99252004-07-14 01:32:14368 stream->id = dts_id++;
Michael Niedermayer01f48952005-07-17 22:24:36369 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
Fabrice Bellard044007c2003-12-16 14:00:18370 stream->id = lpcm_id++;
371 for(j = 0; j < 4; j++) {
Michael Niedermayer01f48952005-07-17 22:24:36372 if (lpcm_freq_tab[j] == st->codec->sample_rate)
Fabrice Bellard044007c2003-12-16 14:00:18373 break;
374 }
375 if (j == 4)
376 goto fail;
Michael Niedermayer01f48952005-07-17 22:24:36377 if (st->codec->channels > 8)
Fabrice Bellard044007c2003-12-16 14:00:18378 return -1;
379 stream->lpcm_header[0] = 0x0c;
Michael Niedermayer01f48952005-07-17 22:24:36380 stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
Fabrice Bellard044007c2003-12-16 14:00:18381 stream->lpcm_header[2] = 0x80;
Michael Niedermayer01f48952005-07-17 22:24:36382 stream->lpcm_align = st->codec->channels * 2;
Fabrice Bellard044007c2003-12-16 14:00:18383 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:56384 stream->id = mpa_id++;
Fabrice Bellard044007c2003-12-16 14:00:18385 }
Hauke Duden22494482004-04-26 22:16:06386
387 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
388 Right now it is also used for everything else.*/
Diego Biurrun115329f2005-12-17 18:14:38389 stream->max_buffer_size = 4 * 1024;
Fabrice Bellardde6d9b62001-07-22 14:18:56390 s->audio_bound++;
391 break;
392 case CODEC_TYPE_VIDEO:
393 stream->id = mpv_id++;
Michael Niedermayer01f48952005-07-17 22:24:36394 if (st->codec->rc_buffer_size)
395 stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
Michael Niedermayer7e051552004-10-03 03:14:09396 else
397 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
398#if 0
Hauke Duden22494482004-04-26 22:16:06399 /* see VCD standard, p. IV-7*/
Diego Biurrun115329f2005-12-17 18:14:38400 stream->max_buffer_size = 46 * 1024;
Hauke Duden22494482004-04-26 22:16:06401 else
402 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
403 Right now it is also used for everything else.*/
Diego Biurrun115329f2005-12-17 18:14:38404 stream->max_buffer_size = 230 * 1024;
Michael Niedermayer7e051552004-10-03 03:14:09405#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56406 s->video_bound++;
407 break;
Aurelien Jacobs9ba73f12005-06-15 20:50:12408 case CODEC_TYPE_SUBTITLE:
409 stream->id = mps_id++;
410 stream->max_buffer_size = 16 * 1024;
411 break;
Philip Gladstoneac5e6a52002-05-09 01:19:33412 default:
Michael Niedermayer71c32f12004-10-01 13:16:16413 return -1;
Fabrice Bellardde6d9b62001-07-22 14:18:56414 }
Michael Niedermayer0d712402004-12-01 02:28:28415 fifo_init(&stream->fifo, 16);
Fabrice Bellardde6d9b62001-07-22 14:18:56416 }
Hauke Duden24515922004-02-19 22:34:13417 bitrate = 0;
418 audio_bitrate = 0;
419 video_bitrate = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56420 for(i=0;i<ctx->nb_streams;i++) {
Michael Niedermayer7000a172004-10-03 02:42:01421 int codec_rate;
Fabrice Bellardde6d9b62001-07-22 14:18:56422 st = ctx->streams[i];
Hauke Duden24515922004-02-19 22:34:13423 stream = (StreamInfo*) st->priv_data;
Michael Niedermayer7000a172004-10-03 02:42:01424
Michael Niedermayer01f48952005-07-17 22:24:36425 if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
426 codec_rate= st->codec->rc_max_rate;
Michael Niedermayer7000a172004-10-03 02:42:01427 else
Michael Niedermayer01f48952005-07-17 22:24:36428 codec_rate= st->codec->bit_rate;
Diego Biurrun115329f2005-12-17 18:14:38429
Michael Niedermayer7000a172004-10-03 02:42:01430 if(!codec_rate)
431 codec_rate= (1<<21)*8*50/ctx->nb_streams;
Diego Biurrun115329f2005-12-17 18:14:38432
Michael Niedermayer7000a172004-10-03 02:42:01433 bitrate += codec_rate;
Hauke Duden24515922004-02-19 22:34:13434
435 if (stream->id==AUDIO_ID)
Michael Niedermayer7000a172004-10-03 02:42:01436 audio_bitrate += codec_rate;
Hauke Duden24515922004-02-19 22:34:13437 else if (stream->id==VIDEO_ID)
Michael Niedermayer7000a172004-10-03 02:42:01438 video_bitrate += codec_rate;
Fabrice Bellardde6d9b62001-07-22 14:18:56439 }
Diego Biurrun115329f2005-12-17 18:14:38440
Michael Niedermayer2db3c632004-10-06 22:29:30441 if(ctx->mux_rate){
442 s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
443 } else {
444 /* we increase slightly the bitrate to take into account the
445 headers. XXX: compute it exactly */
446 bitrate += bitrate*5/100;
447 bitrate += 10000;
448 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
449 }
Hauke Duden24515922004-02-19 22:34:13450
451 if (s->is_vcd) {
452 double overhead_rate;
453
454 /* The VCD standard mandates that the mux_rate field is 3528
455 (see standard p. IV-6).
456 The value is actually "wrong", i.e. if you calculate
457 it using the normal formula and the 75 sectors per second transfer
458 rate you get a different value because the real pack size is 2324,
459 not 2352. But the standard explicitly specifies that the mux_rate
460 field in the header must have this value.*/
Michael Niedermayer2db3c632004-10-06 22:29:30461// s->mux_rate=2352 * 75 / 50; /* = 3528*/
Hauke Duden24515922004-02-19 22:34:13462
463 /* The VCD standard states that the muxed stream must be
464 exactly 75 packs / second (the data rate of a single speed cdrom).
465 Since the video bitrate (probably 1150000 bits/sec) will be below
466 the theoretical maximum we have to add some padding packets
467 to make up for the lower data rate.
468 (cf. VCD standard p. IV-6 )*/
469
470 /* Add the header overhead to the data rate.
471 2279 data bytes per audio pack, 2294 data bytes per video pack*/
472 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
473 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
474 overhead_rate *= 8;
Diego Biurrun115329f2005-12-17 18:14:38475
Hauke Duden24515922004-02-19 22:34:13476 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
477 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
Hauke Duden24515922004-02-19 22:34:13478 }
Diego Biurrun115329f2005-12-17 18:14:38479
Fabrice Bellardfb7566d2002-10-15 10:22:23480 if (s->is_vcd || s->is_mpeg2)
Juanjo92b3e122002-05-12 21:38:54481 /* every packet */
482 s->pack_header_freq = 1;
483 else
484 /* every 2 seconds */
485 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
Michael Niedermayerb623bbc2003-10-28 10:55:15486
487 /* the above seems to make pack_header_freq zero sometimes */
488 if (s->pack_header_freq == 0)
489 s->pack_header_freq = 1;
Diego Biurrun115329f2005-12-17 18:14:38490
Fabrice Bellardb2cac182002-10-21 15:57:21491 if (s->is_mpeg2)
492 /* every 200 packets. Need to look at the spec. */
493 s->system_header_freq = s->pack_header_freq * 40;
494 else if (s->is_vcd)
Hauke Duden24515922004-02-19 22:34:13495 /* the standard mandates that there are only two system headers
496 in the whole file: one in the first packet of each stream.
497 (see standard p. IV-7 and IV-8) */
498 s->system_header_freq = 0x7fffffff;
Juanjo92b3e122002-05-12 21:38:54499 else
Juanjo92b3e122002-05-12 21:38:54500 s->system_header_freq = s->pack_header_freq * 5;
Diego Biurrun115329f2005-12-17 18:14:38501
Fabrice Bellardde6d9b62001-07-22 14:18:56502 for(i=0;i<ctx->nb_streams;i++) {
503 stream = ctx->streams[i]->priv_data;
Fabrice Bellardde6d9b62001-07-22 14:18:56504 stream->packet_number = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56505 }
Fabrice Bellard0dbb48d2003-12-16 11:25:30506 s->system_header_size = get_system_header_size(ctx);
Michel Bardiaux27a206e2003-12-09 18:06:18507 s->last_scr = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56508 return 0;
509 fail:
510 for(i=0;i<ctx->nb_streams;i++) {
Fabrice Bellard1ea4f592002-05-18 23:11:09511 av_free(ctx->streams[i]->priv_data);
Fabrice Bellardde6d9b62001-07-22 14:18:56512 }
Fabrice Bellardde6d9b62001-07-22 14:18:56513 return -ENOMEM;
514}
515
Michel Bardiaux27a206e2003-12-09 18:06:18516static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
517{
Diego Biurrun115329f2005-12-17 18:14:38518 put_byte(pb,
519 (id << 4) |
520 (((timestamp >> 30) & 0x07) << 1) |
Michel Bardiaux27a206e2003-12-09 18:06:18521 1);
522 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
523 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
524}
525
Fabrice Bellard0dbb48d2003-12-16 11:25:30526
Hauke Duden24515922004-02-19 22:34:13527/* return the number of padding bytes that should be inserted into
528 the multiplexed stream.*/
529static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
530{
531 MpegMuxContext *s = ctx->priv_data;
532 int pad_bytes = 0;
533
534 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
535 {
536 int64_t full_pad_bytes;
Diego Biurrun115329f2005-12-17 18:14:38537
Michael Niedermayer7000a172004-10-03 02:42:01538 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
Hauke Duden24515922004-02-19 22:34:13539 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
540
541 if (pad_bytes<0)
542 /* might happen if we have already padded to a later timestamp. This
543 can occur if another stream has already advanced further.*/
544 pad_bytes=0;
545 }
546
547 return pad_bytes;
548}
549
550
Måns Rullgård88730be2005-02-24 19:08:50551#if 0 /* unused, remove? */
Fabrice Bellard0dbb48d2003-12-16 11:25:30552/* return the exact available payload size for the next packet for
553 stream 'stream_index'. 'pts' and 'dts' are only used to know if
554 timestamps are needed in the packet header. */
555static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
556 int64_t pts, int64_t dts)
557{
558 MpegMuxContext *s = ctx->priv_data;
559 int buf_index;
560 StreamInfo *stream;
561
Hauke Duden24515922004-02-19 22:34:13562 stream = ctx->streams[stream_index]->priv_data;
563
Fabrice Bellard0dbb48d2003-12-16 11:25:30564 buf_index = 0;
565 if (((s->packet_number % s->pack_header_freq) == 0)) {
566 /* pack header size */
Diego Biurrun115329f2005-12-17 18:14:38567 if (s->is_mpeg2)
Fabrice Bellard0dbb48d2003-12-16 11:25:30568 buf_index += 14;
569 else
570 buf_index += 12;
Diego Biurrun115329f2005-12-17 18:14:38571
Hauke Duden24515922004-02-19 22:34:13572 if (s->is_vcd) {
573 /* there is exactly one system header for each stream in a VCD MPEG,
574 One in the very first video packet and one in the very first
575 audio packet (see VCD standard p. IV-7 and IV-8).*/
Diego Biurrun115329f2005-12-17 18:14:38576
Hauke Duden24515922004-02-19 22:34:13577 if (stream->packet_number==0)
578 /* The system headers refer only to the stream they occur in,
579 so they have a constant size.*/
580 buf_index += 15;
581
Diego Biurrun115329f2005-12-17 18:14:38582 } else {
Hauke Duden24515922004-02-19 22:34:13583 if ((s->packet_number % s->system_header_freq) == 0)
584 buf_index += s->system_header_size;
585 }
Fabrice Bellard0dbb48d2003-12-16 11:25:30586 }
587
Hauke Duden22494482004-04-26 22:16:06588 if ((s->is_vcd && stream->packet_number==0)
589 || (s->is_svcd && s->packet_number==0))
Hauke Duden24515922004-02-19 22:34:13590 /* the first pack of each stream contains only the pack header,
Diego Biurrun115329f2005-12-17 18:14:38591 the system header and some padding (see VCD standard p. IV-6)
Hauke Duden24515922004-02-19 22:34:13592 Add the padding size, so that the actual payload becomes 0.*/
593 buf_index += s->packet_size - buf_index;
594 else {
595 /* packet header size */
596 buf_index += 6;
Hauke Duden22494482004-04-26 22:16:06597 if (s->is_mpeg2) {
Fabrice Bellard044007c2003-12-16 14:00:18598 buf_index += 3;
Hauke Duden22494482004-04-26 22:16:06599 if (stream->packet_number==0)
600 buf_index += 3; /* PES extension */
601 buf_index += 1; /* obligatory stuffing byte */
602 }
Hauke Duden24515922004-02-19 22:34:13603 if (pts != AV_NOPTS_VALUE) {
604 if (dts != pts)
605 buf_index += 5 + 5;
606 else
607 buf_index += 5;
608
609 } else {
610 if (!s->is_mpeg2)
611 buf_index++;
Fabrice Bellard044007c2003-12-16 14:00:18612 }
Diego Biurrun115329f2005-12-17 18:14:38613
Hauke Duden24515922004-02-19 22:34:13614 if (stream->id < 0xc0) {
615 /* AC3/LPCM private data header */
616 buf_index += 4;
617 if (stream->id >= 0xa0) {
618 int n;
619 buf_index += 3;
620 /* NOTE: we round the payload size to an integer number of
621 LPCM samples */
622 n = (s->packet_size - buf_index) % stream->lpcm_align;
623 if (n)
624 buf_index += (stream->lpcm_align - n);
625 }
626 }
627
628 if (s->is_vcd && stream->id == AUDIO_ID)
629 /* The VCD standard demands that 20 zero bytes follow
630 each audio packet (see standard p. IV-8).*/
631 buf_index+=20;
Fabrice Bellard0dbb48d2003-12-16 11:25:30632 }
Diego Biurrun115329f2005-12-17 18:14:38633 return s->packet_size - buf_index;
Fabrice Bellard0dbb48d2003-12-16 11:25:30634}
Måns Rullgård88730be2005-02-24 19:08:50635#endif
Fabrice Bellard0dbb48d2003-12-16 11:25:30636
Hauke Duden24515922004-02-19 22:34:13637/* Write an MPEG padding packet header. */
Hauke Duden24515922004-02-19 22:34:13638static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
639{
Michael Niedermayerd8b5abf2004-10-01 20:05:04640 MpegMuxContext *s = ctx->priv_data;
641 int i;
Diego Biurrun115329f2005-12-17 18:14:38642
Michael Niedermayerd8b5abf2004-10-01 20:05:04643 put_be32(pb, PADDING_STREAM);
644 put_be16(pb, packet_bytes - 6);
645 if (!s->is_mpeg2) {
646 put_byte(pb, 0x0f);
647 packet_bytes -= 7;
648 } else
649 packet_bytes -= 6;
Hauke Duden24515922004-02-19 22:34:13650
651 for(i=0;i<packet_bytes;i++)
652 put_byte(pb, 0xff);
653}
654
Michael Niedermayer7000a172004-10-03 02:42:01655static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
656 int nb_frames=0;
657 PacketDesc *pkt_desc= stream->premux_packet;
658
Diego Biurrun115329f2005-12-17 18:14:38659 while(len>0){
Michael Niedermayer7000a172004-10-03 02:42:01660 if(pkt_desc->size == pkt_desc->unwritten_size)
661 nb_frames++;
662 len -= pkt_desc->unwritten_size;
663 pkt_desc= pkt_desc->next;
664 }
665
666 return nb_frames;
667}
Hauke Duden24515922004-02-19 22:34:13668
Fabrice Bellardde6d9b62001-07-22 14:18:56669/* flush the packet on stream stream_index */
Diego Biurrun115329f2005-12-17 18:14:38670static int flush_packet(AVFormatContext *ctx, int stream_index,
Michael Niedermayer7000a172004-10-03 02:42:01671 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
Fabrice Bellardde6d9b62001-07-22 14:18:56672{
673 MpegMuxContext *s = ctx->priv_data;
674 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48675 uint8_t *buf_ptr;
Fabrice Bellard0dbb48d2003-12-16 11:25:30676 int size, payload_size, startcode, id, stuffing_size, i, header_len;
677 int packet_size;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48678 uint8_t buffer[128];
Hauke Duden24515922004-02-19 22:34:13679 int zero_trail_bytes = 0;
680 int pad_packet_bytes = 0;
Hauke Duden22494482004-04-26 22:16:06681 int pes_flags;
682 int general_pack = 0; /*"general" pack without data specific to one stream?*/
Michael Niedermayer7000a172004-10-03 02:42:01683 int nb_frames;
Diego Biurrun115329f2005-12-17 18:14:38684
Fabrice Bellardde6d9b62001-07-22 14:18:56685 id = stream->id;
Diego Biurrun115329f2005-12-17 18:14:38686
Fabrice Bellardde6d9b62001-07-22 14:18:56687#if 0
Diego Biurrun115329f2005-12-17 18:14:38688 printf("packet ID=%2x PTS=%0.3f\n",
Michel Bardiaux27a206e2003-12-09 18:06:18689 id, pts / 90000.0);
Fabrice Bellardde6d9b62001-07-22 14:18:56690#endif
691
692 buf_ptr = buffer;
Hauke Duden24515922004-02-19 22:34:13693
Michael Niedermayer7000a172004-10-03 02:42:01694 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
Fabrice Bellardde6d9b62001-07-22 14:18:56695 /* output pack and systems header if needed */
Michel Bardiaux27a206e2003-12-09 18:06:18696 size = put_pack_header(ctx, buf_ptr, scr);
Fabrice Bellardde6d9b62001-07-22 14:18:56697 buf_ptr += size;
Michael Niedermayer7000a172004-10-03 02:42:01698 s->last_scr= scr;
Hauke Duden24515922004-02-19 22:34:13699
700 if (s->is_vcd) {
701 /* there is exactly one system header for each stream in a VCD MPEG,
702 One in the very first video packet and one in the very first
703 audio packet (see VCD standard p. IV-7 and IV-8).*/
Diego Biurrun115329f2005-12-17 18:14:38704
Hauke Duden24515922004-02-19 22:34:13705 if (stream->packet_number==0) {
706 size = put_system_header(ctx, buf_ptr, id);
707 buf_ptr += size;
708 }
Chriss7e0fda02004-11-23 22:25:12709 } else if (s->is_dvd) {
710 if (stream->align_iframe || s->packet_number == 0){
711 int bytes_to_iframe;
712 int PES_bytes_to_fill;
713 if (stream->fifo_iframe_ptr >= stream->fifo.rptr) {
714 bytes_to_iframe = stream->fifo_iframe_ptr - stream->fifo.rptr;
715 } else {
716 bytes_to_iframe = (stream->fifo.end - stream->fifo.rptr) + (stream->fifo_iframe_ptr - stream->fifo.buffer);
717 }
718 PES_bytes_to_fill = s->packet_size - size - 10;
719
720 if (pts != AV_NOPTS_VALUE) {
721 if (dts != pts)
722 PES_bytes_to_fill -= 5 + 5;
723 else
724 PES_bytes_to_fill -= 5;
725 }
726
727 if (bytes_to_iframe == 0 || s->packet_number == 0) {
728 size = put_system_header(ctx, buf_ptr, 0);
729 buf_ptr += size;
730 size = buf_ptr - buffer;
731 put_buffer(&ctx->pb, buffer, size);
732
733 put_be32(&ctx->pb, PRIVATE_STREAM_2);
734 put_be16(&ctx->pb, 0x03d4); // length
735 put_byte(&ctx->pb, 0x00); // substream ID, 00=PCI
736 for (i = 0; i < 979; i++)
737 put_byte(&ctx->pb, 0x00);
738
739 put_be32(&ctx->pb, PRIVATE_STREAM_2);
740 put_be16(&ctx->pb, 0x03fa); // length
741 put_byte(&ctx->pb, 0x01); // substream ID, 01=DSI
742 for (i = 0; i < 1017; i++)
743 put_byte(&ctx->pb, 0x00);
744
745 memset(buffer, 0, 128);
746 buf_ptr = buffer;
747 s->packet_number++;
748 stream->align_iframe = 0;
749 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
750 size = put_pack_header(ctx, buf_ptr, scr);
751 s->last_scr= scr;
752 buf_ptr += size;
753 /* GOP Start */
754 } else if (bytes_to_iframe < PES_bytes_to_fill) {
755 pad_packet_bytes = PES_bytes_to_fill - bytes_to_iframe;
756 }
757 }
Hauke Duden24515922004-02-19 22:34:13758 } else {
759 if ((s->packet_number % s->system_header_freq) == 0) {
760 size = put_system_header(ctx, buf_ptr, 0);
761 buf_ptr += size;
762 }
Fabrice Bellardde6d9b62001-07-22 14:18:56763 }
764 }
765 size = buf_ptr - buffer;
766 put_buffer(&ctx->pb, buffer, size);
767
Hauke Duden24515922004-02-19 22:34:13768 packet_size = s->packet_size - size;
769
770 if (s->is_vcd && id == AUDIO_ID)
771 /* The VCD standard demands that 20 zero bytes follow
772 each audio pack (see standard p. IV-8).*/
773 zero_trail_bytes += 20;
Diego Biurrun115329f2005-12-17 18:14:38774
Hauke Duden22494482004-04-26 22:16:06775 if ((s->is_vcd && stream->packet_number==0)
776 || (s->is_svcd && s->packet_number==0)) {
777 /* for VCD the first pack of each stream contains only the pack header,
Hauke Duden24515922004-02-19 22:34:13778 the system header and lots of padding (see VCD standard p. IV-6).
779 In the case of an audio pack, 20 zero bytes are also added at
780 the end.*/
Hauke Duden22494482004-04-26 22:16:06781 /* For SVCD we fill the very first pack to increase compatibility with
782 some DVD players. Not mandated by the standard.*/
783 if (s->is_svcd)
784 general_pack = 1; /* the system header refers to both streams and no stream data*/
Hauke Duden24515922004-02-19 22:34:13785 pad_packet_bytes = packet_size - zero_trail_bytes;
Fabrice Bellardfb7566d2002-10-15 10:22:23786 }
Hauke Duden24515922004-02-19 22:34:13787
788 packet_size -= pad_packet_bytes + zero_trail_bytes;
789
790 if (packet_size > 0) {
791
792 /* packet header size */
793 packet_size -= 6;
Diego Biurrun115329f2005-12-17 18:14:38794
Hauke Duden24515922004-02-19 22:34:13795 /* packet header */
796 if (s->is_mpeg2) {
797 header_len = 3;
Hauke Duden22494482004-04-26 22:16:06798 if (stream->packet_number==0)
799 header_len += 3; /* PES extension */
800 header_len += 1; /* obligatory stuffing byte */
Hauke Duden24515922004-02-19 22:34:13801 } else {
802 header_len = 0;
803 }
804 if (pts != AV_NOPTS_VALUE) {
805 if (dts != pts)
806 header_len += 5 + 5;
807 else
808 header_len += 5;
809 } else {
810 if (!s->is_mpeg2)
811 header_len++;
812 }
813
814 payload_size = packet_size - header_len;
815 if (id < 0xc0) {
816 startcode = PRIVATE_STREAM_1;
Aurelien Jacobs9ba73f12005-06-15 20:50:12817 payload_size -= 1;
818 if (id >= 0x40) {
Hauke Duden24515922004-02-19 22:34:13819 payload_size -= 3;
Aurelien Jacobs9ba73f12005-06-15 20:50:12820 if (id >= 0xa0)
821 payload_size -= 3;
822 }
Hauke Duden24515922004-02-19 22:34:13823 } else {
824 startcode = 0x100 + id;
825 }
826
Michael Niedermayer7000a172004-10-03 02:42:01827 stuffing_size = payload_size - fifo_size(&stream->fifo, stream->fifo.rptr);
828
829 // first byte doesnt fit -> reset pts/dts + stuffing
830 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
831 int timestamp_len=0;
Diego Biurrun115329f2005-12-17 18:14:38832 if(dts != pts)
Michael Niedermayer7000a172004-10-03 02:42:01833 timestamp_len += 5;
834 if(pts != AV_NOPTS_VALUE)
835 timestamp_len += s->is_mpeg2 ? 5 : 4;
836 pts=dts= AV_NOPTS_VALUE;
837 header_len -= timestamp_len;
Chriss7e0fda02004-11-23 22:25:12838 if (s->is_dvd && stream->align_iframe) {
839 pad_packet_bytes += timestamp_len;
840 packet_size -= timestamp_len;
841 } else {
842 payload_size += timestamp_len;
843 }
Michael Niedermayer7000a172004-10-03 02:42:01844 stuffing_size += timestamp_len;
845 if(payload_size > trailer_size)
846 stuffing_size += payload_size - trailer_size;
847 }
848
Chriss7e0fda02004-11-23 22:25:12849 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
850 packet_size += pad_packet_bytes;
851 payload_size += pad_packet_bytes; // undo the previous adjustment
852 if (stuffing_size < 0) {
853 stuffing_size = pad_packet_bytes;
854 } else {
855 stuffing_size += pad_packet_bytes;
856 }
857 pad_packet_bytes = 0;
858 }
859
Hauke Duden24515922004-02-19 22:34:13860 if (stuffing_size < 0)
861 stuffing_size = 0;
Hauke Duden22494482004-04-26 22:16:06862 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
863 pad_packet_bytes += stuffing_size;
864 packet_size -= stuffing_size;
865 payload_size -= stuffing_size;
866 stuffing_size = 0;
867 }
Diego Biurrun115329f2005-12-17 18:14:38868
Michael Niedermayer7000a172004-10-03 02:42:01869 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
Hauke Duden22494482004-04-26 22:16:06870
Hauke Duden24515922004-02-19 22:34:13871 put_be32(&ctx->pb, startcode);
872
873 put_be16(&ctx->pb, packet_size);
Diego Biurrun115329f2005-12-17 18:14:38874
Michel Bardiaux27a206e2003-12-09 18:06:18875 if (!s->is_mpeg2)
Hauke Duden24515922004-02-19 22:34:13876 for(i=0;i<stuffing_size;i++)
877 put_byte(&ctx->pb, 0xff);
Michel Bardiaux27a206e2003-12-09 18:06:18878
Hauke Duden24515922004-02-19 22:34:13879 if (s->is_mpeg2) {
880 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
Fabrice Bellard0dbb48d2003-12-16 11:25:30881
Hauke Duden22494482004-04-26 22:16:06882 pes_flags=0;
883
Hauke Duden24515922004-02-19 22:34:13884 if (pts != AV_NOPTS_VALUE) {
Hauke Duden22494482004-04-26 22:16:06885 pes_flags |= 0x80;
886 if (dts != pts)
887 pes_flags |= 0x40;
Michel Bardiaux27a206e2003-12-09 18:06:18888 }
Hauke Duden22494482004-04-26 22:16:06889
890 /* Both the MPEG-2 and the SVCD standards demand that the
891 P-STD_buffer_size field be included in the first packet of
892 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
893 and MPEG-2 standard 2.7.7) */
894 if (stream->packet_number == 0)
895 pes_flags |= 0x01;
896
897 put_byte(&ctx->pb, pes_flags); /* flags */
898 put_byte(&ctx->pb, header_len - 3 + stuffing_size);
899
900 if (pes_flags & 0x80) /*write pts*/
901 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
902 if (pes_flags & 0x40) /*write dts*/
903 put_timestamp(&ctx->pb, 0x01, dts);
Diego Biurrun115329f2005-12-17 18:14:38904
Hauke Duden22494482004-04-26 22:16:06905 if (pes_flags & 0x01) { /*write pes extension*/
906 put_byte(&ctx->pb, 0x10); /* flags */
907
Diego Biurrun115329f2005-12-17 18:14:38908 /* P-STD buffer info */
Hauke Duden22494482004-04-26 22:16:06909 if (id == AUDIO_ID)
910 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
911 else
912 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
913 }
914
Michel Bardiaux27a206e2003-12-09 18:06:18915 } else {
Hauke Duden24515922004-02-19 22:34:13916 if (pts != AV_NOPTS_VALUE) {
917 if (dts != pts) {
918 put_timestamp(&ctx->pb, 0x03, pts);
919 put_timestamp(&ctx->pb, 0x01, dts);
920 } else {
921 put_timestamp(&ctx->pb, 0x02, pts);
922 }
Michel Bardiaux27a206e2003-12-09 18:06:18923 } else {
Hauke Duden24515922004-02-19 22:34:13924 put_byte(&ctx->pb, 0x0f);
Michel Bardiaux27a206e2003-12-09 18:06:18925 }
Michel Bardiaux27a206e2003-12-09 18:06:18926 }
Hauke Duden24515922004-02-19 22:34:13927
Sidik Isani9e9080b2004-05-25 23:06:00928 if (s->is_mpeg2) {
929 /* special stuffing byte that is always written
930 to prevent accidental generation of start codes. */
931 put_byte(&ctx->pb, 0xff);
932
933 for(i=0;i<stuffing_size;i++)
934 put_byte(&ctx->pb, 0xff);
935 }
936
Hauke Duden24515922004-02-19 22:34:13937 if (startcode == PRIVATE_STREAM_1) {
938 put_byte(&ctx->pb, id);
939 if (id >= 0xa0) {
940 /* LPCM (XXX: check nb_frames) */
941 put_byte(&ctx->pb, 7);
942 put_be16(&ctx->pb, 4); /* skip 3 header bytes */
943 put_byte(&ctx->pb, stream->lpcm_header[0]);
944 put_byte(&ctx->pb, stream->lpcm_header[1]);
945 put_byte(&ctx->pb, stream->lpcm_header[2]);
Aurelien Jacobs9ba73f12005-06-15 20:50:12946 } else if (id >= 0x40) {
Hauke Duden24515922004-02-19 22:34:13947 /* AC3 */
Michael Niedermayer7000a172004-10-03 02:42:01948 put_byte(&ctx->pb, nb_frames);
949 put_be16(&ctx->pb, trailer_size+1);
Hauke Duden24515922004-02-19 22:34:13950 }
951 }
952
Hauke Duden24515922004-02-19 22:34:13953 /* output data */
Michael Niedermayer7000a172004-10-03 02:42:01954 if(put_fifo(&ctx->pb, &stream->fifo, payload_size - stuffing_size, &stream->fifo.rptr) < 0)
955 return -1;
956 }else{
957 payload_size=
958 stuffing_size= 0;
Fabrice Bellardfb7566d2002-10-15 10:22:23959 }
Fabrice Bellardde6d9b62001-07-22 14:18:56960
Hauke Duden24515922004-02-19 22:34:13961 if (pad_packet_bytes > 0)
Diego Biurrun115329f2005-12-17 18:14:38962 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
Fabrice Bellardde6d9b62001-07-22 14:18:56963
Hauke Duden24515922004-02-19 22:34:13964 for(i=0;i<zero_trail_bytes;i++)
965 put_byte(&ctx->pb, 0x00);
Diego Biurrun115329f2005-12-17 18:14:38966
Fabrice Bellardde6d9b62001-07-22 14:18:56967 put_flush_packet(&ctx->pb);
Diego Biurrun115329f2005-12-17 18:14:38968
Fabrice Bellardde6d9b62001-07-22 14:18:56969 s->packet_number++;
Hauke Duden22494482004-04-26 22:16:06970
971 /* only increase the stream packet number if this pack actually contains
972 something that is specific to this stream! I.e. a dedicated header
973 or some data.*/
974 if (!general_pack)
975 stream->packet_number++;
Diego Biurrun115329f2005-12-17 18:14:38976
Michael Niedermayer7000a172004-10-03 02:42:01977 return payload_size - stuffing_size;
Fabrice Bellardde6d9b62001-07-22 14:18:56978}
979
Hauke Duden24515922004-02-19 22:34:13980static void put_vcd_padding_sector(AVFormatContext *ctx)
981{
982 /* There are two ways to do this padding: writing a sector/pack
983 of 0 values, or writing an MPEG padding pack. Both seem to
984 work with most decoders, BUT the VCD standard only allows a 0-sector
985 (see standard p. IV-4, IV-5).
986 So a 0-sector it is...*/
987
988 MpegMuxContext *s = ctx->priv_data;
989 int i;
990
991 for(i=0;i<s->packet_size;i++)
992 put_byte(&ctx->pb, 0);
993
994 s->vcd_padding_bytes_written += s->packet_size;
Diego Biurrun115329f2005-12-17 18:14:38995
Hauke Duden24515922004-02-19 22:34:13996 put_flush_packet(&ctx->pb);
Diego Biurrun115329f2005-12-17 18:14:38997
Hauke Duden24515922004-02-19 22:34:13998 /* increasing the packet number is correct. The SCR of the following packs
999 is calculated from the packet_number and it has to include the padding
1000 sector (it represents the sector index, not the MPEG pack index)
1001 (see VCD standard p. IV-6)*/
1002 s->packet_number++;
1003}
1004
Måns Rullgård88730be2005-02-24 19:08:501005#if 0 /* unused, remove? */
Michael Niedermayer92050932004-10-03 02:57:421006static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
Hauke Duden24515922004-02-19 22:34:131007{
1008 MpegMuxContext *s = ctx->priv_data;
1009 int64_t scr;
1010
Hauke Duden24515922004-02-19 22:34:131011 /* Since the data delivery rate is constant, SCR is computed
1012 using the formula C + i * 1200 where C is the start constant
1013 and i is the pack index.
1014 It is recommended that SCR 0 is at the beginning of the VCD front
1015 margin (a sequence of empty Form 2 sectors on the CD).
1016 It is recommended that the front margin is 30 sectors long, so
1017 we use C = 30*1200 = 36000
1018 (Note that even if the front margin is not 30 sectors the file
1019 will still be correct according to the standard. It just won't have
1020 the "recommended" value).*/
1021 scr = 36000 + s->packet_number * 1200;
Hauke Duden22494482004-04-26 22:16:061022
Hauke Duden24515922004-02-19 22:34:131023 return scr;
Diego Biurrun115329f2005-12-17 18:14:381024}
Måns Rullgård88730be2005-02-24 19:08:501025#endif
Hauke Duden24515922004-02-19 22:34:131026
Michael Niedermayer7000a172004-10-03 02:42:011027static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
1028// MpegMuxContext *s = ctx->priv_data;
1029 int i;
1030
1031 for(i=0; i<ctx->nb_streams; i++){
1032 AVStream *st = ctx->streams[i];
1033 StreamInfo *stream = st->priv_data;
1034 PacketDesc *pkt_desc= stream->predecode_packet;
Diego Biurrun115329f2005-12-17 18:14:381035
Michael Niedermayer7000a172004-10-03 02:42:011036 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
Diego Biurrun115329f2005-12-17 18:14:381037 if(stream->buffer_index < pkt_desc->size ||
Michael Niedermayer7000a172004-10-03 02:42:011038 stream->predecode_packet == stream->premux_packet){
1039 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
1040 break;
1041 }
1042 stream->buffer_index -= pkt_desc->size;
1043
1044 stream->predecode_packet= pkt_desc->next;
1045 av_freep(&pkt_desc);
1046 }
1047 }
Diego Biurrun115329f2005-12-17 18:14:381048
Michael Niedermayer7000a172004-10-03 02:42:011049 return 0;
1050}
1051
1052static int output_packet(AVFormatContext *ctx, int flush){
1053 MpegMuxContext *s = ctx->priv_data;
1054 AVStream *st;
1055 StreamInfo *stream;
1056 int i, avail_space, es_size, trailer_size;
1057 int best_i= -1;
1058 int best_score= INT_MIN;
1059 int ignore_constraints=0;
1060 int64_t scr= s->last_scr;
Michael Niedermayerbc3429e2004-10-03 11:16:401061 PacketDesc *timestamp_packet;
Michael Niedermayer17c88cb2004-10-16 21:27:421062 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
Michael Niedermayer7000a172004-10-03 02:42:011063
1064retry:
1065 for(i=0; i<ctx->nb_streams; i++){
1066 AVStream *st = ctx->streams[i];
1067 StreamInfo *stream = st->priv_data;
1068 const int avail_data= fifo_size(&stream->fifo, stream->fifo.rptr);
1069 const int space= stream->max_buffer_size - stream->buffer_index;
1070 int rel_space= 1024*space / stream->max_buffer_size;
Michael Niedermayer17c88cb2004-10-16 21:27:421071 PacketDesc *next_pkt= stream->premux_packet;
Michael Niedermayer7000a172004-10-03 02:42:011072
Aurelien Jacobs9ba73f12005-06-15 20:50:121073 /* for subtitle, a single PES packet must be generated,
1074 so we flush after every single subtitle packet */
1075 if(s->packet_size > avail_data && !flush
Michael Niedermayer01f48952005-07-17 22:24:361076 && st->codec->codec_type != CODEC_TYPE_SUBTITLE)
Michael Niedermayer7000a172004-10-03 02:42:011077 return 0;
1078 if(avail_data==0)
1079 continue;
1080 assert(avail_data>0);
1081
1082 if(space < s->packet_size && !ignore_constraints)
1083 continue;
Diego Biurrun115329f2005-12-17 18:14:381084
Michael Niedermayer17c88cb2004-10-16 21:27:421085 if(next_pkt && next_pkt->dts - scr > max_delay)
1086 continue;
Diego Biurrun115329f2005-12-17 18:14:381087
Michael Niedermayer7000a172004-10-03 02:42:011088 if(rel_space > best_score){
1089 best_score= rel_space;
1090 best_i = i;
1091 avail_space= space;
1092 }
1093 }
Diego Biurrun115329f2005-12-17 18:14:381094
Michael Niedermayer7000a172004-10-03 02:42:011095 if(best_i < 0){
1096 int64_t best_dts= INT64_MAX;
1097
1098 for(i=0; i<ctx->nb_streams; i++){
1099 AVStream *st = ctx->streams[i];
1100 StreamInfo *stream = st->priv_data;
1101 PacketDesc *pkt_desc= stream->predecode_packet;
1102 if(pkt_desc && pkt_desc->dts < best_dts)
1103 best_dts= pkt_desc->dts;
1104 }
1105
1106#if 0
Diego Biurrun115329f2005-12-17 18:14:381107 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
Michael Niedermayer7000a172004-10-03 02:42:011108 scr/90000.0, best_dts/90000.0);
1109#endif
1110 if(best_dts == INT64_MAX)
1111 return 0;
1112
1113 if(scr >= best_dts+1 && !ignore_constraints){
1114 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
1115 ignore_constraints= 1;
1116 }
1117 scr= FFMAX(best_dts+1, scr);
1118 if(remove_decoded_packets(ctx, scr) < 0)
1119 return -1;
1120 goto retry;
1121 }
1122
1123 assert(best_i >= 0);
Diego Biurrun115329f2005-12-17 18:14:381124
Michael Niedermayer7000a172004-10-03 02:42:011125 st = ctx->streams[best_i];
1126 stream = st->priv_data;
Diego Biurrun115329f2005-12-17 18:14:381127
Michael Niedermayer7000a172004-10-03 02:42:011128 assert(fifo_size(&stream->fifo, stream->fifo.rptr) > 0);
1129
1130 assert(avail_space >= s->packet_size || ignore_constraints);
Diego Biurrun115329f2005-12-17 18:14:381131
Michael Niedermayerbc3429e2004-10-03 11:16:401132 timestamp_packet= stream->premux_packet;
1133 if(timestamp_packet->unwritten_size == timestamp_packet->size){
Michael Niedermayer7000a172004-10-03 02:42:011134 trailer_size= 0;
Michael Niedermayerbc3429e2004-10-03 11:16:401135 }else{
1136 trailer_size= timestamp_packet->unwritten_size;
1137 timestamp_packet= timestamp_packet->next;
1138 }
Michael Niedermayer7000a172004-10-03 02:42:011139
Michael Niedermayerbc3429e2004-10-03 11:16:401140 if(timestamp_packet){
Michael Niedermayer2db3c632004-10-06 22:29:301141//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:401142 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
1143 }else{
1144 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);
1145 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
1146 }
Michael Niedermayer7000a172004-10-03 02:42:011147
1148 if (s->is_vcd) {
1149 /* Write one or more padding sectors, if necessary, to reach
1150 the constant overall bitrate.*/
1151 int vcd_pad_bytes;
1152
Michael Niedermayer92050932004-10-03 02:57:421153 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:011154 put_vcd_padding_sector(ctx);
1155 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1156 }
1157 }
Diego Biurrun115329f2005-12-17 18:14:381158
Michael Niedermayer7000a172004-10-03 02:42:011159 stream->buffer_index += es_size;
1160 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
Diego Biurrun115329f2005-12-17 18:14:381161
Michael Niedermayer7000a172004-10-03 02:42:011162 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
1163 es_size -= stream->premux_packet->unwritten_size;
1164 stream->premux_packet= stream->premux_packet->next;
1165 }
1166 if(es_size)
1167 stream->premux_packet->unwritten_size -= es_size;
Diego Biurrun115329f2005-12-17 18:14:381168
Michael Niedermayer7000a172004-10-03 02:42:011169 if(remove_decoded_packets(ctx, s->last_scr) < 0)
1170 return -1;
1171
1172 return 1;
1173}
Hauke Duden24515922004-02-19 22:34:131174
Michael Niedermayere9286492004-05-29 02:06:321175static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
Fabrice Bellardde6d9b62001-07-22 14:18:561176{
1177 MpegMuxContext *s = ctx->priv_data;
Michael Niedermayere9286492004-05-29 02:06:321178 int stream_index= pkt->stream_index;
1179 int size= pkt->size;
1180 uint8_t *buf= pkt->data;
Fabrice Bellardde6d9b62001-07-22 14:18:561181 AVStream *st = ctx->streams[stream_index];
1182 StreamInfo *stream = st->priv_data;
Michael Niedermayer92050932004-10-03 02:57:421183 int64_t pts, dts;
Michael Niedermayer7000a172004-10-03 02:42:011184 PacketDesc *pkt_desc;
Michael Niedermayer17c88cb2004-10-16 21:27:421185 const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
Michael Niedermayer01f48952005-07-17 22:24:361186 const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
Diego Biurrun115329f2005-12-17 18:14:381187
Michael Niedermayere9286492004-05-29 02:06:321188 pts= pkt->pts;
1189 dts= pkt->dts;
Fabrice Bellarde45f1942003-12-18 13:03:371190
Michael Niedermayer17c88cb2004-10-16 21:27:421191 if(pts != AV_NOPTS_VALUE) pts += preload;
1192 if(dts != AV_NOPTS_VALUE) dts += preload;
1193
Michael Niedermayer6c55b272004-10-07 01:55:341194//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);
Aurelien Jacobs9ba73f12005-06-15 20:50:121195 if (!stream->premux_packet)
1196 stream->next_packet = &stream->premux_packet;
Michael Niedermayer7000a172004-10-03 02:42:011197 *stream->next_packet=
1198 pkt_desc= av_mallocz(sizeof(PacketDesc));
1199 pkt_desc->pts= pts;
1200 pkt_desc->dts= dts;
1201 pkt_desc->unwritten_size=
1202 pkt_desc->size= size;
1203 if(!stream->predecode_packet)
1204 stream->predecode_packet= pkt_desc;
1205 stream->next_packet= &pkt_desc->next;
1206
Chriss20b02bc2004-12-05 02:46:001207 fifo_realloc(&stream->fifo, fifo_size(&stream->fifo, NULL) + size + 1);
1208
Michael Niedermayercbb6e402004-11-21 03:37:331209 if (s->is_dvd){
Chriss7be806f2005-02-09 03:00:501210 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
Michael Niedermayercbb6e402004-11-21 03:37:331211 stream->fifo_iframe_ptr = stream->fifo.wptr;
1212 stream->align_iframe = 1;
Chriss7be806f2005-02-09 03:00:501213 stream->vobu_start_pts = pts;
Michael Niedermayercbb6e402004-11-21 03:37:331214 } else {
1215 stream->align_iframe = 0;
1216 }
1217 }
1218
Michael Niedermayer7000a172004-10-03 02:42:011219 fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr);
1220
1221 for(;;){
1222 int ret= output_packet(ctx, 0);
Diego Biurrun115329f2005-12-17 18:14:381223 if(ret<=0)
Michael Niedermayer7000a172004-10-03 02:42:011224 return ret;
Hauke Duden22494482004-04-26 22:16:061225 }
Fabrice Bellardde6d9b62001-07-22 14:18:561226}
1227
1228static int mpeg_mux_end(AVFormatContext *ctx)
1229{
Michael Niedermayer7000a172004-10-03 02:42:011230// MpegMuxContext *s = ctx->priv_data;
Fabrice Bellardde6d9b62001-07-22 14:18:561231 StreamInfo *stream;
1232 int i;
Diego Biurrun115329f2005-12-17 18:14:381233
Michael Niedermayer7000a172004-10-03 02:42:011234 for(;;){
1235 int ret= output_packet(ctx, 1);
Diego Biurrun115329f2005-12-17 18:14:381236 if(ret<0)
Michael Niedermayer7000a172004-10-03 02:42:011237 return ret;
1238 else if(ret==0)
1239 break;
Fabrice Bellardde6d9b62001-07-22 14:18:561240 }
1241
Fabrice Bellardfa0f62c2003-09-10 22:44:301242 /* End header according to MPEG1 systems standard. We do not write
1243 it as it is usually not needed by decoders and because it
1244 complicates MPEG stream concatenation. */
Juanjo92b3e122002-05-12 21:38:541245 //put_be32(&ctx->pb, ISO_11172_END_CODE);
1246 //put_flush_packet(&ctx->pb);
Michael Niedermayer9d90c372003-09-09 19:32:521247
Michael Niedermayer7000a172004-10-03 02:42:011248 for(i=0;i<ctx->nb_streams;i++) {
1249 stream = ctx->streams[i]->priv_data;
1250
1251 assert(fifo_size(&stream->fifo, stream->fifo.rptr) == 0);
1252 fifo_free(&stream->fifo);
1253 }
Fabrice Bellardde6d9b62001-07-22 14:18:561254 return 0;
1255}
Diego Biurruna9e350952005-09-23 00:25:411256#endif //CONFIG_MUXERS
Fabrice Bellardde6d9b62001-07-22 14:18:561257
1258/*********************************************/
1259/* demux code */
1260
1261#define MAX_SYNC_SIZE 100000
1262
Fabrice Bellarddb7f1f92002-05-20 16:29:401263static int mpegps_probe(AVProbeData *p)
1264{
Michael Niedermayer95f97de2004-10-01 16:00:001265 int i;
1266 int size= FFMIN(20, p->buf_size);
1267 uint32_t code=0xFF;
Fabrice Bellarddb7f1f92002-05-20 16:29:401268
1269 /* we search the first start code. If it is a packet start code,
1270 then we decide it is mpeg ps. We do not send highest value to
1271 give a chance to mpegts */
Fabrice Bellardfa7773212003-02-02 20:04:031272 /* NOTE: the search range was restricted to avoid too many false
1273 detections */
1274
Michael Niedermayer95f97de2004-10-01 16:00:001275 for (i = 0; i < size; i++) {
1276 code = (code << 8) | p->buf[i];
Isaac Richardsec23a472003-07-10 09:04:041277 if ((code & 0xffffff00) == 0x100) {
1278 if (code == PACK_START_CODE ||
1279 code == SYSTEM_HEADER_START_CODE ||
1280 (code >= 0x1e0 && code <= 0x1ef) ||
1281 (code >= 0x1c0 && code <= 0x1df) ||
1282 code == PRIVATE_STREAM_2 ||
1283 code == PROGRAM_STREAM_MAP ||
1284 code == PRIVATE_STREAM_1 ||
1285 code == PADDING_STREAM)
Michael Niedermayer149f7c02003-09-01 18:30:021286 return AVPROBE_SCORE_MAX - 2;
Isaac Richardsec23a472003-07-10 09:04:041287 else
1288 return 0;
1289 }
Fabrice Bellarddb7f1f92002-05-20 16:29:401290 }
1291 return 0;
1292}
1293
1294
Fabrice Bellardde6d9b62001-07-22 14:18:561295typedef struct MpegDemuxContext {
1296 int header_state;
Måns Rullgårde3d1cd82005-03-28 17:33:211297 unsigned char psm_es_type[256];
Fabrice Bellardde6d9b62001-07-22 14:18:561298} MpegDemuxContext;
1299
Fabrice Bellard27f388a2003-11-10 18:47:521300static int mpegps_read_header(AVFormatContext *s,
1301 AVFormatParameters *ap)
1302{
1303 MpegDemuxContext *m = s->priv_data;
1304 m->header_state = 0xff;
1305 s->ctx_flags |= AVFMTCTX_NOHEADER;
1306
1307 /* no need to do more */
1308 return 0;
1309}
1310
1311static int64_t get_pts(ByteIOContext *pb, int c)
1312{
1313 int64_t pts;
1314 int val;
1315
1316 if (c < 0)
1317 c = get_byte(pb);
1318 pts = (int64_t)((c >> 1) & 0x07) << 30;
1319 val = get_be16(pb);
1320 pts |= (int64_t)(val >> 1) << 15;
1321 val = get_be16(pb);
1322 pts |= (int64_t)(val >> 1);
1323 return pts;
1324}
1325
Diego Biurrun115329f2005-12-17 18:14:381326static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
Fabrice Bellard27f388a2003-11-10 18:47:521327 uint32_t *header_state)
Fabrice Bellardde6d9b62001-07-22 14:18:561328{
1329 unsigned int state, v;
1330 int val, n;
1331
1332 state = *header_state;
1333 n = *size_ptr;
1334 while (n > 0) {
1335 if (url_feof(pb))
1336 break;
1337 v = get_byte(pb);
1338 n--;
1339 if (state == 0x000001) {
1340 state = ((state << 8) | v) & 0xffffff;
1341 val = state;
1342 goto found;
1343 }
1344 state = ((state << 8) | v) & 0xffffff;
1345 }
1346 val = -1;
1347 found:
1348 *header_state = state;
1349 *size_ptr = n;
1350 return val;
1351}
1352
Måns Rullgård88730be2005-02-24 19:08:501353#if 0 /* unused, remove? */
Fabrice Bellard27f388a2003-11-10 18:47:521354/* XXX: optimize */
1355static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
Juanjo001e3f52002-03-17 17:44:451356{
Fabrice Bellard27f388a2003-11-10 18:47:521357 int64_t pos, pos_start;
1358 int max_size, start_code;
Fabrice Bellardda24c5e2003-10-29 14:20:561359
Fabrice Bellard27f388a2003-11-10 18:47:521360 max_size = *size_ptr;
1361 pos_start = url_ftell(pb);
1362
1363 /* in order to go faster, we fill the buffer */
1364 pos = pos_start - 16386;
1365 if (pos < 0)
1366 pos = 0;
1367 url_fseek(pb, pos, SEEK_SET);
1368 get_byte(pb);
1369
1370 pos = pos_start;
1371 for(;;) {
1372 pos--;
1373 if (pos < 0 || (pos_start - pos) >= max_size) {
1374 start_code = -1;
1375 goto the_end;
1376 }
1377 url_fseek(pb, pos, SEEK_SET);
1378 start_code = get_be32(pb);
1379 if ((start_code & 0xffffff00) == 0x100)
1380 break;
1381 }
1382 the_end:
1383 *size_ptr = pos_start - pos;
1384 return start_code;
Fabrice Bellardde6d9b62001-07-22 14:18:561385}
Måns Rullgård88730be2005-02-24 19:08:501386#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561387
Måns Rullgårde3d1cd82005-03-28 17:33:211388/**
1389 * Extracts stream types from a program stream map
1390 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
Diego Biurrun115329f2005-12-17 18:14:381391 *
Måns Rullgårde3d1cd82005-03-28 17:33:211392 * @return number of bytes occupied by PSM in the bitstream
1393 */
1394static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
1395{
1396 int psm_length, ps_info_length, es_map_length;
1397
1398 psm_length = get_be16(pb);
1399 get_byte(pb);
1400 get_byte(pb);
1401 ps_info_length = get_be16(pb);
1402
1403 /* skip program_stream_info */
1404 url_fskip(pb, ps_info_length);
1405 es_map_length = get_be16(pb);
1406
1407 /* at least one es available? */
1408 while (es_map_length >= 4){
1409 unsigned char type = get_byte(pb);
1410 unsigned char es_id = get_byte(pb);
1411 uint16_t es_info_length = get_be16(pb);
1412 /* remember mapping from stream id to stream type */
1413 m->psm_es_type[es_id] = type;
1414 /* skip program_stream_info */
1415 url_fskip(pb, es_info_length);
1416 es_map_length -= 4 + es_info_length;
1417 }
1418 get_be32(pb); /* crc32 */
1419 return 2 + psm_length;
1420}
1421
Diego Biurrun115329f2005-12-17 18:14:381422/* read the next PES header. Return its position in ppos
Fabrice Bellard27f388a2003-11-10 18:47:521423 (if not NULL), and its start code, pts and dts.
1424 */
1425static int mpegps_read_pes_header(AVFormatContext *s,
Diego Biurrun115329f2005-12-17 18:14:381426 int64_t *ppos, int *pstart_code,
Michael Niedermayer8d14a252004-04-12 16:50:031427 int64_t *ppts, int64_t *pdts)
Fabrice Bellardde6d9b62001-07-22 14:18:561428{
1429 MpegDemuxContext *m = s->priv_data;
Fabrice Bellard27f388a2003-11-10 18:47:521430 int len, size, startcode, c, flags, header_len;
1431 int64_t pts, dts, last_pos;
Fabrice Bellardde6d9b62001-07-22 14:18:561432
Fabrice Bellard27f388a2003-11-10 18:47:521433 last_pos = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561434 redo:
Fabrice Bellard27f388a2003-11-10 18:47:521435 /* next start code (should be immediately after) */
1436 m->header_state = 0xff;
1437 size = MAX_SYNC_SIZE;
1438 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
Juanjo001e3f52002-03-17 17:44:451439 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
Fabrice Bellardde6d9b62001-07-22 14:18:561440 if (startcode < 0)
Mike Melanson0bd586c2004-06-19 03:59:341441 return AVERROR_IO;
Fabrice Bellardde6d9b62001-07-22 14:18:561442 if (startcode == PACK_START_CODE)
1443 goto redo;
1444 if (startcode == SYSTEM_HEADER_START_CODE)
1445 goto redo;
1446 if (startcode == PADDING_STREAM ||
1447 startcode == PRIVATE_STREAM_2) {
1448 /* skip them */
1449 len = get_be16(&s->pb);
1450 url_fskip(&s->pb, len);
1451 goto redo;
1452 }
Måns Rullgårde3d1cd82005-03-28 17:33:211453 if (startcode == PROGRAM_STREAM_MAP) {
1454 mpegps_psm_parse(m, &s->pb);
1455 goto redo;
1456 }
Diego Biurrun115329f2005-12-17 18:14:381457
Fabrice Bellardde6d9b62001-07-22 14:18:561458 /* find matching stream */
1459 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
1460 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
1461 (startcode == 0x1bd)))
1462 goto redo;
Fabrice Bellard27f388a2003-11-10 18:47:521463 if (ppos) {
1464 *ppos = url_ftell(&s->pb) - 4;
1465 }
Fabrice Bellardde6d9b62001-07-22 14:18:561466 len = get_be16(&s->pb);
Fabrice Bellardb2cac182002-10-21 15:57:211467 pts = AV_NOPTS_VALUE;
1468 dts = AV_NOPTS_VALUE;
Fabrice Bellardde6d9b62001-07-22 14:18:561469 /* stuffing */
1470 for(;;) {
Fabrice Bellard27f388a2003-11-10 18:47:521471 if (len < 1)
1472 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561473 c = get_byte(&s->pb);
1474 len--;
1475 /* XXX: for mpeg1, should test only bit 7 */
Diego Biurrun115329f2005-12-17 18:14:381476 if (c != 0xff)
Fabrice Bellardde6d9b62001-07-22 14:18:561477 break;
1478 }
1479 if ((c & 0xc0) == 0x40) {
1480 /* buffer scale & size */
Fabrice Bellard27f388a2003-11-10 18:47:521481 if (len < 2)
1482 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561483 get_byte(&s->pb);
1484 c = get_byte(&s->pb);
1485 len -= 2;
1486 }
1487 if ((c & 0xf0) == 0x20) {
Fabrice Bellard27f388a2003-11-10 18:47:521488 if (len < 4)
1489 goto redo;
1490 dts = pts = get_pts(&s->pb, c);
Fabrice Bellardde6d9b62001-07-22 14:18:561491 len -= 4;
Fabrice Bellardde6d9b62001-07-22 14:18:561492 } else if ((c & 0xf0) == 0x30) {
Fabrice Bellard27f388a2003-11-10 18:47:521493 if (len < 9)
1494 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561495 pts = get_pts(&s->pb, c);
1496 dts = get_pts(&s->pb, -1);
1497 len -= 9;
1498 } else if ((c & 0xc0) == 0x80) {
1499 /* mpeg 2 PES */
1500 if ((c & 0x30) != 0) {
Fabrice Bellard27f388a2003-11-10 18:47:521501 /* Encrypted multiplex not handled */
1502 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561503 }
1504 flags = get_byte(&s->pb);
1505 header_len = get_byte(&s->pb);
1506 len -= 2;
1507 if (header_len > len)
1508 goto redo;
Fabrice Bellard1e5c6672002-10-04 15:46:591509 if ((flags & 0xc0) == 0x80) {
Fabrice Bellard27f388a2003-11-10 18:47:521510 dts = pts = get_pts(&s->pb, -1);
1511 if (header_len < 5)
1512 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561513 header_len -= 5;
1514 len -= 5;
1515 } if ((flags & 0xc0) == 0xc0) {
1516 pts = get_pts(&s->pb, -1);
1517 dts = get_pts(&s->pb, -1);
Fabrice Bellard27f388a2003-11-10 18:47:521518 if (header_len < 10)
1519 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561520 header_len -= 10;
1521 len -= 10;
1522 }
1523 len -= header_len;
1524 while (header_len > 0) {
1525 get_byte(&s->pb);
1526 header_len--;
1527 }
1528 }
Dmitry Borisovdf70de12004-04-23 21:02:011529 else if( c!= 0xf )
1530 goto redo;
1531
Måns Rullgårde3d1cd82005-03-28 17:33:211532 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
Fabrice Bellard27f388a2003-11-10 18:47:521533 if (len < 1)
1534 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561535 startcode = get_byte(&s->pb);
1536 len--;
1537 if (startcode >= 0x80 && startcode <= 0xbf) {
1538 /* audio: skip header */
Fabrice Bellard27f388a2003-11-10 18:47:521539 if (len < 3)
1540 goto redo;
Fabrice Bellardde6d9b62001-07-22 14:18:561541 get_byte(&s->pb);
1542 get_byte(&s->pb);
1543 get_byte(&s->pb);
1544 len -= 3;
1545 }
1546 }
Michael Niedermayerb7549782004-01-13 22:02:491547 if(dts != AV_NOPTS_VALUE && ppos){
1548 int i;
1549 for(i=0; i<s->nb_streams; i++){
1550 if(startcode == s->streams[i]->id) {
Michael Niedermayer27a5fe52005-03-13 00:13:011551 av_add_index_entry(s->streams[i], *ppos, dts, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
Michael Niedermayerb7549782004-01-13 22:02:491552 }
1553 }
1554 }
Diego Biurrun115329f2005-12-17 18:14:381555
Fabrice Bellard27f388a2003-11-10 18:47:521556 *pstart_code = startcode;
1557 *ppts = pts;
1558 *pdts = dts;
1559 return len;
1560}
1561
1562static int mpegps_read_packet(AVFormatContext *s,
1563 AVPacket *pkt)
1564{
Måns Rullgårde3d1cd82005-03-28 17:33:211565 MpegDemuxContext *m = s->priv_data;
Fabrice Bellard27f388a2003-11-10 18:47:521566 AVStream *st;
Måns Rullgårde3d1cd82005-03-28 17:33:211567 int len, startcode, i, type, codec_id = 0, es_type;
Michael Niedermayerb7549782004-01-13 22:02:491568 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
Fabrice Bellard27f388a2003-11-10 18:47:521569
1570 redo:
Michael Niedermayer8d14a252004-04-12 16:50:031571 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
Fabrice Bellard27f388a2003-11-10 18:47:521572 if (len < 0)
1573 return len;
Diego Biurrun115329f2005-12-17 18:14:381574
Fabrice Bellardde6d9b62001-07-22 14:18:561575 /* now find stream */
1576 for(i=0;i<s->nb_streams;i++) {
1577 st = s->streams[i];
1578 if (st->id == startcode)
1579 goto found;
1580 }
Måns Rullgårde3d1cd82005-03-28 17:33:211581
1582 es_type = m->psm_es_type[startcode & 0xff];
1583 if(es_type > 0){
1584 if(es_type == STREAM_TYPE_VIDEO_MPEG1){
1585 codec_id = CODEC_ID_MPEG2VIDEO;
1586 type = CODEC_TYPE_VIDEO;
1587 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
1588 codec_id = CODEC_ID_MPEG2VIDEO;
1589 type = CODEC_TYPE_VIDEO;
1590 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
1591 es_type == STREAM_TYPE_AUDIO_MPEG2){
1592 codec_id = CODEC_ID_MP3;
1593 type = CODEC_TYPE_AUDIO;
1594 } else if(es_type == STREAM_TYPE_AUDIO_AAC){
1595 codec_id = CODEC_ID_AAC;
1596 type = CODEC_TYPE_AUDIO;
1597 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
1598 codec_id = CODEC_ID_MPEG4;
1599 type = CODEC_TYPE_VIDEO;
1600 } else if(es_type == STREAM_TYPE_VIDEO_H264){
1601 codec_id = CODEC_ID_H264;
1602 type = CODEC_TYPE_VIDEO;
1603 } else if(es_type == STREAM_TYPE_AUDIO_AC3){
1604 codec_id = CODEC_ID_AC3;
1605 type = CODEC_TYPE_AUDIO;
1606 } else {
1607 goto skip;
1608 }
1609 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
Fabrice Bellarddb7f1f92002-05-20 16:29:401610 type = CODEC_TYPE_VIDEO;
Fabrice Bellard0dbb48d2003-12-16 11:25:301611 codec_id = CODEC_ID_MPEG2VIDEO;
Fabrice Bellarddb7f1f92002-05-20 16:29:401612 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
1613 type = CODEC_TYPE_AUDIO;
1614 codec_id = CODEC_ID_MP2;
Joakim Plate3f2bf072005-05-20 13:10:091615 } else if (startcode >= 0x80 && startcode <= 0x87) {
Fabrice Bellarddb7f1f92002-05-20 16:29:401616 type = CODEC_TYPE_AUDIO;
1617 codec_id = CODEC_ID_AC3;
Joakim Plate3f2bf072005-05-20 13:10:091618 } else if (startcode >= 0x88 && startcode <= 0x9f) {
Michael Niedermayer23c99252004-07-14 01:32:141619 type = CODEC_TYPE_AUDIO;
1620 codec_id = CODEC_ID_DTS;
Fabrice Bellard9ec05e32003-01-31 17:04:461621 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
1622 type = CODEC_TYPE_AUDIO;
1623 codec_id = CODEC_ID_PCM_S16BE;
Fabrice Bellarda9c32132005-06-03 14:01:491624 } else if (startcode >= 0x20 && startcode <= 0x3f) {
1625 type = CODEC_TYPE_SUBTITLE;
1626 codec_id = CODEC_ID_DVD_SUBTITLE;
Fabrice Bellarddb7f1f92002-05-20 16:29:401627 } else {
1628 skip:
1629 /* skip packet */
1630 url_fskip(&s->pb, len);
1631 goto redo;
1632 }
Fabrice Bellard1e5c6672002-10-04 15:46:591633 /* no stream found: add a new stream */
1634 st = av_new_stream(s, startcode);
Diego Biurrun115329f2005-12-17 18:14:381635 if (!st)
Fabrice Bellard1e5c6672002-10-04 15:46:591636 goto skip;
Michael Niedermayer01f48952005-07-17 22:24:361637 st->codec->codec_type = type;
1638 st->codec->codec_id = codec_id;
Fabrice Bellard27f388a2003-11-10 18:47:521639 if (codec_id != CODEC_ID_PCM_S16BE)
1640 st->need_parsing = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561641 found:
Michael Niedermayerf3356e92005-03-17 01:25:011642 if(st->discard >= AVDISCARD_ALL)
Michael Niedermayerb9866eb2005-01-22 13:36:021643 goto skip;
Fabrice Bellard9ec05e32003-01-31 17:04:461644 if (startcode >= 0xa0 && startcode <= 0xbf) {
1645 int b1, freq;
Fabrice Bellard9ec05e32003-01-31 17:04:461646
1647 /* for LPCM, we just skip the header and consider it is raw
1648 audio data */
1649 if (len <= 3)
1650 goto skip;
1651 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
1652 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
1653 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
1654 len -= 3;
1655 freq = (b1 >> 4) & 3;
Michael Niedermayer01f48952005-07-17 22:24:361656 st->codec->sample_rate = lpcm_freq_tab[freq];
1657 st->codec->channels = 1 + (b1 & 7);
1658 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2;
Fabrice Bellard9ec05e32003-01-31 17:04:461659 }
Fabrice Bellardde6d9b62001-07-22 14:18:561660 av_new_packet(pkt, len);
1661 get_buffer(&s->pb, pkt->data, pkt->size);
1662 pkt->pts = pts;
Fabrice Bellard27f388a2003-11-10 18:47:521663 pkt->dts = dts;
Fabrice Bellarddb7f1f92002-05-20 16:29:401664 pkt->stream_index = st->index;
Michel Bardiaux27a206e2003-12-09 18:06:181665#if 0
Michael Niedermayerb9866eb2005-01-22 13:36:021666 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
1667 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size);
Michel Bardiaux27a206e2003-12-09 18:06:181668#endif
Mike Melanson0bd586c2004-06-19 03:59:341669
Fabrice Bellardde6d9b62001-07-22 14:18:561670 return 0;
1671}
1672
Fabrice Bellarddb7f1f92002-05-20 16:29:401673static int mpegps_read_close(AVFormatContext *s)
Juanjo001e3f52002-03-17 17:44:451674{
Fabrice Bellardde6d9b62001-07-22 14:18:561675 return 0;
1676}
1677
Diego Biurrun115329f2005-12-17 18:14:381678static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
Michael Niedermayer8d14a252004-04-12 16:50:031679 int64_t *ppos, int64_t pos_limit)
Fabrice Bellard27f388a2003-11-10 18:47:521680{
1681 int len, startcode;
1682 int64_t pos, pts, dts;
1683
1684 pos = *ppos;
1685#ifdef DEBUG_SEEK
1686 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
1687#endif
1688 url_fseek(&s->pb, pos, SEEK_SET);
1689 for(;;) {
Michael Niedermayer8d14a252004-04-12 16:50:031690 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
Fabrice Bellard27f388a2003-11-10 18:47:521691 if (len < 0) {
1692#ifdef DEBUG_SEEK
1693 printf("none (ret=%d)\n", len);
1694#endif
1695 return AV_NOPTS_VALUE;
1696 }
Diego Biurrun115329f2005-12-17 18:14:381697 if (startcode == s->streams[stream_index]->id &&
Fabrice Bellard27f388a2003-11-10 18:47:521698 dts != AV_NOPTS_VALUE) {
1699 break;
1700 }
Michael Niedermayer8d14a252004-04-12 16:50:031701 url_fskip(&s->pb, len);
Fabrice Bellard27f388a2003-11-10 18:47:521702 }
1703#ifdef DEBUG_SEEK
1704 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
1705#endif
1706 *ppos = pos;
Michael Niedermayercdd50342004-05-23 16:26:121707 return dts;
Fabrice Bellard27f388a2003-11-10 18:47:521708}
1709
Diego Biurruna9e350952005-09-23 00:25:411710#ifdef CONFIG_MUXERS
Fabrice Bellardfb7566d2002-10-15 10:22:231711static AVOutputFormat mpeg1system_mux = {
Fabrice Bellardde6d9b62001-07-22 14:18:561712 "mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231713 "MPEG1 System format",
Ryutaroh Matsumotoc6c11cb2002-12-20 23:10:581714 "video/mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231715 "mpg,mpeg",
1716 sizeof(MpegMuxContext),
1717 CODEC_ID_MP2,
1718 CODEC_ID_MPEG1VIDEO,
1719 mpeg_mux_init,
1720 mpeg_mux_write_packet,
1721 mpeg_mux_end,
1722};
1723
1724static AVOutputFormat mpeg1vcd_mux = {
1725 "vcd",
1726 "MPEG1 System format (VCD)",
Ryutaroh Matsumotoc6c11cb2002-12-20 23:10:581727 "video/mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231728 NULL,
1729 sizeof(MpegMuxContext),
1730 CODEC_ID_MP2,
1731 CODEC_ID_MPEG1VIDEO,
1732 mpeg_mux_init,
1733 mpeg_mux_write_packet,
1734 mpeg_mux_end,
1735};
1736
1737static AVOutputFormat mpeg2vob_mux = {
1738 "vob",
1739 "MPEG2 PS format (VOB)",
Ryutaroh Matsumotoc6c11cb2002-12-20 23:10:581740 "video/mpeg",
Fabrice Bellardfb7566d2002-10-15 10:22:231741 "vob",
Fabrice Bellarddb7f1f92002-05-20 16:29:401742 sizeof(MpegMuxContext),
Fabrice Bellardde6d9b62001-07-22 14:18:561743 CODEC_ID_MP2,
Fabrice Bellard0dbb48d2003-12-16 11:25:301744 CODEC_ID_MPEG2VIDEO,
Fabrice Bellardde6d9b62001-07-22 14:18:561745 mpeg_mux_init,
1746 mpeg_mux_write_packet,
1747 mpeg_mux_end,
Fabrice Bellardde6d9b62001-07-22 14:18:561748};
Hauke Duden24515922004-02-19 22:34:131749
1750/* Same as mpeg2vob_mux except that the pack size is 2324 */
1751static AVOutputFormat mpeg2svcd_mux = {
1752 "svcd",
1753 "MPEG2 PS format (VOB)",
1754 "video/mpeg",
1755 "vob",
1756 sizeof(MpegMuxContext),
1757 CODEC_ID_MP2,
1758 CODEC_ID_MPEG2VIDEO,
1759 mpeg_mux_init,
1760 mpeg_mux_write_packet,
1761 mpeg_mux_end,
1762};
1763
Paul Curtis78a0efb2004-10-03 18:21:451764/* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1765static AVOutputFormat mpeg2dvd_mux = {
1766 "dvd",
1767 "MPEG2 PS format (DVD VOB)",
1768 "video/mpeg",
1769 "dvd",
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};
Hauke Duden24515922004-02-19 22:34:131777
Diego Biurruna9e350952005-09-23 00:25:411778#endif //CONFIG_MUXERS
Fabrice Bellarddb7f1f92002-05-20 16:29:401779
Fabrice Bellard32f38cb2003-08-08 17:54:051780AVInputFormat mpegps_demux = {
Fabrice Bellarddb7f1f92002-05-20 16:29:401781 "mpeg",
1782 "MPEG PS format",
1783 sizeof(MpegDemuxContext),
1784 mpegps_probe,
1785 mpegps_read_header,
1786 mpegps_read_packet,
1787 mpegps_read_close,
Michael Niedermayer8d14a252004-04-12 16:50:031788 NULL, //mpegps_read_seek,
1789 mpegps_read_dts,
Fabrice Bellarda9c32132005-06-03 14:01:491790 .flags = AVFMT_SHOW_IDS,
Fabrice Bellarddb7f1f92002-05-20 16:29:401791};
1792
1793int mpegps_init(void)
1794{
Diego Biurruna9e350952005-09-23 00:25:411795#ifdef CONFIG_MUXERS
Fabrice Bellardfb7566d2002-10-15 10:22:231796 av_register_output_format(&mpeg1system_mux);
1797 av_register_output_format(&mpeg1vcd_mux);
1798 av_register_output_format(&mpeg2vob_mux);
Hauke Duden24515922004-02-19 22:34:131799 av_register_output_format(&mpeg2svcd_mux);
Paul Curtis78a0efb2004-10-03 18:21:451800 av_register_output_format(&mpeg2dvd_mux);
Diego Biurruna9e350952005-09-23 00:25:411801#endif //CONFIG_MUXERS
Fabrice Bellarddb7f1f92002-05-20 16:29:401802 av_register_input_format(&mpegps_demux);
1803 return 0;
1804}