Go to the documentation of this file.
36 #define MAX_PAYLOAD_SIZE 4096
104 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
106 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
108 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
126 int only_for_stream_id)
129 int size,
i, private_stream_coded,
id;
141 if (
s->is_vcd && only_for_stream_id ==
VIDEO_ID) {
157 if (
s->is_vcd ||
s->is_dvd) {
168 if (
s->is_vcd && (only_for_stream_id & 0xe0) ==
AUDIO_ID) {
188 int P_STD_max_video = 0;
189 int P_STD_max_mpeg_audio = 0;
190 int P_STD_max_mpeg_PS1 = 0;
198 }
else if (
id >= 0xc0 &&
id <= 0xc7 &&
201 }
else if (
id == 0xe0 &&
211 put_bits(&pb, 13, P_STD_max_video / 1024);
214 if (P_STD_max_mpeg_audio == 0)
215 P_STD_max_mpeg_audio = 4096;
219 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
225 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
234 private_stream_coded = 0;
241 if (!
s->is_vcd || stream->
id == only_for_stream_id ||
242 only_for_stream_id == 0) {
246 if (private_stream_coded)
248 private_stream_coded = 1;
276 int buf_index,
i, private_stream_coded;
284 private_stream_coded = 0;
287 if (stream->
id < 0xc0) {
288 if (private_stream_coded)
290 private_stream_coded = 1;
300 int bitrate,
i, mpa_id, mpv_id, h264_id, mps_id, ac3_id, dts_id, lpcm_id, j;
306 s->packet_number = 0;
322 s->packet_size = 2048;
326 s->vcd_padding_bytes_written = 0;
327 s->vcd_padding_bitrate_num = 0;
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",
364 stream->
id = ac3_id++;
366 stream->
id = dts_id++;
368 stream->
id = lpcm_id++;
369 for (j = 0; j < 4; j++) {
377 for (sr = 0; sr < 4; sr++)
394 case 48000: freq = 0;
break;
395 case 96000: freq = 1;
break;
396 case 44100: freq = 2;
break;
397 case 32000: freq = 3;
break;
408 stream->
id = lpcm_id++;
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");
421 stream->
id = mpa_id++;
431 stream->
id = h264_id++;
433 stream->
id = mpv_id++;
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");
453 stream->
id = mps_id++;
486 audio_bitrate += codec_rate;
488 video_bitrate += codec_rate;
491 if (
s->user_mux_rate) {
492 s->mux_rate = (
s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
498 s->mux_rate = (
bitrate + (8 * 50) - 1) / (8 * 50);
499 if (
s->mux_rate >= (1<<22)) {
501 s->mux_rate = (1<<22) - 1;
506 int64_t overhead_rate;
526 overhead_rate = audio_bitrate * 2294LL * (2324 - 2279);
527 overhead_rate += video_bitrate * 2279LL * (2324 - 2294);
530 s->vcd_padding_bitrate_num = (2324LL * 75 * 8 -
bitrate) * 2279 * 2294 - overhead_rate;
531 #define VCD_PADDING_BITRATE_DEN (2279 * 2294)
534 if (
s->is_vcd ||
s->is_mpeg2)
536 s->pack_header_freq = 1;
539 s->pack_header_freq = 2 *
bitrate /
s->packet_size / 8;
542 if (
s->pack_header_freq == 0)
543 s->pack_header_freq = 1;
547 s->system_header_freq =
s->pack_header_freq * 40;
552 s->system_header_freq = 0x7fffffff;
554 s->system_header_freq =
s->pack_header_freq * 5;
572 avio_w8(pb, (
id << 4) | (((timestamp >> 30) & 0x07) << 1) | 1);
573 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
574 avio_wb16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
585 int64_t full_pad_bytes;
590 pad_bytes = (
int)(full_pad_bytes -
s->vcd_padding_bytes_written);
616 for (
i = 0;
i < packet_bytes;
i++)
629 pkt_desc = pkt_desc->
next;
637 int64_t
pts, int64_t dts, int64_t scr,
int trailer_size)
642 int size, payload_size, startcode,
id, stuffing_size,
i, header_len;
645 int zero_trail_bytes = 0;
646 int pad_packet_bytes = 0;
649 int general_pack = 0;
658 if ((
s->packet_number %
s->pack_header_freq) == 0 ||
s->last_scr != scr) {
673 }
else if (
s->is_dvd) {
675 int PES_bytes_to_fill =
s->packet_size -
size - 10;
679 PES_bytes_to_fill -= 5 + 5;
681 PES_bytes_to_fill -= 5;
693 for (
i = 0;
i < 979;
i++)
699 for (
i = 0;
i < 1017;
i++)
707 scr +=
s->packet_size * 90000LL /
708 (
s->mux_rate * 50LL);
714 pad_packet_bytes = PES_bytes_to_fill -
719 if ((
s->packet_number %
s->system_header_freq) == 0) {
728 packet_size =
s->packet_size -
size;
730 if (
s->is_vcd && (
id & 0xe0) ==
AUDIO_ID)
733 zero_trail_bytes += 20;
736 (
s->is_svcd &&
s->packet_number == 0)) {
746 pad_packet_bytes = packet_size - zero_trail_bytes;
749 packet_size -= pad_packet_bytes + zero_trail_bytes;
751 if (packet_size > 0) {
774 payload_size = packet_size - header_len;
784 startcode = 0x100 +
id;
791 int timestamp_len = 0;
795 timestamp_len +=
s->is_mpeg2 ? 5 : 4;
798 header_len -= timestamp_len;
800 pad_packet_bytes += timestamp_len;
801 packet_size -= timestamp_len;
803 payload_size += timestamp_len;
805 stuffing_size += timestamp_len;
806 if (payload_size > trailer_size)
807 stuffing_size += payload_size - trailer_size;
811 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) {
812 packet_size += pad_packet_bytes;
813 payload_size += pad_packet_bytes;
814 if (stuffing_size < 0)
815 stuffing_size = pad_packet_bytes;
817 stuffing_size += pad_packet_bytes;
818 pad_packet_bytes = 0;
821 if (stuffing_size < 0)
826 stuffing_size += payload_size % stream->
lpcm_align;
829 if (stuffing_size > 16) {
830 pad_packet_bytes += stuffing_size;
831 packet_size -= stuffing_size;
832 payload_size -= stuffing_size;
843 for (
i = 0;
i < stuffing_size;
i++)
867 if (pes_flags & 0x80)
869 if (pes_flags & 0x40)
872 if (pes_flags & 0x01) {
899 for (
i = 0;
i < stuffing_size;
i++)
912 }
else if (
id >= 0x40) {
922 payload_size - stuffing_size,
930 if (pad_packet_bytes > 0)
933 for (
i = 0;
i < zero_trail_bytes;
i++)
946 return payload_size - stuffing_size;
960 for (
i = 0;
i <
s->packet_size;
i++)
963 s->vcd_padding_bytes_written +=
s->packet_size;
984 scr > pkt_desc->
dts) {
988 "buffer underflow st=%d bufi=%d size=%d\n",
1006 int i, avail_space = 0, es_size, trailer_size;
1008 int best_score = INT_MIN;
1009 int ignore_constraints = 0;
1010 int ignore_delay = 0;
1011 int64_t scr =
s->last_scr;
1026 if (
s->packet_size > avail_data && !
flush
1029 if (avail_data == 0)
1033 if (space < s->packet_size && !ignore_constraints)
1036 if (next_pkt && next_pkt->
dts - scr > max_delay && !ignore_delay)
1041 if (rel_space > best_score) {
1042 best_score = rel_space;
1044 avail_space =
space;
1049 int64_t best_dts = INT64_MAX;
1056 if (pkt_desc && pkt_desc->
dts < best_dts)
1057 best_dts = pkt_desc->
dts;
1061 if (best_dts < INT64_MAX) {
1063 scr / 90000.0, best_dts / 90000.0);
1065 if (scr >= best_dts + 1 && !ignore_constraints) {
1067 "packet too large, ignoring buffer limits to mux it\n");
1068 ignore_constraints = 1;
1070 scr =
FFMAX(best_dts + 1, scr);
1073 }
else if (has_premux &&
flush) {
1075 "delay too large, ignoring ...\n");
1077 ignore_constraints = 1;
1091 av_assert0(avail_space >=
s->packet_size || ignore_constraints);
1098 timestamp_packet = timestamp_packet->
next;
1101 if (timestamp_packet) {
1103 timestamp_packet->
dts / 90000.0,
1104 timestamp_packet->
pts / 90000.0,
1105 scr / 90000.0, best_i);
1107 timestamp_packet->
dts, scr, trailer_size);
1123 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1129 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1167 if (dts ==
AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) ||
s->is_dvd) {
1172 s->last_scr = dts - preload;
1192 pkt_desc->
dts = dts;
1263 #define OFFSET(x) offsetof(MpegMuxContext, x)
1264 #define E AV_OPT_FLAG_ENCODING_PARAM
1267 {
"preload",
"Initial demux-decode delay in microseconds.",
OFFSET(preload),
AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX,
E },
1271 #define MPEGENC_CLASS(flavor) \
1272 static const AVClass flavor ## _class = { \
1273 .class_name = #flavor " muxer", \
1274 .item_name = av_default_item_name, \
1275 .version = LIBAVUTIL_VERSION_INT, \
1276 .option = options, \
1279 #if CONFIG_MPEG1SYSTEM_MUXER
1284 .mime_type =
"video/mpeg",
1285 .extensions =
"mpg,mpeg",
1292 .priv_class = &mpeg_class,
1296 #if CONFIG_MPEG1VCD_MUXER
1301 .mime_type =
"video/mpeg",
1308 .priv_class = &vcd_class,
1312 #if CONFIG_MPEG2VOB_MUXER
1317 .mime_type =
"video/mpeg",
1318 .extensions =
"vob",
1325 .priv_class = &vob_class,
1330 #if CONFIG_MPEG2SVCD_MUXER
1335 .mime_type =
"video/mpeg",
1336 .extensions =
"vob",
1343 .priv_class = &svcd_class,
1348 #if CONFIG_MPEG2DVD_MUXER
1353 .mime_type =
"video/mpeg",
1354 .extensions =
"dvd",
1361 .priv_class = &dvd_class,
PacketDesc ** next_packet
#define AV_LOG_WARNING
Something somehow does not look correct.
#define SYSTEM_HEADER_START_CODE
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
enum AVMediaType codec_type
General type of the encoded data.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated space
static int get_system_header_size(AVFormatContext *ctx)
#define VCD_PADDING_BITRATE_DEN
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static av_cold int mpeg_mux_init(AVFormatContext *ctx)
static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
AVStream ** streams
A list of all streams in the file.
static int flush_packet(AVFormatContext *ctx, int stream_index, int64_t pts, int64_t dts, int64_t scr, int trailer_size)
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len)
AVOutputFormat ff_mpeg2svcd_muxer
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int output_packet(AVFormatContext *ctx, int flush)
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
PacketDesc * predecode_packet
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static const int lpcm_freq_tab[4]
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
This structure describes the bitrate properties of an encoded bitstream.
int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size)
Resize an AVFifoBuffer.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define MPEGENC_CLASS(flavor)
Describe the class of an AVClass context structure.
static void flush(AVCodecContext *avctx)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static int write_trailer(AVFormatContext *s1)
AVOutputFormat ff_mpeg1vcd_muxer
AVIOContext * pb
I/O context.
void avio_w8(AVIOContext *s, int b)
static void put_padding_packet(AVFormatContext *ctx, AVIOContext *pb, int packet_bytes)
static void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
int sample_rate
Audio only.
ff_const59 struct AVOutputFormat * oformat
The output container format.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
uint8_t * av_stream_get_side_data(const AVStream *stream, enum AVPacketSideDataType type, int *size)
Get side information from stream.
static void put_vcd_padding_sector(AVFormatContext *ctx)
#define AV_NOPTS_VALUE
Undefined timestamp value.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
void avio_wb32(AVIOContext *s, unsigned int val)
int max_bitrate
Maximum bitrate of the stream, in bits per second.
int flags
A combination of AV_PKT_FLAG values.
#define AV_LOG_INFO
Standard information.
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
PacketDesc * premux_packet
AVOutputFormat ff_mpeg2dvd_muxer
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int mpeg_mux_end(AVFormatContext *ctx)
#define AV_TIME_BASE
Internal time base represented as integer.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t vcd_padding_bytes_written
int buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
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.
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
int bits_per_coded_sample
The number of bits per sample in the codedwords.
static int put_system_header(AVFormatContext *ctx, uint8_t *buf, int only_for_stream_id)
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
int void avio_flush(AVIOContext *s)
Force flushing of buffered data.
int64_t vcd_padding_bitrate_num
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
void avio_wb16(AVIOContext *s, unsigned int val)
AVOutputFormat ff_mpeg2vob_muxer
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
static void write_header(FFV1Context *f)
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
static const AVOption options[]
void * priv_data
Format private data.
static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
static int put_pack_header(AVFormatContext *ctx, uint8_t *buf, int64_t timestamp)