22#include "config_components.h"
42#define MAX_PAYLOAD_SIZE 4096
110 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
112 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
114 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
132 int only_for_stream_id)
135 int size,
i, private_stream_coded,
id;
147 if (
s->is_vcd && only_for_stream_id ==
VIDEO_ID) {
163 if (
s->is_vcd ||
s->is_dvd) {
174 if (
s->is_vcd && (only_for_stream_id & 0xe0) ==
AUDIO_ID) {
194 int P_STD_max_video = 0;
195 int P_STD_max_mpeg_audio = 0;
196 int P_STD_max_mpeg_PS1 = 0;
198 for (
i = 0;
i <
ctx->nb_streams;
i++) {
204 }
else if (
id >= 0xc0 &&
id <= 0xc7 &&
207 }
else if (
id == 0xe0 &&
217 put_bits(&pb, 13, P_STD_max_video / 1024);
220 if (P_STD_max_mpeg_audio == 0)
221 P_STD_max_mpeg_audio = 4096;
225 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
231 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
240 private_stream_coded = 0;
241 for (
i = 0;
i <
ctx->nb_streams;
i++) {
247 if (!
s->is_vcd || stream->
id == only_for_stream_id ||
248 only_for_stream_id == 0) {
252 if (private_stream_coded)
254 private_stream_coded = 1;
282 int buf_index,
i, private_stream_coded;
290 private_stream_coded = 0;
291 for (
i = 0;
i <
ctx->nb_streams;
i++) {
292 stream =
ctx->streams[
i]->priv_data;
293 if (stream->
id < 0xc0) {
294 if (private_stream_coded)
296 private_stream_coded = 1;
306 int bitrate,
i, mpa_id, mpv_id, h264_id, mps_id, ac3_id, dts_id, lpcm_id, j;
312 s->packet_number = 0;
320 if (
ctx->packet_size) {
321 if (
ctx->packet_size < 20 ||
ctx->packet_size > (1 << 23) + 10) {
326 s->packet_size =
ctx->packet_size;
328 s->packet_size = 2048;
329 if (
ctx->max_delay < 0)
332 s->vcd_padding_bytes_written = 0;
333 s->vcd_padding_bitrate_num = 0;
346 for (
i = 0;
i <
ctx->nb_streams;
i++) {
347 st =
ctx->streams[
i];
363 "%s in MPEG-1 system streams is not widely supported, "
364 "consider using the vob or the dvd muxer "
365 "to force a MPEG-2 program stream.\n",
368 stream->
id = ac3_id++;
370 stream->
id = dts_id++;
372 stream->
id = lpcm_id++;
373 for (j = 0; j < 4; j++) {
381 for (sr = 0; sr < 4; sr++)
398 case 48000: freq = 0;
break;
399 case 96000: freq = 1;
break;
400 case 44100: freq = 2;
break;
401 case 32000: freq = 3;
break;
412 stream->
id = lpcm_id++;
422 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");
425 stream->
id = mpa_id++;
437 stream->
id = h264_id++;
439 stream->
id = mpv_id++;
450 "VBV buffer size not set, using default size of 230KB\n"
451 "If you want the mpeg file to be compliant to some specification\n"
452 "Like DVD, VCD or others, make sure you set the correct buffer size\n");
464 stream->
id = mps_id++;
482 "Too many streams to fit the MPEG program stream system header\n");
489 for (
i = 0;
i <
ctx->nb_streams;
i++) {
493 st =
ctx->streams[
i];
507 codec_rate = (1 << 21) * 8 * 50 /
ctx->nb_streams;
512 audio_bitrate += codec_rate;
514 video_bitrate += codec_rate;
517 if (
s->user_mux_rate) {
518 s->mux_rate = (
s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
524 s->mux_rate = (
bitrate + (8 * 50) - 1) / (8 * 50);
525 if (
s->mux_rate >= (1<<22)) {
527 s->mux_rate = (1<<22) - 1;
552 overhead_rate = audio_bitrate * 2294LL * (2324 - 2279);
553 overhead_rate += video_bitrate * 2279LL * (2324 - 2294);
556 s->vcd_padding_bitrate_num = (2324LL * 75 * 8 -
bitrate) * 2279 * 2294 - overhead_rate;
557#define VCD_PADDING_BITRATE_DEN (2279 * 2294)
560 if (
s->is_vcd ||
s->is_mpeg2)
562 s->pack_header_freq = 1;
565 s->pack_header_freq = 2 *
bitrate /
s->packet_size / 8;
568 if (
s->pack_header_freq == 0)
569 s->pack_header_freq = 1;
573 s->system_header_freq =
s->pack_header_freq * 40;
578 s->system_header_freq = 0x7fffffff;
580 s->system_header_freq =
s->pack_header_freq * 5;
582 for (
i = 0;
i <
ctx->nb_streams;
i++) {
583 stream =
ctx->streams[
i]->priv_data;
593 avio_w8(pb, (
id << 4) | (((timestamp >> 30) & 0x07) << 1) | 1);
594 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
595 avio_wb16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
611 pad_bytes = (int)(full_pad_bytes -
s->vcd_padding_bytes_written);
648 pkt_desc = pkt_desc->
next;
667 int size, payload_size, startcode,
id, stuffing_size, header_len;
671 int zero_trail_bytes = 0;
672 int pad_packet_bytes = 0;
675 int general_pack = 0;
684 if ((
s->packet_number %
s->pack_header_freq) == 0 ||
s->last_scr != scr) {
699 }
else if (
s->is_dvd) {
701 int PES_bytes_to_fill =
s->packet_size -
size - 10;
705 PES_bytes_to_fill -= 5 + 5;
707 PES_bytes_to_fill -= 5;
731 scr +=
s->packet_size * 90000LL /
732 (
s->mux_rate * 50LL);
738 pad_packet_bytes = PES_bytes_to_fill -
743 if ((
s->packet_number %
s->system_header_freq) == 0) {
752 packet_size =
s->packet_size -
size;
754 if (
s->is_vcd && (
id & 0xe0) ==
AUDIO_ID)
757 zero_trail_bytes += 20;
760 (
s->is_svcd &&
s->packet_number == 0)) {
770 pad_packet_bytes = packet_size - zero_trail_bytes;
773 packet_size -= pad_packet_bytes + zero_trail_bytes;
775 if (packet_size > 0) {
799 payload_size = packet_size - header_len;
809 startcode = 0x100 +
id;
816 int timestamp_len = 0;
820 timestamp_len +=
s->is_mpeg2 ? 5 : 4;
823 header_len -= timestamp_len;
825 pad_packet_bytes += timestamp_len;
826 packet_size -= timestamp_len;
828 payload_size += timestamp_len;
830 stuffing_size += timestamp_len;
831 if (payload_size > trailer_size)
832 stuffing_size += payload_size - trailer_size;
836 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) {
837 packet_size += pad_packet_bytes;
838 payload_size += pad_packet_bytes;
839 if (stuffing_size < 0)
840 stuffing_size = pad_packet_bytes;
842 stuffing_size += pad_packet_bytes;
843 pad_packet_bytes = 0;
846 if (stuffing_size < 0)
851 stuffing_size += payload_size % stream->
lpcm_align;
854 if (stuffing_size > 16) {
855 pad_packet_bytes += stuffing_size;
856 packet_size -= stuffing_size;
857 payload_size -= stuffing_size;
889 avio_w8(
ctx->pb, header_len - 3 + stuffing_size);
891 if (pes_flags & 0x80)
893 if (pes_flags & 0x40)
896 if (pes_flags & 0x01) {
935 }
else if (
id >= 0x40) {
943 fifo_data = payload_size - stuffing_size;
952 if (pad_packet_bytes > 0)
967 return payload_size - stuffing_size;
982 s->vcd_padding_bytes_written +=
s->packet_size;
997 for (
i = 0;
i <
ctx->nb_streams;
i++) {
1003 scr > pkt_desc->
dts) {
1007 "buffer underflow st=%d bufi=%d size=%d\n",
1027 int i, avail_space = 0, es_size, trailer_size;
1029 int best_score = INT_MIN;
1030 int ignore_constraints = 0;
1031 int ignore_delay = 0;
1037 for (
i = 0;
i <
ctx->nb_streams;
i++) {
1047 if (
s->packet_size > avail_data && !
flush
1050 if (avail_data == 0)
1054 if (
space < s->packet_size && !ignore_constraints)
1057 if (next_pkt && next_pkt->
dts - scr > max_delay && !ignore_delay)
1062 if (rel_space > best_score) {
1063 best_score = rel_space;
1065 avail_space =
space;
1073 for (
i = 0;
i <
ctx->nb_streams;
i++) {
1077 if (pkt_desc && pkt_desc->
dts < best_dts)
1078 best_dts = pkt_desc->
dts;
1082 if (best_dts < INT64_MAX) {
1084 scr / 90000.0, best_dts / 90000.0);
1086 if (scr >= best_dts + 1 && !ignore_constraints) {
1088 "packet too large, ignoring buffer limits to mux it\n");
1089 ignore_constraints = 1;
1091 scr =
FFMAX(best_dts + 1, scr);
1094 }
else if (has_premux &&
flush) {
1096 "delay too large, ignoring ...\n");
1098 ignore_constraints = 1;
1107 st =
ctx->streams[best_i];
1112 av_assert0(avail_space >=
s->packet_size || ignore_constraints);
1119 timestamp_packet = timestamp_packet->
next;
1122 if (timestamp_packet) {
1124 timestamp_packet->
dts / 90000.0,
1125 timestamp_packet->
pts / 90000.0,
1126 scr / 90000.0, best_i);
1128 timestamp_packet->
dts, scr, trailer_size);
1144 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1150 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1170 int stream_index =
pkt->stream_index;
1172 const uint8_t *buf =
pkt->data;
1189 if (dts ==
AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) ||
s->is_dvd) {
1194 s->last_scr = dts - preload;
1205 dts / 90000.0,
pts / 90000.0,
pkt->flags,
1223 if (can_write <
size) {
1239 pkt_desc->
dts = dts;
1281 for (
i = 0;
i <
ctx->nb_streams;
i++) {
1282 stream =
ctx->streams[
i]->priv_data;
1291 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
1304#define OFFSET(x) offsetof(MpegMuxContext, x)
1305#define E AV_OPT_FLAG_ENCODING_PARAM
1307 {
"muxrate",
"mux rate as bits/s",
OFFSET(user_mux_rate),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, ((1<<22) - 1) * (8 * 50),
E },
1308 {
"preload",
"initial demux-decode delay in microseconds",
OFFSET(preload),
AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX,
E },
1313 .class_name =
"mpeg/(s)vcd/vob/dvd muxer",
1319#if CONFIG_MPEG1SYSTEM_MUXER
1323 .p.mime_type =
"video/mpeg",
1324 .p.extensions =
"mpg,mpeg",
1336#if CONFIG_MPEG1VCD_MUXER
1340 .p.mime_type =
"video/mpeg",
1352#if CONFIG_MPEG2VOB_MUXER
1356 .p.mime_type =
"video/mpeg",
1357 .p.extensions =
"vob",
1370#if CONFIG_MPEG2SVCD_MUXER
1374 .p.mime_type =
"video/mpeg",
1375 .p.extensions =
"vob",
1388#if CONFIG_MPEG2DVD_MUXER
1392 .p.mime_type =
"video/mpeg",
1393 .p.extensions =
"dvd",
#define av_assert0(cond)
assert() equivalent, that is always enabled.
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
void avio_w8(AVIOContext *s, int b)
void avio_wb32(AVIOContext *s, unsigned int val)
void avio_wb16(AVIOContext *s, unsigned int val)
@ AVIO_DATA_MARKER_FLUSH_POINT
A point in the output bytestream where the underlying AVIOContext might flush the buffer depending on...
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
void ffio_fill(AVIOContext *s, int b, int64_t count)
#define i(width, name, range_min, range_max)
void(* flush)(AVBSFContext *ctx)
@ AV_OPT_TYPE_INT
Underlying C type is int.
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
size_t av_fifo_can_write(const AVFifo *f)
size_t av_fifo_can_read(const AVFifo *f)
int av_fifo_read_to_cb(AVFifo *f, AVFifoCB write_cb, void *opaque, size_t *nb_elems)
Feed data from a FIFO into a user-provided callback.
int av_fifo_grow2(AVFifo *f, size_t inc)
Enlarge an AVFifo.
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE
Internal time base represented as integer.
#define LIBAVUTIL_VERSION_INT
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Macro definitions for various function/variable attributes.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Memory handling functions.
#define SYSTEM_HEADER_START_CODE
static const int lpcm_freq_tab[4]
static int get_system_header_size(AVFormatContext *ctx)
static void put_padding_packet(AVFormatContext *ctx, AVIOContext *pb, int packet_bytes)
static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len)
static int mpeg_mux_end(AVFormatContext *ctx)
static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr)
static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
static int put_system_header(AVFormatContext *ctx, uint8_t *buf, int buf_size, int only_for_stream_id)
static av_cold int mpeg_mux_init(AVFormatContext *ctx)
static int fifo_avio_wrapper(void *opaque, void *buf, size_t *nb_elems)
static const AVClass mpeg_class
static int output_packet(AVFormatContext *ctx, int flush)
static void mpeg_mux_deinit(AVFormatContext *ctx)
#define VCD_PADDING_BITRATE_DEN
static void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
static int put_pack_header(AVFormatContext *ctx, uint8_t *buf, int64_t timestamp)
static int flush_packet(AVFormatContext *ctx, int stream_index, int64_t pts, int64_t dts, int64_t scr, int trailer_size)
static void put_vcd_padding_sector(AVFormatContext *ctx)
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static int put_bytes_output(const PutBitContext *s)
static av_unused void put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
This structure describes the bitrate properties of an encoded bitstream.
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
int nb_coded_side_data
Amount of entries in coded_side_data.
int bits_per_coded_sample
The number of bits per sample in the codedwords.
AVChannelLayout ch_layout
The channel layout and number of channels.
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
enum AVMediaType codec_type
General type of the encoded data.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int sample_rate
The number of audio samples per second.
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
This structure stores compressed data.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int64_t vcd_padding_bytes_written
int64_t vcd_padding_bitrate_num
PacketDesc * premux_packet
PacketDesc * predecode_packet
static AVFormatContext * ctx