On Sat, 25 Aug 2012 14:01:17 -0400, Justin Ruggles <justin.rugg...@gmail.com> wrote: > --- > libavcodec/libmp3lame.c | 105 +++++++++++++++++----------------------------- > 1 files changed, 39 insertions(+), 66 deletions(-) > > diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c > index d754f46..b09b61c 100644 > --- a/libavcodec/libmp3lame.c > +++ b/libavcodec/libmp3lame.c > @@ -33,6 +33,7 @@ > #include "libavutil/opt.h" > #include "avcodec.h" > #include "audio_frame_queue.h" > +#include "dsputil.h" > #include "internal.h" > #include "mpegaudio.h" > #include "mpegaudiodecheader.h" > @@ -46,8 +47,9 @@ typedef struct LAMEContext { > uint8_t buffer[BUFFER_SIZE]; > int buffer_index; > int reservoir; > - void *planar_samples[2]; > + float *samples_flt[2]; > AudioFrameQueue afq; > + DSPContext dsp; > } LAMEContext; > > > @@ -58,8 +60,8 @@ static av_cold int mp3lame_encode_close(AVCodecContext > *avctx) > #if FF_API_OLD_ENCODE_AUDIO > av_freep(&avctx->coded_frame); > #endif > - av_freep(&s->planar_samples[0]); > - av_freep(&s->planar_samples[1]); > + av_freep(&s->samples_flt[0]); > + av_freep(&s->samples_flt[1]); > > ff_af_queue_close(&s->afq); > > @@ -126,93 +128,64 @@ static av_cold int mp3lame_encode_init(AVCodecContext > *avctx) > } > #endif > > - /* sample format */ > - if (avctx->sample_fmt == AV_SAMPLE_FMT_S32 || > - avctx->sample_fmt == AV_SAMPLE_FMT_FLT) { > + /* allocate float sample buffers */ > + if (avctx->sample_fmt == AV_SAMPLE_FMT_FLTP) { > int ch; > for (ch = 0; ch < avctx->channels; ch++) { > - s->planar_samples[ch] = av_malloc(avctx->frame_size * > - > av_get_bytes_per_sample(avctx->sample_fmt)); > - if (!s->planar_samples[ch]) { > + s->samples_flt[ch] = av_malloc(avctx->frame_size * > + sizeof(*s->samples_flt[ch])); > + if (!s->samples_flt[ch]) { > ret = AVERROR(ENOMEM); > goto error; > } > } > } > > + ff_dsputil_init(&s->dsp, avctx); > + > return 0; > error: > mp3lame_encode_close(avctx); > return ret; > } > > -#define DEINTERLEAVE(type, scale) do { \ > - int ch, i; \ > - for (ch = 0; ch < s->avctx->channels; ch++) { \ > - const type *input = samples; \ > - type *output = s->planar_samples[ch]; \ > - input += ch; \ > - for (i = 0; i < nb_samples; i++) { \ > - output[i] = *input * scale; \ > - input += s->avctx->channels; \ > - } \ > - } \ > +#define ENCODE_BUFFER(suffix, buf_name) do { \ > + lame_result = lame_encode_ ## suffix(s->gfp, \ > + buf_name[0], \ > + buf_name[1], \ > + frame->nb_samples, \ > + s->buffer + s->buffer_index, \ > + BUFFER_SIZE - s->buffer_index); \ > } while (0) > > -static int encode_frame_int16(LAMEContext *s, void *samples, int nb_samples) > -{ > - if (s->avctx->channels > 1) { > - return lame_encode_buffer_interleaved(s->gfp, samples, > - nb_samples, > - s->buffer + s->buffer_index, > - BUFFER_SIZE - s->buffer_index); > - } else { > - return lame_encode_buffer(s->gfp, samples, NULL, nb_samples, > - s->buffer + s->buffer_index, > - BUFFER_SIZE - s->buffer_index); > - } > -} > - > -static int encode_frame_int32(LAMEContext *s, void *samples, int nb_samples) > -{ > - DEINTERLEAVE(int32_t, 1); > - > - return lame_encode_buffer_int(s->gfp, > - s->planar_samples[0], s->planar_samples[1], > - nb_samples, > - s->buffer + s->buffer_index, > - BUFFER_SIZE - s->buffer_index); > -} > - > -static int encode_frame_float(LAMEContext *s, void *samples, int nb_samples) > -{ > - DEINTERLEAVE(float, 32768.0f); > - > - return lame_encode_buffer_float(s->gfp, > - s->planar_samples[0], > s->planar_samples[1], > - nb_samples, > - s->buffer + s->buffer_index, > - BUFFER_SIZE - s->buffer_index); > -} > - > static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, > const AVFrame *frame, int *got_packet_ptr) > { > LAMEContext *s = avctx->priv_data; > MPADecodeHeader hdr; > - int len, ret; > + int len, ret, ch; > int lame_result; > > if (frame) { > switch (avctx->sample_fmt) { > - case AV_SAMPLE_FMT_S16: > - lame_result = encode_frame_int16(s, frame->data[0], > frame->nb_samples); > + case AV_SAMPLE_FMT_S16P: > + ENCODE_BUFFER(buffer, (const int16_t *)frame->data);
Wouldn't it be better to move the cast to ENCODE_BUFFER? Casting frame->data (an array of pointers) to a pointer looks confusing. -- Anton Khirnov _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel