| @@ -32,7 +32,7 @@ | |||||
| #include "sinewin.h" | #include "sinewin.h" | ||||
| #include "twinvq_data.h" | #include "twinvq_data.h" | ||||
| enum FrameType { | |||||
| enum TwinVQFrameType { | |||||
| FT_SHORT = 0, ///< Short frame (divided in n sub-blocks) | FT_SHORT = 0, ///< Short frame (divided in n sub-blocks) | ||||
| FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks) | FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks) | ||||
| FT_LONG, ///< Long frame (single sub-block + PPC) | FT_LONG, ///< Long frame (single sub-block + PPC) | ||||
| @@ -42,7 +42,7 @@ enum FrameType { | |||||
| /** | /** | ||||
| * Parameters and tables that are different for each frame type | * Parameters and tables that are different for each frame type | ||||
| */ | */ | ||||
| struct FrameMode { | |||||
| struct TwinVQFrameMode { | |||||
| uint8_t sub; ///< Number subblocks in each frame | uint8_t sub; ///< Number subblocks in each frame | ||||
| const uint16_t *bark_tab; | const uint16_t *bark_tab; | ||||
| @@ -66,8 +66,8 @@ struct FrameMode { | |||||
| * 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 | ||||
| */ | */ | ||||
| typedef struct { | |||||
| struct FrameMode fmode[3]; ///< frame type-dependant parameters | |||||
| typedef struct TwinVQModeTab { | |||||
| struct TwinVQFrameMode fmode[3]; ///< frame type-dependant parameters | |||||
| uint16_t size; ///< frame size in samples | uint16_t size; ///< frame size in samples | ||||
| uint8_t n_lsp; ///< number of lsp coefficients | uint8_t n_lsp; ///< number of lsp coefficients | ||||
| @@ -90,9 +90,9 @@ typedef struct { | |||||
| /** constant for peak period to peak width conversion */ | /** constant for peak period to peak width conversion */ | ||||
| uint16_t peak_per2wid; | uint16_t peak_per2wid; | ||||
| } ModeTab; | |||||
| } TwinVQModeTab; | |||||
| static const ModeTab mode_08_08 = { | |||||
| static const TwinVQModeTab mode_08_08 = { | |||||
| { | { | ||||
| { 8, bark_tab_s08_64, 10, tab.fcb08s, 1, 5, tab.cb0808s0, tab.cb0808s1, 18 }, | { 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 }, | { 2, bark_tab_m08_256, 20, tab.fcb08m, 2, 5, tab.cb0808m0, tab.cb0808m1, 16 }, | ||||
| @@ -101,7 +101,7 @@ static const ModeTab mode_08_08 = { | |||||
| 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 = { | |||||
| static const TwinVQModeTab mode_11_08 = { | |||||
| { | { | ||||
| { 8, bark_tab_s11_64, 10, tab.fcb11s, 1, 5, tab.cb1108s0, tab.cb1108s1, 29 }, | { 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 }, | { 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1108m0, tab.cb1108m1, 24 }, | ||||
| @@ -110,7 +110,7 @@ static const ModeTab mode_11_08 = { | |||||
| 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 = { | |||||
| static const TwinVQModeTab mode_11_10 = { | |||||
| { | { | ||||
| { 8, bark_tab_s11_64, 10, tab.fcb11s, 1, 5, tab.cb1110s0, tab.cb1110s1, 21 }, | { 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 }, | { 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1110m0, tab.cb1110m1, 18 }, | ||||
| @@ -119,7 +119,7 @@ static const ModeTab mode_11_10 = { | |||||
| 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 = { | |||||
| static const TwinVQModeTab mode_16_16 = { | |||||
| { | { | ||||
| { 8, bark_tab_s16_128, 10, tab.fcb16s, 1, 5, tab.cb1616s0, tab.cb1616s1, 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 }, | { 2, bark_tab_m16_512, 20, tab.fcb16m, 2, 5, tab.cb1616m0, tab.cb1616m1, 15 }, | ||||
| @@ -128,7 +128,7 @@ static const ModeTab mode_16_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 = { | |||||
| static const TwinVQModeTab mode_22_20 = { | |||||
| { | { | ||||
| { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 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 }, | { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17 }, | ||||
| @@ -137,7 +137,7 @@ static const ModeTab mode_22_20 = { | |||||
| 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144 | 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144 | ||||
| }; | }; | ||||
| static const ModeTab mode_22_24 = { | |||||
| static const TwinVQModeTab mode_22_24 = { | |||||
| { | { | ||||
| { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 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 }, | { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14 }, | ||||
| @@ -146,7 +146,7 @@ static const ModeTab mode_22_24 = { | |||||
| 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144 | 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144 | ||||
| }; | }; | ||||
| static const ModeTab mode_22_32 = { | |||||
| static const TwinVQModeTab mode_22_32 = { | |||||
| { | { | ||||
| { 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11 }, | { 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 }, | { 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11 }, | ||||
| @@ -155,7 +155,7 @@ static const ModeTab mode_22_32 = { | |||||
| 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 = { | |||||
| static const TwinVQModeTab mode_44_40 = { | |||||
| { | { | ||||
| { 16, bark_tab_s44_128, 10, tab.fcb44s, 1, 6, tab.cb4440s0, tab.cb4440s1, 18 }, | { 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 }, | { 4, bark_tab_m44_512, 20, tab.fcb44m, 2, 6, tab.cb4440m0, tab.cb4440m1, 17 }, | ||||
| @@ -164,7 +164,7 @@ static const ModeTab mode_44_40 = { | |||||
| 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 = { | |||||
| static const TwinVQModeTab mode_44_48 = { | |||||
| { | { | ||||
| { 16, bark_tab_s44_128, 10, tab.fcb44s, 1, 6, tab.cb4448s0, tab.cb4448s1, 15 }, | { 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 }, | { 4, bark_tab_m44_512, 20, tab.fcb44m, 2, 6, tab.cb4448m0, tab.cb4448m1, 14 }, | ||||
| @@ -173,12 +173,12 @@ static const ModeTab mode_44_48 = { | |||||
| 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 { | |||||
| typedef struct TwinVQContext { | |||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| AVFloatDSPContext fdsp; | AVFloatDSPContext fdsp; | ||||
| FFTContext mdct_ctx[3]; | FFTContext mdct_ctx[3]; | ||||
| const ModeTab *mtab; | |||||
| const TwinVQModeTab *mtab; | |||||
| // history | // history | ||||
| float lsp_hist[2][20]; ///< LSP coefficients of the last frame | float lsp_hist[2][20]; ///< LSP coefficients of the last frame | ||||
| @@ -202,7 +202,7 @@ typedef struct TwinContext { | |||||
| // scratch buffers | // scratch buffers | ||||
| float *tmp_buf; | float *tmp_buf; | ||||
| } TwinContext; | |||||
| } TwinVQContext; | |||||
| #define PPC_SHAPE_CB_SIZE 64 | #define PPC_SHAPE_CB_SIZE 64 | ||||
| #define PPC_SHAPE_LEN_MAX 60 | #define PPC_SHAPE_LEN_MAX 60 | ||||
| @@ -263,11 +263,11 @@ static float eval_lpc_spectrum(const float *lsp, float cos_val, int order) | |||||
| /** | /** | ||||
| * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs. | * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs. | ||||
| */ | */ | ||||
| static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc) | |||||
| static void eval_lpcenv(TwinVQContext *tctx, const float *cos_vals, float *lpc) | |||||
| { | { | ||||
| int i; | int i; | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| int size_s = mtab->size / mtab->fmode[FT_SHORT].sub; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| 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]; | float cos_i = tctx->cos_tabs[0][i]; | ||||
| @@ -307,14 +307,14 @@ static inline float get_cos(int idx, int part, const float *cos_tab, int size) | |||||
| * (negative cosine values) | * (negative cosine values) | ||||
| * @param size the size of the whole output | * @param size the size of the whole output | ||||
| */ | */ | ||||
| static inline void eval_lpcenv_or_interp(TwinContext *tctx, | |||||
| enum FrameType ftype, | |||||
| static inline void eval_lpcenv_or_interp(TwinVQContext *tctx, | |||||
| enum TwinVQFrameType ftype, | |||||
| float *out, const float *in, | float *out, const float *in, | ||||
| int size, int step, int part) | int size, int step, int part) | ||||
| { | { | ||||
| int i; | int i; | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| const float *cos_tab = tctx->cos_tabs[ftype]; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| const float *cos_tab = tctx->cos_tabs[ftype]; | |||||
| // Fill the 's' | // Fill the 's' | ||||
| for (i = 0; i < size; i += step) | for (i = 0; i < size; i += step) | ||||
| @@ -344,7 +344,7 @@ static inline void eval_lpcenv_or_interp(TwinContext *tctx, | |||||
| out[size - 2 * step], step - 1); | out[size - 2 * step], step - 1); | ||||
| } | } | ||||
| static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType ftype, | |||||
| static void eval_lpcenv_2parts(TwinVQContext *tctx, enum TwinVQFrameType ftype, | |||||
| const float *buf, float *lpc, | const float *buf, float *lpc, | ||||
| int size, int step) | int size, int step) | ||||
| { | { | ||||
| @@ -363,8 +363,8 @@ static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType 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(TwinContext *tctx, GetBitContext *gb, float *out, | |||||
| enum FrameType ftype, | |||||
| static void dequant(TwinVQContext *tctx, GetBitContext *gb, float *out, | |||||
| 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) | ||||
| { | { | ||||
| int pos = 0; | int pos = 0; | ||||
| @@ -478,15 +478,15 @@ static void add_peak(int period, int width, const float *shape, | |||||
| speech[j + center] += ppc_gain * *shape++; | speech[j + center] += ppc_gain * *shape++; | ||||
| } | } | ||||
| static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape, | |||||
| float ppc_gain, float *speech) | |||||
| static void decode_ppc(TwinVQContext *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(40 * 2 * mtab->size * 6, isampf); | |||||
| int period_range = max_period - min_period; | |||||
| const TwinVQModeTab *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(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 | // This is actually the period multiplied by 400. It is just linearly coded | ||||
| // between its maximum and minimum value. | // between its maximum and minimum value. | ||||
| @@ -505,10 +505,10 @@ static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape, | |||||
| 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(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype, | |||||
| float *out) | |||||
| static void dec_gain(TwinVQContext *tctx, GetBitContext *gb, | |||||
| enum TwinVQFrameType ftype, float *out) | |||||
| { | { | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| 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); | ||||
| @@ -553,10 +553,10 @@ static void rearrange_lsp(int order, float *lsp, float min_dist) | |||||
| } | } | ||||
| } | } | ||||
| static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, | |||||
| static void decode_lsp(TwinVQContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, | |||||
| int lpc_hist_idx, float *lsp, float *hist) | int lpc_hist_idx, float *lsp, float *hist) | ||||
| { | { | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| int i, j; | int i, j; | ||||
| const float *cb = mtab->lspcodebook; | const float *cb = mtab->lspcodebook; | ||||
| @@ -593,8 +593,8 @@ static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, | |||||
| ff_sort_nearly_sorted_floats(lsp, mtab->n_lsp); | ff_sort_nearly_sorted_floats(lsp, mtab->n_lsp); | ||||
| } | } | ||||
| static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp, | |||||
| enum FrameType ftype, float *lpc) | |||||
| static void dec_lpc_spectrum_inv(TwinVQContext *tctx, float *lsp, | |||||
| enum TwinVQFrameType ftype, float *lpc) | |||||
| { | { | ||||
| int i; | int i; | ||||
| int size = tctx->mtab->size / tctx->mtab->fmode[ftype].sub; | int size = tctx->mtab->size / tctx->mtab->fmode[ftype].sub; | ||||
| @@ -617,14 +617,14 @@ 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 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) | |||||
| static void imdct_and_window(TwinVQContext *tctx, enum TwinVQFrameType ftype, | |||||
| int wtype, float *in, float *prev, int ch) | |||||
| { | { | ||||
| 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; | |||||
| FFTContext *mdct = &tctx->mdct_ctx[ftype]; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| int bsize = mtab->size / mtab->fmode[ftype].sub; | |||||
| int size = mtab->size; | |||||
| float *buf1 = tctx->tmp_buf; | |||||
| int j, first_wsize, wsize; // Window size | int j, first_wsize, wsize; // Window size | ||||
| float *out = tctx->curr_frame + 2 * ch * mtab->size; | float *out = tctx->curr_frame + 2 * ch * mtab->size; | ||||
| float *out2 = out; | float *out2 = out; | ||||
| @@ -668,11 +668,11 @@ static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype, | |||||
| 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) | |||||
| static void imdct_output(TwinVQContext *tctx, enum TwinVQFrameType ftype, | |||||
| int wtype, float **out) | |||||
| { | { | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0]; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0]; | |||||
| int size1, size2, i; | int size1, size2, i; | ||||
| for (i = 0; i < tctx->avctx->channels; i++) | for (i = 0; i < tctx->avctx->channels; i++) | ||||
| @@ -699,10 +699,11 @@ static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype, | |||||
| } | } | ||||
| } | } | ||||
| static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist, | |||||
| int ch, float *out, float gain, enum FrameType ftype) | |||||
| static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist, | |||||
| int ch, float *out, float gain, | |||||
| enum TwinVQFrameType ftype) | |||||
| { | { | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| int i, j; | int i, j; | ||||
| float *hist = tctx->bark_hist[ftype][ch]; | float *hist = tctx->bark_hist[ftype][ch]; | ||||
| float val = ((const float []) { 0.4, 0.35, 0.28 })[ftype]; | float val = ((const float []) { 0.4, 0.35, 0.28 })[ftype]; | ||||
| @@ -726,13 +727,13 @@ static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist, | |||||
| } | } | ||||
| } | } | ||||
| static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, | |||||
| float *out, enum FrameType ftype) | |||||
| static void read_and_decode_spectrum(TwinVQContext *tctx, GetBitContext *gb, | |||||
| float *out, enum TwinVQFrameType ftype) | |||||
| { | { | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| int channels = tctx->avctx->channels; | |||||
| int sub = mtab->fmode[ftype].sub; | |||||
| int block_size = mtab->size / sub; | |||||
| const TwinVQModeTab *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]; | 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 bark1[CHANNELS_MAX][SUBBLOCKS_MAX][BARK_N_COEF_MAX]; | ||||
| @@ -812,19 +813,19 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, | |||||
| } | } | ||||
| } | } | ||||
| static int twin_decode_frame(AVCodecContext *avctx, void *data, | |||||
| int *got_frame_ptr, AVPacket *avpkt) | |||||
| static int twinvq_decode_frame(AVCodecContext *avctx, void *data, | |||||
| int *got_frame_ptr, AVPacket *avpkt) | |||||
| { | { | ||||
| AVFrame *frame = data; | AVFrame *frame = data; | ||||
| const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
| int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
| TwinContext *tctx = avctx->priv_data; | |||||
| TwinVQContext *tctx = avctx->priv_data; | |||||
| GetBitContext gb; | GetBitContext gb; | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| float **out = NULL; | |||||
| enum FrameType ftype; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| float **out = NULL; | |||||
| enum TwinVQFrameType ftype; | |||||
| int window_type, ret; | int window_type, ret; | ||||
| static const enum FrameType wtype_to_ftype_table[] = { | |||||
| static const enum TwinVQFrameType wtype_to_ftype_table[] = { | |||||
| FT_LONG, FT_LONG, FT_SHORT, FT_LONG, | FT_LONG, FT_LONG, FT_SHORT, FT_LONG, | ||||
| FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM | FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM | ||||
| }; | }; | ||||
| @@ -876,14 +877,14 @@ static int twin_decode_frame(AVCodecContext *avctx, void *data, | |||||
| /** | /** | ||||
| * Init IMDCT and windowing tables | * Init IMDCT and windowing tables | ||||
| */ | */ | ||||
| static av_cold int init_mdct_win(TwinContext *tctx) | |||||
| static av_cold int init_mdct_win(TwinVQContext *tctx) | |||||
| { | { | ||||
| int i, j, ret; | 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.0 : 1.0; | |||||
| const TwinVQModeTab *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.0 : 1.0; | |||||
| for (i = 0; i < 3; i++) { | 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; | ||||
| @@ -936,7 +937,7 @@ alloc_fail: | |||||
| static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks, | static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks, | ||||
| int block_size, | int block_size, | ||||
| const uint8_t line_len[2], int length_div, | const uint8_t line_len[2], int length_div, | ||||
| enum FrameType ftype) | |||||
| enum TwinVQFrameType ftype) | |||||
| { | { | ||||
| int i, j; | int i, j; | ||||
| @@ -993,11 +994,11 @@ static void linear_perm(int16_t *out, int16_t *in, int n_blocks, int size) | |||||
| out[i] = block_size * (in[i] % n_blocks) + in[i] / n_blocks; | 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(TwinVQContext *tctx, | |||||
| enum TwinVQFrameType ftype) | |||||
| { | { | ||||
| int block_size, size; | int block_size, size; | ||||
| const ModeTab *mtab = tctx->mtab; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| int16_t *tmp_perm = (int16_t *)tctx->tmp_buf; | int16_t *tmp_perm = (int16_t *)tctx->tmp_buf; | ||||
| if (ftype == FT_PPC) { | if (ftype == FT_PPC) { | ||||
| @@ -1019,12 +1020,12 @@ static av_cold void construct_perm_table(TwinContext *tctx, | |||||
| size * block_size); | size * block_size); | ||||
| } | } | ||||
| static av_cold void init_bitstream_params(TwinContext *tctx) | |||||
| static av_cold void init_bitstream_params(TwinVQContext *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; | |||||
| const TwinVQModeTab *mtab = tctx->mtab; | |||||
| 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 + | int lsp_bits_per_block = n_ch * (mtab->lsp_bit0 + mtab->lsp_bit1 + | ||||
| mtab->lsp_split * mtab->lsp_bit2); | mtab->lsp_split * mtab->lsp_bit2); | ||||
| @@ -1033,7 +1034,7 @@ static av_cold void init_bitstream_params(TwinContext *tctx) | |||||
| mtab->ppc_period_bit); | mtab->ppc_period_bit); | ||||
| int bsize_no_main_cb[3], bse_bits[3], i; | int bsize_no_main_cb[3], bse_bits[3], i; | ||||
| enum FrameType frametype; | |||||
| enum TwinVQFrameType frametype; | |||||
| for (i = 0; i < 3; i++) | for (i = 0; i < 3; i++) | ||||
| // +1 for history usage switch | // +1 for history usage switch | ||||
| @@ -1088,9 +1089,9 @@ static av_cold void init_bitstream_params(TwinContext *tctx) | |||||
| construct_perm_table(tctx, frametype); | construct_perm_table(tctx, frametype); | ||||
| } | } | ||||
| static av_cold int twin_decode_close(AVCodecContext *avctx) | |||||
| static av_cold int twinvq_decode_close(AVCodecContext *avctx) | |||||
| { | { | ||||
| TwinContext *tctx = avctx->priv_data; | |||||
| TwinVQContext *tctx = avctx->priv_data; | |||||
| int i; | int i; | ||||
| for (i = 0; i < 3; i++) { | for (i = 0; i < 3; i++) { | ||||
| @@ -1106,10 +1107,10 @@ static av_cold int twin_decode_close(AVCodecContext *avctx) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static av_cold int twin_decode_init(AVCodecContext *avctx) | |||||
| static av_cold int twinvq_decode_init(AVCodecContext *avctx) | |||||
| { | { | ||||
| int ret, isampf, ibps; | int ret, isampf, ibps; | ||||
| TwinContext *tctx = avctx->priv_data; | |||||
| TwinVQContext *tctx = avctx->priv_data; | |||||
| tctx->avctx = avctx; | tctx->avctx = avctx; | ||||
| avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; | avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; | ||||
| @@ -1189,7 +1190,7 @@ static av_cold int twin_decode_init(AVCodecContext *avctx) | |||||
| avpriv_float_dsp_init(&tctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); | avpriv_float_dsp_init(&tctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); | ||||
| if ((ret = init_mdct_win(tctx))) { | if ((ret = init_mdct_win(tctx))) { | ||||
| av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n"); | av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n"); | ||||
| twin_decode_close(avctx); | |||||
| twinvq_decode_close(avctx); | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| init_bitstream_params(tctx); | init_bitstream_params(tctx); | ||||
| @@ -1203,10 +1204,10 @@ AVCodec ff_twinvq_decoder = { | |||||
| .name = "twinvq", | .name = "twinvq", | ||||
| .type = AVMEDIA_TYPE_AUDIO, | .type = AVMEDIA_TYPE_AUDIO, | ||||
| .id = AV_CODEC_ID_TWINVQ, | .id = AV_CODEC_ID_TWINVQ, | ||||
| .priv_data_size = sizeof(TwinContext), | |||||
| .init = twin_decode_init, | |||||
| .close = twin_decode_close, | |||||
| .decode = twin_decode_frame, | |||||
| .priv_data_size = sizeof(TwinVQContext), | |||||
| .init = twinvq_decode_init, | |||||
| .close = twinvq_decode_close, | |||||
| .decode = twinvq_decode_frame, | |||||
| .capabilities = CODEC_CAP_DR1, | .capabilities = CODEC_CAP_DR1, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"), | .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"), | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, | .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, | ||||