FFmpeg
twinvq.h
Go to the documentation of this file.
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 
29 #include "libavutil/tx.h"
30 #include "libavutil/common.h"
31 #include "libavutil/float_dsp.h"
32 #include "avcodec.h"
33 
37 };
38 
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  */
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 
86 typedef struct TwinVQFrameData {
89 
90  uint8_t main_coeffs[1024];
92 
95 
98 
102 
106 
107 /**
108  * Parameters and tables that are different for every combination of
109  * bitrate/sample rate
110  */
111 typedef struct TwinVQModeTab {
112  struct TwinVQFrameMode fmode[3]; ///< frame type-dependent 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 
137 typedef struct TwinVQContext {
142 
144 
145  int is_6kbps;
146 
147  // history
148  float lsp_hist[2][20]; ///< LSP coefficients of the last frame
149  float bark_hist[3][2][40]; ///< BSE coefficients of last frame
150 
151  // bitstream parameters
152  int16_t permut[4][4096];
153  uint8_t length[4][2]; ///< main codebook stride
154  uint8_t length_change[4];
155  uint8_t bits_main_spec[2][4][2]; ///< bits for the main codebook
157  int n_div[4];
158 
159  float *spectrum;
160  float *curr_frame; ///< non-interleaved output
161  float *prev_frame; ///< non-interleaved previous frame
164 
165  float *cos_tabs[3];
166 
167  // scratch buffers
168  float *tmp_buf;
169 
172 
174 
176  const uint8_t *buf, int buf_size);
177  void (*dec_bark_env)(struct TwinVQContext *tctx, const uint8_t *in,
178  int use_hist, int ch, float *out, float gain,
179  enum TwinVQFrameType ftype);
180  void (*decode_ppc)(struct TwinVQContext *tctx, int period_coef, int g_coef,
181  const float *shape, float *speech);
182 } TwinVQContext;
183 
186 
187 extern const float ff_metasound_lsp8[];
188 extern const float ff_metasound_lsp11[];
189 extern const float ff_metasound_lsp16[];
190 extern const float ff_metasound_lsp22[];
191 extern const float ff_metasound_lsp44[];
192 
193 /** @note not speed critical, hence not optimized */
194 static inline void twinvq_memset_float(float *buf, float val, int size)
195 {
196  while (size--)
197  *buf++ = val;
198 }
199 
200 static inline float twinvq_mulawinv(float y, float clip, float mu)
201 {
202  y = av_clipf(y / clip, -1, 1);
203  return clip * FFSIGN(y) * (exp(log(1 + mu) * fabs(y)) - 1) / mu;
204 }
205 
207  int *got_frame_ptr, AVPacket *avpkt);
209 /** Requires the caller to call ff_twinvq_decode_close() upon failure. */
212 
213 #endif /* AVCODEC_TWINVQ_H */
TwinVQModeTab::lspcodebook
const float * lspcodebook
Definition: twinvq.h:116
FF_VISIBILITY_PUSH_HIDDEN
#define FF_VISIBILITY_PUSH_HIDDEN
Definition: attributes_internal.h:30
TwinVQContext::mtab
const TwinVQModeTab * mtab
Definition: twinvq.h:143
TwinVQFrameMode::sub
uint8_t sub
Number subblocks in each frame.
Definition: twinvq.h:67
out
FILE * out
Definition: movenc.c:54
TwinVQContext::bits_main_spec
uint8_t bits_main_spec[2][4][2]
bits for the main codebook
Definition: twinvq.h:155
TwinVQFrameData::bark1
uint8_t bark1[TWINVQ_CHANNELS_MAX][TWINVQ_SUBBLOCKS_MAX][TWINVQ_BARK_N_COEF_MAX]
Definition: twinvq.h:96
TwinVQFrameData::lpc_idx2
uint8_t lpc_idx2[TWINVQ_CHANNELS_MAX][TWINVQ_LSP_SPLIT_MAX]
Definition: twinvq.h:100
TwinVQContext::tmp_buf
float * tmp_buf
Definition: twinvq.h:168
TwinVQContext::curr_frame
float * curr_frame
non-interleaved output
Definition: twinvq.h:160
AVTXContext
Definition: tx_priv.h:228
TwinVQFrameData::bark_use_hist
uint8_t bark_use_hist[TWINVQ_CHANNELS_MAX][TWINVQ_SUBBLOCKS_MAX]
Definition: twinvq.h:97
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:330
TwinVQContext::bits
TwinVQFrameData bits[TWINVQ_MAX_FRAMES_PER_PACKET]
Definition: twinvq.h:171
TwinVQModeTab::ppc_shape_len
uint8_t ppc_shape_len
size of PPC shape CB
Definition: twinvq.h:130
TwinVQModeTab::lsp_bit1
uint8_t lsp_bit1
Definition: twinvq.h:120
TwinVQContext::permut
int16_t permut[4][4096]
Definition: twinvq.h:152
TwinVQModeTab::pgain_bit
uint8_t pgain_bit
bits for PPC gain
Definition: twinvq.h:131
TWINVQ_CODEC_VQF
@ TWINVQ_CODEC_VQF
Definition: twinvq.h:35
TwinVQFrameData::ppc_coeffs
uint8_t ppc_coeffs[TWINVQ_PPC_SHAPE_LEN_MAX]
Definition: twinvq.h:91
TwinVQFrameMode::cb0
const int16_t * cb0
main codebooks for spectrum data
Definition: twinvq.h:79
TwinVQContext::last_block_pos
int last_block_pos[2]
Definition: twinvq.h:162
TwinVQFrameMode::cb1
const int16_t * cb1
Definition: twinvq.h:80
TwinVQFrameMode::bark_n_coef
uint8_t bark_n_coef
number of BSE CB coefficients to read
Definition: twinvq.h:74
TwinVQFrameType
TwinVQFrameType
Definition: twinvq.h:39
FFSIGN
#define FFSIGN(a)
Definition: common.h:65
ff_metasound_lsp16
const float ff_metasound_lsp16[]
Definition: metasound_twinvq_data.h:260
ff_metasound_lsp22
const float ff_metasound_lsp22[]
Definition: metasound_twinvq_data.h:439
TwinVQFrameData::sub_gain_bits
uint8_t sub_gain_bits[TWINVQ_CHANNELS_MAX *TWINVQ_SUBBLOCKS_MAX]
Definition: twinvq.h:94
val
static double val(void *priv, double ch)
Definition: aeval.c:77
TwinVQModeTab::size
uint16_t size
frame size in samples
Definition: twinvq.h:114
twinvq_mulawinv
static float twinvq_mulawinv(float y, float clip, float mu)
Definition: twinvq.h:200
TwinVQContext::dec_bark_env
void(* dec_bark_env)(struct TwinVQContext *tctx, const uint8_t *in, int use_hist, int ch, float *out, float gain, enum TwinVQFrameType ftype)
Definition: twinvq.h:177
TwinVQContext::n_div
int n_div[4]
Definition: twinvq.h:157
TwinVQContext::decode_ppc
void(* decode_ppc)(struct TwinVQContext *tctx, int period_coef, int g_coef, const float *shape, float *speech)
Definition: twinvq.h:180
ftype
#define ftype
Definition: afir_template.c:45
TwinVQContext::fdsp
AVFloatDSPContext * fdsp
Definition: twinvq.h:139
TwinVQFrameData::g_coef
int g_coef[TWINVQ_CHANNELS_MAX]
Definition: twinvq.h:104
ff_twinvq_decode_init
int ff_twinvq_decode_init(AVCodecContext *avctx)
Requires the caller to call ff_twinvq_decode_close() upon failure.
Definition: twinvq.c:763
av_tx_fn
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition: tx.h:127
TwinVQContext::lsp_hist
float lsp_hist[2][20]
LSP coefficients of the last frame.
Definition: twinvq.h:148
clip
clip
Definition: af_crystalizer.c:122
TwinVQModeTab::ppc_shape_bit
uint8_t ppc_shape_bit
number of bits of the PPC shape CB coeffs
Definition: twinvq.h:129
TwinVQFrameData::lpc_idx1
uint8_t lpc_idx1[TWINVQ_CHANNELS_MAX]
Definition: twinvq.h:99
attributes_internal.h
TWINVQ_BARK_N_COEF_MAX
#define TWINVQ_BARK_N_COEF_MAX
Definition: twinvq.h:59
TwinVQContext::codec
enum TwinVQCodec codec
Definition: twinvq.h:173
TwinVQContext::length_change
uint8_t length_change[4]
Definition: twinvq.h:154
TwinVQFrameData::lpc_hist_idx
uint8_t lpc_hist_idx[TWINVQ_CHANNELS_MAX]
Definition: twinvq.h:101
ff_twinvq_decode_frame
int ff_twinvq_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: twinvq.c:479
TWINVQ_FT_MEDIUM
@ TWINVQ_FT_MEDIUM
Medium frame (divided in m<n sub-blocks)
Definition: twinvq.h:41
TwinVQFrameMode
Parameters and tables that are different for each frame type.
Definition: twinvq.h:66
TwinVQModeTab
Parameters and tables that are different for every combination of bitrate/sample rate.
Definition: twinvq.h:111
TwinVQModeTab::lsp_bit2
uint8_t lsp_bit2
Definition: twinvq.h:121
TwinVQFrameMode::bark_tab
const uint16_t * bark_tab
Definition: twinvq.h:68
twinvq_memset_float
static void twinvq_memset_float(float *buf, float val, int size)
Definition: twinvq.h:194
TwinVQContext::prev_frame
float * prev_frame
non-interleaved previous frame
Definition: twinvq.h:161
TWINVQ_FT_PPC
@ TWINVQ_FT_PPC
Periodic Peak Component (part of the long frame)
Definition: twinvq.h:43
TwinVQFrameMode::bark_cb
const int16_t * bark_cb
codebook for the bark scale envelope (BSE)
Definition: twinvq.h:73
TwinVQContext::length
uint8_t length[4][2]
main codebook stride
Definition: twinvq.h:153
TwinVQFrameData::gain_bits
uint8_t gain_bits[TWINVQ_CHANNELS_MAX]
Definition: twinvq.h:93
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
av_clipf
av_clipf
Definition: af_crystalizer.c:122
TwinVQContext::is_6kbps
int is_6kbps
Definition: twinvq.h:145
exp
int8_t exp
Definition: eval.c:72
float_dsp.h
TwinVQFrameData::main_coeffs
uint8_t main_coeffs[1024]
Definition: twinvq.h:90
TwinVQContext::avctx
AVCodecContext * avctx
Definition: twinvq.h:138
TwinVQModeTab::lsp_bit0
uint8_t lsp_bit0
Definition: twinvq.h:119
TWINVQ_FT_LONG
@ TWINVQ_FT_LONG
Long frame (single sub-block + PPC)
Definition: twinvq.h:42
ff_metasound_lsp44
const float ff_metasound_lsp44[]
Definition: metasound_twinvq_data.h:606
TwinVQFrameMode::bark_n_bit
uint8_t bark_n_bit
number of bits of the BSE coefs
Definition: twinvq.h:75
size
int size
Definition: twinvq_data.h:10344
TwinVQModeTab::ppc_period_bit
uint8_t ppc_period_bit
number of the bits for the PPC period value
Definition: twinvq.h:127
TwinVQContext::bits_main_spec_change
int bits_main_spec_change[4]
Definition: twinvq.h:156
TWINVQ_PPC_SHAPE_LEN_MAX
#define TWINVQ_PPC_SHAPE_LEN_MAX
Definition: twinvq.h:47
TWINVQ_CHANNELS_MAX
#define TWINVQ_CHANNELS_MAX
Definition: twinvq.h:57
TwinVQModeTab::ppc_shape_cb
const int16_t * ppc_shape_cb
PPC shape CB.
Definition: twinvq.h:124
AVFloatDSPContext
Definition: float_dsp.h:24
TwinVQModeTab::peak_per2wid
uint16_t peak_per2wid
constant for peak period to peak width conversion
Definition: twinvq.h:134
FF_VISIBILITY_POP_HIDDEN
#define FF_VISIBILITY_POP_HIDDEN
Definition: attributes_internal.h:31
TwinVQContext::read_bitstream
int(* read_bitstream)(AVCodecContext *avctx, struct TwinVQContext *tctx, const uint8_t *buf, int buf_size)
Definition: twinvq.h:175
TwinVQContext::discarded_packets
int discarded_packets
Definition: twinvq.h:163
TWINVQ_CODEC_METASOUND
@ TWINVQ_CODEC_METASOUND
Definition: twinvq.h:36
TwinVQContext::frame_size
int frame_size
Definition: twinvq.h:170
TwinVQContext::bark_hist
float bark_hist[3][2][40]
BSE coefficients of last frame.
Definition: twinvq.h:149
TwinVQFrameData
Definition: twinvq.h:86
common.h
TwinVQContext::cos_tabs
float * cos_tabs[3]
Definition: twinvq.h:165
ff_twinvq_decode_close
int ff_twinvq_decode_close(AVCodecContext *avctx)
Definition: twinvq.c:744
ff_metasound_lsp8
const float ff_metasound_lsp8[]
Definition: metasound_twinvq_data.h:27
avcodec.h
TwinVQContext::cur_frame
int cur_frame
Definition: twinvq.h:170
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
TwinVQContext::tx_fn
av_tx_fn tx_fn[3]
Definition: twinvq.h:141
TWINVQ_FT_SHORT
@ TWINVQ_FT_SHORT
Short frame (divided in n sub-blocks)
Definition: twinvq.h:40
AVCodecContext
main external API structure.
Definition: avcodec.h:426
ff_metasound_lsp11
const float ff_metasound_lsp11[]
Definition: metasound_twinvq_data.h:93
TwinVQFrameMode::cb_len_read
uint8_t cb_len_read
number of spectrum coefficients to read
Definition: twinvq.h:83
TwinVQFrameData::ftype
enum TwinVQFrameType ftype
Definition: twinvq.h:88
ff_twinvq_wtype_to_ftype_table
FF_VISIBILITY_PUSH_HIDDEN enum TwinVQFrameType ff_twinvq_wtype_to_ftype_table[]
Definition: twinvq.c:473
TwinVQContext::tx
AVTXContext * tx[3]
Definition: twinvq.h:140
TwinVQContext::frames_per_packet
int frames_per_packet
Definition: twinvq.h:170
AVPacket
This structure stores compressed data.
Definition: packet.h:351
TWINVQ_SUBBLOCKS_MAX
#define TWINVQ_SUBBLOCKS_MAX
Definition: twinvq.h:58
TwinVQContext::spectrum
float * spectrum
Definition: twinvq.h:159
TwinVQFrameData::window_type
int window_type
Definition: twinvq.h:87
TWINVQ_MAX_FRAMES_PER_PACKET
#define TWINVQ_MAX_FRAMES_PER_PACKET
Definition: twinvq.h:61
TwinVQFrameData::p_coef
int p_coef[TWINVQ_CHANNELS_MAX]
Definition: twinvq.h:103
TwinVQContext
Definition: twinvq.h:137
TWINVQ_LSP_SPLIT_MAX
#define TWINVQ_LSP_SPLIT_MAX
Definition: twinvq.h:56
int
int
Definition: ffmpeg_filter.c:156
TwinVQModeTab::lsp_split
uint8_t lsp_split
number of CB entries for the LSP decoding
Definition: twinvq.h:123
TwinVQModeTab::fmode
struct TwinVQFrameMode fmode[3]
frame type-dependent parameters
Definition: twinvq.h:112
TwinVQFrameMode::bark_env_size
uint8_t bark_env_size
number of distinct bark scale envelope values
Definition: twinvq.h:71
tx.h
TwinVQModeTab::n_lsp
uint8_t n_lsp
number of lsp coefficients
Definition: twinvq.h:115
TwinVQCodec
TwinVQCodec
Definition: twinvq.h:34