annotate ffmpeg/libavcodec/ac3dsp.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * AC-3 DSP utils
yading@10 3 * Copyright (c) 2011 Justin Ruggles
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "libavutil/avassert.h"
yading@10 23 #include "avcodec.h"
yading@10 24 #include "ac3.h"
yading@10 25 #include "ac3dsp.h"
yading@10 26 #include "mathops.h"
yading@10 27
yading@10 28 static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
yading@10 29 {
yading@10 30 int blk, i;
yading@10 31
yading@10 32 if (!num_reuse_blocks)
yading@10 33 return;
yading@10 34
yading@10 35 for (i = 0; i < nb_coefs; i++) {
yading@10 36 uint8_t min_exp = *exp;
yading@10 37 uint8_t *exp1 = exp + 256;
yading@10 38 for (blk = 0; blk < num_reuse_blocks; blk++) {
yading@10 39 uint8_t next_exp = *exp1;
yading@10 40 if (next_exp < min_exp)
yading@10 41 min_exp = next_exp;
yading@10 42 exp1 += 256;
yading@10 43 }
yading@10 44 *exp++ = min_exp;
yading@10 45 }
yading@10 46 }
yading@10 47
yading@10 48 static int ac3_max_msb_abs_int16_c(const int16_t *src, int len)
yading@10 49 {
yading@10 50 int i, v = 0;
yading@10 51 for (i = 0; i < len; i++)
yading@10 52 v |= abs(src[i]);
yading@10 53 return v;
yading@10 54 }
yading@10 55
yading@10 56 static void ac3_lshift_int16_c(int16_t *src, unsigned int len,
yading@10 57 unsigned int shift)
yading@10 58 {
yading@10 59 uint32_t *src32 = (uint32_t *)src;
yading@10 60 const uint32_t mask = ~(((1 << shift) - 1) << 16);
yading@10 61 int i;
yading@10 62 len >>= 1;
yading@10 63 for (i = 0; i < len; i += 8) {
yading@10 64 src32[i ] = (src32[i ] << shift) & mask;
yading@10 65 src32[i+1] = (src32[i+1] << shift) & mask;
yading@10 66 src32[i+2] = (src32[i+2] << shift) & mask;
yading@10 67 src32[i+3] = (src32[i+3] << shift) & mask;
yading@10 68 src32[i+4] = (src32[i+4] << shift) & mask;
yading@10 69 src32[i+5] = (src32[i+5] << shift) & mask;
yading@10 70 src32[i+6] = (src32[i+6] << shift) & mask;
yading@10 71 src32[i+7] = (src32[i+7] << shift) & mask;
yading@10 72 }
yading@10 73 }
yading@10 74
yading@10 75 static void ac3_rshift_int32_c(int32_t *src, unsigned int len,
yading@10 76 unsigned int shift)
yading@10 77 {
yading@10 78 do {
yading@10 79 *src++ >>= shift;
yading@10 80 *src++ >>= shift;
yading@10 81 *src++ >>= shift;
yading@10 82 *src++ >>= shift;
yading@10 83 *src++ >>= shift;
yading@10 84 *src++ >>= shift;
yading@10 85 *src++ >>= shift;
yading@10 86 *src++ >>= shift;
yading@10 87 len -= 8;
yading@10 88 } while (len > 0);
yading@10 89 }
yading@10 90
yading@10 91 static void float_to_fixed24_c(int32_t *dst, const float *src, unsigned int len)
yading@10 92 {
yading@10 93 const float scale = 1 << 24;
yading@10 94 do {
yading@10 95 *dst++ = lrintf(*src++ * scale);
yading@10 96 *dst++ = lrintf(*src++ * scale);
yading@10 97 *dst++ = lrintf(*src++ * scale);
yading@10 98 *dst++ = lrintf(*src++ * scale);
yading@10 99 *dst++ = lrintf(*src++ * scale);
yading@10 100 *dst++ = lrintf(*src++ * scale);
yading@10 101 *dst++ = lrintf(*src++ * scale);
yading@10 102 *dst++ = lrintf(*src++ * scale);
yading@10 103 len -= 8;
yading@10 104 } while (len > 0);
yading@10 105 }
yading@10 106
yading@10 107 static void ac3_bit_alloc_calc_bap_c(int16_t *mask, int16_t *psd,
yading@10 108 int start, int end,
yading@10 109 int snr_offset, int floor,
yading@10 110 const uint8_t *bap_tab, uint8_t *bap)
yading@10 111 {
yading@10 112 int bin, band, band_end;
yading@10 113
yading@10 114 /* special case, if snr offset is -960, set all bap's to zero */
yading@10 115 if (snr_offset == -960) {
yading@10 116 memset(bap, 0, AC3_MAX_COEFS);
yading@10 117 return;
yading@10 118 }
yading@10 119
yading@10 120 bin = start;
yading@10 121 band = ff_ac3_bin_to_band_tab[start];
yading@10 122 do {
yading@10 123 int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
yading@10 124 band_end = ff_ac3_band_start_tab[++band];
yading@10 125 band_end = FFMIN(band_end, end);
yading@10 126
yading@10 127 for (; bin < band_end; bin++) {
yading@10 128 int address = av_clip((psd[bin] - m) >> 5, 0, 63);
yading@10 129 bap[bin] = bap_tab[address];
yading@10 130 }
yading@10 131 } while (end > band_end);
yading@10 132 }
yading@10 133
yading@10 134 static void ac3_update_bap_counts_c(uint16_t mant_cnt[16], uint8_t *bap,
yading@10 135 int len)
yading@10 136 {
yading@10 137 while (len-- > 0)
yading@10 138 mant_cnt[bap[len]]++;
yading@10 139 }
yading@10 140
yading@10 141 DECLARE_ALIGNED(16, const uint16_t, ff_ac3_bap_bits)[16] = {
yading@10 142 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
yading@10 143 };
yading@10 144
yading@10 145 static int ac3_compute_mantissa_size_c(uint16_t mant_cnt[6][16])
yading@10 146 {
yading@10 147 int blk, bap;
yading@10 148 int bits = 0;
yading@10 149
yading@10 150 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
yading@10 151 // bap=1 : 3 mantissas in 5 bits
yading@10 152 bits += (mant_cnt[blk][1] / 3) * 5;
yading@10 153 // bap=2 : 3 mantissas in 7 bits
yading@10 154 // bap=4 : 2 mantissas in 7 bits
yading@10 155 bits += ((mant_cnt[blk][2] / 3) + (mant_cnt[blk][4] >> 1)) * 7;
yading@10 156 // bap=3 : 1 mantissa in 3 bits
yading@10 157 bits += mant_cnt[blk][3] * 3;
yading@10 158 // bap=5 to 15 : get bits per mantissa from table
yading@10 159 for (bap = 5; bap < 16; bap++)
yading@10 160 bits += mant_cnt[blk][bap] * ff_ac3_bap_bits[bap];
yading@10 161 }
yading@10 162 return bits;
yading@10 163 }
yading@10 164
yading@10 165 static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs)
yading@10 166 {
yading@10 167 int i;
yading@10 168
yading@10 169 for (i = 0; i < nb_coefs; i++) {
yading@10 170 int v = abs(coef[i]);
yading@10 171 exp[i] = v ? 23 - av_log2(v) : 24;
yading@10 172 }
yading@10 173 }
yading@10 174
yading@10 175 static void ac3_sum_square_butterfly_int32_c(int64_t sum[4],
yading@10 176 const int32_t *coef0,
yading@10 177 const int32_t *coef1,
yading@10 178 int len)
yading@10 179 {
yading@10 180 int i;
yading@10 181
yading@10 182 sum[0] = sum[1] = sum[2] = sum[3] = 0;
yading@10 183
yading@10 184 for (i = 0; i < len; i++) {
yading@10 185 int lt = coef0[i];
yading@10 186 int rt = coef1[i];
yading@10 187 int md = lt + rt;
yading@10 188 int sd = lt - rt;
yading@10 189 MAC64(sum[0], lt, lt);
yading@10 190 MAC64(sum[1], rt, rt);
yading@10 191 MAC64(sum[2], md, md);
yading@10 192 MAC64(sum[3], sd, sd);
yading@10 193 }
yading@10 194 }
yading@10 195
yading@10 196 static void ac3_sum_square_butterfly_float_c(float sum[4],
yading@10 197 const float *coef0,
yading@10 198 const float *coef1,
yading@10 199 int len)
yading@10 200 {
yading@10 201 int i;
yading@10 202
yading@10 203 sum[0] = sum[1] = sum[2] = sum[3] = 0;
yading@10 204
yading@10 205 for (i = 0; i < len; i++) {
yading@10 206 float lt = coef0[i];
yading@10 207 float rt = coef1[i];
yading@10 208 float md = lt + rt;
yading@10 209 float sd = lt - rt;
yading@10 210 sum[0] += lt * lt;
yading@10 211 sum[1] += rt * rt;
yading@10 212 sum[2] += md * md;
yading@10 213 sum[3] += sd * sd;
yading@10 214 }
yading@10 215 }
yading@10 216
yading@10 217 static void ac3_downmix_c(float **samples, float (*matrix)[2],
yading@10 218 int out_ch, int in_ch, int len)
yading@10 219 {
yading@10 220 int i, j;
yading@10 221 float v0, v1;
yading@10 222 if (out_ch == 2) {
yading@10 223 for (i = 0; i < len; i++) {
yading@10 224 v0 = v1 = 0.0f;
yading@10 225 for (j = 0; j < in_ch; j++) {
yading@10 226 v0 += samples[j][i] * matrix[j][0];
yading@10 227 v1 += samples[j][i] * matrix[j][1];
yading@10 228 }
yading@10 229 samples[0][i] = v0;
yading@10 230 samples[1][i] = v1;
yading@10 231 }
yading@10 232 } else if (out_ch == 1) {
yading@10 233 for (i = 0; i < len; i++) {
yading@10 234 v0 = 0.0f;
yading@10 235 for (j = 0; j < in_ch; j++)
yading@10 236 v0 += samples[j][i] * matrix[j][0];
yading@10 237 samples[0][i] = v0;
yading@10 238 }
yading@10 239 }
yading@10 240 }
yading@10 241
yading@10 242 av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
yading@10 243 {
yading@10 244 c->ac3_exponent_min = ac3_exponent_min_c;
yading@10 245 c->ac3_max_msb_abs_int16 = ac3_max_msb_abs_int16_c;
yading@10 246 c->ac3_lshift_int16 = ac3_lshift_int16_c;
yading@10 247 c->ac3_rshift_int32 = ac3_rshift_int32_c;
yading@10 248 c->float_to_fixed24 = float_to_fixed24_c;
yading@10 249 c->bit_alloc_calc_bap = ac3_bit_alloc_calc_bap_c;
yading@10 250 c->update_bap_counts = ac3_update_bap_counts_c;
yading@10 251 c->compute_mantissa_size = ac3_compute_mantissa_size_c;
yading@10 252 c->extract_exponents = ac3_extract_exponents_c;
yading@10 253 c->sum_square_butterfly_int32 = ac3_sum_square_butterfly_int32_c;
yading@10 254 c->sum_square_butterfly_float = ac3_sum_square_butterfly_float_c;
yading@10 255 c->downmix = ac3_downmix_c;
yading@10 256
yading@10 257 if (ARCH_ARM)
yading@10 258 ff_ac3dsp_init_arm(c, bit_exact);
yading@10 259 if (ARCH_X86)
yading@10 260 ff_ac3dsp_init_x86(c, bit_exact);
yading@10 261 if (ARCH_MIPS)
yading@10 262 ff_ac3dsp_init_mips(c, bit_exact);
yading@10 263 }