You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
mp3enc: support MPEG-2 and MPEG-2.5 in Xing header.
This commit is contained in:
committed by
Anton Khirnov
parent
6365e4db79
commit
ca8e39dd0d
@@ -90,25 +90,34 @@ typedef struct MP3Context {
|
|||||||
AVPacketList *queue, *queue_end;
|
AVPacketList *queue, *queue_end;
|
||||||
} MP3Context;
|
} MP3Context;
|
||||||
|
|
||||||
|
static const uint8_t xing_offtbl[2][2] = {{32, 17}, {17, 9}};
|
||||||
|
|
||||||
/* insert a dummy frame containing number of frames */
|
/* insert a dummy frame containing number of frames */
|
||||||
static void mp3_write_xing(AVFormatContext *s)
|
static void mp3_write_xing(AVFormatContext *s)
|
||||||
{
|
{
|
||||||
MP3Context *mp3 = s->priv_data;
|
MP3Context *mp3 = s->priv_data;
|
||||||
AVCodecContext *codec = s->streams[mp3->audio_stream_idx]->codec;
|
AVCodecContext *codec = s->streams[mp3->audio_stream_idx]->codec;
|
||||||
int bitrate_idx = 1; // 32 kbps
|
int bitrate_idx = 1; // 32 kbps
|
||||||
int64_t xing_offset = (codec->channels == 2) ? 32 : 17;
|
|
||||||
int32_t header;
|
int32_t header;
|
||||||
MPADecodeHeader mpah;
|
MPADecodeHeader mpah;
|
||||||
int srate_idx, i, channels;
|
int srate_idx, i, channels;
|
||||||
|
int xing_offset;
|
||||||
|
int ver = 0;
|
||||||
|
|
||||||
if (!s->pb->seekable)
|
if (!s->pb->seekable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(avpriv_mpa_freq_tab); i++)
|
for (i = 0; i < FF_ARRAY_ELEMS(avpriv_mpa_freq_tab); i++) {
|
||||||
if (avpriv_mpa_freq_tab[i] == codec->sample_rate) {
|
const uint16_t base_freq = avpriv_mpa_freq_tab[i];
|
||||||
srate_idx = i;
|
|
||||||
break;
|
if (codec->sample_rate == base_freq) ver = 0x3; // MPEG 1
|
||||||
}
|
else if (codec->sample_rate == base_freq / 2) ver = 0x2; // MPEG 2
|
||||||
|
else if (codec->sample_rate == base_freq / 4) ver = 0x0; // MPEG 2.5
|
||||||
|
else continue;
|
||||||
|
|
||||||
|
srate_idx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (i == FF_ARRAY_ELEMS(avpriv_mpa_freq_tab)) {
|
if (i == FF_ARRAY_ELEMS(avpriv_mpa_freq_tab)) {
|
||||||
av_log(s, AV_LOG_WARNING, "Unsupported sample rate, not writing Xing "
|
av_log(s, AV_LOG_WARNING, "Unsupported sample rate, not writing Xing "
|
||||||
"header.\n");
|
"header.\n");
|
||||||
@@ -125,13 +134,14 @@ static void mp3_write_xing(AVFormatContext *s)
|
|||||||
|
|
||||||
/* dummy MPEG audio header */
|
/* dummy MPEG audio header */
|
||||||
header = 0xff << 24; // sync
|
header = 0xff << 24; // sync
|
||||||
header |= (0x7 << 5 | 0x3 << 3 | 0x1 << 1 | 0x1) << 16; // sync/mpeg-1/layer 3/no crc*/
|
header |= (0x7 << 5 | ver << 3 | 0x1 << 1 | 0x1) << 16; // sync/audio-version/layer 3/no crc*/
|
||||||
header |= (bitrate_idx << 4 | srate_idx << 2) << 8;
|
header |= (bitrate_idx << 4 | srate_idx << 2) << 8;
|
||||||
header |= channels << 6;
|
header |= channels << 6;
|
||||||
avio_wb32(s->pb, header);
|
avio_wb32(s->pb, header);
|
||||||
|
|
||||||
avpriv_mpegaudio_decode_header(&mpah, header);
|
avpriv_mpegaudio_decode_header(&mpah, header);
|
||||||
|
|
||||||
|
xing_offset = xing_offtbl[ver != 3][codec->channels == 1];
|
||||||
ffio_fill(s->pb, 0, xing_offset);
|
ffio_fill(s->pb, 0, xing_offset);
|
||||||
ffio_wfourcc(s->pb, "Xing");
|
ffio_wfourcc(s->pb, "Xing");
|
||||||
avio_wb32(s->pb, 0x1); // only number of frames
|
avio_wb32(s->pb, 0x1); // only number of frames
|
||||||
|
|||||||
Reference in New Issue
Block a user