00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avcodec.h"
00023 #include "ac3dsp.h"
00024
00025 static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
00026 {
00027 int blk, i;
00028
00029 if (!num_reuse_blocks)
00030 return;
00031
00032 for (i = 0; i < nb_coefs; i++) {
00033 uint8_t min_exp = *exp;
00034 uint8_t *exp1 = exp + 256;
00035 for (blk = 0; blk < num_reuse_blocks; blk++) {
00036 uint8_t next_exp = *exp1;
00037 if (next_exp < min_exp)
00038 min_exp = next_exp;
00039 exp1 += 256;
00040 }
00041 *exp++ = min_exp;
00042 }
00043 }
00044
00045 static int ac3_max_msb_abs_int16_c(const int16_t *src, int len)
00046 {
00047 int i, v = 0;
00048 for (i = 0; i < len; i++)
00049 v |= abs(src[i]);
00050 return v;
00051 }
00052
00053 static void ac3_lshift_int16_c(int16_t *src, unsigned int len,
00054 unsigned int shift)
00055 {
00056 uint32_t *src32 = (uint32_t *)src;
00057 const uint32_t mask = ~(((1 << shift) - 1) << 16);
00058 int i;
00059 len >>= 1;
00060 for (i = 0; i < len; i += 8) {
00061 src32[i ] = (src32[i ] << shift) & mask;
00062 src32[i+1] = (src32[i+1] << shift) & mask;
00063 src32[i+2] = (src32[i+2] << shift) & mask;
00064 src32[i+3] = (src32[i+3] << shift) & mask;
00065 src32[i+4] = (src32[i+4] << shift) & mask;
00066 src32[i+5] = (src32[i+5] << shift) & mask;
00067 src32[i+6] = (src32[i+6] << shift) & mask;
00068 src32[i+7] = (src32[i+7] << shift) & mask;
00069 }
00070 }
00071
00072 static void ac3_rshift_int32_c(int32_t *src, unsigned int len,
00073 unsigned int shift)
00074 {
00075 do {
00076 *src++ >>= shift;
00077 *src++ >>= shift;
00078 *src++ >>= shift;
00079 *src++ >>= shift;
00080 *src++ >>= shift;
00081 *src++ >>= shift;
00082 *src++ >>= shift;
00083 *src++ >>= shift;
00084 len -= 8;
00085 } while (len > 0);
00086 }
00087
00088 static void float_to_fixed24_c(int32_t *dst, const float *src, unsigned int len)
00089 {
00090 const float scale = 1 << 24;
00091 do {
00092 *dst++ = lrintf(*src++ * scale);
00093 *dst++ = lrintf(*src++ * scale);
00094 *dst++ = lrintf(*src++ * scale);
00095 *dst++ = lrintf(*src++ * scale);
00096 *dst++ = lrintf(*src++ * scale);
00097 *dst++ = lrintf(*src++ * scale);
00098 *dst++ = lrintf(*src++ * scale);
00099 *dst++ = lrintf(*src++ * scale);
00100 len -= 8;
00101 } while (len > 0);
00102 }
00103
00104 av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
00105 {
00106 c->ac3_exponent_min = ac3_exponent_min_c;
00107 c->ac3_max_msb_abs_int16 = ac3_max_msb_abs_int16_c;
00108 c->ac3_lshift_int16 = ac3_lshift_int16_c;
00109 c->ac3_rshift_int32 = ac3_rshift_int32_c;
00110 c->float_to_fixed24 = float_to_fixed24_c;
00111
00112 if (HAVE_MMX)
00113 ff_ac3dsp_init_x86(c, bit_exact);
00114 }