X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftwinvq.c;h=86c81a1b0f6be7ca169d74d046f94fafd4b14f1a;hb=94d47382e0558d05e4ba2dd2e3717405d2a703ad;hp=02129eb0d3da28872ee3603aee90c055e872d08d;hpb=bf8202f35246bde7faef1f958d9df7a4d59f5249;p=ffmpeg diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c index 02129eb0d3d..86c81a1b0f6 100644 --- a/libavcodec/twinvq.c +++ b/libavcodec/twinvq.c @@ -2,26 +2,29 @@ * TwinVQ decoder * Copyright (c) 2009 Vitor Sessak * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avcodec.h" #include "get_bits.h" #include "dsputil.h" +#include "fft.h" +#include "lsp.h" +#include "sinewin.h" #include #include @@ -172,7 +175,7 @@ static const ModeTab mode_44_48 = { typedef struct TwinContext { AVCodecContext *avctx; DSPContext dsp; - MDCTContext mdct_ctx[3]; + FFTContext mdct_ctx[3]; const ModeTab *mtab; @@ -200,6 +203,7 @@ typedef struct TwinContext { } TwinContext; #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 @@ -207,6 +211,11 @@ typedef struct TwinContext { #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 */ static void memset_float(float *buf, float val, int size) @@ -225,7 +234,7 @@ static void memset_float(float *buf, float val, int size) * be a multiple of four. * @return the LPC value * - * @todo reuse code from vorbis_dec.c: vorbis_floor0_decode + * @todo reuse code from Vorbis decoder: vorbis_floor0_decode */ static float eval_lpc_spectrum(const float *lsp, float cos_val, int order) { @@ -250,7 +259,7 @@ static float eval_lpc_spectrum(const float *lsp, float cos_val, int order) } /** - * Evaluates 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) { @@ -283,7 +292,7 @@ static inline float get_cos(int idx, int part, const float *cos_tab, int size) } /** - * Evaluates the LPC amplitude spectrum envelope from the line spectrum pairs. + * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs. * Probably for speed reasons, the coefficients are evaluated as * siiiibiiiisiiiibiiiisiiiibiiiisiiiibiiiis ... * where s is an evaluated value, i is a value interpolated from the others @@ -402,7 +411,7 @@ static inline float mulawinv(float y, float clip, float mu) * 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 + * @code * static int very_broken_op(int a, int b) * { * static float test; // Ugh, force gcc to do the division first... @@ -410,7 +419,7 @@ static inline float mulawinv(float y, float clip, float mu) * test = a/400.; * return b * test + 0.5; * } - * \endcode + * @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 @@ -536,17 +545,6 @@ static void rearrange_lsp(int order, float *lsp, float min_dist) } } -static void bubblesort(float *lsp, int lp_order) -{ - int i,j; - - /* sort lsp in ascending order. float bubble agorithm, - O(n) if data already sorted, O(n^2) - otherwise */ - for (i = 0; i < lp_order - 1; i++) - for (j = i; j >= 0 && lsp[j] > lsp[j+1]; j--) - FFSWAP(float, lsp[j], lsp[j+1]); -} - static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, int lpc_hist_idx, float *lsp, float *hist) { @@ -583,7 +581,7 @@ static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, rearrange_lsp(mtab->n_lsp, lsp, 0.0001); rearrange_lsp(mtab->n_lsp, lsp, 0.000095); - bubblesort(lsp, mtab->n_lsp); + ff_sort_nearly_sorted_floats(lsp, mtab->n_lsp); } static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp, @@ -611,6 +609,7 @@ static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp, static void imdct_and_window(TwinContext *tctx, enum FrameType 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; @@ -643,13 +642,12 @@ static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype, wsize = types_sizes[wtype_to_wsize[sub_wtype]]; - ff_imdct_half(&tctx->mdct_ctx[ftype], buf1 + bsize*j, in + bsize*j); + mdct->imdct_half(mdct, buf1 + bsize*j, in + bsize*j); tctx->dsp.vector_fmul_window(out2, prev_buf + (bsize-wsize)/2, buf1 + bsize*j, - ff_sine_windows[av_log2(wsize) - 7], - 0.0, + ff_sine_windows[av_log2(wsize)], wsize/2); out2 += wsize; @@ -736,14 +734,14 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, int channels = tctx->avctx->channels; int sub = mtab->fmode[ftype].sub; int block_size = mtab->size / sub; - float gain[channels*sub]; - float ppc_shape[mtab->ppc_shape_len * channels * 4]; - uint8_t bark1[channels][sub][mtab->fmode[ftype].bark_n_coef]; - uint8_t bark_use_hist[channels][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]; - uint8_t lpc_idx1[channels]; - uint8_t lpc_idx2[channels][tctx->mtab->lsp_split]; - uint8_t lpc_hist_idx[channels]; + 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; @@ -780,13 +778,13 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, for (i = 0; i < channels; i++) { float *chunk = out + mtab->size * i; - float lsp[tctx->mtab->n_lsp]; + float lsp[LSP_COEFS_MAX]; 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->dsp.vector_fmul(chunk + block_size*j, tctx->tmp_buf, + tctx->dsp.vector_fmul(chunk + block_size*j, chunk + block_size*j, tctx->tmp_buf, block_size); } @@ -808,7 +806,7 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf); for (j = 0; j < mtab->fmode[ftype].sub; j++) { - tctx->dsp.vector_fmul(chunk, tctx->tmp_buf, block_size); + tctx->dsp.vector_fmul(chunk, chunk, tctx->tmp_buf, block_size); chunk += block_size; } } @@ -859,9 +857,6 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data, return buf_size; } - tctx->dsp.vector_clipf(out, out, -32700./(1<<15), 32700./(1<<15), - avctx->channels * mtab->size); - *data_size = mtab->size*avctx->channels*4; return buf_size; @@ -903,9 +898,9 @@ static av_cold void init_mdct_win(TwinContext *tctx) } - ff_sine_window_init(ff_sine_windows[av_log2(size_m) - 7], size_m ); - ff_sine_window_init(ff_sine_windows[av_log2(size_s/2) - 7], size_s/2); - ff_sine_window_init(ff_sine_windows[av_log2(mtab->size) - 7], mtab->size); + 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(mtab->size)); } /** @@ -943,14 +938,14 @@ static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks, /** * Interpret the input data as in the following table: * - * \verbatim + * @verbatim * * abcdefgh * ijklmnop * qrstuvw * x123456 * - * \endverbatim + * @endverbatim * * and transpose it, giving the output * aiqxbjr1cks2dlt3emu4fvn5gow6hp @@ -1014,6 +1009,7 @@ static av_cold void init_bitstream_params(TwinContext *tctx) int bsize_no_main_cb[3]; int bse_bits[3]; int i; + enum FrameType frametype; for (i = 0; i < 3; i++) // +1 for history usage switch @@ -1062,8 +1058,8 @@ static av_cold void init_bitstream_params(TwinContext *tctx) tctx->length_change[i] = num_rounded_up; } - for (i = 0; i < 4; i++) - construct_perm_table(tctx, i); + for (frametype = FT_SHORT; frametype <= FT_PPC; frametype++) + construct_perm_table(tctx, frametype); } static av_cold int twin_decode_init(AVCodecContext *avctx) @@ -1073,9 +1069,9 @@ static av_cold int twin_decode_init(AVCodecContext *avctx) int ibps = avctx->bit_rate/(1000 * avctx->channels); tctx->avctx = avctx; - avctx->sample_fmt = SAMPLE_FMT_FLT; + avctx->sample_fmt = AV_SAMPLE_FMT_FLT; - if (avctx->channels > 2) { + if (avctx->channels > CHANNELS_MAX) { av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n", avctx->channels); return -1; @@ -1124,10 +1120,10 @@ static av_cold int twin_decode_close(AVCodecContext *avctx) return 0; } -AVCodec twinvq_decoder = +AVCodec ff_twinvq_decoder = { "twinvq", - CODEC_TYPE_AUDIO, + AVMEDIA_TYPE_AUDIO, CODEC_ID_TWINVQ, sizeof(TwinContext), twin_decode_init,