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;
273 int ret = 0, write = 1;
278 while ((pktl = mp3->
queue)) {
308 int seek_point = 256LL * mp3->
bag[j] / mp3->
size;
322 "attached pictures.\n");
341 .mime_type =
"audio/x-mpeg",
342 .extensions =
"mp2,m2a,mpa",
353 {
"id3v2_version",
"Select ID3v2 version to write. Currently 3 and 4 are supported.",
355 {
"write_id3v1",
"Enable ID3v1 writing. ID3v1 tags are written in UTF-8 which may not be supported by most software.",
357 {
"write_xing",
"Write the Xing header containing file duration.",
362 static const AVClass mp3_muxer_class = {
443 "audio stream is required.\n");
460 "ID3v2 header is disabled.\n");
483 .mime_type =
"audio/x-mpeg",
492 .priv_class = &mp3_muxer_class,