[FFmpeg-devel] [PATCH] add (e)ac3float decoders
Michael Niedermayer
michaelni
Thu Mar 10 16:39:33 CET 2011
On Thu, Mar 10, 2011 at 02:52:15PM +0000, M?ns Rullg?rd wrote:
> FB2000 <flybird2k at gmail.com> writes:
>
> > On Tue, Mar 8, 2011 at 5:27 AM, Michael Niedermayer <michaelni at gmx.at>
> > wrote:
> >
> >> On Mon, Mar 07, 2011 at 03:01:46PM -0500, Justin Ruggles wrote:
> >> >
> >> > 1) There is no need for separate int16 and float decoders. The AC3
> >> > decoder is a floating-point decoder. It just happens to output int16 at
> >> > the end.
> >>
> >> can you send a patch that does this?
> >>
> >>
> > Well, if these are what wanted. See attached patches for AC3 and DCA.
> >
> > FB2000
> >
> > diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
> > index 5ebee19..882e1c5 100644
> > --- a/libavcodec/ac3dec.c
> > +++ b/libavcodec/ac3dec.c
> > @@ -196,8 +196,7 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
> > ff_fmt_convert_init(&s->fmt_conv, avctx);
> > av_lfg_init(&s->dith_state, 0);
> >
> > - /* set scale value for float to int16 conversion */
> > - s->mul_bias = 32767.0f;
> > + s->mul_bias = 1.0f;
> >
> > /* allow downmixing to stereo or mono */
> > if (avctx->channels > 0 && avctx->request_channels > 0 &&
> > @@ -214,7 +213,7 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
> > return AVERROR(ENOMEM);
> > }
> >
> > - avctx->sample_fmt = AV_SAMPLE_FMT_S16;
> > + avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
> > return 0;
> > }
> >
> > @@ -1308,8 +1307,8 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
> > const uint8_t *buf = avpkt->data;
> > int buf_size = avpkt->size;
> > AC3DecodeContext *s = avctx->priv_data;
> > - int16_t *out_samples = (int16_t *)data;
> > - int blk, ch, err;
> > + float *out_samples = (float *)data;
> > + int i, blk, ch, err;
> > const uint8_t *channel_map;
> > const float *output[AC3_MAX_CHANNELS];
> >
> > @@ -1408,10 +1407,11 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
> > av_log(avctx, AV_LOG_ERROR, "error decoding the audio block\n");
> > err = 1;
> > }
> > - s->fmt_conv.float_to_int16_interleave(out_samples, output, 256, s->out_channels);
> > - out_samples += 256 * s->out_channels;
> > + for (i = 0; i < 256; i++)
> > + for (ch = 0; ch < s->out_channels; ch++)
> > + *(out_samples++) = output[ch][i];
> > }
> > - *data_size = s->num_blocks * 256 * avctx->channels * sizeof (int16_t);
> > + *data_size = s->num_blocks * 256 * avctx->channels * sizeof (float);
> > return FFMIN(buf_size, s->frame_size);
> > }
>
> This gives a 5x slowdown on ARM. That is unacceptable.
you need 5 times more time to do the same thing outside the codec as inside?
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The greatest way to live with honor in this world is to be what we pretend
to be. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20110310/9964f977/attachment.pgp>
More information about the ffmpeg-devel
mailing list