> 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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel