[FFmpeg-devel] [PATCH] avcodec/libmp3lame: properly handle unaligned frame data
wm4
nfxjfg at googlemail.com
Wed Apr 26 13:34:25 EEST 2017
On Wed, 26 Apr 2017 17:16:05 +0700
Muhammad Faiz <mfcc64 at gmail.com> wrote:
> This should fix Ticket6349
>
> Since 383057f8e744efeaaa3648a59bc577b25b055835, framequeue may
> generate unaligned frame data.
>
> Signed-off-by: Muhammad Faiz <mfcc64 at gmail.com>
> ---
> libavcodec/libmp3lame.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c
> index 5e26743..cd505bb 100644
> --- a/libavcodec/libmp3lame.c
> +++ b/libavcodec/libmp3lame.c
> @@ -203,15 +203,20 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
> ENCODE_BUFFER(lame_encode_buffer_int, int32_t, frame->data);
> break;
> case AV_SAMPLE_FMT_FLTP:
> - if (frame->linesize[0] < 4 * FFALIGN(frame->nb_samples, 8)) {
> - av_log(avctx, AV_LOG_ERROR, "inadequate AVFrame plane padding\n");
> - return AVERROR(EINVAL);
> - }
> for (ch = 0; ch < avctx->channels; ch++) {
> + if (frame->linesize[0] < 4 * FFALIGN(frame->nb_samples, 8) || 0x1F & (intptr_t)(frame->data[ch])) {
> + float *src = (float *) frame->data[ch];
> + float *dst = s->samples_flt[ch];
> + int k;
> +
> + for (k = 0; k < frame->nb_samples; k++)
> + dst[k] = src[k] * 32768.0f;
> + } else {
> s->fdsp->vector_fmul_scalar(s->samples_flt[ch],
> (const float *)frame->data[ch],
> 32768.0f,
> FFALIGN(frame->nb_samples, 8));
> + }
> }
> ENCODE_BUFFER(lame_encode_buffer_float, float, s->samples_flt);
> break;
Looks like the right solution is fixing framequeue.
I don't think encoders generally allow lax alignment, and this might
not be the only case.
More information about the ffmpeg-devel
mailing list