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

Nedeljko Babic Nedeljko.Babic at imgtec.com
Mon Jun 1 15:23:53 CEST 2015


> 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
>

I will change this and resubmit the patch.

>
>> +}
>> +
>> +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 ?
>

It shouldn't have.
It will be changed.

>
>> +
>>  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
>

The definition for this function (as for most of the other functions) is
basically the same as the definition for the similar function given in the
float_dsp.h adjusted for the fixed point version.
I didn't think that more detailed explanation is needed since the functionality
is basically the same, although I have to admit that I should have specified
fixed point precision, as you pointed out, and I will add this in the new patch.

>also the fixed point precision must be specified because the results
>are completely different depending on where the 1.0 point is and
>how much the result is shifted to compensate
>
>these issues applies also to other functions

Thanks,
-Nedeljko


More information about the ffmpeg-devel mailing list