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;
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;
310 (CONFIG_MPEG2DVD_MUXER && ctx->
oformat == &ff_mpeg2dvd_muxer) ||
356 "%s in MPEG-1 system streams is not widely supported, "
357 "consider using the vob or the dvd muxer "
358 "to force a MPEG-2 program stream.\n",
361 stream->
id = ac3_id++;
363 stream->
id = dts_id++;
365 stream->
id = lpcm_id++;
366 for (j = 0; j < 4; j++) {
379 stream->
id = mpa_id++;
389 stream->
id = h264_id++;
391 stream->
id = mpv_id++;
396 "VBV buffer size not set, using default size of 130KB\n"
397 "If you want the mpeg file to be compliant to some specification\n"
398 "Like DVD, VCD or others, make sure you set the correct buffer size\n");
409 stream->
id = mps_id++;
436 codec_rate = (1 << 21) * 8 * 50 / ctx->
nb_streams;
438 bitrate += codec_rate;
441 audio_bitrate += codec_rate;
443 video_bitrate += codec_rate;
451 bitrate += bitrate / 20;
453 s->
mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
461 int64_t overhead_rate;
481 overhead_rate = audio_bitrate * 2294LL * (2324 - 2279);
482 overhead_rate += video_bitrate * 2279LL * (2324 - 2294);
486 #define VCD_PADDING_BITRATE_DEN (2279 * 2294)
527 avio_w8(pb, (
id << 4) | (((timestamp >> 30) & 0x07) << 1) | 1);
528 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
529 avio_wb16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
540 int64_t full_pad_bytes;
571 for (i = 0; i < packet_bytes; i++)
584 pkt_desc = pkt_desc->
next;
592 int64_t
pts, int64_t dts, int64_t scr,
int trailer_size)
597 int size, payload_size, startcode,
id, stuffing_size, i, header_len;
600 int zero_trail_bytes = 0;
601 int pad_packet_bytes = 0;
604 int general_pack = 0;
630 int PES_bytes_to_fill = s->
packet_size - size - 10;
634 PES_bytes_to_fill -= 5 + 5;
636 PES_bytes_to_fill -= 5;
648 for (i = 0; i < 979; i++)
654 for (i = 0; i < 1017; i++)
657 memset(buffer, 0, 128);
669 pad_packet_bytes = PES_bytes_to_fill -
688 zero_trail_bytes += 20;
701 pad_packet_bytes = packet_size - zero_trail_bytes;
704 packet_size -= pad_packet_bytes + zero_trail_bytes;
706 if (packet_size > 0) {
729 payload_size = packet_size - header_len;
739 startcode = 0x100 +
id;
746 int timestamp_len = 0;
750 timestamp_len += s->
is_mpeg2 ? 5 : 4;
753 header_len -= timestamp_len;
755 pad_packet_bytes += timestamp_len;
756 packet_size -= timestamp_len;
758 payload_size += timestamp_len;
760 stuffing_size += timestamp_len;
761 if (payload_size > trailer_size)
762 stuffing_size += payload_size - trailer_size;
766 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) {
767 packet_size += pad_packet_bytes;
768 payload_size += pad_packet_bytes;
769 if (stuffing_size < 0)
770 stuffing_size = pad_packet_bytes;
772 stuffing_size += pad_packet_bytes;
773 pad_packet_bytes = 0;
776 if (stuffing_size < 0)
781 stuffing_size += payload_size % stream->
lpcm_align;
784 if (stuffing_size > 16) {
785 pad_packet_bytes += stuffing_size;
786 packet_size -= stuffing_size;
787 payload_size -= stuffing_size;
791 nb_frames =
get_nb_frames(ctx, stream, payload_size - stuffing_size);
798 for (i = 0; i < stuffing_size; i++)
820 avio_w8(ctx->
pb, header_len - 3 + stuffing_size);
822 if (pes_flags & 0x80)
824 if (pes_flags & 0x40)
827 if (pes_flags & 0x01) {
854 for (i = 0; i < stuffing_size; i++)
867 }
else if (
id >= 0x40) {
877 payload_size - stuffing_size,
885 if (pad_packet_bytes > 0)
888 for (i = 0; i < zero_trail_bytes; i++)
901 return payload_size - stuffing_size;
939 scr > pkt_desc->
dts) {
943 "buffer underflow st=%d bufi=%d size=%d\n",
961 int i, avail_space = 0, es_size, trailer_size;
963 int best_score = INT_MIN;
964 int ignore_constraints = 0;
965 int ignore_delay = 0;
988 if (space < s->packet_size && !ignore_constraints)
991 if (next_pkt && next_pkt->
dts - scr > max_delay && !ignore_delay)
996 if (rel_space > best_score) {
997 best_score = rel_space;
1004 int64_t best_dts = INT64_MAX;
1011 if (pkt_desc && pkt_desc->
dts < best_dts)
1012 best_dts = pkt_desc->
dts;
1016 if (best_dts < INT64_MAX) {
1018 scr / 90000.0, best_dts / 90000.0);
1020 if (scr >= best_dts + 1 && !ignore_constraints) {
1022 "packet too large, ignoring buffer limits to mux it\n");
1023 ignore_constraints = 1;
1025 scr =
FFMAX(best_dts + 1, scr);
1028 }
else if (has_premux && flush) {
1030 "delay too large, ignoring ...\n");
1032 ignore_constraints = 1;
1053 timestamp_packet = timestamp_packet->
next;
1056 if (timestamp_packet) {
1058 timestamp_packet->
dts / 90000.0,
1059 timestamp_packet->
pts / 90000.0,
1060 scr / 90000.0, best_i);
1062 timestamp_packet->
dts, scr, trailer_size);
1138 dts / 90000.0, pts / 90000.0, pkt->
flags,
1145 pkt_desc->
dts = dts;
1203 #define OFFSET(x) offsetof(MpegMuxContext, x)
1204 #define E AV_OPT_FLAG_ENCODING_PARAM
1207 {
"preload",
"Initial demux-decode delay in microseconds.",
OFFSET(preload),
AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX,
E },
1211 #define MPEGENC_CLASS(flavor) \
1212 static const AVClass flavor ## _class = { \
1213 .class_name = #flavor " muxer", \
1214 .item_name = av_default_item_name, \
1215 .version = LIBAVUTIL_VERSION_INT, \
1216 .option = options, \
1219 #if CONFIG_MPEG1SYSTEM_MUXER
1224 .mime_type =
"video/mpeg",
1225 .extensions =
"mpg,mpeg",
1232 .priv_class = &mpeg_class,
1236 #if CONFIG_MPEG1VCD_MUXER
1241 .mime_type =
"video/mpeg",
1248 .priv_class = &vcd_class,
1252 #if CONFIG_MPEG2VOB_MUXER
1257 .mime_type =
"video/mpeg",
1258 .extensions =
"vob",
1265 .priv_class = &vob_class,
1270 #if CONFIG_MPEG2SVCD_MUXER
1275 .mime_type =
"video/mpeg",
1276 .extensions =
"vob",
1283 .priv_class = &svcd_class,
1288 #if CONFIG_MPEG2DVD_MUXER
1293 .mime_type =
"video/mpeg",
1294 .extensions =
"dvd",
1301 .priv_class = &dvd_class,
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
static int put_pack_header(AVFormatContext *ctx, uint8_t *buf, int64_t timestamp)
static const AVOption options[]
PacketDesc ** next_packet
static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr)
static void flush(AVCodecContext *avctx)
static av_cold int mpeg_mux_init(AVFormatContext *ctx)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
#define AV_LOG_WARNING
Something somehow does not look correct.
static int get_system_header_size(AVFormatContext *ctx)
static const int lpcm_freq_tab[4]
static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len)
int64_t vcd_padding_bytes_written
Macro definitions for various function/variable attributes.
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 int output_packet(AVFormatContext *ctx, int flush)
static int flush_packet(AVFormatContext *ctx, int stream_index, int64_t pts, int64_t dts, int64_t scr, int trailer_size)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
AVOutputFormat ff_mpeg2svcd_muxer
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
AVStream ** streams
A list of all streams in the file.
#define SYSTEM_HEADER_START_CODE
PacketDesc * predecode_packet
int64_t vcd_padding_bitrate_num
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
struct AVOutputFormat * oformat
The output container format.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define MPEGENC_CLASS(flavor)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
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.
int rc_max_rate
maximum bitrate
int flags
A combination of AV_PKT_FLAG values.
AVCodecContext * codec
Codec context associated with this stream.
int rc_buffer_size
decoder bitstream buffer size
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
static void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
int bit_rate
the average bitrate
int void avio_flush(AVIOContext *s)
Force flushing of buffered data.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
#define AV_TIME_BASE
Internal time base represented as integer.
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
AVOutputFormat ff_mpeg1vcd_muxer
static int write_trailer(AVFormatContext *s1)
static void put_padding_packet(AVFormatContext *ctx, AVIOContext *pb, int packet_bytes)
preferred ID for MPEG-1/2 video decoding
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
enum AVMediaType codec_type
static void put_vcd_padding_sector(AVFormatContext *ctx)
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 int mpeg_mux_end(AVFormatContext *ctx)
int sample_rate
samples per second
AVIOContext * pb
I/O context.
int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size)
Resize an AVFifoBuffer.
void avio_w8(AVIOContext *s, int b)
a very simple circular buffer FIFO implementation
Describe the class of an AVClass context structure.
AVOutputFormat ff_mpeg2dvd_muxer
PacketDesc * premux_packet
static int64_t pts
Global timestamp for the audio frames.
void avio_wb16(AVIOContext *s, unsigned int val)
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 void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
int channels
number of audio channels
void * priv_data
Format private data.
static void write_header(FFV1Context *f)
static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
void avio_wb32(AVIOContext *s, unsigned int val)
static int put_system_header(AVFormatContext *ctx, uint8_t *buf, int only_for_stream_id)
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
This structure stores compressed data.
static int write_packet(AVFormatContext *s1, AVPacket *pkt)
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define VCD_PADDING_BITRATE_DEN
AVOutputFormat ff_mpeg2vob_muxer