[FFmpeg-cvslog] r23646 - in trunk/libavcodec: mpegaudio.h mpegaudiodec.c

Måns Rullgård mans
Sat Jun 19 13:13:41 CEST 2010


vitor <subversion at mplayerhq.hu> writes:

> Author: vitor
> Date: Sat Jun 19 11:56:05 2010
> New Revision: 23646
>
> Log:
> Factorize the mpegaudio windowing code in a function and call it by a
> function pointer. Should allow for ASM optimizations.
>
> Modified:
>    trunk/libavcodec/mpegaudio.h
>    trunk/libavcodec/mpegaudiodec.c
>
> Modified: trunk/libavcodec/mpegaudiodec.c
> ==============================================================================
> --- trunk/libavcodec/mpegaudiodec.c	Sat Jun 19 01:17:20 2010	(r23645)
> +++ trunk/libavcodec/mpegaudiodec.c	Sat Jun 19 11:56:05 2010	(r23646)
> @@ -69,6 +69,8 @@
>
>  static void compute_antialias_integer(MPADecodeContext *s, GranuleDef *g);
>  static void compute_antialias_float(MPADecodeContext *s, GranuleDef *g);
> +static void apply_window_mp3_c(MPA_INT *synth_buf, MPA_INT *window,
> +                               int *dither_state, OUT_INT *samples, int incr);
>
>  /* vlc structure for decoding layer 3 huffman tables */
>  static VLC huff_vlc[16];
> @@ -305,6 +307,7 @@ static av_cold int decode_init(AVCodecCo
>      int i, j, k;
>
>      s->avctx = avctx;
> +    s->apply_window_mp3 = apply_window_mp3_c;
>
>      avctx->sample_fmt= OUT_FMT;
>      s->error_recognition= avctx->error_recognition;
> @@ -836,41 +839,20 @@ void av_cold RENAME(ff_mpa_synth_init)(M
>      }
>  }
>
> -/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
> -   32 samples. */
> -/* XXX: optimize by avoiding ring buffer usage */
> -void RENAME(ff_mpa_synth_filter)(MPA_INT *synth_buf_ptr, int *synth_buf_offset,
> -                         MPA_INT *window, int *dither_state,
> -                         OUT_INT *samples, int incr,
> -                         INTFLOAT sb_samples[SBLIMIT])
> +static void apply_window_mp3_c(MPA_INT *synth_buf, MPA_INT *window,
> +                               int *dither_state, OUT_INT *samples, int incr)
>  {
> -    register MPA_INT *synth_buf;
>      register const MPA_INT *w, *w2, *p;
> -    int j, offset;
> +    int j;
>      OUT_INT *samples2;
>  #if CONFIG_FLOAT
>      float sum, sum2;
>  #elif FRAC_BITS <= 15
> -    int32_t tmp[32];
>      int sum, sum2;
>  #else
>      int64_t sum, sum2;
>  #endif
>
> -    offset = *synth_buf_offset;
> -    synth_buf = synth_buf_ptr + offset;
> -
> -#if FRAC_BITS <= 15 && !CONFIG_FLOAT
> -    dct32(tmp, sb_samples);
> -    for(j=0;j<32;j++) {
> -        /* NOTE: can cause a loss in precision if very high amplitude
> -           sound */
> -        synth_buf[j] = av_clip_int16(tmp[j]);
> -    }
> -#else
> -    dct32(synth_buf, sb_samples);
> -#endif
> -
>      /* copy to avoid wrap */
>      memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf));
>
> @@ -909,10 +891,63 @@ void RENAME(ff_mpa_synth_filter)(MPA_INT
>      SUM8(MLSS, sum, w + 32, p);
>      *samples = round_sample(&sum);
>      *dither_state= sum;
> +}
> +
> +
> +/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
> +   32 samples. */
> +/* XXX: optimize by avoiding ring buffer usage */
> +#if CONFIG_FLOAT
> +void ff_mpa_synth_filter_float(MPADecodeContext *s, float *synth_buf_ptr,
> +                               int *synth_buf_offset,
> +                               float *window, int *dither_state,
> +                               float *samples, int incr,
> +                               float sb_samples[SBLIMIT])
> +{
> +    float *synth_buf;
> +    int offset;
> +
> +    offset = *synth_buf_offset;
> +    synth_buf = synth_buf_ptr + offset;
> +
> +    dct32(synth_buf, sb_samples);
> +    s->apply_window_mp3(synth_buf, window, dither_state, samples, incr);
> +
> +    offset = (offset - 32) & 511;
> +    *synth_buf_offset = offset;
> +}
> +#else
> +void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset,
> +                         MPA_INT *window, int *dither_state,
> +                         OUT_INT *samples, int incr,
> +                         INTFLOAT sb_samples[SBLIMIT])
> +{
> +    register MPA_INT *synth_buf;
> +    int offset;
> +#if FRAC_BITS <= 15
> +    int32_t tmp[32];
> +#endif
> +
> +    offset = *synth_buf_offset;
> +    synth_buf = synth_buf_ptr + offset;
> +
> +#if FRAC_BITS <= 15 && !CONFIG_FLOAT

!CONFIG_FLOAT is always true here.

> +    dct32(tmp, sb_samples);
> +    for(j=0;j<32;j++) {
> +        /* NOTE: can cause a loss in precision if very high amplitude
> +           sound */
> +        synth_buf[j] = av_clip_int16(tmp[j]);
> +    }
> +#else
> +    dct32(synth_buf, sb_samples);
> +#endif
> +
> +    apply_window_mp3_c(synth_buf, window, dither_state, samples, incr);

Why doesn't this use a function pointer too?

>      offset = (offset - 32) & 511;
>      *synth_buf_offset = offset;
>  }
> +#endif
>
>  #define C3 FIXHR(0.86602540378443864676/2)
>
> @@ -2227,7 +2262,11 @@ static int mp_decode_frame(MPADecodeCont
>      for(ch=0;ch<s->nb_channels;ch++) {
>          samples_ptr = samples + ch;
>          for(i=0;i<nb_frames;i++) {
> -            RENAME(ff_mpa_synth_filter)(s->synth_buf[ch], &(s->synth_buf_offset[ch]),
> +            RENAME(ff_mpa_synth_filter)(
> +#if CONFIG_FLOAT
> +                         s,
> +#endif

Do I really need to tell you that this is hideously ugly?

> +                         s->synth_buf[ch], &(s->synth_buf_offset[ch]),
>                           RENAME(ff_mpa_synth_window), &s->dither_state,
>                           samples_ptr, s->nb_channels,
>                           s->sb_samples[ch][i]);
>

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-cvslog mailing list