[FFmpeg-devel] [PATCH 02/14] libavutil: Add new fixed dsp functions.

Michael Niedermayer michaelni at gmx.at
Fri May 29 19:25:27 CEST 2015


On Fri, May 29, 2015 at 03:46:21PM +0200, Nedeljko Babic wrote:
> Added functions needed for implementation of fixed point aac dec.
> 
> Signed-off-by: Nedeljko Babic <nedeljko.babic at imgtec.com>
> ---
>  libavutil/fixed_dsp.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  libavutil/fixed_dsp.h | 53 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 113 insertions(+)
> 
> diff --git a/libavutil/fixed_dsp.c b/libavutil/fixed_dsp.c
> index e0ea981..8ddcdef 100644
> --- a/libavutil/fixed_dsp.c
> +++ b/libavutil/fixed_dsp.c
> @@ -47,6 +47,28 @@
>  
>  #include "fixed_dsp.h"
>  
> +static void vector_fmul_add_c(int *dst, const int *src0, const int *src1, const int *src2, int len){
> +    int i;
> +    int64_t accu;
> +
> +    for (i=0; i<len; i++) {
> +        accu = (int64_t)src0[i] * src1[i];
> +        dst[i] = src2[i] + (int)((accu + 0x40000000) >> 31);
> +    }
> +}
> +
> +static void vector_fmul_reverse_c(int *dst, const int *src0, const int *src1, int len)
> +{
> +    int i;
> +    int64_t accu;
> +
> +    src1 += len-1;
> +    for (i=0; i<len; i++) {
> +        accu = (int64_t)src0[i] * src1[-i];
> +        dst[i] = (int)((accu+0x40000000) >> 31);
> +    }
> +}
> +
>  static void vector_fmul_window_scaled_c(int16_t *dst, const int32_t *src0,
>                                         const int32_t *src1, const int32_t *win,
>                                         int len, uint8_t bits)
> @@ -88,6 +110,39 @@ static void vector_fmul_window_c(int32_t *dst, const int32_t *src0,
>      }
>  }
>  
> +static void vector_fmul_c(int *dst, const int *src0, const int *src1, int len)
> +{
> +    int i;
> +    int64_t accu;
> +
> +    for (i = 0; i < len; i++){
> +        accu = (int64_t)src0[i] * src1[i];
> +        dst[i] = (int)((accu+0x40000000) >> 31);
> +    }
> +}
> +
> +static int ff_scalarproduct_fixed_c(const int *v1, const int *v2, int len)
> +{

> +    int64_t p = 0;
> +    int i;
> +
> +    for (i = 0; i < len; i++)
> +        p += (int64_t)v1[i] * v2[i];
> +
> +    return (int)((p + 0x40000000) >> 31);

p could be set to 0x4000000 instead of 0 to avoid the addition


> +}
> +
> +static void butterflies_fixed_c(int *v1, int *v2, int len)
> +{
> +  int i;
> +
> +  for (i = 0; i < len; i++){
> +    int t = v1[i] - v2[i];
> +    v1[i] += v2[i];
> +    v2[i] = t;
> +  }
> +}

why does this have a different indention depth ?


> +
>  AVFixedDSPContext * avpriv_alloc_fixed_dsp(int bit_exact)
>  {
>      AVFixedDSPContext * fdsp = av_malloc(sizeof(AVFixedDSPContext));
> @@ -97,6 +152,11 @@ AVFixedDSPContext * avpriv_alloc_fixed_dsp(int bit_exact)
>  
>      fdsp->vector_fmul_window_scaled = vector_fmul_window_scaled_c;
>      fdsp->vector_fmul_window = vector_fmul_window_c;
> +    fdsp->vector_fmul = vector_fmul_c;
> +    fdsp->vector_fmul_add = vector_fmul_add_c;
> +    fdsp->vector_fmul_reverse = vector_fmul_reverse_c;
> +    fdsp->butterflies_fixed = butterflies_fixed_c;
> +    fdsp->scalarproduct_fixed = ff_scalarproduct_fixed_c;
>  
>      return fdsp;
>  }
> diff --git a/libavutil/fixed_dsp.h b/libavutil/fixed_dsp.h
> index ff6f365..73859c0 100644
> --- a/libavutil/fixed_dsp.h
> +++ b/libavutil/fixed_dsp.h
> @@ -54,6 +54,8 @@
>  #include "libavcodec/mathops.h"
>  
>  typedef struct AVFixedDSPContext {
> +    /* assume len is a multiple of 16, and arrays are 32-byte aligned */
> +
>      /**
>       * Overlap/add with window function.
>       * Used primarily by MDCT-based audio codecs.
> @@ -92,6 +94,57 @@ typedef struct AVFixedDSPContext {
>       */
>      void (*vector_fmul_window)(int32_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len);
>  
> +    /**

> +     * Fixed-point multiplication that calculates the product of two vectors of
> +     * integers and stores the result in a vector of integers.

"the product of 2 vectors" is not a clearly defined operation
there are many products, the dot product is the most commonly used
possibly but thats not what this function does, what you mean is the
element or component wise multiplication

also the fixed point precission must be specified because the results
are completely diffeernt depending on where the 1.0 point is and
how much the result is shifted to compensate

these issues applies also to other functions


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150529/f6045589/attachment.asc>


More information about the ffmpeg-devel mailing list