Commit e28fabb4 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '6c145ecf'

* commit '6c145ecf':
  twinvq: K&R formatting cosmetics

Conflicts:
	libavcodec/twinvq.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 1af92119 6c145ecf
......@@ -19,6 +19,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <math.h>
#include <stdint.h>
#include "libavutil/channel_layout.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
......@@ -27,10 +30,6 @@
#include "internal.h"
#include "lsp.h"
#include "sinewin.h"
#include <math.h>
#include <stdint.h>
#include "twinvq_data.h"
enum FrameType {
......@@ -95,83 +94,83 @@ typedef struct {
static const ModeTab mode_08_08 = {
{
{ 8, bark_tab_s08_64, 10, tab.fcb08s , 1, 5, tab.cb0808s0, tab.cb0808s1, 18},
{ 2, bark_tab_m08_256, 20, tab.fcb08m , 2, 5, tab.cb0808m0, tab.cb0808m1, 16},
{ 1, bark_tab_l08_512, 30, tab.fcb08l , 3, 6, tab.cb0808l0, tab.cb0808l1, 17}
{ 8, bark_tab_s08_64, 10, tab.fcb08s, 1, 5, tab.cb0808s0, tab.cb0808s1, 18 },
{ 2, bark_tab_m08_256, 20, tab.fcb08m, 2, 5, tab.cb0808m0, tab.cb0808m1, 16 },
{ 1, bark_tab_l08_512, 30, tab.fcb08l, 3, 6, tab.cb0808l0, tab.cb0808l1, 17 }
},
512 , 12, tab.lsp08, 1, 5, 3, 3, tab.shape08 , 8, 28, 20, 6, 40
512, 12, tab.lsp08, 1, 5, 3, 3, tab.shape08, 8, 28, 20, 6, 40
};
static const ModeTab mode_11_08 = {
{
{ 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1108s0, tab.cb1108s1, 29},
{ 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1108m0, tab.cb1108m1, 24},
{ 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1108l0, tab.cb1108l1, 27}
{ 8, bark_tab_s11_64, 10, tab.fcb11s, 1, 5, tab.cb1108s0, tab.cb1108s1, 29 },
{ 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1108m0, tab.cb1108m1, 24 },
{ 1, bark_tab_l11_512, 30, tab.fcb11l, 3, 6, tab.cb1108l0, tab.cb1108l1, 27 }
},
512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90
512, 16, tab.lsp11, 1, 6, 4, 3, tab.shape11, 9, 36, 30, 7, 90
};
static const ModeTab mode_11_10 = {
{
{ 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1110s0, tab.cb1110s1, 21},
{ 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1110m0, tab.cb1110m1, 18},
{ 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1110l0, tab.cb1110l1, 20}
{ 8, bark_tab_s11_64, 10, tab.fcb11s, 1, 5, tab.cb1110s0, tab.cb1110s1, 21 },
{ 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1110m0, tab.cb1110m1, 18 },
{ 1, bark_tab_l11_512, 30, tab.fcb11l, 3, 6, tab.cb1110l0, tab.cb1110l1, 20 }
},
512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90
512, 16, tab.lsp11, 1, 6, 4, 3, tab.shape11, 9, 36, 30, 7, 90
};
static const ModeTab mode_16_16 = {
{
{ 8, bark_tab_s16_128, 10, tab.fcb16s , 1, 5, tab.cb1616s0, tab.cb1616s1, 16},
{ 2, bark_tab_m16_512, 20, tab.fcb16m , 2, 5, tab.cb1616m0, tab.cb1616m1, 15},
{ 1, bark_tab_l16_1024,30, tab.fcb16l , 3, 6, tab.cb1616l0, tab.cb1616l1, 16}
{ 8, bark_tab_s16_128, 10, tab.fcb16s, 1, 5, tab.cb1616s0, tab.cb1616s1, 16 },
{ 2, bark_tab_m16_512, 20, tab.fcb16m, 2, 5, tab.cb1616m0, tab.cb1616m1, 15 },
{ 1, bark_tab_l16_1024, 30, tab.fcb16l, 3, 6, tab.cb1616l0, tab.cb1616l1, 16 }
},
1024, 16, tab.lsp16, 1, 6, 4, 3, tab.shape16 , 9, 56, 60, 7, 180
1024, 16, tab.lsp16, 1, 6, 4, 3, tab.shape16, 9, 56, 60, 7, 180
};
static const ModeTab mode_22_20 = {
{
{ 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18},
{ 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17},
{ 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18}
{ 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18 },
{ 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17 },
{ 1, bark_tab_l22_1024, 32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18 }
},
1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
};
static const ModeTab mode_22_24 = {
{
{ 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15},
{ 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14},
{ 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15}
{ 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15 },
{ 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14 },
{ 1, bark_tab_l22_1024, 32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15 }
},
1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
};
static const ModeTab mode_22_32 = {
{
{ 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11},
{ 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11},
{ 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12}
{ 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11 },
{ 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11 },
{ 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12 }
},
512 , 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72
512, 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72
};
static const ModeTab mode_44_40 = {
{
{16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4440s0, tab.cb4440s1, 18},
{ 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4440m0, tab.cb4440m1, 17},
{ 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4440l0, tab.cb4440l1, 17}
{ 16, bark_tab_s44_128, 10, tab.fcb44s, 1, 6, tab.cb4440s0, tab.cb4440s1, 18 },
{ 4, bark_tab_m44_512, 20, tab.fcb44m, 2, 6, tab.cb4440m0, tab.cb4440m1, 17 },
{ 1, bark_tab_l44_2048, 40, tab.fcb44l, 4, 6, tab.cb4440l0, tab.cb4440l1, 17 }
},
2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432
2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44, 9, 84, 54, 7, 432
};
static const ModeTab mode_44_48 = {
{
{16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4448s0, tab.cb4448s1, 15},
{ 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4448m0, tab.cb4448m1, 14},
{ 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4448l0, tab.cb4448l1, 14}
{ 16, bark_tab_s44_128, 10, tab.fcb44s, 1, 6, tab.cb4448s0, tab.cb4448s1, 15 },
{ 4, bark_tab_m44_512, 20, tab.fcb44m, 2, 6, tab.cb4448m0, tab.cb4448m1, 14 },
{ 1, bark_tab_l44_2048, 40, tab.fcb44l, 4, 6, tab.cb4448l0, tab.cb4448l1, 14 }
},
2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432
2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44, 9, 84, 54, 7, 432
};
typedef struct TwinContext {
......@@ -242,17 +241,17 @@ static void memset_float(float *buf, float val, int size)
static float eval_lpc_spectrum(const float *lsp, float cos_val, int order)
{
int j;
float p = 0.5f;
float q = 0.5f;
float two_cos_w = 2.0f*cos_val;
float p = 0.5f;
float q = 0.5f;
float two_cos_w = 2.0f * cos_val;
for (j = 0; j + 1 < order; j += 2*2) {
for (j = 0; j + 1 < order; j += 2 * 2) {
// Unroll the loop once since order is a multiple of four
q *= lsp[j ] - two_cos_w;
p *= lsp[j+1] - two_cos_w;
q *= lsp[j] - two_cos_w;
p *= lsp[j + 1] - two_cos_w;
q *= lsp[j+2] - two_cos_w;
p *= lsp[j+3] - two_cos_w;
q *= lsp[j + 2] - two_cos_w;
p *= lsp[j + 3] - two_cos_w;
}
p *= p * (2.0f - two_cos_w);
......@@ -268,30 +267,30 @@ static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc)
{
int i;
const ModeTab *mtab = tctx->mtab;
int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
for (i = 0; i < size_s/2; i++) {
for (i = 0; i < size_s / 2; i++) {
float cos_i = tctx->cos_tabs[0][i];
lpc[i] = eval_lpc_spectrum(cos_vals, cos_i, mtab->n_lsp);
lpc[size_s-i-1] = eval_lpc_spectrum(cos_vals, -cos_i, mtab->n_lsp);
lpc[i] = eval_lpc_spectrum(cos_vals, cos_i, mtab->n_lsp);
lpc[size_s - i - 1] = eval_lpc_spectrum(cos_vals, -cos_i, mtab->n_lsp);
}
}
static void interpolate(float *out, float v1, float v2, int size)
{
int i;
float step = (v1 - v2)/(size + 1);
float step = (v1 - v2) / (size + 1);
for (i = 0; i < size; i++) {
v2 += step;
v2 += step;
out[i] = v2;
}
}
static inline float get_cos(int idx, int part, const float *cos_tab, int size)
{
return part ? -cos_tab[size - idx - 1] :
cos_tab[ idx ];
return part ? -cos_tab[size - idx - 1]
: cos_tab[idx];
}
/**
......@@ -305,7 +304,7 @@ static inline float get_cos(int idx, int part, const float *cos_tab, int size)
* @param step the size of a block "siiiibiiii"
* @param in the cosinus of the LSP data
* @param part is 0 for 0...PI (positive cossinus values) and 1 for PI...2PI
(negative cossinus values)
* (negative cossinus values)
* @param size the size of the whole output
*/
static inline void eval_lpcenv_or_interp(TwinContext *tctx,
......@@ -314,7 +313,7 @@ static inline void eval_lpcenv_or_interp(TwinContext *tctx,
int size, int step, int part)
{
int i;
const ModeTab *mtab = tctx->mtab;
const ModeTab *mtab = tctx->mtab;
const float *cos_tab = tctx->cos_tabs[ftype];
// Fill the 's'
......@@ -325,33 +324,38 @@ static inline void eval_lpcenv_or_interp(TwinContext *tctx,
mtab->n_lsp);
// Fill the 'iiiibiiii'
for (i = step; i <= size - 2*step; i += step) {
if (out[i + step] + out[i - step] > 1.95*out[i] ||
out[i + step] >= out[i - step]) {
interpolate(out + i - step + 1, out[i], out[i-step], step - 1);
for (i = step; i <= size - 2 * step; i += step) {
if (out[i + step] + out[i - step] > 1.95 * out[i] ||
out[i + step] >= out[i - step]) {
interpolate(out + i - step + 1, out[i], out[i - step], step - 1);
} else {
out[i - step/2] =
out[i - step / 2] =
eval_lpc_spectrum(in,
get_cos(i-step/2, part, cos_tab, size),
get_cos(i - step / 2, part, cos_tab, size),
mtab->n_lsp);
interpolate(out + i - step + 1, out[i-step/2], out[i-step ], step/2 - 1);
interpolate(out + i - step/2 + 1, out[i ], out[i-step/2], step/2 - 1);
interpolate(out + i - step + 1, out[i - step / 2],
out[i - step], step / 2 - 1);
interpolate(out + i - step / 2 + 1, out[i],
out[i - step / 2], step / 2 - 1);
}
}
interpolate(out + size - 2*step + 1, out[size-step], out[size - 2*step], step - 1);
interpolate(out + size - 2 * step + 1, out[size - step],
out[size - 2 * step], step - 1);
}
static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType ftype,
const float *buf, float *lpc,
int size, int step)
{
eval_lpcenv_or_interp(tctx, ftype, lpc , buf, size/2, step, 0);
eval_lpcenv_or_interp(tctx, ftype, lpc + size/2, buf, size/2, 2*step, 1);
eval_lpcenv_or_interp(tctx, ftype, lpc, buf, size / 2, step, 0);
eval_lpcenv_or_interp(tctx, ftype, lpc + size / 2, buf, size / 2,
2 * step, 1);
interpolate(lpc+size/2-step+1, lpc[size/2], lpc[size/2-step], step);
interpolate(lpc + size / 2 - step + 1, lpc[size / 2],
lpc[size / 2 - step], step);
memset_float(lpc + size - 2*step + 1, lpc[size - 2*step], 2*step - 1);
memset_float(lpc + size - 2 * step + 1, lpc[size - 2 * step], 2 * step - 1);
}
/**
......@@ -392,26 +396,26 @@ static void dequant(TwinContext *tctx, GetBitContext *gb, float *out,
}
tmp1 = get_bits(gb, bits);
tab0 = cb0 + tmp0*cb_len;
tab1 = cb1 + tmp1*cb_len;
tab0 = cb0 + tmp0 * cb_len;
tab1 = cb1 + tmp1 * cb_len;
for (j = 0; j < length; j++)
out[tctx->permut[ftype][pos+j]] = sign0*tab0[j] + sign1*tab1[j];
out[tctx->permut[ftype][pos + j]] = sign0 * tab0[j] +
sign1 * tab1[j];
pos += length;
}
}
static inline float mulawinv(float y, float clip, float mu)
{
y = av_clipf(y/clip, -1, 1);
return clip * FFSIGN(y) * (exp(log(1+mu) * fabs(y)) - 1) / mu;
y = av_clipf(y / clip, -1, 1);
return clip * FFSIGN(y) * (exp(log(1 + mu) * fabs(y)) - 1) / mu;
}
/**
* Evaluate a*b/400 rounded to the nearest integer. When, for example,
* a*b == 200 and the nearest integer is ill-defined, use a table to emulate
* Evaluate a * b / 400 rounded to the nearest integer. When, for example,
* a * b == 200 and the nearest integer is ill-defined, use a table to emulate
* the following broken float-based implementation used by the binary decoder:
*
* @code
......@@ -419,30 +423,30 @@ static inline float mulawinv(float y, float clip, float mu)
* {
* static float test; // Ugh, force gcc to do the division first...
*
* test = a/400.;
* return b * test + 0.5;
* test = a / 400.;
* return b * test + 0.5;
* }
* @endcode
*
* @note if this function is replaced by just ROUNDED_DIV(a*b,400.), the stddev
* between the original file (before encoding with Yamaha encoder) and the
* decoded output increases, which leads one to believe that the encoder expects
* exactly this broken calculation.
* @note if this function is replaced by just ROUNDED_DIV(a * b, 400.), the
* stddev between the original file (before encoding with Yamaha encoder) and
* the decoded output increases, which leads one to believe that the encoder
* expects exactly this broken calculation.
*/
static int very_broken_op(int a, int b)
{
int x = a*b + 200;
int x = a * b + 200;
int size;
const uint8_t *rtab;
if (x%400 || b%5)
return x/400;
if (x % 400 || b % 5)
return x / 400;
x /= 400;
size = tabs[b/5].size;
rtab = tabs[b/5].tab;
return x - rtab[size*av_log2(2*(x - 1)/size)+(x - 1)%size];
size = tabs[b / 5].size;
rtab = tabs[b / 5].tab;
return x - rtab[size * av_log2(2 * (x - 1) / size) + (x - 1) % size];
}
/**
......@@ -459,42 +463,44 @@ static void add_peak(int period, int width, const float *shape,
int center;
// First peak centered around zero
for (i = 0; i < width/2; i++)
for (i = 0; i < width / 2; i++)
speech[i] += ppc_gain * *shape++;
for (i = 1; i < ROUNDED_DIV(len,width) ; i++) {
for (i = 1; i < ROUNDED_DIV(len, width); i++) {
center = very_broken_op(period, i);
for (j = -width/2; j < (width+1)/2; j++)
speech[j+center] += ppc_gain * *shape++;
for (j = -width / 2; j < (width + 1) / 2; j++)
speech[j + center] += ppc_gain * *shape++;
}
// For the last block, be careful not to go beyond the end of the buffer
center = very_broken_op(period, i);
for (j = -width/2; j < (width + 1)/2 && shape < shape_end; j++)
speech[j+center] += ppc_gain * *shape++;
for (j = -width / 2; j < (width + 1) / 2 && shape < shape_end; j++)
speech[j + center] += ppc_gain * *shape++;
}
static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape,
float ppc_gain, float *speech)
{
const ModeTab *mtab = tctx->mtab;
int isampf = tctx->avctx->sample_rate/1000;
int ibps = tctx->avctx->bit_rate/(1000 * tctx->avctx->channels);
int min_period = ROUNDED_DIV( 40*2*mtab->size, isampf);
int max_period = ROUNDED_DIV(6*40*2*mtab->size, isampf);
int period_range = max_period - min_period;
int isampf = tctx->avctx->sample_rate / 1000;
int ibps = tctx->avctx->bit_rate / (1000 * tctx->avctx->channels);
int min_period = ROUNDED_DIV(40 * 2 * mtab->size, isampf);
int max_period = ROUNDED_DIV(40 * 2 * mtab->size * 6, isampf);
int period_range = max_period - min_period;
// This is actually the period multiplied by 400. It is just linearly coded
// between its maximum and minimum value.
int period = min_period +
ROUNDED_DIV(period_coef*period_range, (1 << mtab->ppc_period_bit) - 1);
ROUNDED_DIV(period_coef * period_range,
(1 << mtab->ppc_period_bit) - 1);
int width;
if (isampf == 22 && ibps == 32) {
// For some unknown reason, NTT decided to code this case differently...
width = ROUNDED_DIV((period + 800)* mtab->peak_per2wid, 400*mtab->size);
width = ROUNDED_DIV((period + 800) * mtab->peak_per2wid,
400 * mtab->size);
} else
width = (period )* mtab->peak_per2wid/(400*mtab->size);
width = period * mtab->peak_per2wid / (400 * mtab->size);
add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
}
......@@ -504,27 +510,26 @@ static void dec_gain(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype,
{
const ModeTab *mtab = tctx->mtab;
int i, j;
int sub = mtab->fmode[ftype].sub;
float step = AMP_MAX / ((1 << GAIN_BITS) - 1);
int sub = mtab->fmode[ftype].sub;
float step = AMP_MAX / ((1 << GAIN_BITS) - 1);
float sub_step = SUB_AMP_MAX / ((1 << SUB_GAIN_BITS) - 1);
if (ftype == FT_LONG) {
for (i = 0; i < tctx->avctx->channels; i++)
out[i] = (1./(1<<13)) *
mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
AMP_MAX, MULAW_MU);
out[i] = (1. / (1 << 13)) *
mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
AMP_MAX, MULAW_MU);
} else {
for (i = 0; i < tctx->avctx->channels; i++) {
float val = (1./(1<<23)) *
mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
AMP_MAX, MULAW_MU);
for (j = 0; j < sub; j++) {
out[i*sub + j] =
val*mulawinv(sub_step* 0.5 +
sub_step* get_bits(gb, SUB_GAIN_BITS),
SUB_AMP_MAX, MULAW_MU);
}
float val = (1. / (1 << 23)) *
mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
AMP_MAX, MULAW_MU);
for (j = 0; j < sub; j++)
out[i * sub + j] =
val * mulawinv(sub_step * 0.5 +
sub_step * get_bits(gb, SUB_GAIN_BITS),
SUB_AMP_MAX, MULAW_MU);
}
}
}
......@@ -540,11 +545,11 @@ static void rearrange_lsp(int order, float *lsp, float min_dist)
int i;
float min_dist2 = min_dist * 0.5;
for (i = 1; i < order; i++)
if (lsp[i] - lsp[i-1] < min_dist) {
float avg = (lsp[i] + lsp[i-1]) * 0.5;
if (lsp[i] - lsp[i - 1] < min_dist) {
float avg = (lsp[i] + lsp[i - 1]) * 0.5;
lsp[i-1] = avg - min_dist2;
lsp[i ] = avg + min_dist2;
lsp[i - 1] = avg - min_dist2;
lsp[i] = avg + min_dist2;
}
}
......@@ -554,9 +559,9 @@ static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2,
const ModeTab *mtab = tctx->mtab;
int i, j;
const float *cb = mtab->lspcodebook;
const float *cb2 = cb + (1 << mtab->lsp_bit1)*mtab->n_lsp;
const float *cb3 = cb2 + (1 << mtab->lsp_bit2)*mtab->n_lsp;
const float *cb = mtab->lspcodebook;
const float *cb2 = cb + (1 << mtab->lsp_bit1) * mtab->n_lsp;
const float *cb3 = cb2 + (1 << mtab->lsp_bit2) * mtab->n_lsp;
const int8_t funny_rounding[4] = {
-2,
......@@ -567,17 +572,18 @@ static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2,
j = 0;
for (i = 0; i < mtab->lsp_split; i++) {
int chunk_end = ((i + 1)*mtab->n_lsp + funny_rounding[i])/mtab->lsp_split;
int chunk_end = ((i + 1) * mtab->n_lsp + funny_rounding[i]) /
mtab->lsp_split;
for (; j < chunk_end; j++)
lsp[j] = cb [lpc_idx1 * mtab->n_lsp + j] +
lsp[j] = cb[lpc_idx1 * mtab->n_lsp + j] +
cb2[lpc_idx2[i] * mtab->n_lsp + j];
}
rearrange_lsp(mtab->n_lsp, lsp, 0.0001);
for (i = 0; i < mtab->n_lsp; i++) {
float tmp1 = 1. - cb3[lpc_hist_idx*mtab->n_lsp + i];
float tmp2 = hist[i] * cb3[lpc_hist_idx*mtab->n_lsp + i];
float tmp1 = 1. - cb3[lpc_hist_idx * mtab->n_lsp + i];
float tmp2 = hist[i] * cb3[lpc_hist_idx * mtab->n_lsp + i];
hist[i] = lsp[i];
lsp[i] = lsp[i] * tmp1 + tmp2;
}
......@@ -594,7 +600,7 @@ static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp,
int size = tctx->mtab->size / tctx->mtab->fmode[ftype].sub;
for (i = 0; i < tctx->mtab->n_lsp; i++)
lsp[i] = 2*cos(lsp[i]);
lsp[i] = 2 * cos(lsp[i]);
switch (ftype) {
case FT_LONG:
......@@ -609,74 +615,71 @@ static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp,
}
}
static const uint8_t wtype_to_wsize[] = { 0, 0, 2, 2, 2, 1, 0, 1, 1 };
static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype,
float *in, float *prev, int ch)
float *in, float *prev, int ch)
{
FFTContext *mdct = &tctx->mdct_ctx[ftype];
FFTContext *mdct = &tctx->mdct_ctx[ftype];
const ModeTab *mtab = tctx->mtab;
int bsize = mtab->size / mtab->fmode[ftype].sub;
int size = mtab->size;
float *buf1 = tctx->tmp_buf;
int j;
int wsize; // Window size
float *out = tctx->curr_frame + 2*ch*mtab->size;
int bsize = mtab->size / mtab->fmode[ftype].sub;
int size = mtab->size;
float *buf1 = tctx->tmp_buf;
int j, first_wsize, wsize; // Window size
float *out = tctx->curr_frame + 2 * ch * mtab->size;
float *out2 = out;
float *prev_buf;
int first_wsize;
static const uint8_t wtype_to_wsize[] = {0, 0, 2, 2, 2, 1, 0, 1, 1};
int types_sizes[] = {
mtab->size / mtab->fmode[FT_LONG ].sub,
mtab->size / mtab->fmode[FT_MEDIUM].sub,
mtab->size / (2*mtab->fmode[FT_SHORT ].sub),
mtab->size / mtab->fmode[FT_LONG].sub,
mtab->size / mtab->fmode[FT_MEDIUM].sub,
mtab->size / (mtab->fmode[FT_SHORT].sub * 2),
};
wsize = types_sizes[wtype_to_wsize[wtype]];
wsize = types_sizes[wtype_to_wsize[wtype]];
first_wsize = wsize;
prev_buf = prev + (size - bsize)/2;
prev_buf = prev + (size - bsize) / 2;
for (j = 0; j < mtab->fmode[ftype].sub; j++) {
int sub_wtype = ftype == FT_MEDIUM ? 8 : wtype;
if (!j && wtype == 4)
sub_wtype = 4;
else if (j == mtab->fmode[ftype].sub-1 && wtype == 7)
else if (j == mtab->fmode[ftype].sub - 1 && wtype == 7)
sub_wtype = 7;
wsize = types_sizes[wtype_to_wsize[sub_wtype]];
mdct->imdct_half(mdct, buf1 + bsize*j, in + bsize*j);
mdct->imdct_half(mdct, buf1 + bsize * j, in + bsize * j);
tctx->fdsp.vector_fmul_window(out2, prev_buf + (bsize-wsize) / 2,
tctx->fdsp.vector_fmul_window(out2, prev_buf + (bsize - wsize) / 2,
buf1 + bsize * j,
ff_sine_windows[av_log2(wsize)],
wsize / 2);
out2 += wsize;
memcpy(out2, buf1 + bsize*j + wsize/2, (bsize - wsize/2)*sizeof(float));
memcpy(out2, buf1 + bsize * j + wsize / 2,
(bsize - wsize / 2) * sizeof(float));
out2 += ftype == FT_MEDIUM ? (bsize-wsize)/2 : bsize - wsize;
out2 += ftype == FT_MEDIUM ? (bsize - wsize) / 2 : bsize - wsize;
prev_buf = buf1 + bsize*j + bsize/2;
prev_buf = buf1 + bsize * j + bsize / 2;
}
tctx->last_block_pos[ch] = (size + first_wsize)/2;
tctx->last_block_pos[ch] = (size + first_wsize) / 2;
}
static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype,
float **out)
{
const ModeTab *mtab = tctx->mtab;
int size1, size2;
float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0];
int i;
float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0];
int size1, size2, i;
for (i = 0; i < tctx->avctx->channels; i++) {
for (i = 0; i < tctx->avctx->channels; i++)
imdct_and_window(tctx, ftype, wtype,
tctx->spectrum + i*mtab->size,
prev_buf + 2*i*mtab->size,
tctx->spectrum + i * mtab->size,
prev_buf + 2 * i * mtab->size,
i);
}
if (!out)
return;
......@@ -684,12 +687,14 @@ static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype,
size2 = tctx->last_block_pos[0];
size1 = mtab->size - size2;
memcpy(&out[0][0 ], prev_buf, size1 * sizeof(out[0][0]));
memcpy(&out[0][0], prev_buf, size1 * sizeof(out[0][0]));
memcpy(&out[0][size1], tctx->curr_frame, size2 * sizeof(out[0][0]));
if (tctx->avctx->channels == 2) {
memcpy(&out[1][0], &prev_buf[2*mtab->size], size1 * sizeof(out[1][0]));
memcpy(&out[1][size1], &tctx->curr_frame[2*mtab->size], size2 * sizeof(out[1][0]));
memcpy(&out[1][0], &prev_buf[2 * mtab->size],
size1 * sizeof(out[1][0]));
memcpy(&out[1][size1], &tctx->curr_frame[2 * mtab->size],
size2 * sizeof(out[1][0]));
tctx->fdsp.butterflies_float(out[0], out[1], mtab->size);
}
}
......@@ -698,37 +703,37 @@ static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist,
int ch, float *out, float gain, enum FrameType ftype)
{
const ModeTab *mtab = tctx->mtab;
int i,j;
float *hist = tctx->bark_hist[ftype][ch];
float val = ((const float []) {0.4, 0.35, 0.28})[ftype];
int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef;
int idx = 0;
int i, j;
float *hist = tctx->bark_hist[ftype][ch];
float val = ((const float []) { 0.4, 0.35, 0.28 })[ftype];
int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef;
int idx = 0;
for (i = 0; i < fw_cb_len; i++)
for (j = 0; j < bark_n_coef; j++, idx++) {
float tmp2 =
mtab->fmode[ftype].bark_cb[fw_cb_len*in[j] + i] * (1./4096);
float st = use_hist ?
(1. - val) * tmp2 + val*hist[idx] + 1. : tmp2 + 1.;
float tmp2 = mtab->fmode[ftype].bark_cb[fw_cb_len * in[j] + i] *
(1. / 4096);
float st = use_hist ? (1. - val) * tmp2 + val * hist[idx] + 1.
: tmp2 + 1.;
hist[idx] = tmp2;
if (st < -1.) st = 1.;
if (st < -1.)
st = 1.;
memset_float(out, st * gain, mtab->fmode[ftype].bark_tab[idx]);
out += mtab->fmode[ftype].bark_tab[idx];
}
}
static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
float *out, enum FrameType ftype)
{
const ModeTab *mtab = tctx->mtab;
int channels = tctx->avctx->channels;
int sub = mtab->fmode[ftype].sub;
int block_size = mtab->size / sub;
float gain[CHANNELS_MAX*SUBBLOCKS_MAX];
int channels = tctx->avctx->channels;
int sub = mtab->fmode[ftype].sub;
int block_size = mtab->size / sub;
float gain[CHANNELS_MAX * SUBBLOCKS_MAX];
float ppc_shape[PPC_SHAPE_LEN_MAX * CHANNELS_MAX * 4];
uint8_t bark1[CHANNELS_MAX][SUBBLOCKS_MAX][BARK_N_COEF_MAX];
uint8_t bark_use_hist[CHANNELS_MAX][SUBBLOCKS_MAX];
......@@ -757,17 +762,17 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
for (i = 0; i < channels; i++) {
lpc_hist_idx[i] = get_bits(gb, tctx->mtab->lsp_bit0);
lpc_idx1 [i] = get_bits(gb, tctx->mtab->lsp_bit1);
lpc_idx1[i] = get_bits(gb, tctx->mtab->lsp_bit1);
for (j = 0; j < tctx->mtab->lsp_split; j++)
lpc_idx2[i][j] = get_bits(gb, tctx->mtab->lsp_bit2);
}
if (ftype == FT_LONG) {
int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len*channels - 1)/
tctx->n_div[3];
int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len * channels - 1) /
tctx->n_div[3];
dequant(tctx, gb, ppc_shape, FT_PPC, mtab->ppc_shape_cb,
mtab->ppc_shape_cb + cb_len_p*PPC_SHAPE_CB_SIZE, cb_len_p);
mtab->ppc_shape_cb + cb_len_p * PPC_SHAPE_CB_SIZE, cb_len_p);
}
for (i = 0; i < channels; i++) {
......@@ -776,21 +781,22 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
for (j = 0; j < sub; j++) {
dec_bark_env(tctx, bark1[i][j], bark_use_hist[i][j], i,
tctx->tmp_buf, gain[sub*i+j], ftype);
tctx->tmp_buf, gain[sub * i + j], ftype);
tctx->fdsp.vector_fmul(chunk + block_size*j, chunk + block_size*j,
tctx->fdsp.vector_fmul(chunk + block_size * j,
chunk + block_size * j,
tctx->tmp_buf, block_size);
}
if (ftype == FT_LONG) {
float pgain_step = 25000. / ((1 << mtab->pgain_bit) - 1);
int p_coef = get_bits(gb, tctx->mtab->ppc_period_bit);
int g_coef = get_bits(gb, tctx->mtab->pgain_bit);
float v = 1./8192*
mulawinv(pgain_step*g_coef+ pgain_step/2, 25000., PGAIN_MU);
int p_coef = get_bits(gb, tctx->mtab->ppc_period_bit);
int g_coef = get_bits(gb, tctx->mtab->pgain_bit);
float v = 1. / 8192 *
mulawinv(pgain_step * g_coef + pgain_step / 2,
25000., PGAIN_MU);
decode_ppc(tctx, p_coef, ppc_shape + i*mtab->ppc_shape_len, v,
decode_ppc(tctx, p_coef, ppc_shape + i * mtab->ppc_shape_len, v,
chunk);
}
......@@ -806,16 +812,16 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
}
}
static int twin_decode_frame(AVCodecContext * avctx, void *data,
static int twin_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
TwinContext *tctx = avctx->priv_data;
int buf_size = avpkt->size;
TwinContext *tctx = avctx->priv_data;
GetBitContext gb;
const ModeTab *mtab = tctx->mtab;
float **out = NULL;
float **out = NULL;
enum FrameType ftype;
int window_type, ret;
static const enum FrameType wtype_to_ftype_table[] = {
......@@ -823,7 +829,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM
};
if (buf_size*8 < avctx->bit_rate*mtab->size/avctx->sample_rate + 8) {
if (buf_size * 8 < avctx->bit_rate * mtab->size / avctx->sample_rate + 8) {
av_log(avctx, AV_LOG_ERROR,
"Frame too small (%d bytes). Truncated file?\n", buf_size);
return AVERROR(EINVAL);
......@@ -852,7 +858,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
imdct_output(tctx, ftype, window_type, out);
FFSWAP(float*, tctx->curr_frame, tctx->prev_frame);
FFSWAP(float *, tctx->curr_frame, tctx->prev_frame);
if (tctx->discarded_packets < 2) {
tctx->discarded_packets++;
......@@ -872,15 +878,15 @@ static av_cold int init_mdct_win(TwinContext *tctx)
{
int i, j, ret;
const ModeTab *mtab = tctx->mtab;
int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
int size_m = mtab->size / mtab->fmode[FT_MEDIUM].sub;
int channels = tctx->avctx->channels;
float norm = channels == 1 ? 2. : 1.;
int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
int size_m = mtab->size / mtab->fmode[FT_MEDIUM].sub;
int channels = tctx->avctx->channels;
float norm = channels == 1 ? 2. : 1.;
for (i = 0; i < 3; i++) {
int bsize = tctx->mtab->size/tctx->mtab->fmode[i].sub;
int bsize = tctx->mtab->size / tctx->mtab->fmode[i].sub;
if ((ret = ff_mdct_init(&tctx->mdct_ctx[i], av_log2(bsize) + 1, 1,
-sqrt(norm/bsize) / (1<<15))))
-sqrt(norm / bsize) / (1 << 15))))
return ret;
}
......@@ -898,23 +904,23 @@ static av_cold int init_mdct_win(TwinContext *tctx)
alloc_fail);
for (i = 0; i < 3; i++) {
int m = 4*mtab->size/mtab->fmode[i].sub;
double freq = 2*M_PI/m;
int m = 4 * mtab->size / mtab->fmode[i].sub;
double freq = 2 * M_PI / m;
FF_ALLOC_OR_GOTO(tctx->avctx, tctx->cos_tabs[i],
(m / 4) * sizeof(*tctx->cos_tabs[i]), alloc_fail);
for (j = 0; j <= m/8; j++)
tctx->cos_tabs[i][j] = cos((2*j + 1)*freq);
for (j = 1; j < m/8; j++)
tctx->cos_tabs[i][m/4-j] = tctx->cos_tabs[i][j];
for (j = 0; j <= m / 8; j++)
tctx->cos_tabs[i][j] = cos((2 * j + 1) * freq);
for (j = 1; j < m / 8; j++)
tctx->cos_tabs[i][m / 4 - j] = tctx->cos_tabs[i][j];
}
ff_init_ff_sine_windows(av_log2(size_m));
ff_init_ff_sine_windows(av_log2(size_s/2));
ff_init_ff_sine_windows(av_log2(size_s / 2));
ff_init_ff_sine_windows(av_log2(mtab->size));
return 0;
alloc_fail:
return AVERROR(ENOMEM);
}
......@@ -929,25 +935,24 @@ static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks,
int block_size,
const uint8_t line_len[2], int length_div,
enum FrameType ftype)
{
int i,j;
int i, j;
for (i = 0; i < line_len[0]; i++) {
int shift;
if (num_blocks == 1 ||
if (num_blocks == 1 ||
(ftype == FT_LONG && num_vect % num_blocks) ||
(ftype != FT_LONG && num_vect & 1 ) ||
(ftype != FT_LONG && num_vect & 1) ||
i == line_len[1]) {
shift = 0;
} else if (ftype == FT_LONG) {
shift = i;
} else
shift = i*i;
shift = i * i;
for (j = 0; j < num_vect && (j+num_vect*i < block_size*num_blocks); j++)
tab[i*num_vect+j] = i*num_vect + (j + shift) % num_vect;
for (j = 0; j < num_vect && (j + num_vect * i < block_size * num_blocks); j++)
tab[i * num_vect + j] = i * num_vect + (j + shift) % num_vect;
}
}
......@@ -969,31 +974,32 @@ static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks,
static void transpose_perm(int16_t *out, int16_t *in, int num_vect,
const uint8_t line_len[2], int length_div)
{
int i,j;
int cont= 0;
int i, j;
int cont = 0;
for (i = 0; i < num_vect; i++)
for (j = 0; j < line_len[i >= length_div]; j++)
out[cont++] = in[j*num_vect + i];
out[cont++] = in[j * num_vect + i];
}
static void linear_perm(int16_t *out, int16_t *in, int n_blocks, int size)
{
int block_size = size/n_blocks;
int block_size = size / n_blocks;
int i;
for (i = 0; i < size; i++)
out[i] = block_size * (in[i] % n_blocks) + in[i] / n_blocks;
}
static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype)
static av_cold void construct_perm_table(TwinContext *tctx,
enum FrameType ftype)
{
int block_size;
int block_size, size;
const ModeTab *mtab = tctx->mtab;
int size;
int16_t *tmp_perm = (int16_t *) tctx->tmp_buf;
int16_t *tmp_perm = (int16_t *)tctx->tmp_buf;
if (ftype == FT_PPC) {
size = tctx->avctx->channels;
size = tctx->avctx->channels;
block_size = mtab->ppc_shape_len;
} else {
size = tctx->avctx->channels * mtab->fmode[ftype].sub;
......@@ -1008,71 +1014,71 @@ static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype)
tctx->length[ftype], tctx->length_change[ftype]);
linear_perm(tctx->permut[ftype], tctx->permut[ftype], size,
size*block_size);
size * block_size);
}
static av_cold void init_bitstream_params(TwinContext *tctx)
{
const ModeTab *mtab = tctx->mtab;
int n_ch = tctx->avctx->channels;
int total_fr_bits = tctx->avctx->bit_rate*mtab->size/
tctx->avctx->sample_rate;
int n_ch = tctx->avctx->channels;
int total_fr_bits = tctx->avctx->bit_rate * mtab->size /
tctx->avctx->sample_rate;
int lsp_bits_per_block = n_ch*(mtab->lsp_bit0 + mtab->lsp_bit1 +
mtab->lsp_split*mtab->lsp_bit2);
int lsp_bits_per_block = n_ch * (mtab->lsp_bit0 + mtab->lsp_bit1 +
mtab->lsp_split * mtab->lsp_bit2);
int ppc_bits = n_ch*(mtab->pgain_bit + mtab->ppc_shape_bit +
mtab->ppc_period_bit);
int ppc_bits = n_ch * (mtab->pgain_bit + mtab->ppc_shape_bit +
mtab->ppc_period_bit);
int bsize_no_main_cb[3];
int bse_bits[3];
int i;
int bsize_no_main_cb[3], bse_bits[3], i;
enum FrameType frametype;
for (i = 0; i < 3; i++)
// +1 for history usage switch
bse_bits[i] = n_ch *
(mtab->fmode[i].bark_n_coef * mtab->fmode[i].bark_n_bit + 1);
(mtab->fmode[i].bark_n_coef *
mtab->fmode[i].bark_n_bit + 1);
bsize_no_main_cb[2] = bse_bits[2] + lsp_bits_per_block + ppc_bits +
WINDOW_TYPE_BITS + n_ch*GAIN_BITS;
WINDOW_TYPE_BITS + n_ch * GAIN_BITS;
for (i = 0; i < 2; i++)
bsize_no_main_cb[i] =
lsp_bits_per_block + n_ch*GAIN_BITS + WINDOW_TYPE_BITS +
mtab->fmode[i].sub*(bse_bits[i] + n_ch*SUB_GAIN_BITS);
lsp_bits_per_block + n_ch * GAIN_BITS + WINDOW_TYPE_BITS +
mtab->fmode[i].sub * (bse_bits[i] + n_ch * SUB_GAIN_BITS);
// The remaining bits are all used for the main spectrum coefficients
for (i = 0; i < 4; i++) {
int bit_size;
int vect_size;
int bit_size, vect_size;
int rounded_up, rounded_down, num_rounded_down, num_rounded_up;
if (i == 3) {
bit_size = n_ch * mtab->ppc_shape_bit;
vect_size = n_ch * mtab->ppc_shape_len;
} else {
bit_size = total_fr_bits - bsize_no_main_cb[i];
bit_size = total_fr_bits - bsize_no_main_cb[i];
vect_size = n_ch * mtab->size;
}
tctx->n_div[i] = (bit_size + 13) / 14;
rounded_up = (bit_size + tctx->n_div[i] - 1)/tctx->n_div[i];
rounded_down = (bit_size )/tctx->n_div[i];
num_rounded_down = rounded_up * tctx->n_div[i] - bit_size;
num_rounded_up = tctx->n_div[i] - num_rounded_down;
tctx->bits_main_spec[0][i][0] = (rounded_up + 1)/2;
tctx->bits_main_spec[1][i][0] = (rounded_up )/2;
tctx->bits_main_spec[0][i][1] = (rounded_down + 1)/2;
tctx->bits_main_spec[1][i][1] = (rounded_down )/2;
rounded_up = (bit_size + tctx->n_div[i] - 1) /
tctx->n_div[i];
rounded_down = (bit_size) / tctx->n_div[i];
num_rounded_down = rounded_up * tctx->n_div[i] - bit_size;
num_rounded_up = tctx->n_div[i] - num_rounded_down;
tctx->bits_main_spec[0][i][0] = (rounded_up + 1) / 2;
tctx->bits_main_spec[1][i][0] = rounded_up / 2;
tctx->bits_main_spec[0][i][1] = (rounded_down + 1) / 2;
tctx->bits_main_spec[1][i][1] = rounded_down / 2;
tctx->bits_main_spec_change[i] = num_rounded_up;
rounded_up = (vect_size + tctx->n_div[i] - 1)/tctx->n_div[i];
rounded_down = (vect_size )/tctx->n_div[i];
num_rounded_down = rounded_up * tctx->n_div[i] - vect_size;
num_rounded_up = tctx->n_div[i] - num_rounded_down;
tctx->length[i][0] = rounded_up;
tctx->length[i][1] = rounded_down;
rounded_up = (vect_size + tctx->n_div[i] - 1) /
tctx->n_div[i];
rounded_down = (vect_size) / tctx->n_div[i];
num_rounded_down = rounded_up * tctx->n_div[i] - vect_size;
num_rounded_up = tctx->n_div[i] - num_rounded_down;
tctx->length[i][0] = rounded_up;
tctx->length[i][1] = rounded_down;
tctx->length_change[i] = num_rounded_up;
}
......@@ -1090,7 +1096,6 @@ static av_cold int twin_decode_close(AVCodecContext *avctx)
av_free(tctx->cos_tabs[i]);
}
av_free(tctx->curr_frame);
av_free(tctx->spectrum);
av_free(tctx->prev_frame);
......@@ -1101,9 +1106,8 @@ static av_cold int twin_decode_close(AVCodecContext *avctx)
static av_cold int twin_decode_init(AVCodecContext *avctx)
{
int ret;
int ret, isampf, ibps;
TwinContext *tctx = avctx->priv_data;
int isampf, ibps;
tctx->avctx = avctx;
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
......@@ -1112,7 +1116,7 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
av_log(avctx, AV_LOG_ERROR, "Missing or incomplete extradata\n");
return AVERROR_INVALIDDATA;
}
avctx->channels = AV_RB32(avctx->extradata ) + 1;
avctx->channels = AV_RB32(avctx->extradata) + 1;
avctx->bit_rate = AV_RB32(avctx->extradata + 4) * 1000;
isampf = AV_RB32(avctx->extradata + 8);
......@@ -1121,10 +1125,18 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA;
}
switch (isampf) {
case 44: avctx->sample_rate = 44100; break;
case 22: avctx->sample_rate = 22050; break;
case 11: avctx->sample_rate = 11025; break;
default: avctx->sample_rate = isampf * 1000; break;
case 44:
avctx->sample_rate = 44100;
break;
case 22:
avctx->sample_rate = 22050;
break;
case 11:
avctx->sample_rate = 11025;
break;
default:
avctx->sample_rate = isampf * 1000;
break;
}
if (avctx->channels <= 0 || avctx->channels > CHANNELS_MAX) {
......@@ -1132,8 +1144,8 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
avctx->channels);
return -1;
}
avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO :
AV_CH_LAYOUT_STEREO;
avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO
: AV_CH_LAYOUT_STEREO;
ibps = avctx->bit_rate / (1000 * avctx->channels);
......@@ -1142,18 +1154,38 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA;
}
switch ((isampf << 8) + ibps) {
case (8 <<8) + 8: tctx->mtab = &mode_08_08; break;
case (11<<8) + 8: tctx->mtab = &mode_11_08; break;
case (11<<8) + 10: tctx->mtab = &mode_11_10; break;
case (16<<8) + 16: tctx->mtab = &mode_16_16; break;
case (22<<8) + 20: tctx->mtab = &mode_22_20; break;
case (22<<8) + 24: tctx->mtab = &mode_22_24; break;
case (22<<8) + 32: tctx->mtab = &mode_22_32; break;
case (44<<8) + 40: tctx->mtab = &mode_44_40; break;
case (44<<8) + 48: tctx->mtab = &mode_44_48; break;
switch ((isampf << 8) + ibps) {
case (8 << 8) + 8:
tctx->mtab = &mode_08_08;
break;
case (11 << 8) + 8:
tctx->mtab = &mode_11_08;
break;
case (11 << 8) + 10:
tctx->mtab = &mode_11_10;
break;
case (16 << 8) + 16:
tctx->mtab = &mode_16_16;
break;
case (22 << 8) + 20:
tctx->mtab = &mode_22_20;
break;
case (22 << 8) + 24:
tctx->mtab = &mode_22_24;
break;
case (22 << 8) + 32:
tctx->mtab = &mode_22_32;
break;
case (44 << 8) + 40:
tctx->mtab = &mode_44_40;
break;
case (44 << 8) + 48:
tctx->mtab = &mode_44_48;
break;
default:
av_log(avctx, AV_LOG_ERROR, "This version does not support %d kHz - %d kbit/s/ch mode.\n", isampf, isampf);
av_log(avctx, AV_LOG_ERROR,
"This version does not support %d kHz - %d kbit/s/ch mode.\n",
isampf, isampf);
return -1;
}
......
......@@ -39,95 +39,94 @@
* for some slightly nonconventional bark-scale function
*/
static const uint16_t bark_tab_l08_512[] = {
7, 8, 7, 8, 8, 8, 8, 8, 8, 9,
9, 10, 10, 11, 11, 12, 12, 14, 15, 16,
18, 19, 21, 24, 27, 30, 35, 40, 46, 53
7, 8, 7, 8, 8, 8, 8, 8, 8, 9,
9, 10, 10, 11, 11, 12, 12, 14, 15, 16,
18, 19, 21, 24, 27, 30, 35, 40, 46, 53
};
static const uint16_t bark_tab_l11_512[] = {
6, 6, 6, 6, 6, 6, 7, 6, 7, 7,
8, 8, 8, 9, 10, 10, 11, 13, 13, 15,
17, 18, 21, 25, 27, 33, 38, 45, 54, 66
6, 6, 6, 6, 6, 6, 7, 6, 7, 7,
8, 8, 8, 9, 10, 10, 11, 13, 13, 15,
17, 18, 21, 25, 27, 33, 38, 45, 54, 66
};
static const uint16_t bark_tab_l16_1024[] = {
9, 9, 8, 9, 10, 9, 10, 10, 10, 12,
11, 13, 13, 14, 16, 17, 19, 20, 24, 26,
30, 35, 40, 48, 56, 68, 83, 102, 128, 165
9, 9, 8, 9, 10, 9, 10, 10, 10, 12,
11, 13, 13, 14, 16, 17, 19, 20, 24, 26,
30, 35, 40, 48, 56, 68, 83, 102, 128, 165
};
static const uint16_t bark_tab_l22_1024[] = {
6, 7, 6, 6, 7, 7, 7, 7, 7, 8,
9, 8, 10, 10, 11, 12, 13, 15, 16, 18,
21, 24, 27, 33, 38, 46, 55, 68, 84, 107,
140, 191
6, 7, 6, 6, 7, 7, 7, 7, 7, 8,
9, 8, 10, 10, 11, 12, 13, 15, 16, 18,
21, 24, 27, 33, 38, 46, 55, 68, 84, 107,
140, 191
};
static const uint16_t bark_tab_l22_512[] = {
3, 3, 3, 4, 3, 3, 4, 3, 4, 4,
4, 5, 4, 5, 6, 6, 7, 7, 8, 9,
10, 12, 14, 16, 20, 22, 28, 34, 42, 53,
71, 95
3, 3, 3, 4, 3, 3, 4, 3, 4, 4,
4, 5, 4, 5, 6, 6, 7, 7, 8, 9,
10, 12, 14, 16, 20, 22, 28, 34, 42, 53,
71, 95
};
static const uint16_t bark_tab_l44_2048[] = {
5, 6, 5, 6, 5, 6, 6, 6, 6, 6,
7, 7, 7, 8, 8, 9, 9, 10, 11, 11,
13, 14, 16, 17, 19, 22, 25, 29, 33, 39,
46, 54, 64, 79, 98, 123, 161, 220, 320, 512
5, 6, 5, 6, 5, 6, 6, 6, 6, 6,
7, 7, 7, 8, 8, 9, 9, 10, 11, 11,
13, 14, 16, 17, 19, 22, 25, 29, 33, 39,
46, 54, 64, 79, 98, 123, 161, 220, 320, 512
};
static const uint16_t bark_tab_m08_256[] = {
6, 5, 6, 6, 6, 6, 7, 7, 8, 8,
9, 10, 11, 13, 15, 18, 20, 25, 31, 39
6, 5, 6, 6, 6, 6, 7, 7, 8, 8,
9, 10, 11, 13, 15, 18, 20, 25, 31, 39
};
static const uint16_t bark_tab_m11_256[] = {
4, 5, 4, 5, 5, 5, 6, 5, 7, 7,
8, 9, 10, 12, 15, 17, 22, 28, 35, 47
4, 5, 4, 5, 5, 5, 6, 5, 7, 7,
8, 9, 10, 12, 15, 17, 22, 28, 35, 47
};
static const uint16_t bark_tab_m16_512[] = {
7, 6, 7, 7, 7, 8, 9, 9, 10, 11,
14, 15, 18, 22, 27, 34, 44, 59, 81, 117
7, 6, 7, 7, 7, 8, 9, 9, 10, 11,
14, 15, 18, 22, 27, 34, 44, 59, 81, 117
};
static const uint16_t bark_tab_m22_256[] = {
3, 2, 3, 2, 3, 3, 4, 3, 4, 5,
5, 7, 8, 9, 13, 16, 22, 30, 44, 70
3, 2, 3, 2, 3, 3, 4, 3, 4, 5,
5, 7, 8, 9, 13, 16, 22, 30, 44, 70
};
static const uint16_t bark_tab_m22_512[] = {
5, 5, 5, 6, 5, 7, 6, 7, 9, 9,
11, 13, 15, 20, 24, 33, 43, 61, 88, 140
5, 5, 5, 6, 5, 7, 6, 7, 9, 9,
11, 13, 15, 20, 24, 33, 43, 61, 88, 140
};
static const uint16_t bark_tab_m44_512[] = {
3, 2, 3, 3, 3, 4, 3, 5, 4, 6,
7, 8, 10, 14, 18, 25, 36, 55, 95, 208
3, 2, 3, 3, 3, 4, 3, 5, 4, 6,
7, 8, 10, 14, 18, 25, 36, 55, 95, 208
};
static const uint16_t bark_tab_s08_64[] = {
3, 3, 3, 3, 4, 5, 6, 8, 12, 17
3, 3, 3, 3, 4, 5, 6, 8, 12, 17
};
static const uint16_t bark_tab_s11_64[] = {
2, 3, 2, 3, 3, 4, 6, 8, 12, 21
2, 3, 2, 3, 3, 4, 6, 8, 12, 21
};
static const uint16_t bark_tab_s16_128[] = {
3, 4, 4, 4, 5, 7, 10, 16, 26, 49
3, 4, 4, 4, 5, 7, 10, 16, 26, 49
};
static const uint16_t bark_tab_s22_128[] = {
3, 2, 3, 4, 4, 6, 9, 14, 26, 57
3, 2, 3, 4, 4, 6, 9, 14, 26, 57
};
static const uint16_t bark_tab_s44_128[] = {
1, 2, 1, 2, 3, 4, 6, 10, 23, 76
1, 2, 1, 2, 3, 4, 6, 10, 23, 76
};
/**
* TwinVQ codebooks. They are coded in a struct so we can use code such as
*
......@@ -10991,147 +10990,155 @@ static const struct twinvq_data {
},
};
static const uint8_t tab7[][35] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
{0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
{0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0}
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0 },
{ 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0,
1, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0 }
};
static const uint8_t tab8[][5] = {
{0, 0, 0, 1, 1},
{0, 1, 0, 0, 1},
{1, 1, 0, 0, 0},
{1, 0, 0, 1, 0},
{0, 0, 0, 1, 1},
{0, 1, 0, 0, 1},
{1, 1, 0, 0, 0},
{1, 0, 0, 1, 0},
{0, 0, 0, 1, 1},
{0, 1, 0, 0, 1},
{1, 1, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 1, 0, 1, 0}
{ 0, 0, 0, 1, 1 },
{ 0, 1, 0, 0, 1 },
{ 1, 1, 0, 0, 0 },
{ 1, 0, 0, 1, 0 },
{ 0, 0, 0, 1, 1 },
{ 0, 1, 0, 0, 1 },
{ 1, 1, 0, 0, 0 },
{ 1, 0, 0, 1, 0 },
{ 0, 0, 0, 1, 1 },
{ 0, 1, 0, 0, 1 },
{ 1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 0 }
};
static const uint8_t tab9[][45] = {
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
},{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
},{
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},{
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
},{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
},{
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},{
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},{
0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0
},{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
static const uint8_t tab10[][25] =
{
{1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0},
{1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0},
{1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0},
{1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
{1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
{0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1}
static const uint8_t tab10[][25] = {
{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,
0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 },
{ 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }
};
static const uint8_t tab11[][55] = {
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0
},{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
},{
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},{
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
}, {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
},{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
},{
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},{
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},{
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
}
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }
};
static const uint8_t tab12[][15] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1 },
};
static const struct {
int size;
const uint8_t *tab;
} tabs[] = {
{0 , NULL},
{5 , &tab8 [0][0]},{5 , &tab8 [0][0]}, {15, &tab12[0][0]},
{5 , &tab8 [0][0]},{25, &tab10[0][0]}, {15, &tab12[0][0]},
{35, &tab7 [0][0]},{5 , &tab8 [0][0]}, {45, &tab9 [0][0]},
{25, &tab10[0][0]},{55, &tab11[0][0]}, {15, &tab12[0][0]}
{ 0, NULL },
{ 5, &tab8[0][0] }, { 5, &tab8[0][0] }, { 15, &tab12[0][0] },
{ 5, &tab8[0][0] }, { 25, &tab10[0][0] }, { 15, &tab12[0][0] },
{ 35, &tab7[0][0] }, { 5, &tab8[0][0] }, { 45, &tab9[0][0] },
{ 25, &tab10[0][0] }, { 55, &tab11[0][0] }, { 15, &tab12[0][0] }
};
#endif /* AVCODEC_TWINVQ_DATA_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment