[FFmpeg-devel] [PATCH] Add shift argument to MULL() macro
Mans Rullgard
mans
Sun Nov 23 23:40:21 CET 2008
This replaces use of FRAC_BITS in the MULL() definition with a third
argument specifying the shift amount. All uses of this macro are
updated to pass FRAC_BITS as third argument.
---
libavcodec/armv4l/mathops.h | 6 ++----
libavcodec/i386/mathops.h | 6 ++----
libavcodec/lsp.c | 2 +-
libavcodec/mathops.h | 2 +-
libavcodec/mpegaudiodec.c | 24 ++++++++++++------------
5 files changed, 18 insertions(+), 22 deletions(-)
diff --git a/libavcodec/armv4l/mathops.h b/libavcodec/armv4l/mathops.h
index 37a0d3f..f8a3d6d 100644
--- a/libavcodec/armv4l/mathops.h
+++ b/libavcodec/armv4l/mathops.h
@@ -25,19 +25,17 @@
#include <stdint.h>
#include "libavutil/common.h"
-#ifdef FRAC_BITS
# define MULL MULL
-static inline av_const int MULL(int a, int b)
+static inline av_const int MULL(int a, int b, unsigned shift)
{
int lo, hi;
__asm__("smull %0, %1, %2, %3 \n\t"
"mov %0, %0, lsr %4 \n\t"
"add %1, %0, %1, lsl %5 \n\t"
: "=&r"(lo), "=&r"(hi)
- : "r"(b), "r"(a), "i"(FRAC_BITS), "i"(32-FRAC_BITS));
+ : "r"(b), "r"(a), "i"(shift), "i"(32-shift));
return hi;
}
-#endif
#define MULH MULH
#ifdef HAVE_ARMV6
diff --git a/libavcodec/i386/mathops.h b/libavcodec/i386/mathops.h
index 2ae24fc..77c72d8 100644
--- a/libavcodec/i386/mathops.h
+++ b/libavcodec/i386/mathops.h
@@ -22,15 +22,13 @@
#ifndef AVCODEC_I386_MATHOPS_H
#define AVCODEC_I386_MATHOPS_H
-#ifdef FRAC_BITS
-# define MULL(ra, rb) \
+#define MULL(ra, rb, shift) \
({ int rt, dummy; __asm__ (\
"imull %3 \n\t"\
"shrdl %4, %%edx, %%eax \n\t"\
: "=a"(rt), "=d"(dummy)\
- : "a" ((int)ra), "rm" ((int)rb), "i"(FRAC_BITS));\
+ : "a" ((int)ra), "rm" ((int)rb), "i"(shift));\
rt; })
-#endif
#define MULH(ra, rb) \
({ int rt, dummy;\
diff --git a/libavcodec/lsp.c b/libavcodec/lsp.c
index d2785f7..f57f621 100644
--- a/libavcodec/lsp.c
+++ b/libavcodec/lsp.c
@@ -72,7 +72,7 @@ static void lsp2poly(int* f, const int16_t* lsp, int lp_half_order)
{
f[i] = f[i-2];
for(j=i; j>1; j--)
- f[j] -= MULL(f[j-1], lsp[2*i-2]) - f[j-2];
+ f[j] -= MULL(f[j-1], lsp[2*i-2], FRAC_BITS) - f[j-2];
f[1] -= lsp[2*i-2] << 8;
}
diff --git a/libavcodec/mathops.h b/libavcodec/mathops.h
index 123fcb7..817e452 100644
--- a/libavcodec/mathops.h
+++ b/libavcodec/mathops.h
@@ -45,7 +45,7 @@
/* generic implementation */
#ifndef MULL
-# define MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS)
+# define MULL(a,b,s) (((int64_t)(a) * (int64_t)(b)) >> (s))
#endif
#ifndef MULH
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index a277492..a853562 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -351,9 +351,9 @@ static int decode_init(AVCodecContext * avctx)
int n, norm;
n = i + 2;
norm = ((INT64_C(1) << n) * FRAC_ONE) / ((1 << n) - 1);
- scale_factor_mult[i][0] = MULL(FIXR(1.0 * 2.0), norm);
- scale_factor_mult[i][1] = MULL(FIXR(0.7937005259 * 2.0), norm);
- scale_factor_mult[i][2] = MULL(FIXR(0.6299605249 * 2.0), norm);
+ scale_factor_mult[i][0] = MULL(FIXR(1.0 * 2.0), norm, FRAC_BITS);
+ scale_factor_mult[i][1] = MULL(FIXR(0.7937005259 * 2.0), norm, FRAC_BITS);
+ scale_factor_mult[i][2] = MULL(FIXR(0.6299605249 * 2.0), norm, FRAC_BITS);
dprintf(avctx, "%d: norm=%x s=%x %x %x\n",
i, norm,
scale_factor_mult[i][0],
@@ -1097,7 +1097,7 @@ static void imdct36(int *out, int *buf, int *in, int *win)
t2 = tmp[i + 1];
t3 = tmp[i + 3];
s1 = MULH(2*(t3 + t2), icos36h[j]);
- s3 = MULL(t3 - t2, icos36[8 - j]);
+ s3 = MULL(t3 - t2, icos36[8 - j], FRAC_BITS);
t0 = s0 + s1;
t1 = s0 - s1;
@@ -1705,8 +1705,8 @@ static void compute_stereo(MPADecodeContext *s,
v2 = is_tab[1][sf];
for(j=0;j<len;j++) {
tmp0 = tab0[j];
- tab0[j] = MULL(tmp0, v1);
- tab1[j] = MULL(tmp0, v2);
+ tab0[j] = MULL(tmp0, v1, FRAC_BITS);
+ tab1[j] = MULL(tmp0, v2, FRAC_BITS);
}
} else {
found1:
@@ -1716,8 +1716,8 @@ static void compute_stereo(MPADecodeContext *s,
for(j=0;j<len;j++) {
tmp0 = tab0[j];
tmp1 = tab1[j];
- tab0[j] = MULL(tmp0 + tmp1, ISQRT2);
- tab1[j] = MULL(tmp0 - tmp1, ISQRT2);
+ tab0[j] = MULL(tmp0 + tmp1, ISQRT2, FRAC_BITS);
+ tab1[j] = MULL(tmp0 - tmp1, ISQRT2, FRAC_BITS);
}
}
}
@@ -1749,8 +1749,8 @@ static void compute_stereo(MPADecodeContext *s,
v2 = is_tab[1][sf];
for(j=0;j<len;j++) {
tmp0 = tab0[j];
- tab0[j] = MULL(tmp0, v1);
- tab1[j] = MULL(tmp0, v2);
+ tab0[j] = MULL(tmp0, v1, FRAC_BITS);
+ tab1[j] = MULL(tmp0, v2, FRAC_BITS);
}
} else {
found2:
@@ -1760,8 +1760,8 @@ static void compute_stereo(MPADecodeContext *s,
for(j=0;j<len;j++) {
tmp0 = tab0[j];
tmp1 = tab1[j];
- tab0[j] = MULL(tmp0 + tmp1, ISQRT2);
- tab1[j] = MULL(tmp0 - tmp1, ISQRT2);
+ tab0[j] = MULL(tmp0 + tmp1, ISQRT2, FRAC_BITS);
+ tab1[j] = MULL(tmp0 - tmp1, ISQRT2, FRAC_BITS);
}
}
}
--
1.6.0.4
More information about the ffmpeg-devel
mailing list