yading@11
|
1 /*
|
yading@11
|
2 * MPEG1/2 muxer
|
yading@11
|
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
yading@11
|
4 *
|
yading@11
|
5 * This file is part of FFmpeg.
|
yading@11
|
6 *
|
yading@11
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
9 * License as published by the Free Software Foundation; either
|
yading@11
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
11 *
|
yading@11
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
15 * Lesser General Public License for more details.
|
yading@11
|
16 *
|
yading@11
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
20 */
|
yading@11
|
21
|
yading@11
|
22 #include "libavutil/fifo.h"
|
yading@11
|
23 #include "libavutil/log.h"
|
yading@11
|
24 #include "libavutil/mathematics.h"
|
yading@11
|
25 #include "libavutil/opt.h"
|
yading@11
|
26 #include "libavcodec/put_bits.h"
|
yading@11
|
27 #include "avformat.h"
|
yading@11
|
28 #include "internal.h"
|
yading@11
|
29 #include "mpeg.h"
|
yading@11
|
30
|
yading@11
|
31 #define MAX_PAYLOAD_SIZE 4096
|
yading@11
|
32
|
yading@11
|
33 #undef NDEBUG
|
yading@11
|
34 #include <assert.h>
|
yading@11
|
35
|
yading@11
|
36 typedef struct PacketDesc {
|
yading@11
|
37 int64_t pts;
|
yading@11
|
38 int64_t dts;
|
yading@11
|
39 int size;
|
yading@11
|
40 int unwritten_size;
|
yading@11
|
41 int flags;
|
yading@11
|
42 struct PacketDesc *next;
|
yading@11
|
43 } PacketDesc;
|
yading@11
|
44
|
yading@11
|
45 typedef struct {
|
yading@11
|
46 AVFifoBuffer *fifo;
|
yading@11
|
47 uint8_t id;
|
yading@11
|
48 int max_buffer_size; /* in bytes */
|
yading@11
|
49 int buffer_index;
|
yading@11
|
50 PacketDesc *predecode_packet;
|
yading@11
|
51 PacketDesc *premux_packet;
|
yading@11
|
52 PacketDesc **next_packet;
|
yading@11
|
53 int packet_number;
|
yading@11
|
54 uint8_t lpcm_header[3];
|
yading@11
|
55 int lpcm_align;
|
yading@11
|
56 int bytes_to_iframe;
|
yading@11
|
57 int align_iframe;
|
yading@11
|
58 int64_t vobu_start_pts;
|
yading@11
|
59 } StreamInfo;
|
yading@11
|
60
|
yading@11
|
61 typedef struct {
|
yading@11
|
62 const AVClass *class;
|
yading@11
|
63 int packet_size; /* required packet size */
|
yading@11
|
64 int packet_number;
|
yading@11
|
65 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
|
yading@11
|
66 int system_header_freq;
|
yading@11
|
67 int system_header_size;
|
yading@11
|
68 int user_mux_rate; /* bitrate in units of bits/s */
|
yading@11
|
69 int mux_rate; /* bitrate in units of 50 bytes/s */
|
yading@11
|
70 /* stream info */
|
yading@11
|
71 int audio_bound;
|
yading@11
|
72 int video_bound;
|
yading@11
|
73 int is_mpeg2;
|
yading@11
|
74 int is_vcd;
|
yading@11
|
75 int is_svcd;
|
yading@11
|
76 int is_dvd;
|
yading@11
|
77 int64_t last_scr; /* current system clock */
|
yading@11
|
78
|
yading@11
|
79 double vcd_padding_bitrate; //FIXME floats
|
yading@11
|
80 int64_t vcd_padding_bytes_written;
|
yading@11
|
81
|
yading@11
|
82 int preload;
|
yading@11
|
83 } MpegMuxContext;
|
yading@11
|
84
|
yading@11
|
85 extern AVOutputFormat ff_mpeg1vcd_muxer;
|
yading@11
|
86 extern AVOutputFormat ff_mpeg2dvd_muxer;
|
yading@11
|
87 extern AVOutputFormat ff_mpeg2svcd_muxer;
|
yading@11
|
88 extern AVOutputFormat ff_mpeg2vob_muxer;
|
yading@11
|
89
|
yading@11
|
90 static int put_pack_header(AVFormatContext *ctx,
|
yading@11
|
91 uint8_t *buf, int64_t timestamp)
|
yading@11
|
92 {
|
yading@11
|
93 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
94 PutBitContext pb;
|
yading@11
|
95
|
yading@11
|
96 init_put_bits(&pb, buf, 128);
|
yading@11
|
97
|
yading@11
|
98 put_bits32(&pb, PACK_START_CODE);
|
yading@11
|
99 if (s->is_mpeg2) {
|
yading@11
|
100 put_bits(&pb, 2, 0x1);
|
yading@11
|
101 } else {
|
yading@11
|
102 put_bits(&pb, 4, 0x2);
|
yading@11
|
103 }
|
yading@11
|
104 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
|
yading@11
|
105 put_bits(&pb, 1, 1);
|
yading@11
|
106 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
|
yading@11
|
107 put_bits(&pb, 1, 1);
|
yading@11
|
108 put_bits(&pb, 15, (uint32_t)((timestamp ) & 0x7fff));
|
yading@11
|
109 put_bits(&pb, 1, 1);
|
yading@11
|
110 if (s->is_mpeg2) {
|
yading@11
|
111 /* clock extension */
|
yading@11
|
112 put_bits(&pb, 9, 0);
|
yading@11
|
113 }
|
yading@11
|
114 put_bits(&pb, 1, 1);
|
yading@11
|
115 put_bits(&pb, 22, s->mux_rate);
|
yading@11
|
116 put_bits(&pb, 1, 1);
|
yading@11
|
117 if (s->is_mpeg2) {
|
yading@11
|
118 put_bits(&pb, 1, 1);
|
yading@11
|
119 put_bits(&pb, 5, 0x1f); /* reserved */
|
yading@11
|
120 put_bits(&pb, 3, 0); /* stuffing length */
|
yading@11
|
121 }
|
yading@11
|
122 flush_put_bits(&pb);
|
yading@11
|
123 return put_bits_ptr(&pb) - pb.buf;
|
yading@11
|
124 }
|
yading@11
|
125
|
yading@11
|
126 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
|
yading@11
|
127 {
|
yading@11
|
128 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
129 int size, i, private_stream_coded, id;
|
yading@11
|
130 PutBitContext pb;
|
yading@11
|
131
|
yading@11
|
132 init_put_bits(&pb, buf, 128);
|
yading@11
|
133
|
yading@11
|
134 put_bits32(&pb, SYSTEM_HEADER_START_CODE);
|
yading@11
|
135 put_bits(&pb, 16, 0);
|
yading@11
|
136 put_bits(&pb, 1, 1);
|
yading@11
|
137
|
yading@11
|
138 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
|
yading@11
|
139 put_bits(&pb, 1, 1); /* marker */
|
yading@11
|
140 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
|
yading@11
|
141 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
|
yading@11
|
142 put_bits(&pb, 6, 0);
|
yading@11
|
143 } else
|
yading@11
|
144 put_bits(&pb, 6, s->audio_bound);
|
yading@11
|
145
|
yading@11
|
146 if (s->is_vcd) {
|
yading@11
|
147 /* see VCD standard, p. IV-7*/
|
yading@11
|
148 put_bits(&pb, 1, 0);
|
yading@11
|
149 put_bits(&pb, 1, 1);
|
yading@11
|
150 } else {
|
yading@11
|
151 put_bits(&pb, 1, 0); /* variable bitrate*/
|
yading@11
|
152 put_bits(&pb, 1, 0); /* non constrainted bit stream */
|
yading@11
|
153 }
|
yading@11
|
154
|
yading@11
|
155 if (s->is_vcd || s->is_dvd) {
|
yading@11
|
156 /* see VCD standard p IV-7 */
|
yading@11
|
157 put_bits(&pb, 1, 1); /* audio locked */
|
yading@11
|
158 put_bits(&pb, 1, 1); /* video locked */
|
yading@11
|
159 } else {
|
yading@11
|
160 put_bits(&pb, 1, 0); /* audio locked */
|
yading@11
|
161 put_bits(&pb, 1, 0); /* video locked */
|
yading@11
|
162 }
|
yading@11
|
163
|
yading@11
|
164 put_bits(&pb, 1, 1); /* marker */
|
yading@11
|
165
|
yading@11
|
166 if (s->is_vcd && (only_for_stream_id & 0xe0) == AUDIO_ID) {
|
yading@11
|
167 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
|
yading@11
|
168 put_bits(&pb, 5, 0);
|
yading@11
|
169 } else
|
yading@11
|
170 put_bits(&pb, 5, s->video_bound);
|
yading@11
|
171
|
yading@11
|
172 if (s->is_dvd) {
|
yading@11
|
173 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
|
yading@11
|
174 put_bits(&pb, 7, 0x7f); /* reserved byte */
|
yading@11
|
175 } else
|
yading@11
|
176 put_bits(&pb, 8, 0xff); /* reserved byte */
|
yading@11
|
177
|
yading@11
|
178 /* DVD-Video Stream_bound entries
|
yading@11
|
179 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
|
yading@11
|
180 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)
|
yading@11
|
181 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
|
yading@11
|
182 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
|
yading@11
|
183 if (s->is_dvd) {
|
yading@11
|
184
|
yading@11
|
185 int P_STD_max_video = 0;
|
yading@11
|
186 int P_STD_max_mpeg_audio = 0;
|
yading@11
|
187 int P_STD_max_mpeg_PS1 = 0;
|
yading@11
|
188
|
yading@11
|
189 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
190 StreamInfo *stream = ctx->streams[i]->priv_data;
|
yading@11
|
191
|
yading@11
|
192 id = stream->id;
|
yading@11
|
193 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
|
yading@11
|
194 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
|
yading@11
|
195 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
|
yading@11
|
196 P_STD_max_mpeg_audio = stream->max_buffer_size;
|
yading@11
|
197 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
|
yading@11
|
198 P_STD_max_video = stream->max_buffer_size;
|
yading@11
|
199 }
|
yading@11
|
200 }
|
yading@11
|
201
|
yading@11
|
202 /* video */
|
yading@11
|
203 put_bits(&pb, 8, 0xb9); /* stream ID */
|
yading@11
|
204 put_bits(&pb, 2, 3);
|
yading@11
|
205 put_bits(&pb, 1, 1);
|
yading@11
|
206 put_bits(&pb, 13, P_STD_max_video / 1024);
|
yading@11
|
207
|
yading@11
|
208 /* audio */
|
yading@11
|
209 if (P_STD_max_mpeg_audio == 0)
|
yading@11
|
210 P_STD_max_mpeg_audio = 4096;
|
yading@11
|
211 put_bits(&pb, 8, 0xb8); /* stream ID */
|
yading@11
|
212 put_bits(&pb, 2, 3);
|
yading@11
|
213 put_bits(&pb, 1, 0);
|
yading@11
|
214 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
|
yading@11
|
215
|
yading@11
|
216 /* private stream 1 */
|
yading@11
|
217 put_bits(&pb, 8, 0xbd); /* stream ID */
|
yading@11
|
218 put_bits(&pb, 2, 3);
|
yading@11
|
219 put_bits(&pb, 1, 0);
|
yading@11
|
220 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
|
yading@11
|
221
|
yading@11
|
222 /* private stream 2 */
|
yading@11
|
223 put_bits(&pb, 8, 0xbf); /* stream ID */
|
yading@11
|
224 put_bits(&pb, 2, 3);
|
yading@11
|
225 put_bits(&pb, 1, 1);
|
yading@11
|
226 put_bits(&pb, 13, 2);
|
yading@11
|
227 }
|
yading@11
|
228 else {
|
yading@11
|
229 /* audio stream info */
|
yading@11
|
230 private_stream_coded = 0;
|
yading@11
|
231 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
232 StreamInfo *stream = ctx->streams[i]->priv_data;
|
yading@11
|
233
|
yading@11
|
234
|
yading@11
|
235 /* For VCDs, only include the stream info for the stream
|
yading@11
|
236 that the pack which contains this system belongs to.
|
yading@11
|
237 (see VCD standard p. IV-7) */
|
yading@11
|
238 if ( !s->is_vcd || stream->id==only_for_stream_id
|
yading@11
|
239 || only_for_stream_id==0) {
|
yading@11
|
240
|
yading@11
|
241 id = stream->id;
|
yading@11
|
242 if (id < 0xc0) {
|
yading@11
|
243 /* special case for private streams (AC-3 uses that) */
|
yading@11
|
244 if (private_stream_coded)
|
yading@11
|
245 continue;
|
yading@11
|
246 private_stream_coded = 1;
|
yading@11
|
247 id = 0xbd;
|
yading@11
|
248 }
|
yading@11
|
249 put_bits(&pb, 8, id); /* stream ID */
|
yading@11
|
250 put_bits(&pb, 2, 3);
|
yading@11
|
251 if (id < 0xe0) {
|
yading@11
|
252 /* audio */
|
yading@11
|
253 put_bits(&pb, 1, 0);
|
yading@11
|
254 put_bits(&pb, 13, stream->max_buffer_size / 128);
|
yading@11
|
255 } else {
|
yading@11
|
256 /* video */
|
yading@11
|
257 put_bits(&pb, 1, 1);
|
yading@11
|
258 put_bits(&pb, 13, stream->max_buffer_size / 1024);
|
yading@11
|
259 }
|
yading@11
|
260 }
|
yading@11
|
261 }
|
yading@11
|
262 }
|
yading@11
|
263
|
yading@11
|
264 flush_put_bits(&pb);
|
yading@11
|
265 size = put_bits_ptr(&pb) - pb.buf;
|
yading@11
|
266 /* patch packet size */
|
yading@11
|
267 buf[4] = (size - 6) >> 8;
|
yading@11
|
268 buf[5] = (size - 6) & 0xff;
|
yading@11
|
269
|
yading@11
|
270 return size;
|
yading@11
|
271 }
|
yading@11
|
272
|
yading@11
|
273 static int get_system_header_size(AVFormatContext *ctx)
|
yading@11
|
274 {
|
yading@11
|
275 int buf_index, i, private_stream_coded;
|
yading@11
|
276 StreamInfo *stream;
|
yading@11
|
277 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
278
|
yading@11
|
279 if (s->is_dvd)
|
yading@11
|
280 return 18; // DVD-Video system headers are 18 bytes fixed length.
|
yading@11
|
281
|
yading@11
|
282 buf_index = 12;
|
yading@11
|
283 private_stream_coded = 0;
|
yading@11
|
284 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
285 stream = ctx->streams[i]->priv_data;
|
yading@11
|
286 if (stream->id < 0xc0) {
|
yading@11
|
287 if (private_stream_coded)
|
yading@11
|
288 continue;
|
yading@11
|
289 private_stream_coded = 1;
|
yading@11
|
290 }
|
yading@11
|
291 buf_index += 3;
|
yading@11
|
292 }
|
yading@11
|
293 return buf_index;
|
yading@11
|
294 }
|
yading@11
|
295
|
yading@11
|
296 static int mpeg_mux_init(AVFormatContext *ctx)
|
yading@11
|
297 {
|
yading@11
|
298 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
299 int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
|
yading@11
|
300 AVStream *st;
|
yading@11
|
301 StreamInfo *stream;
|
yading@11
|
302 int audio_bitrate;
|
yading@11
|
303 int video_bitrate;
|
yading@11
|
304
|
yading@11
|
305 s->packet_number = 0;
|
yading@11
|
306 s->is_vcd = (CONFIG_MPEG1VCD_MUXER && ctx->oformat == &ff_mpeg1vcd_muxer);
|
yading@11
|
307 s->is_svcd = (CONFIG_MPEG2SVCD_MUXER && ctx->oformat == &ff_mpeg2svcd_muxer);
|
yading@11
|
308 s->is_mpeg2 = ((CONFIG_MPEG2VOB_MUXER && ctx->oformat == &ff_mpeg2vob_muxer) ||
|
yading@11
|
309 (CONFIG_MPEG2DVD_MUXER && ctx->oformat == &ff_mpeg2dvd_muxer) ||
|
yading@11
|
310 (CONFIG_MPEG2SVCD_MUXER && ctx->oformat == &ff_mpeg2svcd_muxer));
|
yading@11
|
311 s->is_dvd = (CONFIG_MPEG2DVD_MUXER && ctx->oformat == &ff_mpeg2dvd_muxer);
|
yading@11
|
312
|
yading@11
|
313 if(ctx->packet_size) {
|
yading@11
|
314 if (ctx->packet_size < 20 || ctx->packet_size > (1 << 23) + 10) {
|
yading@11
|
315 av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n",
|
yading@11
|
316 ctx->packet_size);
|
yading@11
|
317 goto fail;
|
yading@11
|
318 }
|
yading@11
|
319 s->packet_size = ctx->packet_size;
|
yading@11
|
320 } else
|
yading@11
|
321 s->packet_size = 2048;
|
yading@11
|
322 if (ctx->max_delay < 0) /* Not set by the caller */
|
yading@11
|
323 ctx->max_delay = 0;
|
yading@11
|
324
|
yading@11
|
325 s->vcd_padding_bytes_written = 0;
|
yading@11
|
326 s->vcd_padding_bitrate=0;
|
yading@11
|
327
|
yading@11
|
328 s->audio_bound = 0;
|
yading@11
|
329 s->video_bound = 0;
|
yading@11
|
330 mpa_id = AUDIO_ID;
|
yading@11
|
331 ac3_id = AC3_ID;
|
yading@11
|
332 dts_id = DTS_ID;
|
yading@11
|
333 mpv_id = VIDEO_ID;
|
yading@11
|
334 mps_id = SUB_ID;
|
yading@11
|
335 lpcm_id = LPCM_ID;
|
yading@11
|
336 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
337 st = ctx->streams[i];
|
yading@11
|
338 stream = av_mallocz(sizeof(StreamInfo));
|
yading@11
|
339 if (!stream)
|
yading@11
|
340 goto fail;
|
yading@11
|
341 st->priv_data = stream;
|
yading@11
|
342
|
yading@11
|
343 avpriv_set_pts_info(st, 64, 1, 90000);
|
yading@11
|
344
|
yading@11
|
345 switch(st->codec->codec_type) {
|
yading@11
|
346 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
347 if (st->codec->codec_id == AV_CODEC_ID_AC3) {
|
yading@11
|
348 stream->id = ac3_id++;
|
yading@11
|
349 } else if (st->codec->codec_id == AV_CODEC_ID_DTS) {
|
yading@11
|
350 stream->id = dts_id++;
|
yading@11
|
351 } else if (st->codec->codec_id == AV_CODEC_ID_PCM_S16BE) {
|
yading@11
|
352 stream->id = lpcm_id++;
|
yading@11
|
353 for(j = 0; j < 4; j++) {
|
yading@11
|
354 if (lpcm_freq_tab[j] == st->codec->sample_rate)
|
yading@11
|
355 break;
|
yading@11
|
356 }
|
yading@11
|
357 if (j == 4)
|
yading@11
|
358 goto fail;
|
yading@11
|
359 if (st->codec->channels > 8)
|
yading@11
|
360 return -1;
|
yading@11
|
361 stream->lpcm_header[0] = 0x0c;
|
yading@11
|
362 stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
|
yading@11
|
363 stream->lpcm_header[2] = 0x80;
|
yading@11
|
364 stream->lpcm_align = st->codec->channels * 2;
|
yading@11
|
365 } else {
|
yading@11
|
366 stream->id = mpa_id++;
|
yading@11
|
367 }
|
yading@11
|
368
|
yading@11
|
369 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
|
yading@11
|
370 Right now it is also used for everything else.*/
|
yading@11
|
371 stream->max_buffer_size = 4 * 1024;
|
yading@11
|
372 s->audio_bound++;
|
yading@11
|
373 break;
|
yading@11
|
374 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
375 stream->id = mpv_id++;
|
yading@11
|
376 if (st->codec->rc_buffer_size)
|
yading@11
|
377 stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
|
yading@11
|
378 else {
|
yading@11
|
379 av_log(ctx, AV_LOG_WARNING, "VBV buffer size not set, muxing may fail\n");
|
yading@11
|
380 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
|
yading@11
|
381 }
|
yading@11
|
382 s->video_bound++;
|
yading@11
|
383 break;
|
yading@11
|
384 case AVMEDIA_TYPE_SUBTITLE:
|
yading@11
|
385 stream->id = mps_id++;
|
yading@11
|
386 stream->max_buffer_size = 16 * 1024;
|
yading@11
|
387 break;
|
yading@11
|
388 default:
|
yading@11
|
389 return -1;
|
yading@11
|
390 }
|
yading@11
|
391 stream->fifo= av_fifo_alloc(16);
|
yading@11
|
392 if (!stream->fifo)
|
yading@11
|
393 goto fail;
|
yading@11
|
394 }
|
yading@11
|
395 bitrate = 0;
|
yading@11
|
396 audio_bitrate = 0;
|
yading@11
|
397 video_bitrate = 0;
|
yading@11
|
398 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
399 int codec_rate;
|
yading@11
|
400 st = ctx->streams[i];
|
yading@11
|
401 stream = (StreamInfo*) st->priv_data;
|
yading@11
|
402
|
yading@11
|
403 if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
|
yading@11
|
404 codec_rate= st->codec->rc_max_rate;
|
yading@11
|
405 else
|
yading@11
|
406 codec_rate= st->codec->bit_rate;
|
yading@11
|
407
|
yading@11
|
408 if(!codec_rate)
|
yading@11
|
409 codec_rate= (1<<21)*8*50/ctx->nb_streams;
|
yading@11
|
410
|
yading@11
|
411 bitrate += codec_rate;
|
yading@11
|
412
|
yading@11
|
413 if ((stream->id & 0xe0) == AUDIO_ID)
|
yading@11
|
414 audio_bitrate += codec_rate;
|
yading@11
|
415 else if (stream->id==VIDEO_ID)
|
yading@11
|
416 video_bitrate += codec_rate;
|
yading@11
|
417 }
|
yading@11
|
418
|
yading@11
|
419 if (s->user_mux_rate) {
|
yading@11
|
420 s->mux_rate = (s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
|
yading@11
|
421 } else {
|
yading@11
|
422 /* we increase slightly the bitrate to take into account the
|
yading@11
|
423 headers. XXX: compute it exactly */
|
yading@11
|
424 bitrate += bitrate / 20;
|
yading@11
|
425 bitrate += 10000;
|
yading@11
|
426 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
|
yading@11
|
427 }
|
yading@11
|
428
|
yading@11
|
429 if (s->is_vcd) {
|
yading@11
|
430 double overhead_rate;
|
yading@11
|
431
|
yading@11
|
432 /* The VCD standard mandates that the mux_rate field is 3528
|
yading@11
|
433 (see standard p. IV-6).
|
yading@11
|
434 The value is actually "wrong", i.e. if you calculate
|
yading@11
|
435 it using the normal formula and the 75 sectors per second transfer
|
yading@11
|
436 rate you get a different value because the real pack size is 2324,
|
yading@11
|
437 not 2352. But the standard explicitly specifies that the mux_rate
|
yading@11
|
438 field in the header must have this value.*/
|
yading@11
|
439 // s->mux_rate=2352 * 75 / 50; /* = 3528*/
|
yading@11
|
440
|
yading@11
|
441 /* The VCD standard states that the muxed stream must be
|
yading@11
|
442 exactly 75 packs / second (the data rate of a single speed cdrom).
|
yading@11
|
443 Since the video bitrate (probably 1150000 bits/sec) will be below
|
yading@11
|
444 the theoretical maximum we have to add some padding packets
|
yading@11
|
445 to make up for the lower data rate.
|
yading@11
|
446 (cf. VCD standard p. IV-6 )*/
|
yading@11
|
447
|
yading@11
|
448 /* Add the header overhead to the data rate.
|
yading@11
|
449 2279 data bytes per audio pack, 2294 data bytes per video pack*/
|
yading@11
|
450 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
|
yading@11
|
451 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
|
yading@11
|
452 overhead_rate *= 8;
|
yading@11
|
453
|
yading@11
|
454 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
|
yading@11
|
455 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
|
yading@11
|
456 }
|
yading@11
|
457
|
yading@11
|
458 if (s->is_vcd || s->is_mpeg2)
|
yading@11
|
459 /* every packet */
|
yading@11
|
460 s->pack_header_freq = 1;
|
yading@11
|
461 else
|
yading@11
|
462 /* every 2 seconds */
|
yading@11
|
463 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
|
yading@11
|
464
|
yading@11
|
465 /* the above seems to make pack_header_freq zero sometimes */
|
yading@11
|
466 if (s->pack_header_freq == 0)
|
yading@11
|
467 s->pack_header_freq = 1;
|
yading@11
|
468
|
yading@11
|
469 if (s->is_mpeg2)
|
yading@11
|
470 /* every 200 packets. Need to look at the spec. */
|
yading@11
|
471 s->system_header_freq = s->pack_header_freq * 40;
|
yading@11
|
472 else if (s->is_vcd)
|
yading@11
|
473 /* the standard mandates that there are only two system headers
|
yading@11
|
474 in the whole file: one in the first packet of each stream.
|
yading@11
|
475 (see standard p. IV-7 and IV-8) */
|
yading@11
|
476 s->system_header_freq = 0x7fffffff;
|
yading@11
|
477 else
|
yading@11
|
478 s->system_header_freq = s->pack_header_freq * 5;
|
yading@11
|
479
|
yading@11
|
480 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
481 stream = ctx->streams[i]->priv_data;
|
yading@11
|
482 stream->packet_number = 0;
|
yading@11
|
483 }
|
yading@11
|
484 s->system_header_size = get_system_header_size(ctx);
|
yading@11
|
485 s->last_scr = AV_NOPTS_VALUE;
|
yading@11
|
486 return 0;
|
yading@11
|
487 fail:
|
yading@11
|
488 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
489 av_free(ctx->streams[i]->priv_data);
|
yading@11
|
490 }
|
yading@11
|
491 return AVERROR(ENOMEM);
|
yading@11
|
492 }
|
yading@11
|
493
|
yading@11
|
494 static inline void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
|
yading@11
|
495 {
|
yading@11
|
496 avio_w8(pb,
|
yading@11
|
497 (id << 4) |
|
yading@11
|
498 (((timestamp >> 30) & 0x07) << 1) |
|
yading@11
|
499 1);
|
yading@11
|
500 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
|
yading@11
|
501 avio_wb16(pb, (uint16_t)((((timestamp ) & 0x7fff) << 1) | 1));
|
yading@11
|
502 }
|
yading@11
|
503
|
yading@11
|
504
|
yading@11
|
505 /* return the number of padding bytes that should be inserted into
|
yading@11
|
506 the multiplexed stream.*/
|
yading@11
|
507 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
|
yading@11
|
508 {
|
yading@11
|
509 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
510 int pad_bytes = 0;
|
yading@11
|
511
|
yading@11
|
512 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
|
yading@11
|
513 {
|
yading@11
|
514 int64_t full_pad_bytes;
|
yading@11
|
515
|
yading@11
|
516 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
|
yading@11
|
517 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
|
yading@11
|
518
|
yading@11
|
519 if (pad_bytes<0)
|
yading@11
|
520 /* might happen if we have already padded to a later timestamp. This
|
yading@11
|
521 can occur if another stream has already advanced further.*/
|
yading@11
|
522 pad_bytes=0;
|
yading@11
|
523 }
|
yading@11
|
524
|
yading@11
|
525 return pad_bytes;
|
yading@11
|
526 }
|
yading@11
|
527
|
yading@11
|
528
|
yading@11
|
529 /* Write an MPEG padding packet header. */
|
yading@11
|
530 static void put_padding_packet(AVFormatContext *ctx, AVIOContext *pb,int packet_bytes)
|
yading@11
|
531 {
|
yading@11
|
532 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
533 int i;
|
yading@11
|
534
|
yading@11
|
535 avio_wb32(pb, PADDING_STREAM);
|
yading@11
|
536 avio_wb16(pb, packet_bytes - 6);
|
yading@11
|
537 if (!s->is_mpeg2) {
|
yading@11
|
538 avio_w8(pb, 0x0f);
|
yading@11
|
539 packet_bytes -= 7;
|
yading@11
|
540 } else
|
yading@11
|
541 packet_bytes -= 6;
|
yading@11
|
542
|
yading@11
|
543 for(i=0;i<packet_bytes;i++)
|
yading@11
|
544 avio_w8(pb, 0xff);
|
yading@11
|
545 }
|
yading@11
|
546
|
yading@11
|
547 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
|
yading@11
|
548 int nb_frames=0;
|
yading@11
|
549 PacketDesc *pkt_desc= stream->premux_packet;
|
yading@11
|
550
|
yading@11
|
551 while(len>0){
|
yading@11
|
552 if(pkt_desc->size == pkt_desc->unwritten_size)
|
yading@11
|
553 nb_frames++;
|
yading@11
|
554 len -= pkt_desc->unwritten_size;
|
yading@11
|
555 pkt_desc= pkt_desc->next;
|
yading@11
|
556 }
|
yading@11
|
557
|
yading@11
|
558 return nb_frames;
|
yading@11
|
559 }
|
yading@11
|
560
|
yading@11
|
561 /* flush the packet on stream stream_index */
|
yading@11
|
562 static int flush_packet(AVFormatContext *ctx, int stream_index,
|
yading@11
|
563 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
|
yading@11
|
564 {
|
yading@11
|
565 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
566 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
|
yading@11
|
567 uint8_t *buf_ptr;
|
yading@11
|
568 int size, payload_size, startcode, id, stuffing_size, i, header_len;
|
yading@11
|
569 int packet_size;
|
yading@11
|
570 uint8_t buffer[128];
|
yading@11
|
571 int zero_trail_bytes = 0;
|
yading@11
|
572 int pad_packet_bytes = 0;
|
yading@11
|
573 int pes_flags;
|
yading@11
|
574 int general_pack = 0; /*"general" pack without data specific to one stream?*/
|
yading@11
|
575 int nb_frames;
|
yading@11
|
576
|
yading@11
|
577 id = stream->id;
|
yading@11
|
578
|
yading@11
|
579 av_dlog(ctx, "packet ID=%2x PTS=%0.3f\n", id, pts / 90000.0);
|
yading@11
|
580
|
yading@11
|
581 buf_ptr = buffer;
|
yading@11
|
582
|
yading@11
|
583 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
|
yading@11
|
584 /* output pack and systems header if needed */
|
yading@11
|
585 size = put_pack_header(ctx, buf_ptr, scr);
|
yading@11
|
586 buf_ptr += size;
|
yading@11
|
587 s->last_scr= scr;
|
yading@11
|
588
|
yading@11
|
589 if (s->is_vcd) {
|
yading@11
|
590 /* there is exactly one system header for each stream in a VCD MPEG,
|
yading@11
|
591 One in the very first video packet and one in the very first
|
yading@11
|
592 audio packet (see VCD standard p. IV-7 and IV-8).*/
|
yading@11
|
593
|
yading@11
|
594 if (stream->packet_number==0) {
|
yading@11
|
595 size = put_system_header(ctx, buf_ptr, id);
|
yading@11
|
596 buf_ptr += size;
|
yading@11
|
597 }
|
yading@11
|
598 } else if (s->is_dvd) {
|
yading@11
|
599 if (stream->align_iframe || s->packet_number == 0){
|
yading@11
|
600 int PES_bytes_to_fill = s->packet_size - size - 10;
|
yading@11
|
601
|
yading@11
|
602 if (pts != AV_NOPTS_VALUE) {
|
yading@11
|
603 if (dts != pts)
|
yading@11
|
604 PES_bytes_to_fill -= 5 + 5;
|
yading@11
|
605 else
|
yading@11
|
606 PES_bytes_to_fill -= 5;
|
yading@11
|
607 }
|
yading@11
|
608
|
yading@11
|
609 if (stream->bytes_to_iframe == 0 || s->packet_number == 0) {
|
yading@11
|
610 size = put_system_header(ctx, buf_ptr, 0);
|
yading@11
|
611 buf_ptr += size;
|
yading@11
|
612 size = buf_ptr - buffer;
|
yading@11
|
613 avio_write(ctx->pb, buffer, size);
|
yading@11
|
614
|
yading@11
|
615 avio_wb32(ctx->pb, PRIVATE_STREAM_2);
|
yading@11
|
616 avio_wb16(ctx->pb, 0x03d4); // length
|
yading@11
|
617 avio_w8(ctx->pb, 0x00); // substream ID, 00=PCI
|
yading@11
|
618 for (i = 0; i < 979; i++)
|
yading@11
|
619 avio_w8(ctx->pb, 0x00);
|
yading@11
|
620
|
yading@11
|
621 avio_wb32(ctx->pb, PRIVATE_STREAM_2);
|
yading@11
|
622 avio_wb16(ctx->pb, 0x03fa); // length
|
yading@11
|
623 avio_w8(ctx->pb, 0x01); // substream ID, 01=DSI
|
yading@11
|
624 for (i = 0; i < 1017; i++)
|
yading@11
|
625 avio_w8(ctx->pb, 0x00);
|
yading@11
|
626
|
yading@11
|
627 memset(buffer, 0, 128);
|
yading@11
|
628 buf_ptr = buffer;
|
yading@11
|
629 s->packet_number++;
|
yading@11
|
630 stream->align_iframe = 0;
|
yading@11
|
631 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
|
yading@11
|
632 size = put_pack_header(ctx, buf_ptr, scr);
|
yading@11
|
633 s->last_scr= scr;
|
yading@11
|
634 buf_ptr += size;
|
yading@11
|
635 /* GOP Start */
|
yading@11
|
636 } else if (stream->bytes_to_iframe < PES_bytes_to_fill) {
|
yading@11
|
637 pad_packet_bytes = PES_bytes_to_fill - stream->bytes_to_iframe;
|
yading@11
|
638 }
|
yading@11
|
639 }
|
yading@11
|
640 } else {
|
yading@11
|
641 if ((s->packet_number % s->system_header_freq) == 0) {
|
yading@11
|
642 size = put_system_header(ctx, buf_ptr, 0);
|
yading@11
|
643 buf_ptr += size;
|
yading@11
|
644 }
|
yading@11
|
645 }
|
yading@11
|
646 }
|
yading@11
|
647 size = buf_ptr - buffer;
|
yading@11
|
648 avio_write(ctx->pb, buffer, size);
|
yading@11
|
649
|
yading@11
|
650 packet_size = s->packet_size - size;
|
yading@11
|
651
|
yading@11
|
652 if (s->is_vcd && (id & 0xe0) == AUDIO_ID)
|
yading@11
|
653 /* The VCD standard demands that 20 zero bytes follow
|
yading@11
|
654 each audio pack (see standard p. IV-8).*/
|
yading@11
|
655 zero_trail_bytes += 20;
|
yading@11
|
656
|
yading@11
|
657 if ((s->is_vcd && stream->packet_number==0)
|
yading@11
|
658 || (s->is_svcd && s->packet_number==0)) {
|
yading@11
|
659 /* for VCD the first pack of each stream contains only the pack header,
|
yading@11
|
660 the system header and lots of padding (see VCD standard p. IV-6).
|
yading@11
|
661 In the case of an audio pack, 20 zero bytes are also added at
|
yading@11
|
662 the end.*/
|
yading@11
|
663 /* For SVCD we fill the very first pack to increase compatibility with
|
yading@11
|
664 some DVD players. Not mandated by the standard.*/
|
yading@11
|
665 if (s->is_svcd)
|
yading@11
|
666 general_pack = 1; /* the system header refers to both streams and no stream data*/
|
yading@11
|
667 pad_packet_bytes = packet_size - zero_trail_bytes;
|
yading@11
|
668 }
|
yading@11
|
669
|
yading@11
|
670 packet_size -= pad_packet_bytes + zero_trail_bytes;
|
yading@11
|
671
|
yading@11
|
672 if (packet_size > 0) {
|
yading@11
|
673
|
yading@11
|
674 /* packet header size */
|
yading@11
|
675 packet_size -= 6;
|
yading@11
|
676
|
yading@11
|
677 /* packet header */
|
yading@11
|
678 if (s->is_mpeg2) {
|
yading@11
|
679 header_len = 3;
|
yading@11
|
680 if (stream->packet_number==0)
|
yading@11
|
681 header_len += 3; /* PES extension */
|
yading@11
|
682 header_len += 1; /* obligatory stuffing byte */
|
yading@11
|
683 } else {
|
yading@11
|
684 header_len = 0;
|
yading@11
|
685 }
|
yading@11
|
686 if (pts != AV_NOPTS_VALUE) {
|
yading@11
|
687 if (dts != pts)
|
yading@11
|
688 header_len += 5 + 5;
|
yading@11
|
689 else
|
yading@11
|
690 header_len += 5;
|
yading@11
|
691 } else {
|
yading@11
|
692 if (!s->is_mpeg2)
|
yading@11
|
693 header_len++;
|
yading@11
|
694 }
|
yading@11
|
695
|
yading@11
|
696 payload_size = packet_size - header_len;
|
yading@11
|
697 if (id < 0xc0) {
|
yading@11
|
698 startcode = PRIVATE_STREAM_1;
|
yading@11
|
699 payload_size -= 1;
|
yading@11
|
700 if (id >= 0x40) {
|
yading@11
|
701 payload_size -= 3;
|
yading@11
|
702 if (id >= 0xa0)
|
yading@11
|
703 payload_size -= 3;
|
yading@11
|
704 }
|
yading@11
|
705 } else {
|
yading@11
|
706 startcode = 0x100 + id;
|
yading@11
|
707 }
|
yading@11
|
708
|
yading@11
|
709 stuffing_size = payload_size - av_fifo_size(stream->fifo);
|
yading@11
|
710
|
yading@11
|
711 // first byte does not fit -> reset pts/dts + stuffing
|
yading@11
|
712 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
|
yading@11
|
713 int timestamp_len=0;
|
yading@11
|
714 if(dts != pts)
|
yading@11
|
715 timestamp_len += 5;
|
yading@11
|
716 if(pts != AV_NOPTS_VALUE)
|
yading@11
|
717 timestamp_len += s->is_mpeg2 ? 5 : 4;
|
yading@11
|
718 pts=dts= AV_NOPTS_VALUE;
|
yading@11
|
719 header_len -= timestamp_len;
|
yading@11
|
720 if (s->is_dvd && stream->align_iframe) {
|
yading@11
|
721 pad_packet_bytes += timestamp_len;
|
yading@11
|
722 packet_size -= timestamp_len;
|
yading@11
|
723 } else {
|
yading@11
|
724 payload_size += timestamp_len;
|
yading@11
|
725 }
|
yading@11
|
726 stuffing_size += timestamp_len;
|
yading@11
|
727 if(payload_size > trailer_size)
|
yading@11
|
728 stuffing_size += payload_size - trailer_size;
|
yading@11
|
729 }
|
yading@11
|
730
|
yading@11
|
731 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
|
yading@11
|
732 packet_size += pad_packet_bytes;
|
yading@11
|
733 payload_size += pad_packet_bytes; // undo the previous adjustment
|
yading@11
|
734 if (stuffing_size < 0) {
|
yading@11
|
735 stuffing_size = pad_packet_bytes;
|
yading@11
|
736 } else {
|
yading@11
|
737 stuffing_size += pad_packet_bytes;
|
yading@11
|
738 }
|
yading@11
|
739 pad_packet_bytes = 0;
|
yading@11
|
740 }
|
yading@11
|
741
|
yading@11
|
742 if (stuffing_size < 0)
|
yading@11
|
743 stuffing_size = 0;
|
yading@11
|
744
|
yading@11
|
745 if (startcode == PRIVATE_STREAM_1 && id >= 0xa0) {
|
yading@11
|
746 if (payload_size < av_fifo_size(stream->fifo))
|
yading@11
|
747 stuffing_size += payload_size % stream->lpcm_align;
|
yading@11
|
748 }
|
yading@11
|
749
|
yading@11
|
750 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
|
yading@11
|
751 pad_packet_bytes += stuffing_size;
|
yading@11
|
752 packet_size -= stuffing_size;
|
yading@11
|
753 payload_size -= stuffing_size;
|
yading@11
|
754 stuffing_size = 0;
|
yading@11
|
755 }
|
yading@11
|
756
|
yading@11
|
757 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
|
yading@11
|
758
|
yading@11
|
759 avio_wb32(ctx->pb, startcode);
|
yading@11
|
760
|
yading@11
|
761 avio_wb16(ctx->pb, packet_size);
|
yading@11
|
762
|
yading@11
|
763 if (!s->is_mpeg2)
|
yading@11
|
764 for(i=0;i<stuffing_size;i++)
|
yading@11
|
765 avio_w8(ctx->pb, 0xff);
|
yading@11
|
766
|
yading@11
|
767 if (s->is_mpeg2) {
|
yading@11
|
768 avio_w8(ctx->pb, 0x80); /* mpeg2 id */
|
yading@11
|
769
|
yading@11
|
770 pes_flags=0;
|
yading@11
|
771
|
yading@11
|
772 if (pts != AV_NOPTS_VALUE) {
|
yading@11
|
773 pes_flags |= 0x80;
|
yading@11
|
774 if (dts != pts)
|
yading@11
|
775 pes_flags |= 0x40;
|
yading@11
|
776 }
|
yading@11
|
777
|
yading@11
|
778 /* Both the MPEG-2 and the SVCD standards demand that the
|
yading@11
|
779 P-STD_buffer_size field be included in the first packet of
|
yading@11
|
780 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
|
yading@11
|
781 and MPEG-2 standard 2.7.7) */
|
yading@11
|
782 if (stream->packet_number == 0)
|
yading@11
|
783 pes_flags |= 0x01;
|
yading@11
|
784
|
yading@11
|
785 avio_w8(ctx->pb, pes_flags); /* flags */
|
yading@11
|
786 avio_w8(ctx->pb, header_len - 3 + stuffing_size);
|
yading@11
|
787
|
yading@11
|
788 if (pes_flags & 0x80) /*write pts*/
|
yading@11
|
789 put_timestamp(ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
|
yading@11
|
790 if (pes_flags & 0x40) /*write dts*/
|
yading@11
|
791 put_timestamp(ctx->pb, 0x01, dts);
|
yading@11
|
792
|
yading@11
|
793 if (pes_flags & 0x01) { /*write pes extension*/
|
yading@11
|
794 avio_w8(ctx->pb, 0x10); /* flags */
|
yading@11
|
795
|
yading@11
|
796 /* P-STD buffer info */
|
yading@11
|
797 if ((id & 0xe0) == AUDIO_ID)
|
yading@11
|
798 avio_wb16(ctx->pb, 0x4000 | stream->max_buffer_size/ 128);
|
yading@11
|
799 else
|
yading@11
|
800 avio_wb16(ctx->pb, 0x6000 | stream->max_buffer_size/1024);
|
yading@11
|
801 }
|
yading@11
|
802
|
yading@11
|
803 } else {
|
yading@11
|
804 if (pts != AV_NOPTS_VALUE) {
|
yading@11
|
805 if (dts != pts) {
|
yading@11
|
806 put_timestamp(ctx->pb, 0x03, pts);
|
yading@11
|
807 put_timestamp(ctx->pb, 0x01, dts);
|
yading@11
|
808 } else {
|
yading@11
|
809 put_timestamp(ctx->pb, 0x02, pts);
|
yading@11
|
810 }
|
yading@11
|
811 } else {
|
yading@11
|
812 avio_w8(ctx->pb, 0x0f);
|
yading@11
|
813 }
|
yading@11
|
814 }
|
yading@11
|
815
|
yading@11
|
816 if (s->is_mpeg2) {
|
yading@11
|
817 /* special stuffing byte that is always written
|
yading@11
|
818 to prevent accidental generation of start codes. */
|
yading@11
|
819 avio_w8(ctx->pb, 0xff);
|
yading@11
|
820
|
yading@11
|
821 for(i=0;i<stuffing_size;i++)
|
yading@11
|
822 avio_w8(ctx->pb, 0xff);
|
yading@11
|
823 }
|
yading@11
|
824
|
yading@11
|
825 if (startcode == PRIVATE_STREAM_1) {
|
yading@11
|
826 avio_w8(ctx->pb, id);
|
yading@11
|
827 if (id >= 0xa0) {
|
yading@11
|
828 /* LPCM (XXX: check nb_frames) */
|
yading@11
|
829 avio_w8(ctx->pb, 7);
|
yading@11
|
830 avio_wb16(ctx->pb, 4); /* skip 3 header bytes */
|
yading@11
|
831 avio_w8(ctx->pb, stream->lpcm_header[0]);
|
yading@11
|
832 avio_w8(ctx->pb, stream->lpcm_header[1]);
|
yading@11
|
833 avio_w8(ctx->pb, stream->lpcm_header[2]);
|
yading@11
|
834 } else if (id >= 0x40) {
|
yading@11
|
835 /* AC-3 */
|
yading@11
|
836 avio_w8(ctx->pb, nb_frames);
|
yading@11
|
837 avio_wb16(ctx->pb, trailer_size+1);
|
yading@11
|
838 }
|
yading@11
|
839 }
|
yading@11
|
840
|
yading@11
|
841 /* output data */
|
yading@11
|
842 assert(payload_size - stuffing_size <= av_fifo_size(stream->fifo));
|
yading@11
|
843 av_fifo_generic_read(stream->fifo, ctx->pb, payload_size - stuffing_size, (void*)avio_write);
|
yading@11
|
844 stream->bytes_to_iframe -= payload_size - stuffing_size;
|
yading@11
|
845 }else{
|
yading@11
|
846 payload_size=
|
yading@11
|
847 stuffing_size= 0;
|
yading@11
|
848 }
|
yading@11
|
849
|
yading@11
|
850 if (pad_packet_bytes > 0)
|
yading@11
|
851 put_padding_packet(ctx,ctx->pb, pad_packet_bytes);
|
yading@11
|
852
|
yading@11
|
853 for(i=0;i<zero_trail_bytes;i++)
|
yading@11
|
854 avio_w8(ctx->pb, 0x00);
|
yading@11
|
855
|
yading@11
|
856 avio_flush(ctx->pb);
|
yading@11
|
857
|
yading@11
|
858 s->packet_number++;
|
yading@11
|
859
|
yading@11
|
860 /* only increase the stream packet number if this pack actually contains
|
yading@11
|
861 something that is specific to this stream! I.e. a dedicated header
|
yading@11
|
862 or some data.*/
|
yading@11
|
863 if (!general_pack)
|
yading@11
|
864 stream->packet_number++;
|
yading@11
|
865
|
yading@11
|
866 return payload_size - stuffing_size;
|
yading@11
|
867 }
|
yading@11
|
868
|
yading@11
|
869 static void put_vcd_padding_sector(AVFormatContext *ctx)
|
yading@11
|
870 {
|
yading@11
|
871 /* There are two ways to do this padding: writing a sector/pack
|
yading@11
|
872 of 0 values, or writing an MPEG padding pack. Both seem to
|
yading@11
|
873 work with most decoders, BUT the VCD standard only allows a 0-sector
|
yading@11
|
874 (see standard p. IV-4, IV-5).
|
yading@11
|
875 So a 0-sector it is...*/
|
yading@11
|
876
|
yading@11
|
877 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
878 int i;
|
yading@11
|
879
|
yading@11
|
880 for(i=0;i<s->packet_size;i++)
|
yading@11
|
881 avio_w8(ctx->pb, 0);
|
yading@11
|
882
|
yading@11
|
883 s->vcd_padding_bytes_written += s->packet_size;
|
yading@11
|
884
|
yading@11
|
885 avio_flush(ctx->pb);
|
yading@11
|
886
|
yading@11
|
887 /* increasing the packet number is correct. The SCR of the following packs
|
yading@11
|
888 is calculated from the packet_number and it has to include the padding
|
yading@11
|
889 sector (it represents the sector index, not the MPEG pack index)
|
yading@11
|
890 (see VCD standard p. IV-6)*/
|
yading@11
|
891 s->packet_number++;
|
yading@11
|
892 }
|
yading@11
|
893
|
yading@11
|
894 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
|
yading@11
|
895 // MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
896 int i;
|
yading@11
|
897
|
yading@11
|
898 for(i=0; i<ctx->nb_streams; i++){
|
yading@11
|
899 AVStream *st = ctx->streams[i];
|
yading@11
|
900 StreamInfo *stream = st->priv_data;
|
yading@11
|
901 PacketDesc *pkt_desc;
|
yading@11
|
902
|
yading@11
|
903 while((pkt_desc= stream->predecode_packet)
|
yading@11
|
904 && scr > pkt_desc->dts){ //FIXME > vs >=
|
yading@11
|
905 if(stream->buffer_index < pkt_desc->size ||
|
yading@11
|
906 stream->predecode_packet == stream->premux_packet){
|
yading@11
|
907 av_log(ctx, AV_LOG_ERROR,
|
yading@11
|
908 "buffer underflow i=%d bufi=%d size=%d\n",
|
yading@11
|
909 i, stream->buffer_index, pkt_desc->size);
|
yading@11
|
910 break;
|
yading@11
|
911 }
|
yading@11
|
912 stream->buffer_index -= pkt_desc->size;
|
yading@11
|
913
|
yading@11
|
914 stream->predecode_packet= pkt_desc->next;
|
yading@11
|
915 av_freep(&pkt_desc);
|
yading@11
|
916 }
|
yading@11
|
917 }
|
yading@11
|
918
|
yading@11
|
919 return 0;
|
yading@11
|
920 }
|
yading@11
|
921
|
yading@11
|
922 static int output_packet(AVFormatContext *ctx, int flush){
|
yading@11
|
923 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
924 AVStream *st;
|
yading@11
|
925 StreamInfo *stream;
|
yading@11
|
926 int i, avail_space=0, es_size, trailer_size;
|
yading@11
|
927 int best_i= -1;
|
yading@11
|
928 int best_score= INT_MIN;
|
yading@11
|
929 int ignore_constraints=0;
|
yading@11
|
930 int64_t scr= s->last_scr;
|
yading@11
|
931 PacketDesc *timestamp_packet;
|
yading@11
|
932 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
|
yading@11
|
933
|
yading@11
|
934 retry:
|
yading@11
|
935 for(i=0; i<ctx->nb_streams; i++){
|
yading@11
|
936 AVStream *st = ctx->streams[i];
|
yading@11
|
937 StreamInfo *stream = st->priv_data;
|
yading@11
|
938 const int avail_data= av_fifo_size(stream->fifo);
|
yading@11
|
939 const int space= stream->max_buffer_size - stream->buffer_index;
|
yading@11
|
940 int rel_space= 1024LL*space / stream->max_buffer_size;
|
yading@11
|
941 PacketDesc *next_pkt= stream->premux_packet;
|
yading@11
|
942
|
yading@11
|
943 /* for subtitle, a single PES packet must be generated,
|
yading@11
|
944 so we flush after every single subtitle packet */
|
yading@11
|
945 if(s->packet_size > avail_data && !flush
|
yading@11
|
946 && st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)
|
yading@11
|
947 return 0;
|
yading@11
|
948 if(avail_data==0)
|
yading@11
|
949 continue;
|
yading@11
|
950 assert(avail_data>0);
|
yading@11
|
951
|
yading@11
|
952 if(space < s->packet_size && !ignore_constraints)
|
yading@11
|
953 continue;
|
yading@11
|
954
|
yading@11
|
955 if(next_pkt && next_pkt->dts - scr > max_delay)
|
yading@11
|
956 continue;
|
yading@11
|
957
|
yading@11
|
958 if(rel_space > best_score){
|
yading@11
|
959 best_score= rel_space;
|
yading@11
|
960 best_i = i;
|
yading@11
|
961 avail_space= space;
|
yading@11
|
962 }
|
yading@11
|
963 }
|
yading@11
|
964
|
yading@11
|
965 if(best_i < 0){
|
yading@11
|
966 int64_t best_dts= INT64_MAX;
|
yading@11
|
967
|
yading@11
|
968 for(i=0; i<ctx->nb_streams; i++){
|
yading@11
|
969 AVStream *st = ctx->streams[i];
|
yading@11
|
970 StreamInfo *stream = st->priv_data;
|
yading@11
|
971 PacketDesc *pkt_desc= stream->predecode_packet;
|
yading@11
|
972 if(pkt_desc && pkt_desc->dts < best_dts)
|
yading@11
|
973 best_dts= pkt_desc->dts;
|
yading@11
|
974 }
|
yading@11
|
975
|
yading@11
|
976 av_dlog(ctx, "bumping scr, scr:%f, dts:%f\n",
|
yading@11
|
977 scr / 90000.0, best_dts / 90000.0);
|
yading@11
|
978 if(best_dts == INT64_MAX)
|
yading@11
|
979 return 0;
|
yading@11
|
980
|
yading@11
|
981 if(scr >= best_dts+1 && !ignore_constraints){
|
yading@11
|
982 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
|
yading@11
|
983 ignore_constraints= 1;
|
yading@11
|
984 }
|
yading@11
|
985 scr= FFMAX(best_dts+1, scr);
|
yading@11
|
986 if(remove_decoded_packets(ctx, scr) < 0)
|
yading@11
|
987 return -1;
|
yading@11
|
988 goto retry;
|
yading@11
|
989 }
|
yading@11
|
990
|
yading@11
|
991 assert(best_i >= 0);
|
yading@11
|
992
|
yading@11
|
993 st = ctx->streams[best_i];
|
yading@11
|
994 stream = st->priv_data;
|
yading@11
|
995
|
yading@11
|
996 assert(av_fifo_size(stream->fifo) > 0);
|
yading@11
|
997
|
yading@11
|
998 assert(avail_space >= s->packet_size || ignore_constraints);
|
yading@11
|
999
|
yading@11
|
1000 timestamp_packet= stream->premux_packet;
|
yading@11
|
1001 if(timestamp_packet->unwritten_size == timestamp_packet->size){
|
yading@11
|
1002 trailer_size= 0;
|
yading@11
|
1003 }else{
|
yading@11
|
1004 trailer_size= timestamp_packet->unwritten_size;
|
yading@11
|
1005 timestamp_packet= timestamp_packet->next;
|
yading@11
|
1006 }
|
yading@11
|
1007
|
yading@11
|
1008 if(timestamp_packet){
|
yading@11
|
1009 av_dlog(ctx, "dts:%f pts:%f scr:%f stream:%d\n",
|
yading@11
|
1010 timestamp_packet->dts / 90000.0,
|
yading@11
|
1011 timestamp_packet->pts / 90000.0,
|
yading@11
|
1012 scr / 90000.0, best_i);
|
yading@11
|
1013 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
|
yading@11
|
1014 }else{
|
yading@11
|
1015 assert(av_fifo_size(stream->fifo) == trailer_size);
|
yading@11
|
1016 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
|
yading@11
|
1017 }
|
yading@11
|
1018
|
yading@11
|
1019 if (s->is_vcd) {
|
yading@11
|
1020 /* Write one or more padding sectors, if necessary, to reach
|
yading@11
|
1021 the constant overall bitrate.*/
|
yading@11
|
1022 int vcd_pad_bytes;
|
yading@11
|
1023
|
yading@11
|
1024 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
|
yading@11
|
1025 put_vcd_padding_sector(ctx);
|
yading@11
|
1026 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
|
yading@11
|
1027 }
|
yading@11
|
1028 }
|
yading@11
|
1029
|
yading@11
|
1030 stream->buffer_index += es_size;
|
yading@11
|
1031 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
|
yading@11
|
1032
|
yading@11
|
1033 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
|
yading@11
|
1034 es_size -= stream->premux_packet->unwritten_size;
|
yading@11
|
1035 stream->premux_packet= stream->premux_packet->next;
|
yading@11
|
1036 }
|
yading@11
|
1037 if(es_size)
|
yading@11
|
1038 stream->premux_packet->unwritten_size -= es_size;
|
yading@11
|
1039
|
yading@11
|
1040 if(remove_decoded_packets(ctx, s->last_scr) < 0)
|
yading@11
|
1041 return -1;
|
yading@11
|
1042
|
yading@11
|
1043 return 1;
|
yading@11
|
1044 }
|
yading@11
|
1045
|
yading@11
|
1046 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
|
yading@11
|
1047 {
|
yading@11
|
1048 MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
1049 int stream_index= pkt->stream_index;
|
yading@11
|
1050 int size= pkt->size;
|
yading@11
|
1051 uint8_t *buf= pkt->data;
|
yading@11
|
1052 AVStream *st = ctx->streams[stream_index];
|
yading@11
|
1053 StreamInfo *stream = st->priv_data;
|
yading@11
|
1054 int64_t pts, dts;
|
yading@11
|
1055 PacketDesc *pkt_desc;
|
yading@11
|
1056 int preload;
|
yading@11
|
1057 const int is_iframe = st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (pkt->flags & AV_PKT_FLAG_KEY);
|
yading@11
|
1058
|
yading@11
|
1059 preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
|
yading@11
|
1060
|
yading@11
|
1061 pts= pkt->pts;
|
yading@11
|
1062 dts= pkt->dts;
|
yading@11
|
1063
|
yading@11
|
1064 if (s->last_scr == AV_NOPTS_VALUE) {
|
yading@11
|
1065 if (dts == AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) || s->is_dvd) {
|
yading@11
|
1066 if (dts != AV_NOPTS_VALUE)
|
yading@11
|
1067 s->preload += av_rescale(-dts, AV_TIME_BASE, 90000);
|
yading@11
|
1068 s->last_scr = 0;
|
yading@11
|
1069 } else {
|
yading@11
|
1070 s->last_scr = dts - preload;
|
yading@11
|
1071 s->preload = 0;
|
yading@11
|
1072 }
|
yading@11
|
1073 preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
|
yading@11
|
1074 av_log(ctx, AV_LOG_DEBUG, "First SCR: %"PRId64" First DTS: %"PRId64"\n", s->last_scr, dts + preload);
|
yading@11
|
1075 }
|
yading@11
|
1076
|
yading@11
|
1077 if (dts != AV_NOPTS_VALUE) dts += preload;
|
yading@11
|
1078 if (pts != AV_NOPTS_VALUE) pts += preload;
|
yading@11
|
1079
|
yading@11
|
1080 av_dlog(ctx, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n",
|
yading@11
|
1081 dts / 90000.0, pts / 90000.0, pkt->flags,
|
yading@11
|
1082 pkt->stream_index, pts != AV_NOPTS_VALUE);
|
yading@11
|
1083 if (!stream->premux_packet)
|
yading@11
|
1084 stream->next_packet = &stream->premux_packet;
|
yading@11
|
1085 *stream->next_packet=
|
yading@11
|
1086 pkt_desc= av_mallocz(sizeof(PacketDesc));
|
yading@11
|
1087 pkt_desc->pts= pts;
|
yading@11
|
1088 pkt_desc->dts= dts;
|
yading@11
|
1089 pkt_desc->unwritten_size=
|
yading@11
|
1090 pkt_desc->size= size;
|
yading@11
|
1091 if(!stream->predecode_packet)
|
yading@11
|
1092 stream->predecode_packet= pkt_desc;
|
yading@11
|
1093 stream->next_packet= &pkt_desc->next;
|
yading@11
|
1094
|
yading@11
|
1095 if (av_fifo_realloc2(stream->fifo, av_fifo_size(stream->fifo) + size) < 0)
|
yading@11
|
1096 return -1;
|
yading@11
|
1097
|
yading@11
|
1098 if (s->is_dvd){
|
yading@11
|
1099 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
|
yading@11
|
1100 stream->bytes_to_iframe = av_fifo_size(stream->fifo);
|
yading@11
|
1101 stream->align_iframe = 1;
|
yading@11
|
1102 stream->vobu_start_pts = pts;
|
yading@11
|
1103 }
|
yading@11
|
1104 }
|
yading@11
|
1105
|
yading@11
|
1106 av_fifo_generic_write(stream->fifo, buf, size, NULL);
|
yading@11
|
1107
|
yading@11
|
1108 for(;;){
|
yading@11
|
1109 int ret= output_packet(ctx, 0);
|
yading@11
|
1110 if(ret<=0)
|
yading@11
|
1111 return ret;
|
yading@11
|
1112 }
|
yading@11
|
1113 }
|
yading@11
|
1114
|
yading@11
|
1115 static int mpeg_mux_end(AVFormatContext *ctx)
|
yading@11
|
1116 {
|
yading@11
|
1117 // MpegMuxContext *s = ctx->priv_data;
|
yading@11
|
1118 StreamInfo *stream;
|
yading@11
|
1119 int i;
|
yading@11
|
1120
|
yading@11
|
1121 for(;;){
|
yading@11
|
1122 int ret= output_packet(ctx, 1);
|
yading@11
|
1123 if(ret<0)
|
yading@11
|
1124 return ret;
|
yading@11
|
1125 else if(ret==0)
|
yading@11
|
1126 break;
|
yading@11
|
1127 }
|
yading@11
|
1128
|
yading@11
|
1129 /* End header according to MPEG1 systems standard. We do not write
|
yading@11
|
1130 it as it is usually not needed by decoders and because it
|
yading@11
|
1131 complicates MPEG stream concatenation. */
|
yading@11
|
1132 //avio_wb32(ctx->pb, ISO_11172_END_CODE);
|
yading@11
|
1133 //avio_flush(ctx->pb);
|
yading@11
|
1134
|
yading@11
|
1135 for(i=0;i<ctx->nb_streams;i++) {
|
yading@11
|
1136 stream = ctx->streams[i]->priv_data;
|
yading@11
|
1137
|
yading@11
|
1138 assert(av_fifo_size(stream->fifo) == 0);
|
yading@11
|
1139 av_fifo_free(stream->fifo);
|
yading@11
|
1140 }
|
yading@11
|
1141 return 0;
|
yading@11
|
1142 }
|
yading@11
|
1143
|
yading@11
|
1144 #define OFFSET(x) offsetof(MpegMuxContext, x)
|
yading@11
|
1145 #define E AV_OPT_FLAG_ENCODING_PARAM
|
yading@11
|
1146 static const AVOption options[] = {
|
yading@11
|
1147 { "muxrate", NULL, OFFSET(user_mux_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
|
yading@11
|
1148 { "preload", "Initial demux-decode delay in microseconds.", OFFSET(preload), AV_OPT_TYPE_INT, {.i64 = 500000}, 0, INT_MAX, E},
|
yading@11
|
1149 { NULL },
|
yading@11
|
1150 };
|
yading@11
|
1151
|
yading@11
|
1152 #define MPEGENC_CLASS(flavor)\
|
yading@11
|
1153 static const AVClass flavor ## _class = {\
|
yading@11
|
1154 .class_name = #flavor " muxer",\
|
yading@11
|
1155 .item_name = av_default_item_name,\
|
yading@11
|
1156 .version = LIBAVUTIL_VERSION_INT,\
|
yading@11
|
1157 .option = options,\
|
yading@11
|
1158 };
|
yading@11
|
1159
|
yading@11
|
1160 #if CONFIG_MPEG1SYSTEM_MUXER
|
yading@11
|
1161 MPEGENC_CLASS(mpeg)
|
yading@11
|
1162 AVOutputFormat ff_mpeg1system_muxer = {
|
yading@11
|
1163 .name = "mpeg",
|
yading@11
|
1164 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 Systems / MPEG program stream"),
|
yading@11
|
1165 .mime_type = "video/mpeg",
|
yading@11
|
1166 .extensions = "mpg,mpeg",
|
yading@11
|
1167 .priv_data_size = sizeof(MpegMuxContext),
|
yading@11
|
1168 .audio_codec = AV_CODEC_ID_MP2,
|
yading@11
|
1169 .video_codec = AV_CODEC_ID_MPEG1VIDEO,
|
yading@11
|
1170 .write_header = mpeg_mux_init,
|
yading@11
|
1171 .write_packet = mpeg_mux_write_packet,
|
yading@11
|
1172 .write_trailer = mpeg_mux_end,
|
yading@11
|
1173 .priv_class = &mpeg_class,
|
yading@11
|
1174 };
|
yading@11
|
1175 #endif
|
yading@11
|
1176 #if CONFIG_MPEG1VCD_MUXER
|
yading@11
|
1177 MPEGENC_CLASS(vcd)
|
yading@11
|
1178 AVOutputFormat ff_mpeg1vcd_muxer = {
|
yading@11
|
1179 .name = "vcd",
|
yading@11
|
1180 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 Systems / MPEG program stream (VCD)"),
|
yading@11
|
1181 .mime_type = "video/mpeg",
|
yading@11
|
1182 .priv_data_size = sizeof(MpegMuxContext),
|
yading@11
|
1183 .audio_codec = AV_CODEC_ID_MP2,
|
yading@11
|
1184 .video_codec = AV_CODEC_ID_MPEG1VIDEO,
|
yading@11
|
1185 .write_header = mpeg_mux_init,
|
yading@11
|
1186 .write_packet = mpeg_mux_write_packet,
|
yading@11
|
1187 .write_trailer = mpeg_mux_end,
|
yading@11
|
1188 .priv_class = &vcd_class,
|
yading@11
|
1189 };
|
yading@11
|
1190 #endif
|
yading@11
|
1191 #if CONFIG_MPEG2VOB_MUXER
|
yading@11
|
1192 MPEGENC_CLASS(vob)
|
yading@11
|
1193 AVOutputFormat ff_mpeg2vob_muxer = {
|
yading@11
|
1194 .name = "vob",
|
yading@11
|
1195 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 PS (VOB)"),
|
yading@11
|
1196 .mime_type = "video/mpeg",
|
yading@11
|
1197 .extensions = "vob",
|
yading@11
|
1198 .priv_data_size = sizeof(MpegMuxContext),
|
yading@11
|
1199 .audio_codec = AV_CODEC_ID_MP2,
|
yading@11
|
1200 .video_codec = AV_CODEC_ID_MPEG2VIDEO,
|
yading@11
|
1201 .write_header = mpeg_mux_init,
|
yading@11
|
1202 .write_packet = mpeg_mux_write_packet,
|
yading@11
|
1203 .write_trailer = mpeg_mux_end,
|
yading@11
|
1204 .priv_class = &vob_class,
|
yading@11
|
1205 };
|
yading@11
|
1206 #endif
|
yading@11
|
1207
|
yading@11
|
1208 /* Same as mpeg2vob_mux except that the pack size is 2324 */
|
yading@11
|
1209 #if CONFIG_MPEG2SVCD_MUXER
|
yading@11
|
1210 MPEGENC_CLASS(svcd)
|
yading@11
|
1211 AVOutputFormat ff_mpeg2svcd_muxer = {
|
yading@11
|
1212 .name = "svcd",
|
yading@11
|
1213 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 PS (SVCD)"),
|
yading@11
|
1214 .mime_type = "video/mpeg",
|
yading@11
|
1215 .extensions = "vob",
|
yading@11
|
1216 .priv_data_size = sizeof(MpegMuxContext),
|
yading@11
|
1217 .audio_codec = AV_CODEC_ID_MP2,
|
yading@11
|
1218 .video_codec = AV_CODEC_ID_MPEG2VIDEO,
|
yading@11
|
1219 .write_header = mpeg_mux_init,
|
yading@11
|
1220 .write_packet = mpeg_mux_write_packet,
|
yading@11
|
1221 .write_trailer = mpeg_mux_end,
|
yading@11
|
1222 .priv_class = &svcd_class,
|
yading@11
|
1223 };
|
yading@11
|
1224 #endif
|
yading@11
|
1225
|
yading@11
|
1226 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
|
yading@11
|
1227 #if CONFIG_MPEG2DVD_MUXER
|
yading@11
|
1228 MPEGENC_CLASS(dvd)
|
yading@11
|
1229 AVOutputFormat ff_mpeg2dvd_muxer = {
|
yading@11
|
1230 .name = "dvd",
|
yading@11
|
1231 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 PS (DVD VOB)"),
|
yading@11
|
1232 .mime_type = "video/mpeg",
|
yading@11
|
1233 .extensions = "dvd",
|
yading@11
|
1234 .priv_data_size = sizeof(MpegMuxContext),
|
yading@11
|
1235 .audio_codec = AV_CODEC_ID_MP2,
|
yading@11
|
1236 .video_codec = AV_CODEC_ID_MPEG2VIDEO,
|
yading@11
|
1237 .write_header = mpeg_mux_init,
|
yading@11
|
1238 .write_packet = mpeg_mux_write_packet,
|
yading@11
|
1239 .write_trailer = mpeg_mux_end,
|
yading@11
|
1240 .priv_class = &dvd_class,
|
yading@11
|
1241 };
|
yading@11
|
1242 #endif
|