From 56dc46a1893251e74be1ad63e54fb38d754bb1fe Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 24 Aug 2014 10:28:32 +0000 Subject: riffenc: do not fall back on AVCodecContext.frame_size for MP3 It will not be set unless the codec context is used as the encoding context, which is discouraged. For MP2, av_get_audio_frame_duration() will already set the frame size properly. For MP3, set the frame size explicitly. --- libavformat/riffenc.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'libavformat/riffenc.c') diff --git a/libavformat/riffenc.c b/libavformat/riffenc.c index b83533a250..81b3b2da12 100644 --- a/libavformat/riffenc.c +++ b/libavformat/riffenc.c @@ -63,8 +63,6 @@ int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc) * fall back on using AVCodecContext.frame_size, which is not as reliable * for indicating packet duration. */ frame_size = av_get_audio_frame_duration(enc, enc->block_align); - if (!frame_size) - frame_size = enc->frame_size; waveformatextensible = (enc->channels > 2 && enc->channel_layout) || enc->sample_rate > 48000 || @@ -96,12 +94,10 @@ int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc) enc->bits_per_coded_sample, bps); } - if (enc->codec_id == AV_CODEC_ID_MP2 || - enc->codec_id == AV_CODEC_ID_MP3) { - /* This is wrong, but it seems many demuxers do not work if this - * is set correctly. */ + if (enc->codec_id == AV_CODEC_ID_MP2) { blkalign = frame_size; - // blkalign = 144 * enc->bit_rate/enc->sample_rate; + } else if (enc->codec_id == AV_CODEC_ID_MP3) { + blkalign = 576 * (enc->sample_rate <= 24000 ? 1 : 2); } else if (enc->codec_id == AV_CODEC_ID_AC3) { blkalign = 3840; /* maximum bytes per frame */ } else if (enc->block_align != 0) { /* specified by the codec */ -- cgit v1.2.3