FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
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
28
#include "
libavutil/common.h
"
29
#include "
libavutil/float_dsp.h
"
30
#include "
avcodec.h
"
31
#include "
fft.h
"
32
#include "
internal.h
"
33
34
enum
TwinVQCodec
{
35
TWINVQ_CODEC_VQF
,
36
TWINVQ_CODEC_METASOUND
,
37
};
38
39
enum
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
*/
66
struct
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
86
typedef
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
*/
111
typedef
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
137
typedef
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
183
extern
const
enum
TwinVQFrameType
ff_twinvq_wtype_to_ftype_table
[];
184
185
/** @note not speed critical, hence not optimized */
186
static
inline
void
twinvq_memset_float
(
float
*
buf
,
float
val
,
int
size
)
187
{
188
while
(size--)
189
*buf++ =
val
;
190
}
191
192
static
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
198
int
ff_twinvq_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
199
int
*got_frame_ptr,
AVPacket
*avpkt);
200
av_cold
int
ff_twinvq_decode_close
(
AVCodecContext
*
avctx
);
201
av_cold
int
ff_twinvq_decode_init
(
AVCodecContext
*
avctx
);
202
203
#endif
/* AVCODEC_TWINVQ_DATA_H */
Generated on Sun Mar 23 2014 23:50:03 for FFmpeg by
1.8.2