Commit bc909626 authored by Kostya Shishkov's avatar Kostya Shishkov Committed by Diego Biurrun

twinvq: move all bitstream reading into single place

This is required for the future addition of VoxWare MetaSound decoder, for its
functions are mostly the same but bitstream reader is completely different
and bitstream format is slightly different too.
Signed-off-by: 's avatarDiego Biurrun <diego@biurrun.de>
parent a22ae9f0
...@@ -39,6 +39,21 @@ enum TwinVQFrameType { ...@@ -39,6 +39,21 @@ enum TwinVQFrameType {
FT_PPC, ///< Periodic Peak Component (part of the long frame) FT_PPC, ///< Periodic Peak Component (part of the long frame)
}; };
#define PPC_SHAPE_CB_SIZE 64
#define PPC_SHAPE_LEN_MAX 60
#define SUB_AMP_MAX 4500.0
#define MULAW_MU 100.0
#define GAIN_BITS 8
#define AMP_MAX 13000.0
#define SUB_GAIN_BITS 5
#define WINDOW_TYPE_BITS 4
#define PGAIN_MU 200
#define LSP_COEFS_MAX 20
#define LSP_SPLIT_MAX 4
#define CHANNELS_MAX 2
#define SUBBLOCKS_MAX 16
#define BARK_N_COEF_MAX 4
/** /**
* Parameters and tables that are different for each frame type * Parameters and tables that are different for each frame type
*/ */
...@@ -62,6 +77,27 @@ struct TwinVQFrameMode { ...@@ -62,6 +77,27 @@ struct TwinVQFrameMode {
uint8_t cb_len_read; ///< number of spectrum coefficients to read uint8_t cb_len_read; ///< number of spectrum coefficients to read
}; };
typedef struct TwinVQFrameData {
int window_type;
enum TwinVQFrameType ftype;
uint8_t main_coeffs[1024];
uint8_t ppc_coeffs[PPC_SHAPE_LEN_MAX];
uint8_t gain_bits[CHANNELS_MAX];
uint8_t sub_gain_bits[CHANNELS_MAX * SUBBLOCKS_MAX];
uint8_t bark1[CHANNELS_MAX][SUBBLOCKS_MAX][BARK_N_COEF_MAX];
uint8_t bark_use_hist[CHANNELS_MAX][SUBBLOCKS_MAX];
uint8_t lpc_idx1[CHANNELS_MAX];
uint8_t lpc_idx2[CHANNELS_MAX][LSP_SPLIT_MAX];
uint8_t lpc_hist_idx[CHANNELS_MAX];
int p_coef[CHANNELS_MAX];
int g_coef[CHANNELS_MAX];
} TwinVQFrameData;
/** /**
* Parameters and tables that are different for every combination of * Parameters and tables that are different for every combination of
* bitrate/sample rate * bitrate/sample rate
...@@ -202,22 +238,9 @@ typedef struct TwinVQContext { ...@@ -202,22 +238,9 @@ typedef struct TwinVQContext {
// scratch buffers // scratch buffers
float *tmp_buf; float *tmp_buf;
} TwinVQContext;
#define PPC_SHAPE_CB_SIZE 64 TwinVQFrameData bits;
#define PPC_SHAPE_LEN_MAX 60 } TwinVQContext;
#define SUB_AMP_MAX 4500.0
#define MULAW_MU 100.0
#define GAIN_BITS 8
#define AMP_MAX 13000.0
#define SUB_GAIN_BITS 5
#define WINDOW_TYPE_BITS 4
#define PGAIN_MU 200
#define LSP_COEFS_MAX 20
#define LSP_SPLIT_MAX 4
#define CHANNELS_MAX 2
#define SUBBLOCKS_MAX 16
#define BARK_N_COEF_MAX 4
/** @note not speed critical, hence not optimized */ /** @note not speed critical, hence not optimized */
static void memset_float(float *buf, float val, int size) static void memset_float(float *buf, float val, int size)
...@@ -363,7 +386,7 @@ static void eval_lpcenv_2parts(TwinVQContext *tctx, enum TwinVQFrameType ftype, ...@@ -363,7 +386,7 @@ static void eval_lpcenv_2parts(TwinVQContext *tctx, enum TwinVQFrameType ftype,
* bitstream, sum the corresponding vectors and write the result to *out * bitstream, sum the corresponding vectors and write the result to *out
* after permutation. * after permutation.
*/ */
static void dequant(TwinVQContext *tctx, GetBitContext *gb, float *out, static void dequant(TwinVQContext *tctx, const uint8_t *cb_bits, float *out,
enum TwinVQFrameType ftype, enum TwinVQFrameType ftype,
const int16_t *cb0, const int16_t *cb1, int cb_len) const int16_t *cb0, const int16_t *cb1, int cb_len)
{ {
...@@ -379,22 +402,20 @@ static void dequant(TwinVQContext *tctx, GetBitContext *gb, float *out, ...@@ -379,22 +402,20 @@ static void dequant(TwinVQContext *tctx, GetBitContext *gb, float *out,
int bitstream_second_part = (i >= tctx->bits_main_spec_change[ftype]); int bitstream_second_part = (i >= tctx->bits_main_spec_change[ftype]);
int bits = tctx->bits_main_spec[0][ftype][bitstream_second_part]; int bits = tctx->bits_main_spec[0][ftype][bitstream_second_part];
tmp0 = *cb_bits++;
if (bits == 7) { if (bits == 7) {
if (get_bits1(gb)) if (tmp0 & 0x40)
sign0 = -1; sign0 = -1;
bits = 6; tmp0 &= 0x3F;
} }
tmp0 = get_bits(gb, bits);
bits = tctx->bits_main_spec[1][ftype][bitstream_second_part]; bits = tctx->bits_main_spec[1][ftype][bitstream_second_part];
tmp1 = *cb_bits++;
if (bits == 7) { if (bits == 7) {
if (get_bits1(gb)) if (tmp1 & 0x40)
sign1 = -1; sign1 = -1;
tmp1 &= 0x3F;
bits = 6;
} }
tmp1 = get_bits(gb, bits);
tab0 = cb0 + tmp0 * cb_len; tab0 = cb0 + tmp0 * cb_len;
tab1 = cb1 + tmp1 * cb_len; tab1 = cb1 + tmp1 * cb_len;
...@@ -505,10 +526,11 @@ static void decode_ppc(TwinVQContext *tctx, int period_coef, ...@@ -505,10 +526,11 @@ static void decode_ppc(TwinVQContext *tctx, int period_coef,
add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len); add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
} }
static void dec_gain(TwinVQContext *tctx, GetBitContext *gb, static void dec_gain(TwinVQContext *tctx,
enum TwinVQFrameType ftype, float *out) enum TwinVQFrameType ftype, float *out)
{ {
const TwinVQModeTab *mtab = tctx->mtab; const TwinVQModeTab *mtab = tctx->mtab;
const TwinVQFrameData *bits = &tctx->bits;
int i, j; int i, j;
int sub = mtab->fmode[ftype].sub; int sub = mtab->fmode[ftype].sub;
float step = AMP_MAX / ((1 << GAIN_BITS) - 1); float step = AMP_MAX / ((1 << GAIN_BITS) - 1);
...@@ -517,18 +539,18 @@ static void dec_gain(TwinVQContext *tctx, GetBitContext *gb, ...@@ -517,18 +539,18 @@ static void dec_gain(TwinVQContext *tctx, GetBitContext *gb,
if (ftype == FT_LONG) { if (ftype == FT_LONG) {
for (i = 0; i < tctx->avctx->channels; i++) for (i = 0; i < tctx->avctx->channels; i++)
out[i] = (1.0 / (1 << 13)) * out[i] = (1.0 / (1 << 13)) *
mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS), mulawinv(step * 0.5 + step * bits->gain_bits[i],
AMP_MAX, MULAW_MU); AMP_MAX, MULAW_MU);
} else { } else {
for (i = 0; i < tctx->avctx->channels; i++) { for (i = 0; i < tctx->avctx->channels; i++) {
float val = (1.0 / (1 << 23)) * float val = (1.0 / (1 << 23)) *
mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS), mulawinv(step * 0.5 + step * bits->gain_bits[i],
AMP_MAX, MULAW_MU); AMP_MAX, MULAW_MU);
for (j = 0; j < sub; j++) for (j = 0; j < sub; j++)
out[i * sub + j] = out[i * sub + j] =
val * mulawinv(sub_step * 0.5 + val * mulawinv(sub_step * 0.5 +
sub_step * get_bits(gb, SUB_GAIN_BITS), sub_step * bits->sub_gain_bits[i * sub + j],
SUB_AMP_MAX, MULAW_MU); SUB_AMP_MAX, MULAW_MU);
} }
} }
...@@ -727,52 +749,29 @@ static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist, ...@@ -727,52 +749,29 @@ static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist,
} }
} }
static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb, static void read_and_decode_spectrum(TwinVQContext *tctx, float *out,
float *out, enum TwinVQFrameType ftype) enum TwinVQFrameType ftype)
{ {
const TwinVQModeTab *mtab = tctx->mtab; const TwinVQModeTab *mtab = tctx->mtab;
TwinVQFrameData *bits = &tctx->bits;
int channels = tctx->avctx->channels; int channels = tctx->avctx->channels;
int sub = mtab->fmode[ftype].sub; int sub = mtab->fmode[ftype].sub;
int block_size = mtab->size / sub; int block_size = mtab->size / sub;
float gain[CHANNELS_MAX * SUBBLOCKS_MAX]; float gain[CHANNELS_MAX * SUBBLOCKS_MAX];
float ppc_shape[PPC_SHAPE_LEN_MAX * CHANNELS_MAX * 4]; 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];
uint8_t lpc_idx1[CHANNELS_MAX];
uint8_t lpc_idx2[CHANNELS_MAX][LSP_SPLIT_MAX];
uint8_t lpc_hist_idx[CHANNELS_MAX];
int i, j, k; int i, j;
dequant(tctx, gb, out, ftype, dequant(tctx, bits->main_coeffs, out, ftype,
mtab->fmode[ftype].cb0, mtab->fmode[ftype].cb1, mtab->fmode[ftype].cb0, mtab->fmode[ftype].cb1,
mtab->fmode[ftype].cb_len_read); mtab->fmode[ftype].cb_len_read);
for (i = 0; i < channels; i++) dec_gain(tctx, ftype, gain);
for (j = 0; j < sub; j++)
for (k = 0; k < mtab->fmode[ftype].bark_n_coef; k++)
bark1[i][j][k] =
get_bits(gb, mtab->fmode[ftype].bark_n_bit);
for (i = 0; i < channels; i++)
for (j = 0; j < sub; j++)
bark_use_hist[i][j] = get_bits1(gb);
dec_gain(tctx, gb, ftype, gain);
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);
for (j = 0; j < tctx->mtab->lsp_split; j++)
lpc_idx2[i][j] = get_bits(gb, tctx->mtab->lsp_bit2);
}
if (ftype == FT_LONG) { if (ftype == FT_LONG) {
int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len * channels - 1) / int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len * channels - 1) /
tctx->n_div[3]; tctx->n_div[3];
dequant(tctx, gb, ppc_shape, FT_PPC, mtab->ppc_shape_cb, dequant(tctx, bits->ppc_coeffs, 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);
} }
...@@ -781,7 +780,7 @@ static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb, ...@@ -781,7 +780,7 @@ static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb,
float lsp[LSP_COEFS_MAX]; float lsp[LSP_COEFS_MAX];
for (j = 0; j < sub; j++) { for (j = 0; j < sub; j++) {
dec_bark_env(tctx, bark1[i][j], bark_use_hist[i][j], i, dec_bark_env(tctx, bits->bark1[i][j], bits->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, tctx->fdsp.vector_fmul(chunk + block_size * j,
...@@ -791,18 +790,17 @@ static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb, ...@@ -791,18 +790,17 @@ static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb,
if (ftype == FT_LONG) { if (ftype == FT_LONG) {
float pgain_step = 25000.0 / ((1 << mtab->pgain_bit) - 1); float pgain_step = 25000.0 / ((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.0 / 8192 * float v = 1.0 / 8192 *
mulawinv(pgain_step * g_coef + pgain_step / 2, mulawinv(pgain_step * bits->g_coef[i] +
pgain_step / 2,
25000.0, PGAIN_MU); 25000.0, PGAIN_MU);
decode_ppc(tctx, p_coef, ppc_shape + i * mtab->ppc_shape_len, v, decode_ppc(tctx, bits->p_coef[i],
chunk); ppc_shape + i * mtab->ppc_shape_len, v, chunk);
} }
decode_lsp(tctx, lpc_idx1[i], lpc_idx2[i], lpc_hist_idx[i], lsp, decode_lsp(tctx, bits->lpc_idx1[i], bits->lpc_idx2[i],
tctx->lsp_hist[i]); bits->lpc_hist_idx[i], lsp, tctx->lsp_hist[i]);
dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf); dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf);
...@@ -813,6 +811,90 @@ static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb, ...@@ -813,6 +811,90 @@ static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb,
} }
} }
static void read_cb_data(TwinVQContext *tctx, GetBitContext *gb,
uint8_t *dst, enum TwinVQFrameType ftype)
{
int i;
for (i = 0; i < tctx->n_div[ftype]; i++) {
int bs_second_part = (i >= tctx->bits_main_spec_change[ftype]);
*dst++ = get_bits(gb, tctx->bits_main_spec[0][ftype][bs_second_part]);
*dst++ = get_bits(gb, tctx->bits_main_spec[1][ftype][bs_second_part]);
}
}
static const enum TwinVQFrameType wtype_to_ftype_table[] = {
FT_LONG, FT_LONG, FT_SHORT, FT_LONG,
FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM
};
static int twinvq_read_bitstream(AVCodecContext *avctx, TwinVQContext *tctx,
const uint8_t *buf, int buf_size)
{
TwinVQFrameData *bits = &tctx->bits;
const TwinVQModeTab *mtab = tctx->mtab;
int channels = tctx->avctx->channels;
int sub;
GetBitContext gb;
int i, j, k;
init_get_bits(&gb, buf, buf_size * 8);
skip_bits(&gb, get_bits(&gb, 8));
bits->window_type = get_bits(&gb, WINDOW_TYPE_BITS);
if (bits->window_type > 8) {
av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
return AVERROR_INVALIDDATA;
}
bits->ftype = wtype_to_ftype_table[tctx->bits.window_type];
sub = mtab->fmode[bits->ftype].sub;
read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype);
for (i = 0; i < channels; i++)
for (j = 0; j < sub; j++)
for (k = 0; k < mtab->fmode[bits->ftype].bark_n_coef; k++)
bits->bark1[i][j][k] =
get_bits(&gb, mtab->fmode[bits->ftype].bark_n_bit);
for (i = 0; i < channels; i++)
for (j = 0; j < sub; j++)
bits->bark_use_hist[i][j] = get_bits1(&gb);
if (bits->ftype == FT_LONG) {
for (i = 0; i < channels; i++)
bits->gain_bits[i] = get_bits(&gb, GAIN_BITS);
} else {
for (i = 0; i < channels; i++) {
bits->gain_bits[i] = get_bits(&gb, GAIN_BITS);
for (j = 0; j < sub; j++)
bits->sub_gain_bits[i * sub + j] = get_bits(&gb, SUB_GAIN_BITS);
}
}
for (i = 0; i < channels; i++) {
bits->lpc_hist_idx[i] = get_bits(&gb, mtab->lsp_bit0);
bits->lpc_idx1[i] = get_bits(&gb, mtab->lsp_bit1);
for (j = 0; j < mtab->lsp_split; j++)
bits->lpc_idx2[i][j] = get_bits(&gb, mtab->lsp_bit2);
}
if (bits->ftype == FT_LONG) {
read_cb_data(tctx, &gb, bits->ppc_coeffs, 3);
for (i = 0; i < channels; i++) {
bits->p_coef[i] = get_bits(&gb, mtab->ppc_period_bit);
bits->g_coef[i] = get_bits(&gb, mtab->pgain_bit);
}
}
return 0;
}
static int twinvq_decode_frame(AVCodecContext *avctx, void *data, static int twinvq_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt) int *got_frame_ptr, AVPacket *avpkt)
{ {
...@@ -820,15 +902,9 @@ static int twinvq_decode_frame(AVCodecContext *avctx, void *data, ...@@ -820,15 +902,9 @@ static int twinvq_decode_frame(AVCodecContext *avctx, void *data,
const uint8_t *buf = avpkt->data; const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size; int buf_size = avpkt->size;
TwinVQContext *tctx = avctx->priv_data; TwinVQContext *tctx = avctx->priv_data;
GetBitContext gb;
const TwinVQModeTab *mtab = tctx->mtab; const TwinVQModeTab *mtab = tctx->mtab;
float **out = NULL; float **out = NULL;
enum TwinVQFrameType ftype; int ret;
int window_type, ret;
static const enum TwinVQFrameType wtype_to_ftype_table[] = {
FT_LONG, FT_LONG, FT_SHORT, FT_LONG,
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, av_log(avctx, AV_LOG_ERROR,
...@@ -846,20 +922,12 @@ static int twinvq_decode_frame(AVCodecContext *avctx, void *data, ...@@ -846,20 +922,12 @@ static int twinvq_decode_frame(AVCodecContext *avctx, void *data,
out = (float **)frame->extended_data; out = (float **)frame->extended_data;
} }
init_get_bits(&gb, buf, buf_size * 8); if ((ret = twinvq_read_bitstream(avctx, tctx, buf, buf_size)) < 0)
skip_bits(&gb, get_bits(&gb, 8)); return ret;
window_type = get_bits(&gb, WINDOW_TYPE_BITS);
if (window_type > 8) {
av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
return -1;
}
ftype = wtype_to_ftype_table[window_type];
read_and_decode_spectrum(tctx, &gb, tctx->spectrum, ftype); read_and_decode_spectrum(tctx, tctx->spectrum, tctx->bits.ftype);
imdct_output(tctx, ftype, window_type, out); imdct_output(tctx, tctx->bits.ftype, tctx->bits.window_type, out);
FFSWAP(float *, tctx->curr_frame, tctx->prev_frame); FFSWAP(float *, tctx->curr_frame, tctx->prev_frame);
......
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