1/* 2 * TwinVQ decoder 3 * Copyright (c) 2009 Vitor Sessak 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#ifndef AVCODEC_TWINVQ_H 23#define AVCODEC_TWINVQ_H 24 25#include <math.h> 26#include <stdint.h> 27 28#include "libavutil/common.h" 29#include "libavutil/float_dsp.h" 30#include "avcodec.h" 31#include "fft.h" 32 33enum TwinVQCodec { 34 TWINVQ_CODEC_VQF, 35 TWINVQ_CODEC_METASOUND, 36}; 37 38enum TwinVQFrameType { 39 TWINVQ_FT_SHORT = 0, ///< Short frame (divided in n sub-blocks) 40 TWINVQ_FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks) 41 TWINVQ_FT_LONG, ///< Long frame (single sub-block + PPC) 42 TWINVQ_FT_PPC, ///< Periodic Peak Component (part of the long frame) 43}; 44 45#define TWINVQ_PPC_SHAPE_CB_SIZE 64 46#define TWINVQ_PPC_SHAPE_LEN_MAX 60 47#define TWINVQ_SUB_AMP_MAX 4500.0 48#define TWINVQ_MULAW_MU 100.0 49#define TWINVQ_GAIN_BITS 8 50#define TWINVQ_AMP_MAX 13000.0 51#define TWINVQ_SUB_GAIN_BITS 5 52#define TWINVQ_WINDOW_TYPE_BITS 4 53#define TWINVQ_PGAIN_MU 200 54#define TWINVQ_LSP_COEFS_MAX 20 55#define TWINVQ_LSP_SPLIT_MAX 4 56#define TWINVQ_CHANNELS_MAX 2 57#define TWINVQ_SUBBLOCKS_MAX 16 58#define TWINVQ_BARK_N_COEF_MAX 4 59 60#define TWINVQ_MAX_FRAMES_PER_PACKET 2 61 62/** 63 * Parameters and tables that are different for each frame type 64 */ 65struct TwinVQFrameMode { 66 uint8_t sub; ///< Number subblocks in each frame 67 const uint16_t *bark_tab; 68 69 /** number of distinct bark scale envelope values */ 70 uint8_t bark_env_size; 71 72 const int16_t *bark_cb; ///< codebook for the bark scale envelope (BSE) 73 uint8_t bark_n_coef;///< number of BSE CB coefficients to read 74 uint8_t bark_n_bit; ///< number of bits of the BSE coefs 75 76 //@{ 77 /** main codebooks for spectrum data */ 78 const int16_t *cb0; 79 const int16_t *cb1; 80 //@} 81 82 uint8_t cb_len_read; ///< number of spectrum coefficients to read 83}; 84 85typedef struct TwinVQFrameData { 86 int window_type; 87 enum TwinVQFrameType ftype; 88 89 uint8_t main_coeffs[1024]; 90 uint8_t ppc_coeffs[TWINVQ_PPC_SHAPE_LEN_MAX]; 91 92 uint8_t gain_bits[TWINVQ_CHANNELS_MAX]; 93 uint8_t sub_gain_bits[TWINVQ_CHANNELS_MAX * TWINVQ_SUBBLOCKS_MAX]; 94 95 uint8_t bark1[TWINVQ_CHANNELS_MAX][TWINVQ_SUBBLOCKS_MAX][TWINVQ_BARK_N_COEF_MAX]; 96 uint8_t bark_use_hist[TWINVQ_CHANNELS_MAX][TWINVQ_SUBBLOCKS_MAX]; 97 98 uint8_t lpc_idx1[TWINVQ_CHANNELS_MAX]; 99 uint8_t lpc_idx2[TWINVQ_CHANNELS_MAX][TWINVQ_LSP_SPLIT_MAX]; 100 uint8_t lpc_hist_idx[TWINVQ_CHANNELS_MAX]; 101 102 int p_coef[TWINVQ_CHANNELS_MAX]; 103 int g_coef[TWINVQ_CHANNELS_MAX]; 104} TwinVQFrameData; 105 106/** 107 * Parameters and tables that are different for every combination of 108 * bitrate/sample rate 109 */ 110typedef struct TwinVQModeTab { 111 struct TwinVQFrameMode fmode[3]; ///< frame type-dependent parameters 112 113 uint16_t size; ///< frame size in samples 114 uint8_t n_lsp; ///< number of lsp coefficients 115 const float *lspcodebook; 116 117 /* number of bits of the different LSP CB coefficients */ 118 uint8_t lsp_bit0; 119 uint8_t lsp_bit1; 120 uint8_t lsp_bit2; 121 122 uint8_t lsp_split; ///< number of CB entries for the LSP decoding 123 const int16_t *ppc_shape_cb; ///< PPC shape CB 124 125 /** number of the bits for the PPC period value */ 126 uint8_t ppc_period_bit; 127 128 uint8_t ppc_shape_bit; ///< number of bits of the PPC shape CB coeffs 129 uint8_t ppc_shape_len; ///< size of PPC shape CB 130 uint8_t pgain_bit; ///< bits for PPC gain 131 132 /** constant for peak period to peak width conversion */ 133 uint16_t peak_per2wid; 134} TwinVQModeTab; 135 136typedef struct TwinVQContext { 137 AVCodecContext *avctx; 138 AVFloatDSPContext *fdsp; 139 FFTContext mdct_ctx[3]; 140 141 const TwinVQModeTab *mtab; 142 143 int is_6kbps; 144 145 // history 146 float lsp_hist[2][20]; ///< LSP coefficients of the last frame 147 float bark_hist[3][2][40]; ///< BSE coefficients of last frame 148 149 // bitstream parameters 150 int16_t permut[4][4096]; 151 uint8_t length[4][2]; ///< main codebook stride 152 uint8_t length_change[4]; 153 uint8_t bits_main_spec[2][4][2]; ///< bits for the main codebook 154 int bits_main_spec_change[4]; 155 int n_div[4]; 156 157 float *spectrum; 158 float *curr_frame; ///< non-interleaved output 159 float *prev_frame; ///< non-interleaved previous frame 160 int last_block_pos[2]; 161 int discarded_packets; 162 163 float *cos_tabs[3]; 164 165 // scratch buffers 166 float *tmp_buf; 167 168 int frame_size, frames_per_packet, cur_frame; 169 TwinVQFrameData bits[TWINVQ_MAX_FRAMES_PER_PACKET]; 170 171 enum TwinVQCodec codec; 172 173 int (*read_bitstream)(AVCodecContext *avctx, struct TwinVQContext *tctx, 174 const uint8_t *buf, int buf_size); 175 void (*dec_bark_env)(struct TwinVQContext *tctx, const uint8_t *in, 176 int use_hist, int ch, float *out, float gain, 177 enum TwinVQFrameType ftype); 178 void (*decode_ppc)(struct TwinVQContext *tctx, int period_coef, int g_coef, 179 const float *shape, float *speech); 180} TwinVQContext; 181 182extern const enum TwinVQFrameType ff_twinvq_wtype_to_ftype_table[]; 183 184/** @note not speed critical, hence not optimized */ 185static inline void twinvq_memset_float(float *buf, float val, int size) 186{ 187 while (size--) 188 *buf++ = val; 189} 190 191static inline float twinvq_mulawinv(float y, float clip, float mu) 192{ 193 y = av_clipf(y / clip, -1, 1); 194 return clip * FFSIGN(y) * (exp(log(1 + mu) * fabs(y)) - 1) / mu; 195} 196 197int ff_twinvq_decode_frame(AVCodecContext *avctx, AVFrame *frame, 198 int *got_frame_ptr, AVPacket *avpkt); 199int ff_twinvq_decode_close(AVCodecContext *avctx); 200/** Requires the caller to call ff_twinvq_decode_close() upon failure. */ 201int ff_twinvq_decode_init(AVCodecContext *avctx); 202 203#endif /* AVCODEC_TWINVQ_H */ 204