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