61 buf[126] = atoi(tag->
value);
77 #define XING_NUM_BAGS 400
78 #define XING_TOC_SIZE 100
80 #define XING_MAX_SIZE (32 + 4 + 4 + 4 + 4 + XING_TOC_SIZE)
120 int srate_idx, i, channels;
122 int best_bitrate_idx;
123 int best_bitrate_error = INT_MAX;
126 int lsf, bytes_needed;
135 else if (codec->
sample_rate == base_freq / 2) ver = 0x2;
136 else if (codec->
sample_rate == base_freq / 4) ver = 0x0;
152 "not writing Xing header.\n");
158 header |= (0x7 << 5 | ver << 3 | 0x1 << 1 | 0x1) << 16;
159 header |= (srate_idx << 2) << 8;
160 header |= channels << 6;
162 lsf = !((header & (1 << 20) && header & (1 << 19)));
164 xing_offset =
xing_offtbl[ver != 3][channels == 1];
173 for (bitrate_idx = 1; bitrate_idx < 15; bitrate_idx++) {
177 if (error < best_bitrate_error){
178 best_bitrate_error = error;
179 best_bitrate_idx = bitrate_idx;
183 for (bitrate_idx = best_bitrate_idx; bitrate_idx < 15; bitrate_idx++) {
189 if (bytes_needed <= mpah.frame_size)
206 mp3->
size = mpah.frame_size;
216 ffio_fill(s->
pb, 0, mpah.frame_size - bytes_needed);
237 mp3->
bag[i / 2] = mp3->
bag[i];
242 mp3->
pos = XING_NUM_BAGS / 2;
276 int ret = 0, write = 1;
281 while ((pktl = mp3->
queue)) {
311 int seek_point = 256LL * mp3->
bag[j] / mp3->
size;
325 "attached pictures.\n");
344 .mime_type =
"audio/x-mpeg",
345 .extensions =
"mp2,m2a,mpa",
356 {
"id3v2_version",
"Select ID3v2 version to write. Currently 3 and 4 are supported.",
358 {
"write_id3v1",
"Enable ID3v1 writing. ID3v1 tags are written in UTF-8 which may not be supported by most software.",
360 {
"write_xing",
"Write the Xing header containing file duration.",
365 static const AVClass mp3_muxer_class = {
446 "audio stream is required.\n");
463 "ID3v2 header is disabled.\n");
486 .mime_type =
"audio/x-mpeg",
495 .priv_class = &mp3_muxer_class,