43 uint8_t *buf,
int buf_size)
79 buf[126] = atoi(
tag->value);
95#define XING_NUM_BAGS 400
96#define XING_TOC_SIZE 100
156 int best_bitrate_idx = -1;
157 int best_bitrate_error = INT_MAX;
169 else if (par->
sample_rate == base_freq / 2) ver = 0x2;
170 else if (par->
sample_rate == base_freq / 4) ver = 0x0;
185 "not writing Xing header.\n");
191 header |= (0x7 << 5 | ver << 3 | 0x1 << 1 | 0x1) << 16;
192 header |= (srate_idx << 2) << 8;
195 for (bitrate_idx = 1; bitrate_idx < 15; bitrate_idx++) {
199 if (
error < best_bitrate_error) {
200 best_bitrate_error =
error;
201 best_bitrate_idx = bitrate_idx;
206 for (bitrate_idx = best_bitrate_idx; ; bitrate_idx++) {
208 if (15 == bitrate_idx)
217 if (bytes_needed <= mpah.frame_size)
231 avio_wb32(dyn_ctx, 0x01 | 0x02 | 0x04 | 0x08);
233 mp3->
size = mpah.frame_size;
251 uint8_t encoder_str[9] = { 0 };
252 if ( strlen(enc->
value) >
sizeof(encoder_str)
253 && !strcmp(
"Lavc libmp3lame", enc->
value)) {
254 memcpy(encoder_str,
"Lavf lame", 9);
256 memcpy(encoder_str, enc->
value,
FFMIN(strlen(enc->
value),
sizeof(encoder_str)));
258 avio_write(dyn_ctx, encoder_str,
sizeof(encoder_str));
278 ffio_fill(dyn_ctx, 0, mpah.frame_size - bytes_needed);
323 if (
pkt->data &&
pkt->size >= 4) {
337 "is invalid, writing it anyway.\n",
pkt->size,
h);
340#ifdef FILTER_VBR_HEADERS
347 if (
MKBETAG(
'X',
'i',
'n',
'g') == v ||
MKBETAG(
'I',
'n',
'f',
'o') == v)
359 uint8_t *side_data =
NULL;
360 size_t side_data_size;
370 if (side_data && side_data_size >= 10) {
371 uint32_t discard_padding =
AV_RL32(side_data + 4);
373 mp3->
padding = discard_padding ? mp3->
padding + discard_padding : 0;
413 int ret = 0, write = 1;
451 int seek_point = 256LL * mp3->
bag[j] / mp3->
size;
452 toc[
i] =
FFMIN(seek_point, 255);
457 s->streams[0]->codecpar->nb_coded_side_data,
459 if (sd && sd->
size >=
sizeof(*rg)) {
484 if (mp3->
delay >= 1 << 12) {
485 mp3->
delay = (1 << 12) - 1;
513 "attached pictures.\n");
538 return MKTAG(
'A',
'P',
'I',
'C');
545 {
"id3v2_version",
"Select ID3v2 version to write. Currently 3 and 4 are supported.",
547 {
"write_id3v1",
"Enable ID3v1 writing. ID3v1 tags are written in UTF-8 which may not be supported by most software.",
549 {
"write_xing",
"Write the Xing header containing file duration.",
555 .class_name =
"MP3 muxer",
584 if (
s->streams[
pkt->stream_index]->nb_frames == 1) {
586 " ignoring.\n",
pkt->stream_index);
627 for (
i = 0;
i <
s->nb_streams;
i++) {
632 "audio stream is required.\n");
649 "ID3v2 header is disabled.\n");
699 .p.mime_type =
"audio/mpeg",
700 .p.extensions =
"mp3",
static double val(void *priv, double ch)
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
void avio_w8(AVIOContext *s, int b)
void avio_wb32(AVIOContext *s, unsigned int val)
void avio_wb16(AVIOContext *s, unsigned int val)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
void avio_wb24(AVIOContext *s, unsigned int val)
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
void ffio_fill(AVIOContext *s, int b, int64_t count)
#define i(width, name, range_min, range_max)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Public header for CRC hash function implementation.
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
AVCodecID
Identify the syntax and semantics of the bitstream.
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
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_SKIP_SAMPLES
Recommends skipping the specified number of samples.
@ AV_PKT_DATA_REPLAYGAIN
This side data should be associated with an audio stream and contains ReplayGain information in form ...
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
#define AV_LOG_WARNING
Something somehow does not look correct.
#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.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
#define LIBAVUTIL_VERSION_INT
const char *const ff_id3v1_genre_str[ID3v1_GENRE_MAX+1]
ID3v1 genres.
const CodecMime ff_id3v2_mime_tags[]
void ff_id3v2_start(ID3v2EncContext *id3, AVIOContext *pb, int id3v2_version, const char *magic)
Initialize an ID3v2 tag.
void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb, int padding_bytes)
Finalize an opened ID3v2 tag.
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
int ff_id3v2_write_apic(AVFormatContext *s, AVIOContext *pb, ID3v2EncContext *id3, AVPacket *pkt)
Write an attached picture from pkt into an ID3v2 tag.
int ff_id3v2_write_metadata(AVFormatContext *s, AVIOContext *pb, ID3v2EncContext *id3)
Convert and write all global metadata from s into an ID3v2 tag.
static int query_codec(enum AVCodecID id, int std_compliance)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static const uint16_t mask[17]
#define MKTAG(a, b, c, d)
#define MKBETAG(a, b, c, d)
Memory handling functions.
static void mp3_update_xing(AVFormatContext *s)
static int mp3_write_audio_packet(AVFormatContext *s, AVPacket *pkt)
static int mp3_queue_flush(AVFormatContext *s)
static const AVClass mp3_muxer_class
static void mp3_xing_add_frame(MP3Context *mp3, AVPacket *pkt)
static const uint8_t xing_offtbl[2][2]
static int mp3_init(struct AVFormatContext *s)
Write an ID3v2 header at beginning of stream.
static int id3v1_create_tag(AVFormatContext *s, uint8_t *buf)
static int query_codec(enum AVCodecID id, int std_compliance)
static int mp3_write_xing(AVFormatContext *s)
static void mp3_deinit(struct AVFormatContext *s)
static int mp3_write_header(struct AVFormatContext *s)
static int id3v1_set_string(AVFormatContext *s, const char *key, uint8_t *buf, int buf_size)
static int mp3_finish_id3v2(AVFormatContext *s)
static int mp3_write_packet(AVFormatContext *s, AVPacket *pkt)
static int mp3_write_trailer(struct AVFormatContext *s)
mpeg audio declarations for both encoder and decoder.
mpeg audio layer common tables.
FF_VISIBILITY_PUSH_HIDDEN const uint16_t ff_mpa_bitrate_tab[2][3][15]
const uint16_t ff_mpa_freq_tab[3]
static const uint8_t header[24]
#define FF_ARRAY_ELEMS(a)
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
This struct describes the properties of an encoded stream.
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.
int error
contains the error code or 0 if no error happened
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
This structure stores compressed data.
ReplayGain information (see http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1....
uint32_t track_peak
Peak track amplitude, with 100000 representing full scale (but values may overflow).
int32_t track_gain
Track replay gain in microbels (divide by 100000 to get the value in dB).
int32_t album_gain
Same as track_gain, but for the whole album.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
uint64_t bag[XING_NUM_BAGS]
int64_t xing_frame_offset
static void error(const char *err)