[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