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#include "internal.h" 33 34enum TwinVQCodec { 35 TWINVQ_CODEC_VQF, 36 TWINVQ_CODEC_METASOUND, 37}; 38 39enum TwinVQFrameType { 40 TWINVQ_FT_SHORT = 0, ///< Short frame (divided in n sub-blocks) 41 TWINVQ_FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks) 42 TWINVQ_FT_LONG, ///< Long frame (single sub-block + PPC) 43 TWINVQ_FT_PPC, ///< Periodic Peak Component (part of the long frame) 44}; 45 46#define TWINVQ_PPC_SHAPE_CB_SIZE 64 47#define TWINVQ_PPC_SHAPE_LEN_MAX 60 48#define TWINVQ_SUB_AMP_MAX 4500.0 49#define TWINVQ_MULAW_MU 100.0 50#define TWINVQ_GAIN_BITS 8 51#define TWINVQ_AMP_MAX 13000.0 52#define TWINVQ_SUB_GAIN_BITS 5 53#define TWINVQ_WINDOW_TYPE_BITS 4 54#define TWINVQ_PGAIN_MU 200 55#define TWINVQ_LSP_COEFS_MAX 20 56#define TWINVQ_LSP_SPLIT_MAX 4 57#define TWINVQ_CHANNELS_MAX 2 58#define TWINVQ_SUBBLOCKS_MAX 16 59#define TWINVQ_BARK_N_COEF_MAX 4 60 61#define TWINVQ_MAX_FRAMES_PER_PACKET 2 62 63/** 64 * Parameters and tables that are different for each frame type 65 */ 66struct TwinVQFrameMode { 67 uint8_t sub; ///< Number subblocks in each frame 68 const uint16_t *bark_tab; 69 70 /** number of distinct bark scale envelope values */ 71 uint8_t bark_env_size; 72 73 const int16_t *bark_cb; ///< codebook for the bark scale envelope (BSE) 74 uint8_t bark_n_coef;///< number of BSE CB coefficients to read 75 uint8_t bark_n_bit; ///< number of bits of the BSE coefs 76 77 //@{ 78 /** main codebooks for spectrum data */ 79 const int16_t *cb0; 80 const int16_t *cb1; 81 //@} 82 83 uint8_t cb_len_read; ///< number of spectrum coefficients to read 84}; 85 86typedef struct TwinVQFrameData { 87 int window_type; 88 enum TwinVQFrameType ftype; 89 90 uint8_t main_coeffs[1024]; 91 uint8_t ppc_coeffs[TWINVQ_PPC_SHAPE_LEN_MAX]; 92 93 uint8_t gain_bits[TWINVQ_CHANNELS_MAX]; 94 uint8_t sub_gain_bits[TWINVQ_CHANNELS_MAX * TWINVQ_SUBBLOCKS_MAX]; 95 96 uint8_t bark1[TWINVQ_CHANNELS_MAX][TWINVQ_SUBBLOCKS_MAX][TWINVQ_BARK_N_COEF_MAX]; 97 uint8_t bark_use_hist[TWINVQ_CHANNELS_MAX][TWINVQ_SUBBLOCKS_MAX]; 98 99 uint8_t lpc_idx1[TWINVQ_CHANNELS_MAX]; 100 uint8_t lpc_idx2[TWINVQ_CHANNELS_MAX][TWINVQ_LSP_SPLIT_MAX]; 101 uint8_t lpc_hist_idx[TWINVQ_CHANNELS_MAX]; 102 103 int p_coef[TWINVQ_CHANNELS_MAX]; 104 int g_coef[TWINVQ_CHANNELS_MAX]; 105} TwinVQFrameData; 106 107/** 108 * Parameters and tables that are different for every combination of 109 * bitrate/sample rate 110 */ 111typedef struct TwinVQModeTab { 112 struct TwinVQFrameMode fmode[3]; ///< frame type-dependant parameters 113 114 uint16_t size; ///< frame size in samples 115 uint8_t n_lsp; ///< number of lsp coefficients 116 const float *lspcodebook; 117 118 /* number of bits of the different LSP CB coefficients */ 119 uint8_t lsp_bit0; 120 uint8_t lsp_bit1; 121 uint8_t lsp_bit2; 122 123 uint8_t lsp_split; ///< number of CB entries for the LSP decoding 124 const int16_t *ppc_shape_cb; ///< PPC shape CB 125 126 /** number of the bits for the PPC period value */ 127 uint8_t ppc_period_bit; 128 129 uint8_t ppc_shape_bit; ///< number of bits of the PPC shape CB coeffs 130 uint8_t ppc_shape_len; ///< size of PPC shape CB 131 uint8_t pgain_bit; ///< bits for PPC gain 132 133 /** constant for peak period to peak width conversion */ 134 uint16_t peak_per2wid; 135} TwinVQModeTab; 136 137typedef struct TwinVQContext { 138 AVCodecContext *avctx; 139 AVFloatDSPContext fdsp; 140 FFTContext mdct_ctx[3]; 141 142 const TwinVQModeTab *mtab; 143 144 int is_6kbps; 145 146 // history 147 float lsp_hist[2][20]; ///< LSP coefficients of the last frame 148 float bark_hist[3][2][40]; ///< BSE coefficients of last frame 149 150 // bitstream parameters 151 int16_t permut[4][4096]; 152 uint8_t length[4][2]; ///< main codebook stride 153 uint8_t length_change[4]; 154 uint8_t bits_main_spec[2][4][2]; ///< bits for the main codebook 155 int bits_main_spec_change[4]; 156 int n_div[4]; 157 158 float *spectrum; 159 float *curr_frame; ///< non-interleaved output 160 float *prev_frame; ///< non-interleaved previous frame 161 int last_block_pos[2]; 162 int discarded_packets; 163 164 float *cos_tabs[3]; 165 166 // scratch buffers 167 float *tmp_buf; 168 169 int frame_size, frames_per_packet, cur_frame; 170 TwinVQFrameData bits[TWINVQ_MAX_FRAMES_PER_PACKET]; 171 172 enum TwinVQCodec codec; 173 174 int (*read_bitstream)(AVCodecContext *avctx, struct TwinVQContext *tctx, 175 const uint8_t *buf, int buf_size); 176 void (*dec_bark_env)(struct TwinVQContext *tctx, const uint8_t *in, 177 int use_hist, int ch, float *out, float gain, 178 enum TwinVQFrameType ftype); 179 void (*decode_ppc)(struct TwinVQContext *tctx, int period_coef, int g_coef, 180 const float *shape, float *speech); 181} TwinVQContext; 182 183extern const enum TwinVQFrameType ff_twinvq_wtype_to_ftype_table[]; 184 185/** @note not speed critical, hence not optimized */ 186static inline void twinvq_memset_float(float *buf, float val, int size) 187{ 188 while (size--) 189 *buf++ = val; 190} 191 192static inline float twinvq_mulawinv(float y, float clip, float mu) 193{ 194 y = av_clipf(y / clip, -1, 1); 195 return clip * FFSIGN(y) * (exp(log(1 + mu) * fabs(y)) - 1) / mu; 196} 197 198int ff_twinvq_decode_frame(AVCodecContext *avctx, void *data, 199 int *got_frame_ptr, AVPacket *avpkt); 200av_cold int ff_twinvq_decode_close(AVCodecContext *avctx); 201av_cold int ff_twinvq_decode_init(AVCodecContext *avctx); 202 203#endif /* AVCODEC_TWINVQ_DATA_H */ 204