]> git.sesse.net Git - ffmpeg/blob - libavformat/mpegenc.c
avcodec/dvbsubdec: prefer to use variable instead of type for sizeof
[ffmpeg] / libavformat / mpegenc.c
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             return AVERROR(EINVAL);
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             return AVERROR(ENOMEM);
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                  st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD))
358                  av_log(ctx, AV_LOG_WARNING,
359                         "%s in MPEG-1 system streams is not widely supported, "
360                         "consider using the vob or the dvd muxer "
361                         "to force a MPEG-2 program stream.\n",
362                         avcodec_get_name(st->codecpar->codec_id));
363             if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
364                 stream->id = ac3_id++;
365             } else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) {
366                 stream->id = dts_id++;
367             } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
368                 stream->id = lpcm_id++;
369                 for (j = 0; j < 4; j++) {
370                     if (lpcm_freq_tab[j] == st->codecpar->sample_rate)
371                         break;
372                 }
373                 if (j == 4) {
374                     int sr;
375                     av_log(ctx, AV_LOG_ERROR, "Invalid sampling rate for PCM stream.\n");
376                     av_log(ctx, AV_LOG_INFO, "Allowed sampling rates:");
377                     for (sr = 0; sr < 4; sr++)
378                          av_log(ctx, AV_LOG_INFO, " %d", lpcm_freq_tab[sr]);
379                     av_log(ctx, AV_LOG_INFO, "\n");
380                     return AVERROR(EINVAL);
381                 }
382                 if (st->codecpar->channels > 8) {
383                     av_log(ctx, AV_LOG_ERROR, "At most 8 channels allowed for LPCM streams.\n");
384                     return AVERROR(EINVAL);
385                 }
386                 stream->lpcm_header[0] = 0x0c;
387                 stream->lpcm_header[1] = (st->codecpar->channels - 1) | (j << 4);
388                 stream->lpcm_header[2] = 0x80;
389                 stream->lpcm_align     = st->codecpar->channels * 2;
390             } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
391                 int freq;
392
393                 switch (st->codecpar->sample_rate) {
394                 case 48000: freq = 0; break;
395                 case 96000: freq = 1; break;
396                 case 44100: freq = 2; break;
397                 case 32000: freq = 3; break;
398                 default:
399                     av_log(ctx, AV_LOG_ERROR, "Unsupported sample rate.\n");
400                     return AVERROR(EINVAL);
401                 }
402
403                 stream->lpcm_header[0] = 0x0c;
404                 stream->lpcm_header[1] = (freq << 4) |
405                                          (((st->codecpar->bits_per_coded_sample - 16) / 4) << 6) |
406                                          st->codecpar->channels - 1;
407                 stream->lpcm_header[2] = 0x80;
408                 stream->id = lpcm_id++;
409                 stream->lpcm_align = st->codecpar->channels * st->codecpar->bits_per_coded_sample / 8;
410             } else if (st->codecpar->codec_id == AV_CODEC_ID_MLP ||
411                        st->codecpar->codec_id == AV_CODEC_ID_TRUEHD) {
412                        av_log(ctx, AV_LOG_ERROR, "Support for muxing audio codec %s not implemented.\n",
413                               avcodec_get_name(st->codecpar->codec_id));
414                        return AVERROR_PATCHWELCOME;
415             } else if (st->codecpar->codec_id != AV_CODEC_ID_MP1 &&
416                        st->codecpar->codec_id != AV_CODEC_ID_MP2 &&
417                        st->codecpar->codec_id != AV_CODEC_ID_MP3) {
418                        av_log(ctx, AV_LOG_ERROR, "Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3 or dts.\n");
419                        return AVERROR(EINVAL);
420             } else {
421                 stream->id = mpa_id++;
422             }
423
424             /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
425              * Right now it is also used for everything else. */
426             stream->max_buffer_size = 4 * 1024;
427             s->audio_bound++;
428             break;
429         case AVMEDIA_TYPE_VIDEO:
430             if (st->codecpar->codec_id == AV_CODEC_ID_H264)
431                 stream->id = h264_id++;
432             else
433                 stream->id = mpv_id++;
434
435             props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
436             if (props && props->buffer_size)
437                 stream->max_buffer_size = 6 * 1024 + props->buffer_size / 8;
438             else {
439                 av_log(ctx, AV_LOG_WARNING,
440                        "VBV buffer size not set, using default size of 230KB\n"
441                        "If you want the mpeg file to be compliant to some specification\n"
442                        "Like DVD, VCD or others, make sure you set the correct buffer size\n");
443                 // FIXME: this is probably too small as default
444                 stream->max_buffer_size = 230 * 1024;
445             }
446             if (stream->max_buffer_size > 1024 * 8191) {
447                 av_log(ctx, AV_LOG_WARNING, "buffer size %d, too large\n", stream->max_buffer_size);
448                 stream->max_buffer_size = 1024 * 8191;
449             }
450             s->video_bound++;
451             break;
452         case AVMEDIA_TYPE_SUBTITLE:
453             stream->id              = mps_id++;
454             stream->max_buffer_size = 16 * 1024;
455             break;
456         default:
457             av_log(ctx, AV_LOG_ERROR, "Invalid media type %s for output stream #%d\n",
458                    av_get_media_type_string(st->codecpar->codec_type), i);
459             return AVERROR(EINVAL);
460         }
461         stream->fifo = av_fifo_alloc(16);
462         if (!stream->fifo)
463             return AVERROR(ENOMEM);
464     }
465     bitrate       = 0;
466     audio_bitrate = 0;
467     video_bitrate = 0;
468     for (i = 0; i < ctx->nb_streams; i++) {
469         AVCPBProperties *props;
470         int codec_rate;
471         st     = ctx->streams[i];
472         stream = (StreamInfo *)st->priv_data;
473
474         props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
475         if (props)
476             codec_rate = props->max_bitrate;
477         else
478             codec_rate = st->codecpar->bit_rate;
479
480         if (!codec_rate)
481             codec_rate = (1 << 21) * 8 * 50 / ctx->nb_streams;
482
483         bitrate += codec_rate;
484
485         if ((stream->id & 0xe0) == AUDIO_ID)
486             audio_bitrate += codec_rate;
487         else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
488             video_bitrate += codec_rate;
489     }
490
491     if (s->user_mux_rate) {
492         s->mux_rate = (s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
493     } else {
494         /* we increase slightly the bitrate to take into account the
495          * headers. XXX: compute it exactly */
496         bitrate    += bitrate / 20;
497         bitrate    += 10000;
498         s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
499         if (s->mux_rate >= (1<<22)) {
500             av_log(ctx, AV_LOG_WARNING, "mux rate %d is too large\n", s->mux_rate);
501             s->mux_rate = (1<<22) - 1;
502         }
503     }
504
505     if (s->is_vcd) {
506         int64_t overhead_rate;
507
508         /* The VCD standard mandates that the mux_rate field is 3528
509          * (see standard p. IV-6).
510          * The value is actually "wrong", i.e. if you calculate
511          * it using the normal formula and the 75 sectors per second transfer
512          * rate you get a different value because the real pack size is 2324,
513          * not 2352. But the standard explicitly specifies that the mux_rate
514          * field in the header must have this value. */
515         // s->mux_rate = 2352 * 75 / 50;    /* = 3528 */
516
517         /* The VCD standard states that the muxed stream must be
518          * exactly 75 packs / second (the data rate of a single speed cdrom).
519          * Since the video bitrate (probably 1150000 bits/sec) will be below
520          * the theoretical maximum we have to add some padding packets
521          * to make up for the lower data rate.
522          * (cf. VCD standard p. IV-6 ) */
523
524         /* Add the header overhead to the data rate.
525          * 2279 data bytes per audio pack, 2294 data bytes per video pack */
526         overhead_rate  = audio_bitrate * 2294LL * (2324 - 2279);
527         overhead_rate += video_bitrate * 2279LL * (2324 - 2294);
528
529         /* Add padding so that the full bitrate is 2324*75 bytes/sec */
530         s->vcd_padding_bitrate_num = (2324LL * 75 * 8 - bitrate) * 2279 * 2294 - overhead_rate;
531 #define VCD_PADDING_BITRATE_DEN (2279 * 2294)
532     }
533
534     if (s->is_vcd || s->is_mpeg2)
535         /* every packet */
536         s->pack_header_freq = 1;
537     else
538         /* every 2 seconds */
539         s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
540
541     /* the above seems to make pack_header_freq zero sometimes */
542     if (s->pack_header_freq == 0)
543         s->pack_header_freq = 1;
544
545     if (s->is_mpeg2)
546         /* every 200 packets. Need to look at the spec.  */
547         s->system_header_freq = s->pack_header_freq * 40;
548     else if (s->is_vcd)
549         /* the standard mandates that there are only two system headers
550          * in the whole file: one in the first packet of each stream.
551          * (see standard p. IV-7 and IV-8) */
552         s->system_header_freq = 0x7fffffff;
553     else
554         s->system_header_freq = s->pack_header_freq * 5;
555
556     for (i = 0; i < ctx->nb_streams; i++) {
557         stream                = ctx->streams[i]->priv_data;
558         stream->packet_number = 0;
559     }
560     s->system_header_size = get_system_header_size(ctx);
561     s->last_scr           = AV_NOPTS_VALUE;
562     return 0;
563 }
564
565 static inline void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
566 {
567     avio_w8(pb, (id << 4) |  (((timestamp >> 30) & 0x07)   << 1) | 1);
568     avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
569     avio_wb16(pb, (uint16_t)((((timestamp)       & 0x7fff) << 1) | 1));
570 }
571
572 /* return the number of padding bytes that should be inserted into
573  * the multiplexed stream. */
574 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
575 {
576     MpegMuxContext *s = ctx->priv_data;
577     int pad_bytes = 0;
578
579     if (s->vcd_padding_bitrate_num > 0 && pts != AV_NOPTS_VALUE) {
580         int64_t full_pad_bytes;
581
582         // FIXME: this is wrong
583         full_pad_bytes =
584             av_rescale(s->vcd_padding_bitrate_num, pts, 90000LL * 8 * VCD_PADDING_BITRATE_DEN);
585         pad_bytes = (int)(full_pad_bytes - s->vcd_padding_bytes_written);
586
587         if (pad_bytes < 0)
588             /* might happen if we have already padded to a later timestamp. This
589              * can occur if another stream has already advanced further. */
590             pad_bytes = 0;
591     }
592
593     return pad_bytes;
594 }
595
596 /* Write an MPEG padding packet header. */
597 static void put_padding_packet(AVFormatContext *ctx, AVIOContext *pb,
598                                int packet_bytes)
599 {
600     MpegMuxContext *s = ctx->priv_data;
601     int i;
602
603     avio_wb32(pb, PADDING_STREAM);
604     avio_wb16(pb, packet_bytes - 6);
605     if (!s->is_mpeg2) {
606         avio_w8(pb, 0x0f);
607         packet_bytes -= 7;
608     } else
609         packet_bytes -= 6;
610
611     for (i = 0; i < packet_bytes; i++)
612         avio_w8(pb, 0xff);
613 }
614
615 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len)
616 {
617     int nb_frames        = 0;
618     PacketDesc *pkt_desc = stream->premux_packet;
619
620     while (len > 0) {
621         if (pkt_desc->size == pkt_desc->unwritten_size)
622             nb_frames++;
623         len     -= pkt_desc->unwritten_size;
624         pkt_desc = pkt_desc->next;
625     }
626
627     return nb_frames;
628 }
629
630 /* flush the packet on stream stream_index */
631 static int flush_packet(AVFormatContext *ctx, int stream_index,
632                         int64_t pts, int64_t dts, int64_t scr, int trailer_size)
633 {
634     MpegMuxContext *s  = ctx->priv_data;
635     StreamInfo *stream = ctx->streams[stream_index]->priv_data;
636     uint8_t *buf_ptr;
637     int size, payload_size, startcode, id, stuffing_size, i, header_len;
638     int packet_size;
639     uint8_t buffer[128];
640     int zero_trail_bytes = 0;
641     int pad_packet_bytes = 0;
642     int pes_flags;
643     /* "general" pack without data specific to one stream? */
644     int general_pack = 0;
645     int nb_frames;
646
647     id = stream->id;
648
649     av_log(ctx, AV_LOG_TRACE, "packet ID=%2x PTS=%0.3f\n", id, pts / 90000.0);
650
651     buf_ptr = buffer;
652
653     if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
654         /* output pack and systems header if needed */
655         size        = put_pack_header(ctx, buf_ptr, scr);
656         buf_ptr    += size;
657         s->last_scr = scr;
658
659         if (s->is_vcd) {
660             /* there is exactly one system header for each stream in a VCD MPEG,
661              * One in the very first video packet and one in the very first
662              * audio packet (see VCD standard p. IV-7 and IV-8). */
663
664             if (stream->packet_number == 0) {
665                 size     = put_system_header(ctx, buf_ptr, id);
666                 buf_ptr += size;
667             }
668         } else if (s->is_dvd) {
669             if (stream->align_iframe || s->packet_number == 0) {
670                 int PES_bytes_to_fill = s->packet_size - size - 10;
671
672                 if (pts != AV_NOPTS_VALUE) {
673                     if (dts != pts)
674                         PES_bytes_to_fill -= 5 + 5;
675                     else
676                         PES_bytes_to_fill -= 5;
677                 }
678
679                 if (stream->bytes_to_iframe == 0 || s->packet_number == 0) {
680                     size     = put_system_header(ctx, buf_ptr, 0);
681                     buf_ptr += size;
682                     size     = buf_ptr - buffer;
683                     avio_write(ctx->pb, buffer, size);
684
685                     avio_wb32(ctx->pb, PRIVATE_STREAM_2);
686                     avio_wb16(ctx->pb, 0x03d4);     // length
687                     avio_w8(ctx->pb, 0x00);         // substream ID, 00=PCI
688                     for (i = 0; i < 979; i++)
689                         avio_w8(ctx->pb, 0x00);
690
691                     avio_wb32(ctx->pb, PRIVATE_STREAM_2);
692                     avio_wb16(ctx->pb, 0x03fa);     // length
693                     avio_w8(ctx->pb, 0x01);         // substream ID, 01=DSI
694                     for (i = 0; i < 1017; i++)
695                         avio_w8(ctx->pb, 0x00);
696
697                     memset(buffer, 0, 128);
698                     buf_ptr = buffer;
699                     s->packet_number++;
700                     stream->align_iframe = 0;
701                     // FIXME: rounding and first few bytes of each packet
702                     scr        += s->packet_size * 90000LL /
703                                   (s->mux_rate * 50LL);
704                     size        = put_pack_header(ctx, buf_ptr, scr);
705                     s->last_scr = scr;
706                     buf_ptr    += size;
707                     /* GOP Start */
708                 } else if (stream->bytes_to_iframe < PES_bytes_to_fill) {
709                     pad_packet_bytes = PES_bytes_to_fill -
710                                        stream->bytes_to_iframe;
711                 }
712             }
713         } else {
714             if ((s->packet_number % s->system_header_freq) == 0) {
715                 size     = put_system_header(ctx, buf_ptr, 0);
716                 buf_ptr += size;
717             }
718         }
719     }
720     size = buf_ptr - buffer;
721     avio_write(ctx->pb, buffer, size);
722
723     packet_size = s->packet_size - size;
724
725     if (s->is_vcd && (id & 0xe0) == AUDIO_ID)
726         /* The VCD standard demands that 20 zero bytes follow
727          * each audio pack (see standard p. IV-8). */
728         zero_trail_bytes += 20;
729
730     if ((s->is_vcd && stream->packet_number == 0) ||
731         (s->is_svcd && s->packet_number == 0)) {
732         /* for VCD the first pack of each stream contains only the pack header,
733          * the system header and lots of padding (see VCD standard p. IV-6).
734          * In the case of an audio pack, 20 zero bytes are also added at
735          * the end. */
736         /* For SVCD we fill the very first pack to increase compatibility with
737          * some DVD players. Not mandated by the standard. */
738         if (s->is_svcd)
739             /* the system header refers to both streams and no stream data */
740             general_pack = 1;
741         pad_packet_bytes = packet_size - zero_trail_bytes;
742     }
743
744     packet_size -= pad_packet_bytes + zero_trail_bytes;
745
746     if (packet_size > 0) {
747         /* packet header size */
748         packet_size -= 6;
749
750         /* packet header */
751         if (s->is_mpeg2) {
752             header_len = 3;
753             if (stream->packet_number == 0)
754                 header_len += 3; /* PES extension */
755             header_len += 1; /* obligatory stuffing byte */
756         } else {
757             header_len = 0;
758         }
759         if (pts != AV_NOPTS_VALUE) {
760             if (dts != pts)
761                 header_len += 5 + 5;
762             else
763                 header_len += 5;
764         } else {
765             if (!s->is_mpeg2)
766                 header_len++;
767         }
768
769         payload_size = packet_size - header_len;
770         if (id < 0xc0) {
771             startcode     = PRIVATE_STREAM_1;
772             payload_size -= 1;
773             if (id >= 0x40) {
774                 payload_size -= 3;
775                 if (id >= 0xa0)
776                     payload_size -= 3;
777             }
778         } else {
779             startcode = 0x100 + id;
780         }
781
782         stuffing_size = payload_size - av_fifo_size(stream->fifo);
783
784         // first byte does not fit -> reset pts/dts + stuffing
785         if (payload_size <= trailer_size && pts != AV_NOPTS_VALUE) {
786             int timestamp_len = 0;
787             if (dts != pts)
788                 timestamp_len += 5;
789             if (pts != AV_NOPTS_VALUE)
790                 timestamp_len += s->is_mpeg2 ? 5 : 4;
791             pts         =
792             dts         = AV_NOPTS_VALUE;
793             header_len -= timestamp_len;
794             if (s->is_dvd && stream->align_iframe) {
795                 pad_packet_bytes += timestamp_len;
796                 packet_size      -= timestamp_len;
797             } else {
798                 payload_size += timestamp_len;
799             }
800             stuffing_size += timestamp_len;
801             if (payload_size > trailer_size)
802                 stuffing_size += payload_size - trailer_size;
803         }
804
805         // can't use padding, so use stuffing
806         if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) {
807             packet_size  += pad_packet_bytes;
808             payload_size += pad_packet_bytes; // undo the previous adjustment
809             if (stuffing_size < 0)
810                 stuffing_size = pad_packet_bytes;
811             else
812                 stuffing_size += pad_packet_bytes;
813             pad_packet_bytes = 0;
814         }
815
816         if (stuffing_size < 0)
817             stuffing_size = 0;
818
819         if (startcode == PRIVATE_STREAM_1 && id >= 0xa0) {
820             if (payload_size < av_fifo_size(stream->fifo))
821                 stuffing_size += payload_size % stream->lpcm_align;
822         }
823
824         if (stuffing_size > 16) {   /* <=16 for MPEG-1, <=32 for MPEG-2 */
825             pad_packet_bytes += stuffing_size;
826             packet_size      -= stuffing_size;
827             payload_size     -= stuffing_size;
828             stuffing_size     = 0;
829         }
830
831         nb_frames = get_nb_frames(ctx, stream, payload_size - stuffing_size);
832
833         avio_wb32(ctx->pb, startcode);
834
835         avio_wb16(ctx->pb, packet_size);
836
837         if (!s->is_mpeg2)
838             for (i = 0; i < stuffing_size; i++)
839                 avio_w8(ctx->pb, 0xff);
840
841         if (s->is_mpeg2) {
842             avio_w8(ctx->pb, 0x80); /* mpeg2 id */
843
844             pes_flags = 0;
845
846             if (pts != AV_NOPTS_VALUE) {
847                 pes_flags |= 0x80;
848                 if (dts != pts)
849                     pes_flags |= 0x40;
850             }
851
852             /* Both the MPEG-2 and the SVCD standards demand that the
853              * P-STD_buffer_size field be included in the first packet of
854              * every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
855              * and MPEG-2 standard 2.7.7) */
856             if (stream->packet_number == 0)
857                 pes_flags |= 0x01;
858
859             avio_w8(ctx->pb, pes_flags); /* flags */
860             avio_w8(ctx->pb, header_len - 3 + stuffing_size);
861
862             if (pes_flags & 0x80)  /* write pts */
863                 put_timestamp(ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
864             if (pes_flags & 0x40)  /* write dts */
865                 put_timestamp(ctx->pb, 0x01, dts);
866
867             if (pes_flags & 0x01) {  /* write pes extension */
868                 avio_w8(ctx->pb, 0x10); /* flags */
869
870                 /* P-STD buffer info */
871                 if ((id & 0xe0) == AUDIO_ID)
872                     avio_wb16(ctx->pb, 0x4000 | stream->max_buffer_size / 128);
873                 else
874                     avio_wb16(ctx->pb, 0x6000 | stream->max_buffer_size / 1024);
875             }
876         } else {
877             if (pts != AV_NOPTS_VALUE) {
878                 if (dts != pts) {
879                     put_timestamp(ctx->pb, 0x03, pts);
880                     put_timestamp(ctx->pb, 0x01, dts);
881                 } else {
882                     put_timestamp(ctx->pb, 0x02, pts);
883                 }
884             } else {
885                 avio_w8(ctx->pb, 0x0f);
886             }
887         }
888
889         if (s->is_mpeg2) {
890             /* special stuffing byte that is always written
891              * to prevent accidental generation of start codes. */
892             avio_w8(ctx->pb, 0xff);
893
894             for (i = 0; i < stuffing_size; i++)
895                 avio_w8(ctx->pb, 0xff);
896         }
897
898         if (startcode == PRIVATE_STREAM_1) {
899             avio_w8(ctx->pb, id);
900             if (id >= 0xa0) {
901                 /* LPCM (XXX: check nb_frames) */
902                 avio_w8(ctx->pb, 7);
903                 avio_wb16(ctx->pb, 4); /* skip 3 header bytes */
904                 avio_w8(ctx->pb, stream->lpcm_header[0]);
905                 avio_w8(ctx->pb, stream->lpcm_header[1]);
906                 avio_w8(ctx->pb, stream->lpcm_header[2]);
907             } else if (id >= 0x40) {
908                 /* AC-3 */
909                 avio_w8(ctx->pb, nb_frames);
910                 avio_wb16(ctx->pb, trailer_size + 1);
911             }
912         }
913
914         /* output data */
915         av_assert0(payload_size - stuffing_size <= av_fifo_size(stream->fifo));
916         av_fifo_generic_read(stream->fifo, ctx->pb,
917                              payload_size - stuffing_size,
918                              (void (*)(void*, void*, int))avio_write);
919         stream->bytes_to_iframe -= payload_size - stuffing_size;
920     } else {
921         payload_size  =
922         stuffing_size = 0;
923     }
924
925     if (pad_packet_bytes > 0)
926         put_padding_packet(ctx, ctx->pb, pad_packet_bytes);
927
928     for (i = 0; i < zero_trail_bytes; i++)
929         avio_w8(ctx->pb, 0x00);
930
931     avio_write_marker(ctx->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
932
933     s->packet_number++;
934
935     /* only increase the stream packet number if this pack actually contains
936      * something that is specific to this stream! I.e. a dedicated header
937      * or some data. */
938     if (!general_pack)
939         stream->packet_number++;
940
941     return payload_size - stuffing_size;
942 }
943
944 static void put_vcd_padding_sector(AVFormatContext *ctx)
945 {
946     /* There are two ways to do this padding: writing a sector/pack
947      * of 0 values, or writing an MPEG padding pack. Both seem to
948      * work with most decoders, BUT the VCD standard only allows a 0-sector
949      * (see standard p. IV-4, IV-5).
950      * So a 0-sector it is... */
951
952     MpegMuxContext *s = ctx->priv_data;
953     int i;
954
955     for (i = 0; i < s->packet_size; i++)
956         avio_w8(ctx->pb, 0);
957
958     s->vcd_padding_bytes_written += s->packet_size;
959
960     avio_write_marker(ctx->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
961
962     /* increasing the packet number is correct. The SCR of the following packs
963      * is calculated from the packet_number and it has to include the padding
964      * sector (it represents the sector index, not the MPEG pack index)
965      * (see VCD standard p. IV-6) */
966     s->packet_number++;
967 }
968
969 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr)
970 {
971     int i;
972
973     for (i = 0; i < ctx->nb_streams; i++) {
974         AVStream *st = ctx->streams[i];
975         StreamInfo *stream = st->priv_data;
976         PacketDesc *pkt_desc;
977
978         while ((pkt_desc = stream->predecode_packet) &&
979                scr > pkt_desc->dts) { // FIXME: > vs >=
980             if (stream->buffer_index < pkt_desc->size ||
981                 stream->predecode_packet == stream->premux_packet) {
982                 av_log(ctx, AV_LOG_ERROR,
983                        "buffer underflow st=%d bufi=%d size=%d\n",
984                        i, stream->buffer_index, pkt_desc->size);
985                 break;
986             }
987             stream->buffer_index    -= pkt_desc->size;
988             stream->predecode_packet = pkt_desc->next;
989             av_freep(&pkt_desc);
990         }
991     }
992
993     return 0;
994 }
995
996 static int output_packet(AVFormatContext *ctx, int flush)
997 {
998     MpegMuxContext *s = ctx->priv_data;
999     AVStream *st;
1000     StreamInfo *stream;
1001     int i, avail_space = 0, es_size, trailer_size;
1002     int best_i = -1;
1003     int best_score = INT_MIN;
1004     int ignore_constraints = 0;
1005     int ignore_delay = 0;
1006     int64_t scr = s->last_scr;
1007     PacketDesc *timestamp_packet;
1008     const int64_t max_delay = av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
1009
1010 retry:
1011     for (i = 0; i < ctx->nb_streams; i++) {
1012         AVStream *st = ctx->streams[i];
1013         StreamInfo *stream = st->priv_data;
1014         const int avail_data = av_fifo_size(stream->fifo);
1015         const int space = stream->max_buffer_size - stream->buffer_index;
1016         int rel_space = 1024LL * space / stream->max_buffer_size;
1017         PacketDesc *next_pkt = stream->premux_packet;
1018
1019         /* for subtitle, a single PES packet must be generated,
1020          * so we flush after every single subtitle packet */
1021         if (s->packet_size > avail_data && !flush
1022             && st->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
1023             return 0;
1024         if (avail_data == 0)
1025             continue;
1026         av_assert0(avail_data > 0);
1027
1028         if (space < s->packet_size && !ignore_constraints)
1029             continue;
1030
1031         if (next_pkt && next_pkt->dts - scr > max_delay && !ignore_delay)
1032             continue;
1033         if (   stream->predecode_packet
1034             && stream->predecode_packet->size > stream->buffer_index)
1035             rel_space += 1<<28;
1036         if (rel_space > best_score) {
1037             best_score  = rel_space;
1038             best_i      = i;
1039             avail_space = space;
1040         }
1041     }
1042
1043     if (best_i < 0) {
1044         int64_t best_dts = INT64_MAX;
1045         int has_premux = 0;
1046
1047         for (i = 0; i < ctx->nb_streams; i++) {
1048             AVStream *st = ctx->streams[i];
1049             StreamInfo *stream = st->priv_data;
1050             PacketDesc *pkt_desc = stream->predecode_packet;
1051             if (pkt_desc && pkt_desc->dts < best_dts)
1052                 best_dts = pkt_desc->dts;
1053             has_premux |= !!stream->premux_packet;
1054         }
1055
1056         if (best_dts < INT64_MAX) {
1057             av_log(ctx, AV_LOG_TRACE, "bumping scr, scr:%f, dts:%f\n",
1058                     scr / 90000.0, best_dts / 90000.0);
1059
1060             if (scr >= best_dts + 1 && !ignore_constraints) {
1061                 av_log(ctx, AV_LOG_ERROR,
1062                     "packet too large, ignoring buffer limits to mux it\n");
1063                 ignore_constraints = 1;
1064             }
1065             scr = FFMAX(best_dts + 1, scr);
1066             if (remove_decoded_packets(ctx, scr) < 0)
1067                 return -1;
1068         } else if (has_premux && flush) {
1069             av_log(ctx, AV_LOG_ERROR,
1070                   "delay too large, ignoring ...\n");
1071             ignore_delay = 1;
1072             ignore_constraints = 1;
1073         } else
1074             return 0;
1075
1076         goto retry;
1077     }
1078
1079     av_assert0(best_i >= 0);
1080
1081     st     = ctx->streams[best_i];
1082     stream = st->priv_data;
1083
1084     av_assert0(av_fifo_size(stream->fifo) > 0);
1085
1086     av_assert0(avail_space >= s->packet_size || ignore_constraints);
1087
1088     timestamp_packet = stream->premux_packet;
1089     if (timestamp_packet->unwritten_size == timestamp_packet->size) {
1090         trailer_size = 0;
1091     } else {
1092         trailer_size     = timestamp_packet->unwritten_size;
1093         timestamp_packet = timestamp_packet->next;
1094     }
1095
1096     if (timestamp_packet) {
1097         av_log(ctx, AV_LOG_TRACE, "dts:%f pts:%f scr:%f stream:%d\n",
1098                 timestamp_packet->dts / 90000.0,
1099                 timestamp_packet->pts / 90000.0,
1100                 scr / 90000.0, best_i);
1101         es_size = flush_packet(ctx, best_i, timestamp_packet->pts,
1102                                timestamp_packet->dts, scr, trailer_size);
1103     } else {
1104         av_assert0(av_fifo_size(stream->fifo) == trailer_size);
1105         es_size = flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr,
1106                                trailer_size);
1107     }
1108
1109     if (s->is_vcd) {
1110         /* Write one or more padding sectors, if necessary, to reach
1111          * the constant overall bitrate. */
1112         int vcd_pad_bytes;
1113
1114         // FIXME: pts cannot be correct here
1115         while ((vcd_pad_bytes = get_vcd_padding_size(ctx, stream->premux_packet->pts)) >= s->packet_size) {
1116             put_vcd_padding_sector(ctx);
1117             // FIXME: rounding and first few bytes of each packet
1118             s->last_scr += s->packet_size * 90000LL / (s->mux_rate * 50LL);
1119         }
1120     }
1121
1122     stream->buffer_index += es_size;
1123     // FIXME: rounding and first few bytes of each packet
1124     s->last_scr          += s->packet_size * 90000LL / (s->mux_rate * 50LL);
1125
1126     while (stream->premux_packet &&
1127            stream->premux_packet->unwritten_size <= es_size) {
1128         es_size              -= stream->premux_packet->unwritten_size;
1129         stream->premux_packet = stream->premux_packet->next;
1130     }
1131     if (es_size) {
1132         av_assert0(stream->premux_packet);
1133         stream->premux_packet->unwritten_size -= es_size;
1134     }
1135
1136     if (remove_decoded_packets(ctx, s->last_scr) < 0)
1137         return -1;
1138
1139     return 1;
1140 }
1141
1142 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
1143 {
1144     int stream_index = pkt->stream_index;
1145     int size         = pkt->size;
1146     uint8_t *buf     = pkt->data;
1147     MpegMuxContext *s = ctx->priv_data;
1148     AVStream *st      = ctx->streams[stream_index];
1149     StreamInfo *stream = st->priv_data;
1150     int64_t pts, dts;
1151     PacketDesc *pkt_desc;
1152     int preload;
1153     const int is_iframe = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1154                           (pkt->flags & AV_PKT_FLAG_KEY);
1155
1156     preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
1157
1158     pts = pkt->pts;
1159     dts = pkt->dts;
1160
1161     if (s->last_scr == AV_NOPTS_VALUE) {
1162         if (dts == AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) || s->is_dvd) {
1163             if (dts != AV_NOPTS_VALUE)
1164                 s->preload += av_rescale(-dts, AV_TIME_BASE, 90000);
1165             s->last_scr = 0;
1166         } else {
1167             s->last_scr = dts - preload;
1168             s->preload = 0;
1169         }
1170         preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
1171         av_log(ctx, AV_LOG_DEBUG, "First SCR: %"PRId64" First DTS: %"PRId64"\n", s->last_scr, dts + preload);
1172     }
1173
1174     if (dts != AV_NOPTS_VALUE) dts += preload;
1175     if (pts != AV_NOPTS_VALUE) pts += preload;
1176
1177     av_log(ctx, AV_LOG_TRACE, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n",
1178             dts / 90000.0, pts / 90000.0, pkt->flags,
1179             pkt->stream_index, pts != AV_NOPTS_VALUE);
1180     if (!stream->premux_packet)
1181         stream->next_packet = &stream->premux_packet;
1182     *stream->next_packet     =
1183     pkt_desc                 = av_mallocz(sizeof(PacketDesc));
1184     if (!pkt_desc)
1185         return AVERROR(ENOMEM);
1186     pkt_desc->pts            = pts;
1187     pkt_desc->dts            = dts;
1188
1189     if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
1190         if (size < 3) {
1191             av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n", size);
1192             return AVERROR(EINVAL);
1193         }
1194
1195         /* Skip first 3 bytes of packet data, which comprise PCM header
1196            and will be written fresh by this muxer. */
1197         buf += 3;
1198         size -= 3;
1199     }
1200
1201     pkt_desc->unwritten_size =
1202     pkt_desc->size           = size;
1203     if (!stream->predecode_packet)
1204         stream->predecode_packet = pkt_desc;
1205     stream->next_packet = &pkt_desc->next;
1206
1207     if (av_fifo_realloc2(stream->fifo, av_fifo_size(stream->fifo) + size) < 0)
1208         return -1;
1209
1210     if (s->is_dvd) {
1211         // min VOBU length 0.4 seconds (mpucoder)
1212         if (is_iframe &&
1213             (s->packet_number == 0 || pts != AV_NOPTS_VALUE &&
1214              (pts - stream->vobu_start_pts >= 36000))) {
1215             stream->bytes_to_iframe = av_fifo_size(stream->fifo);
1216             stream->align_iframe    = 1;
1217             stream->vobu_start_pts  = pts;
1218         }
1219     }
1220
1221     av_fifo_generic_write(stream->fifo, buf, size, NULL);
1222
1223     for (;;) {
1224         int ret = output_packet(ctx, 0);
1225         if (ret <= 0)
1226             return ret;
1227     }
1228 }
1229
1230 static int mpeg_mux_end(AVFormatContext *ctx)
1231 {
1232     StreamInfo *stream;
1233     int i;
1234
1235     for (;;) {
1236         int ret = output_packet(ctx, 1);
1237         if (ret < 0)
1238             return ret;
1239         else if (ret == 0)
1240             break;
1241     }
1242
1243     /* End header according to MPEG-1 systems standard. We do not write
1244      * it as it is usually not needed by decoders and because it
1245      * complicates MPEG stream concatenation. */
1246     // avio_wb32(ctx->pb, ISO_11172_END_CODE);
1247
1248     for (i = 0; i < ctx->nb_streams; i++) {
1249         stream = ctx->streams[i]->priv_data;
1250
1251         av_assert0(av_fifo_size(stream->fifo) == 0);
1252     }
1253     return 0;
1254 }
1255
1256 static void mpeg_mux_deinit(AVFormatContext *ctx)
1257 {
1258     for (int i = 0; i < ctx->nb_streams; i++) {
1259         StreamInfo *stream = ctx->streams[i]->priv_data;
1260         if (!stream)
1261             continue;
1262         av_fifo_freep(&stream->fifo);
1263     }
1264 }
1265
1266 #define OFFSET(x) offsetof(MpegMuxContext, x)
1267 #define E AV_OPT_FLAG_ENCODING_PARAM
1268 static const AVOption options[] = {
1269     { "muxrate", NULL,                                          OFFSET(user_mux_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, ((1<<22) - 1) * (8 * 50), E },
1270     { "preload", "Initial demux-decode delay in microseconds.", OFFSET(preload),  AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX, E },
1271     { NULL },
1272 };
1273
1274 #define MPEGENC_CLASS(flavor)                   \
1275 static const AVClass flavor ## _class = {       \
1276     .class_name = #flavor " muxer",             \
1277     .item_name  = av_default_item_name,         \
1278     .version    = LIBAVUTIL_VERSION_INT,        \
1279     .option     = options,                      \
1280 };
1281
1282 #if CONFIG_MPEG1SYSTEM_MUXER
1283 MPEGENC_CLASS(mpeg)
1284 AVOutputFormat ff_mpeg1system_muxer = {
1285     .name              = "mpeg",
1286     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-1 Systems / MPEG program stream"),
1287     .mime_type         = "video/mpeg",
1288     .extensions        = "mpg,mpeg",
1289     .priv_data_size    = sizeof(MpegMuxContext),
1290     .audio_codec       = AV_CODEC_ID_MP2,
1291     .video_codec       = AV_CODEC_ID_MPEG1VIDEO,
1292     .write_header      = mpeg_mux_init,
1293     .write_packet      = mpeg_mux_write_packet,
1294     .write_trailer     = mpeg_mux_end,
1295     .deinit            = mpeg_mux_deinit,
1296     .priv_class        = &mpeg_class,
1297 };
1298 #endif
1299
1300 #if CONFIG_MPEG1VCD_MUXER
1301 MPEGENC_CLASS(vcd)
1302 AVOutputFormat ff_mpeg1vcd_muxer = {
1303     .name              = "vcd",
1304     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-1 Systems / MPEG program stream (VCD)"),
1305     .mime_type         = "video/mpeg",
1306     .priv_data_size    = sizeof(MpegMuxContext),
1307     .audio_codec       = AV_CODEC_ID_MP2,
1308     .video_codec       = AV_CODEC_ID_MPEG1VIDEO,
1309     .write_header      = mpeg_mux_init,
1310     .write_packet      = mpeg_mux_write_packet,
1311     .write_trailer     = mpeg_mux_end,
1312     .deinit            = mpeg_mux_deinit,
1313     .priv_class        = &vcd_class,
1314 };
1315 #endif
1316
1317 #if CONFIG_MPEG2VOB_MUXER
1318 MPEGENC_CLASS(vob)
1319 AVOutputFormat ff_mpeg2vob_muxer = {
1320     .name              = "vob",
1321     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS (VOB)"),
1322     .mime_type         = "video/mpeg",
1323     .extensions        = "vob",
1324     .priv_data_size    = sizeof(MpegMuxContext),
1325     .audio_codec       = AV_CODEC_ID_MP2,
1326     .video_codec       = AV_CODEC_ID_MPEG2VIDEO,
1327     .write_header      = mpeg_mux_init,
1328     .write_packet      = mpeg_mux_write_packet,
1329     .write_trailer     = mpeg_mux_end,
1330     .deinit            = mpeg_mux_deinit,
1331     .priv_class        = &vob_class,
1332 };
1333 #endif
1334
1335 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1336 #if CONFIG_MPEG2SVCD_MUXER
1337 MPEGENC_CLASS(svcd)
1338 AVOutputFormat ff_mpeg2svcd_muxer = {
1339     .name              = "svcd",
1340     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS (SVCD)"),
1341     .mime_type         = "video/mpeg",
1342     .extensions        = "vob",
1343     .priv_data_size    = sizeof(MpegMuxContext),
1344     .audio_codec       = AV_CODEC_ID_MP2,
1345     .video_codec       = AV_CODEC_ID_MPEG2VIDEO,
1346     .write_header      = mpeg_mux_init,
1347     .write_packet      = mpeg_mux_write_packet,
1348     .write_trailer     = mpeg_mux_end,
1349     .deinit            = mpeg_mux_deinit,
1350     .priv_class        = &svcd_class,
1351 };
1352 #endif
1353
1354 /*  Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1355 #if CONFIG_MPEG2DVD_MUXER
1356 MPEGENC_CLASS(dvd)
1357 AVOutputFormat ff_mpeg2dvd_muxer = {
1358     .name              = "dvd",
1359     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS (DVD VOB)"),
1360     .mime_type         = "video/mpeg",
1361     .extensions        = "dvd",
1362     .priv_data_size    = sizeof(MpegMuxContext),
1363     .audio_codec       = AV_CODEC_ID_MP2,
1364     .video_codec       = AV_CODEC_ID_MPEG2VIDEO,
1365     .write_header      = mpeg_mux_init,
1366     .write_packet      = mpeg_mux_write_packet,
1367     .write_trailer     = mpeg_mux_end,
1368     .deinit            = mpeg_mux_deinit,
1369     .priv_class        = &dvd_class,
1370 };
1371 #endif