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
/**
62
* Parameters and tables that are different for each frame type
63
*/
64
struct
TwinVQFrameMode
{
65
uint8_t
sub
;
///< Number subblocks in each frame
66
const
uint16_t *
bark_tab
;
67
68
/** number of distinct bark scale envelope values */
69
uint8_t
bark_env_size
;
70
71
const
int16_t *
bark_cb
;
///< codebook for the bark scale envelope (BSE)
72
uint8_t
bark_n_coef
;
///< number of BSE CB coefficients to read
73
uint8_t
bark_n_bit
;
///< number of bits of the BSE coefs
74
75
//@{
76
/** main codebooks for spectrum data */
77
const
int16_t *
cb0
;
78
const
int16_t *
cb1
;
79
//@}
80
81
uint8_t
cb_len_read
;
///< number of spectrum coefficients to read
82
};
83
84
typedef
struct
TwinVQFrameData
{
85
int
window_type
;
86
enum
TwinVQFrameType
ftype
;
87
88
uint8_t
main_coeffs
[1024];
89
uint8_t
ppc_coeffs
[
TWINVQ_PPC_SHAPE_LEN_MAX
];
90
91
uint8_t
gain_bits
[
TWINVQ_CHANNELS_MAX
];
92
uint8_t
sub_gain_bits
[
TWINVQ_CHANNELS_MAX
*
TWINVQ_SUBBLOCKS_MAX
];
93
94
uint8_t
bark1
[
TWINVQ_CHANNELS_MAX
][
TWINVQ_SUBBLOCKS_MAX
][
TWINVQ_BARK_N_COEF_MAX
];
95
uint8_t
bark_use_hist
[
TWINVQ_CHANNELS_MAX
][
TWINVQ_SUBBLOCKS_MAX
];
96
97
uint8_t
lpc_idx1
[
TWINVQ_CHANNELS_MAX
];
98
uint8_t
lpc_idx2
[
TWINVQ_CHANNELS_MAX
][
TWINVQ_LSP_SPLIT_MAX
];
99
uint8_t
lpc_hist_idx
[
TWINVQ_CHANNELS_MAX
];
100
101
int
p_coef
[
TWINVQ_CHANNELS_MAX
];
102
int
g_coef
[
TWINVQ_CHANNELS_MAX
];
103
}
TwinVQFrameData
;
104
105
/**
106
* Parameters and tables that are different for every combination of
107
* bitrate/sample rate
108
*/
109
typedef
struct
TwinVQModeTab
{
110
struct
TwinVQFrameMode
fmode
[3];
///< frame type-dependant parameters
111
112
uint16_t
size
;
///< frame size in samples
113
uint8_t
n_lsp
;
///< number of lsp coefficients
114
const
float
*
lspcodebook
;
115
116
/* number of bits of the different LSP CB coefficients */
117
uint8_t
lsp_bit0
;
118
uint8_t
lsp_bit1
;
119
uint8_t
lsp_bit2
;
120
121
uint8_t
lsp_split
;
///< number of CB entries for the LSP decoding
122
const
int16_t *
ppc_shape_cb
;
///< PPC shape CB
123
124
/** number of the bits for the PPC period value */
125
uint8_t
ppc_period_bit
;
126
127
uint8_t
ppc_shape_bit
;
///< number of bits of the PPC shape CB coeffs
128
uint8_t
ppc_shape_len
;
///< size of PPC shape CB
129
uint8_t
pgain_bit
;
///< bits for PPC gain
130
131
/** constant for peak period to peak width conversion */
132
uint16_t
peak_per2wid
;
133
}
TwinVQModeTab
;
134
135
typedef
struct
TwinVQContext
{
136
AVCodecContext
*
avctx
;
137
AVFloatDSPContext
fdsp
;
138
FFTContext
mdct_ctx
[3];
139
140
const
TwinVQModeTab
*
mtab
;
141
142
// history
143
float
lsp_hist
[2][20];
///< LSP coefficients of the last frame
144
float
bark_hist
[3][2][40];
///< BSE coefficients of last frame
145
146
// bitstream parameters
147
int16_t
permut
[4][4096];
148
uint8_t
length
[4][2];
///< main codebook stride
149
uint8_t
length_change
[4];
150
uint8_t
bits_main_spec
[2][4][2];
///< bits for the main codebook
151
int
bits_main_spec_change
[4];
152
int
n_div
[4];
153
154
float
*
spectrum
;
155
float
*
curr_frame
;
///< non-interleaved output
156
float
*
prev_frame
;
///< non-interleaved previous frame
157
int
last_block_pos
[2];
158
int
discarded_packets
;
159
160
float
*
cos_tabs
[3];
161
162
// scratch buffers
163
float
*
tmp_buf
;
164
165
TwinVQFrameData
bits
;
166
167
enum
TwinVQCodec
codec
;
168
169
int (*
read_bitstream
)(
AVCodecContext
*
avctx
,
struct
TwinVQContext
*tctx,
170
const
uint8_t
*
buf
,
int
buf_size);
171
void
(*
dec_bark_env
)(
struct
TwinVQContext
*tctx,
const
uint8_t
*
in
,
172
int
use_hist,
int
ch,
float
*
out
,
float
gain,
173
enum
TwinVQFrameType
ftype);
174
void
(*
decode_ppc
)(
struct
TwinVQContext
*tctx,
int
period_coef,
int
g_coef,
175
const
float
*shape,
float
*speech);
176
}
TwinVQContext
;
177
178
extern
const
enum
TwinVQFrameType
ff_twinvq_wtype_to_ftype_table
[];
179
180
/** @note not speed critical, hence not optimized */
181
static
inline
void
twinvq_memset_float
(
float
*
buf
,
float
val
,
int
size
)
182
{
183
while
(size--)
184
*buf++ =
val
;
185
}
186
187
static
inline
float
twinvq_mulawinv
(
float
y
,
float
clip
,
float
mu)
188
{
189
y = av_clipf(y / clip, -1, 1);
190
return
clip *
FFSIGN
(y) * (exp(log(1 + mu) * fabs(y)) - 1) / mu;
191
}
192
193
int
ff_twinvq_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
194
int
*got_frame_ptr,
AVPacket
*avpkt);
195
av_cold
int
ff_twinvq_decode_close
(
AVCodecContext
*
avctx
);
196
av_cold
int
ff_twinvq_decode_init
(
AVCodecContext
*
avctx
);
197
198
#endif
/* AVCODEC_TWINVQ_DATA_H */
Generated on Sat Jan 25 2014 19:51:55 for FFmpeg by
1.8.2