Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
6c145ecf
Commit
6c145ecf
authored
Jul 19, 2013
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
twinvq: K&R formatting cosmetics
parent
54ba5207
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
478 additions
and
439 deletions
+478
-439
twinvq.c
libavcodec/twinvq.c
+312
-280
twinvq_data.h
libavcodec/twinvq_data.h
+166
-159
No files found.
libavcodec/twinvq.c
View file @
6c145ecf
...
...
@@ -19,6 +19,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <math.h>
#include <stdint.h>
#include "libavutil/channel_layout.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
...
...
@@ -27,10 +30,6 @@
#include "internal.h"
#include "lsp.h"
#include "sinewin.h"
#include <math.h>
#include <stdint.h>
#include "twinvq_data.h"
enum
FrameType
{
...
...
@@ -95,83 +94,83 @@ typedef struct {
static
const
ModeTab
mode_08_08
=
{
{
{
8
,
bark_tab_s08_64
,
10
,
tab
.
fcb08s
,
1
,
5
,
tab
.
cb0808s0
,
tab
.
cb0808s1
,
18
},
{
2
,
bark_tab_m08_256
,
20
,
tab
.
fcb08m
,
2
,
5
,
tab
.
cb0808m0
,
tab
.
cb0808m1
,
16
},
{
1
,
bark_tab_l08_512
,
30
,
tab
.
fcb08l
,
3
,
6
,
tab
.
cb0808l0
,
tab
.
cb0808l1
,
17
}
{
8
,
bark_tab_s08_64
,
10
,
tab
.
fcb08s
,
1
,
5
,
tab
.
cb0808s0
,
tab
.
cb0808s1
,
18
},
{
2
,
bark_tab_m08_256
,
20
,
tab
.
fcb08m
,
2
,
5
,
tab
.
cb0808m0
,
tab
.
cb0808m1
,
16
},
{
1
,
bark_tab_l08_512
,
30
,
tab
.
fcb08l
,
3
,
6
,
tab
.
cb0808l0
,
tab
.
cb0808l1
,
17
}
},
512
,
12
,
tab
.
lsp08
,
1
,
5
,
3
,
3
,
tab
.
shape08
,
8
,
28
,
20
,
6
,
40
512
,
12
,
tab
.
lsp08
,
1
,
5
,
3
,
3
,
tab
.
shape08
,
8
,
28
,
20
,
6
,
40
};
static
const
ModeTab
mode_11_08
=
{
{
{
8
,
bark_tab_s11_64
,
10
,
tab
.
fcb11s
,
1
,
5
,
tab
.
cb1108s0
,
tab
.
cb1108s1
,
29
},
{
2
,
bark_tab_m11_256
,
20
,
tab
.
fcb11m
,
2
,
5
,
tab
.
cb1108m0
,
tab
.
cb1108m1
,
24
},
{
1
,
bark_tab_l11_512
,
30
,
tab
.
fcb11l
,
3
,
6
,
tab
.
cb1108l0
,
tab
.
cb1108l1
,
27
}
{
8
,
bark_tab_s11_64
,
10
,
tab
.
fcb11s
,
1
,
5
,
tab
.
cb1108s0
,
tab
.
cb1108s1
,
29
},
{
2
,
bark_tab_m11_256
,
20
,
tab
.
fcb11m
,
2
,
5
,
tab
.
cb1108m0
,
tab
.
cb1108m1
,
24
},
{
1
,
bark_tab_l11_512
,
30
,
tab
.
fcb11l
,
3
,
6
,
tab
.
cb1108l0
,
tab
.
cb1108l1
,
27
}
},
512
,
16
,
tab
.
lsp11
,
1
,
6
,
4
,
3
,
tab
.
shape11
,
9
,
36
,
30
,
7
,
90
512
,
16
,
tab
.
lsp11
,
1
,
6
,
4
,
3
,
tab
.
shape11
,
9
,
36
,
30
,
7
,
90
};
static
const
ModeTab
mode_11_10
=
{
{
{
8
,
bark_tab_s11_64
,
10
,
tab
.
fcb11s
,
1
,
5
,
tab
.
cb1110s0
,
tab
.
cb1110s1
,
21
},
{
2
,
bark_tab_m11_256
,
20
,
tab
.
fcb11m
,
2
,
5
,
tab
.
cb1110m0
,
tab
.
cb1110m1
,
18
},
{
1
,
bark_tab_l11_512
,
30
,
tab
.
fcb11l
,
3
,
6
,
tab
.
cb1110l0
,
tab
.
cb1110l1
,
20
}
{
8
,
bark_tab_s11_64
,
10
,
tab
.
fcb11s
,
1
,
5
,
tab
.
cb1110s0
,
tab
.
cb1110s1
,
21
},
{
2
,
bark_tab_m11_256
,
20
,
tab
.
fcb11m
,
2
,
5
,
tab
.
cb1110m0
,
tab
.
cb1110m1
,
18
},
{
1
,
bark_tab_l11_512
,
30
,
tab
.
fcb11l
,
3
,
6
,
tab
.
cb1110l0
,
tab
.
cb1110l1
,
20
}
},
512
,
16
,
tab
.
lsp11
,
1
,
6
,
4
,
3
,
tab
.
shape11
,
9
,
36
,
30
,
7
,
90
512
,
16
,
tab
.
lsp11
,
1
,
6
,
4
,
3
,
tab
.
shape11
,
9
,
36
,
30
,
7
,
90
};
static
const
ModeTab
mode_16_16
=
{
{
{
8
,
bark_tab_s16_128
,
10
,
tab
.
fcb16s
,
1
,
5
,
tab
.
cb1616s0
,
tab
.
cb1616s1
,
16
},
{
2
,
bark_tab_m16_512
,
20
,
tab
.
fcb16m
,
2
,
5
,
tab
.
cb1616m0
,
tab
.
cb1616m1
,
15
},
{
1
,
bark_tab_l16_1024
,
30
,
tab
.
fcb16l
,
3
,
6
,
tab
.
cb1616l0
,
tab
.
cb1616l1
,
16
}
{
8
,
bark_tab_s16_128
,
10
,
tab
.
fcb16s
,
1
,
5
,
tab
.
cb1616s0
,
tab
.
cb1616s1
,
16
},
{
2
,
bark_tab_m16_512
,
20
,
tab
.
fcb16m
,
2
,
5
,
tab
.
cb1616m0
,
tab
.
cb1616m1
,
15
},
{
1
,
bark_tab_l16_1024
,
30
,
tab
.
fcb16l
,
3
,
6
,
tab
.
cb1616l0
,
tab
.
cb1616l1
,
16
}
},
1024
,
16
,
tab
.
lsp16
,
1
,
6
,
4
,
3
,
tab
.
shape16
,
9
,
56
,
60
,
7
,
180
1024
,
16
,
tab
.
lsp16
,
1
,
6
,
4
,
3
,
tab
.
shape16
,
9
,
56
,
60
,
7
,
180
};
static
const
ModeTab
mode_22_20
=
{
{
{
8
,
bark_tab_s22_128
,
10
,
tab
.
fcb22s_1
,
1
,
6
,
tab
.
cb2220s0
,
tab
.
cb2220s1
,
18
},
{
2
,
bark_tab_m22_512
,
20
,
tab
.
fcb22m_1
,
2
,
6
,
tab
.
cb2220m0
,
tab
.
cb2220m1
,
17
},
{
1
,
bark_tab_l22_1024
,
32
,
tab
.
fcb22l_1
,
4
,
6
,
tab
.
cb2220l0
,
tab
.
cb2220l1
,
18
}
{
8
,
bark_tab_s22_128
,
10
,
tab
.
fcb22s_1
,
1
,
6
,
tab
.
cb2220s0
,
tab
.
cb2220s1
,
18
},
{
2
,
bark_tab_m22_512
,
20
,
tab
.
fcb22m_1
,
2
,
6
,
tab
.
cb2220m0
,
tab
.
cb2220m1
,
17
},
{
1
,
bark_tab_l22_1024
,
32
,
tab
.
fcb22l_1
,
4
,
6
,
tab
.
cb2220l0
,
tab
.
cb2220l1
,
18
}
},
1024
,
16
,
tab
.
lsp22_1
,
1
,
6
,
4
,
3
,
tab
.
shape22_1
,
9
,
56
,
36
,
7
,
144
};
static
const
ModeTab
mode_22_24
=
{
{
{
8
,
bark_tab_s22_128
,
10
,
tab
.
fcb22s_1
,
1
,
6
,
tab
.
cb2224s0
,
tab
.
cb2224s1
,
15
},
{
2
,
bark_tab_m22_512
,
20
,
tab
.
fcb22m_1
,
2
,
6
,
tab
.
cb2224m0
,
tab
.
cb2224m1
,
14
},
{
1
,
bark_tab_l22_1024
,
32
,
tab
.
fcb22l_1
,
4
,
6
,
tab
.
cb2224l0
,
tab
.
cb2224l1
,
15
}
{
8
,
bark_tab_s22_128
,
10
,
tab
.
fcb22s_1
,
1
,
6
,
tab
.
cb2224s0
,
tab
.
cb2224s1
,
15
},
{
2
,
bark_tab_m22_512
,
20
,
tab
.
fcb22m_1
,
2
,
6
,
tab
.
cb2224m0
,
tab
.
cb2224m1
,
14
},
{
1
,
bark_tab_l22_1024
,
32
,
tab
.
fcb22l_1
,
4
,
6
,
tab
.
cb2224l0
,
tab
.
cb2224l1
,
15
}
},
1024
,
16
,
tab
.
lsp22_1
,
1
,
6
,
4
,
3
,
tab
.
shape22_1
,
9
,
56
,
36
,
7
,
144
};
static
const
ModeTab
mode_22_32
=
{
{
{
4
,
bark_tab_s22_128
,
10
,
tab
.
fcb22s_2
,
1
,
6
,
tab
.
cb2232s0
,
tab
.
cb2232s1
,
11
},
{
2
,
bark_tab_m22_256
,
20
,
tab
.
fcb22m_2
,
2
,
6
,
tab
.
cb2232m0
,
tab
.
cb2232m1
,
11
},
{
1
,
bark_tab_l22_512
,
32
,
tab
.
fcb22l_2
,
4
,
6
,
tab
.
cb2232l0
,
tab
.
cb2232l1
,
12
}
{
4
,
bark_tab_s22_128
,
10
,
tab
.
fcb22s_2
,
1
,
6
,
tab
.
cb2232s0
,
tab
.
cb2232s1
,
11
},
{
2
,
bark_tab_m22_256
,
20
,
tab
.
fcb22m_2
,
2
,
6
,
tab
.
cb2232m0
,
tab
.
cb2232m1
,
11
},
{
1
,
bark_tab_l22_512
,
32
,
tab
.
fcb22l_2
,
4
,
6
,
tab
.
cb2232l0
,
tab
.
cb2232l1
,
12
}
},
512
,
16
,
tab
.
lsp22_2
,
1
,
6
,
4
,
4
,
tab
.
shape22_2
,
9
,
56
,
36
,
7
,
72
512
,
16
,
tab
.
lsp22_2
,
1
,
6
,
4
,
4
,
tab
.
shape22_2
,
9
,
56
,
36
,
7
,
72
};
static
const
ModeTab
mode_44_40
=
{
{
{
16
,
bark_tab_s44_128
,
10
,
tab
.
fcb44s
,
1
,
6
,
tab
.
cb4440s0
,
tab
.
cb4440s1
,
18
},
{
4
,
bark_tab_m44_512
,
20
,
tab
.
fcb44m
,
2
,
6
,
tab
.
cb4440m0
,
tab
.
cb4440m1
,
17
},
{
1
,
bark_tab_l44_2048
,
40
,
tab
.
fcb44l
,
4
,
6
,
tab
.
cb4440l0
,
tab
.
cb4440l1
,
17
}
{
16
,
bark_tab_s44_128
,
10
,
tab
.
fcb44s
,
1
,
6
,
tab
.
cb4440s0
,
tab
.
cb4440s1
,
18
},
{
4
,
bark_tab_m44_512
,
20
,
tab
.
fcb44m
,
2
,
6
,
tab
.
cb4440m0
,
tab
.
cb4440m1
,
17
},
{
1
,
bark_tab_l44_2048
,
40
,
tab
.
fcb44l
,
4
,
6
,
tab
.
cb4440l0
,
tab
.
cb4440l1
,
17
}
},
2048
,
20
,
tab
.
lsp44
,
1
,
6
,
4
,
4
,
tab
.
shape44
,
9
,
84
,
54
,
7
,
432
2048
,
20
,
tab
.
lsp44
,
1
,
6
,
4
,
4
,
tab
.
shape44
,
9
,
84
,
54
,
7
,
432
};
static
const
ModeTab
mode_44_48
=
{
{
{
16
,
bark_tab_s44_128
,
10
,
tab
.
fcb44s
,
1
,
6
,
tab
.
cb4448s0
,
tab
.
cb4448s1
,
15
},
{
4
,
bark_tab_m44_512
,
20
,
tab
.
fcb44m
,
2
,
6
,
tab
.
cb4448m0
,
tab
.
cb4448m1
,
14
},
{
1
,
bark_tab_l44_2048
,
40
,
tab
.
fcb44l
,
4
,
6
,
tab
.
cb4448l0
,
tab
.
cb4448l1
,
14
}
{
16
,
bark_tab_s44_128
,
10
,
tab
.
fcb44s
,
1
,
6
,
tab
.
cb4448s0
,
tab
.
cb4448s1
,
15
},
{
4
,
bark_tab_m44_512
,
20
,
tab
.
fcb44m
,
2
,
6
,
tab
.
cb4448m0
,
tab
.
cb4448m1
,
14
},
{
1
,
bark_tab_l44_2048
,
40
,
tab
.
fcb44l
,
4
,
6
,
tab
.
cb4448l0
,
tab
.
cb4448l1
,
14
}
},
2048
,
20
,
tab
.
lsp44
,
1
,
6
,
4
,
4
,
tab
.
shape44
,
9
,
84
,
54
,
7
,
432
2048
,
20
,
tab
.
lsp44
,
1
,
6
,
4
,
4
,
tab
.
shape44
,
9
,
84
,
54
,
7
,
432
};
typedef
struct
TwinContext
{
...
...
@@ -242,17 +241,17 @@ static void memset_float(float *buf, float val, int size)
static
float
eval_lpc_spectrum
(
const
float
*
lsp
,
float
cos_val
,
int
order
)
{
int
j
;
float
p
=
0
.
5
f
;
float
q
=
0
.
5
f
;
float
two_cos_w
=
2
.
0
f
*
cos_val
;
float
p
=
0
.
5
f
;
float
q
=
0
.
5
f
;
float
two_cos_w
=
2
.
0
f
*
cos_val
;
for
(
j
=
0
;
j
+
1
<
order
;
j
+=
2
*
2
)
{
for
(
j
=
0
;
j
+
1
<
order
;
j
+=
2
*
2
)
{
// Unroll the loop once since order is a multiple of four
q
*=
lsp
[
j
]
-
two_cos_w
;
p
*=
lsp
[
j
+
1
]
-
two_cos_w
;
q
*=
lsp
[
j
]
-
two_cos_w
;
p
*=
lsp
[
j
+
1
]
-
two_cos_w
;
q
*=
lsp
[
j
+
2
]
-
two_cos_w
;
p
*=
lsp
[
j
+
3
]
-
two_cos_w
;
q
*=
lsp
[
j
+
2
]
-
two_cos_w
;
p
*=
lsp
[
j
+
3
]
-
two_cos_w
;
}
p
*=
p
*
(
2
.
0
f
-
two_cos_w
);
...
...
@@ -268,30 +267,30 @@ static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc)
{
int
i
;
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
size_s
=
mtab
->
size
/
mtab
->
fmode
[
FT_SHORT
].
sub
;
int
size_s
=
mtab
->
size
/
mtab
->
fmode
[
FT_SHORT
].
sub
;
for
(
i
=
0
;
i
<
size_s
/
2
;
i
++
)
{
for
(
i
=
0
;
i
<
size_s
/
2
;
i
++
)
{
float
cos_i
=
tctx
->
cos_tabs
[
0
][
i
];
lpc
[
i
]
=
eval_lpc_spectrum
(
cos_vals
,
cos_i
,
mtab
->
n_lsp
);
lpc
[
size_s
-
i
-
1
]
=
eval_lpc_spectrum
(
cos_vals
,
-
cos_i
,
mtab
->
n_lsp
);
lpc
[
i
]
=
eval_lpc_spectrum
(
cos_vals
,
cos_i
,
mtab
->
n_lsp
);
lpc
[
size_s
-
i
-
1
]
=
eval_lpc_spectrum
(
cos_vals
,
-
cos_i
,
mtab
->
n_lsp
);
}
}
static
void
interpolate
(
float
*
out
,
float
v1
,
float
v2
,
int
size
)
{
int
i
;
float
step
=
(
v1
-
v2
)
/
(
size
+
1
);
float
step
=
(
v1
-
v2
)
/
(
size
+
1
);
for
(
i
=
0
;
i
<
size
;
i
++
)
{
v2
+=
step
;
v2
+=
step
;
out
[
i
]
=
v2
;
}
}
static
inline
float
get_cos
(
int
idx
,
int
part
,
const
float
*
cos_tab
,
int
size
)
{
return
part
?
-
cos_tab
[
size
-
idx
-
1
]
:
cos_tab
[
idx
];
return
part
?
-
cos_tab
[
size
-
idx
-
1
]
:
cos_tab
[
idx
];
}
/**
...
...
@@ -305,7 +304,7 @@ static inline float get_cos(int idx, int part, const float *cos_tab, int size)
* @param step the size of a block "siiiibiiii"
* @param in the cosinus of the LSP data
* @param part is 0 for 0...PI (positive cossinus values) and 1 for PI...2PI
(negative cossinus values)
*
(negative cossinus values)
* @param size the size of the whole output
*/
static
inline
void
eval_lpcenv_or_interp
(
TwinContext
*
tctx
,
...
...
@@ -314,7 +313,7 @@ static inline void eval_lpcenv_or_interp(TwinContext *tctx,
int
size
,
int
step
,
int
part
)
{
int
i
;
const
ModeTab
*
mtab
=
tctx
->
mtab
;
const
ModeTab
*
mtab
=
tctx
->
mtab
;
const
float
*
cos_tab
=
tctx
->
cos_tabs
[
ftype
];
// Fill the 's'
...
...
@@ -325,33 +324,38 @@ static inline void eval_lpcenv_or_interp(TwinContext *tctx,
mtab
->
n_lsp
);
// Fill the 'iiiibiiii'
for
(
i
=
step
;
i
<=
size
-
2
*
step
;
i
+=
step
)
{
if
(
out
[
i
+
step
]
+
out
[
i
-
step
]
>
1
.
95
*
out
[
i
]
||
out
[
i
+
step
]
>=
out
[
i
-
step
])
{
interpolate
(
out
+
i
-
step
+
1
,
out
[
i
],
out
[
i
-
step
],
step
-
1
);
for
(
i
=
step
;
i
<=
size
-
2
*
step
;
i
+=
step
)
{
if
(
out
[
i
+
step
]
+
out
[
i
-
step
]
>
1
.
95
*
out
[
i
]
||
out
[
i
+
step
]
>=
out
[
i
-
step
])
{
interpolate
(
out
+
i
-
step
+
1
,
out
[
i
],
out
[
i
-
step
],
step
-
1
);
}
else
{
out
[
i
-
step
/
2
]
=
out
[
i
-
step
/
2
]
=
eval_lpc_spectrum
(
in
,
get_cos
(
i
-
step
/
2
,
part
,
cos_tab
,
size
),
get_cos
(
i
-
step
/
2
,
part
,
cos_tab
,
size
),
mtab
->
n_lsp
);
interpolate
(
out
+
i
-
step
+
1
,
out
[
i
-
step
/
2
],
out
[
i
-
step
],
step
/
2
-
1
);
interpolate
(
out
+
i
-
step
/
2
+
1
,
out
[
i
],
out
[
i
-
step
/
2
],
step
/
2
-
1
);
interpolate
(
out
+
i
-
step
+
1
,
out
[
i
-
step
/
2
],
out
[
i
-
step
],
step
/
2
-
1
);
interpolate
(
out
+
i
-
step
/
2
+
1
,
out
[
i
],
out
[
i
-
step
/
2
],
step
/
2
-
1
);
}
}
interpolate
(
out
+
size
-
2
*
step
+
1
,
out
[
size
-
step
],
out
[
size
-
2
*
step
],
step
-
1
);
interpolate
(
out
+
size
-
2
*
step
+
1
,
out
[
size
-
step
],
out
[
size
-
2
*
step
],
step
-
1
);
}
static
void
eval_lpcenv_2parts
(
TwinContext
*
tctx
,
enum
FrameType
ftype
,
const
float
*
buf
,
float
*
lpc
,
int
size
,
int
step
)
{
eval_lpcenv_or_interp
(
tctx
,
ftype
,
lpc
,
buf
,
size
/
2
,
step
,
0
);
eval_lpcenv_or_interp
(
tctx
,
ftype
,
lpc
+
size
/
2
,
buf
,
size
/
2
,
2
*
step
,
1
);
eval_lpcenv_or_interp
(
tctx
,
ftype
,
lpc
,
buf
,
size
/
2
,
step
,
0
);
eval_lpcenv_or_interp
(
tctx
,
ftype
,
lpc
+
size
/
2
,
buf
,
size
/
2
,
2
*
step
,
1
);
interpolate
(
lpc
+
size
/
2
-
step
+
1
,
lpc
[
size
/
2
],
lpc
[
size
/
2
-
step
],
step
);
interpolate
(
lpc
+
size
/
2
-
step
+
1
,
lpc
[
size
/
2
],
lpc
[
size
/
2
-
step
],
step
);
memset_float
(
lpc
+
size
-
2
*
step
+
1
,
lpc
[
size
-
2
*
step
],
2
*
step
-
1
);
memset_float
(
lpc
+
size
-
2
*
step
+
1
,
lpc
[
size
-
2
*
step
],
2
*
step
-
1
);
}
/**
...
...
@@ -392,26 +396,26 @@ static void dequant(TwinContext *tctx, GetBitContext *gb, float *out,
}
tmp1
=
get_bits
(
gb
,
bits
);
tab0
=
cb0
+
tmp0
*
cb_len
;
tab1
=
cb1
+
tmp1
*
cb_len
;
tab0
=
cb0
+
tmp0
*
cb_len
;
tab1
=
cb1
+
tmp1
*
cb_len
;
for
(
j
=
0
;
j
<
length
;
j
++
)
out
[
tctx
->
permut
[
ftype
][
pos
+
j
]]
=
sign0
*
tab0
[
j
]
+
sign1
*
tab1
[
j
];
out
[
tctx
->
permut
[
ftype
][
pos
+
j
]]
=
sign0
*
tab0
[
j
]
+
sign1
*
tab1
[
j
];
pos
+=
length
;
}
}
static
inline
float
mulawinv
(
float
y
,
float
clip
,
float
mu
)
{
y
=
av_clipf
(
y
/
clip
,
-
1
,
1
);
return
clip
*
FFSIGN
(
y
)
*
(
exp
(
log
(
1
+
mu
)
*
fabs
(
y
))
-
1
)
/
mu
;
y
=
av_clipf
(
y
/
clip
,
-
1
,
1
);
return
clip
*
FFSIGN
(
y
)
*
(
exp
(
log
(
1
+
mu
)
*
fabs
(
y
))
-
1
)
/
mu
;
}
/**
* Evaluate a
*b/
400 rounded to the nearest integer. When, for example,
* a
*
b == 200 and the nearest integer is ill-defined, use a table to emulate
* Evaluate a
* b /
400 rounded to the nearest integer. When, for example,
* a
*
b == 200 and the nearest integer is ill-defined, use a table to emulate
* the following broken float-based implementation used by the binary decoder:
*
* @code
...
...
@@ -419,30 +423,30 @@ static inline float mulawinv(float y, float clip, float mu)
* {
* static float test; // Ugh, force gcc to do the division first...
*
* test = a
/
400.;
* return b * test +
0.5;
* test = a
/
400.;
* return b * test + 0.5;
* }
* @endcode
*
* @note if this function is replaced by just ROUNDED_DIV(a
*b,400.), the stddev
*
between the original file (before encoding with Yamaha encoder) and the
*
decoded output increases, which leads one to believe that the encoder expects
* exactly this broken calculation.
* @note if this function is replaced by just ROUNDED_DIV(a
* b, 400.), the
*
stddev between the original file (before encoding with Yamaha encoder) and
*
the decoded output increases, which leads one to believe that the encoder
* ex
pects ex
actly this broken calculation.
*/
static
int
very_broken_op
(
int
a
,
int
b
)
{
int
x
=
a
*
b
+
200
;
int
x
=
a
*
b
+
200
;
int
size
;
const
uint8_t
*
rtab
;
if
(
x
%
400
||
b
%
5
)
return
x
/
400
;
if
(
x
%
400
||
b
%
5
)
return
x
/
400
;
x
/=
400
;
size
=
tabs
[
b
/
5
].
size
;
rtab
=
tabs
[
b
/
5
].
tab
;
return
x
-
rtab
[
size
*
av_log2
(
2
*
(
x
-
1
)
/
size
)
+
(
x
-
1
)
%
size
];
size
=
tabs
[
b
/
5
].
size
;
rtab
=
tabs
[
b
/
5
].
tab
;
return
x
-
rtab
[
size
*
av_log2
(
2
*
(
x
-
1
)
/
size
)
+
(
x
-
1
)
%
size
];
}
/**
...
...
@@ -459,42 +463,44 @@ static void add_peak(int period, int width, const float *shape,
int
center
;
// First peak centered around zero
for
(
i
=
0
;
i
<
width
/
2
;
i
++
)
for
(
i
=
0
;
i
<
width
/
2
;
i
++
)
speech
[
i
]
+=
ppc_gain
*
*
shape
++
;
for
(
i
=
1
;
i
<
ROUNDED_DIV
(
len
,
width
)
;
i
++
)
{
for
(
i
=
1
;
i
<
ROUNDED_DIV
(
len
,
width
)
;
i
++
)
{
center
=
very_broken_op
(
period
,
i
);
for
(
j
=
-
width
/
2
;
j
<
(
width
+
1
)
/
2
;
j
++
)
speech
[
j
+
center
]
+=
ppc_gain
*
*
shape
++
;
for
(
j
=
-
width
/
2
;
j
<
(
width
+
1
)
/
2
;
j
++
)
speech
[
j
+
center
]
+=
ppc_gain
*
*
shape
++
;
}
// For the last block, be careful not to go beyond the end of the buffer
center
=
very_broken_op
(
period
,
i
);
for
(
j
=
-
width
/
2
;
j
<
(
width
+
1
)
/
2
&&
shape
<
shape_end
;
j
++
)
speech
[
j
+
center
]
+=
ppc_gain
*
*
shape
++
;
for
(
j
=
-
width
/
2
;
j
<
(
width
+
1
)
/
2
&&
shape
<
shape_end
;
j
++
)
speech
[
j
+
center
]
+=
ppc_gain
*
*
shape
++
;
}
static
void
decode_ppc
(
TwinContext
*
tctx
,
int
period_coef
,
const
float
*
shape
,
float
ppc_gain
,
float
*
speech
)
{
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
isampf
=
tctx
->
avctx
->
sample_rate
/
1000
;
int
ibps
=
tctx
->
avctx
->
bit_rate
/
(
1000
*
tctx
->
avctx
->
channels
);
int
min_period
=
ROUNDED_DIV
(
40
*
2
*
mtab
->
size
,
isampf
);
int
max_period
=
ROUNDED_DIV
(
6
*
40
*
2
*
mtab
->
size
,
isampf
);
int
period_range
=
max_period
-
min_period
;
int
isampf
=
tctx
->
avctx
->
sample_rate
/
1000
;
int
ibps
=
tctx
->
avctx
->
bit_rate
/
(
1000
*
tctx
->
avctx
->
channels
);
int
min_period
=
ROUNDED_DIV
(
40
*
2
*
mtab
->
size
,
isampf
);
int
max_period
=
ROUNDED_DIV
(
40
*
2
*
mtab
->
size
*
6
,
isampf
);
int
period_range
=
max_period
-
min_period
;
// This is actually the period multiplied by 400. It is just linearly coded
// between its maximum and minimum value.
int
period
=
min_period
+
ROUNDED_DIV
(
period_coef
*
period_range
,
(
1
<<
mtab
->
ppc_period_bit
)
-
1
);
ROUNDED_DIV
(
period_coef
*
period_range
,
(
1
<<
mtab
->
ppc_period_bit
)
-
1
);
int
width
;
if
(
isampf
==
22
&&
ibps
==
32
)
{
// For some unknown reason, NTT decided to code this case differently...
width
=
ROUNDED_DIV
((
period
+
800
)
*
mtab
->
peak_per2wid
,
400
*
mtab
->
size
);
width
=
ROUNDED_DIV
((
period
+
800
)
*
mtab
->
peak_per2wid
,
400
*
mtab
->
size
);
}
else
width
=
(
period
)
*
mtab
->
peak_per2wid
/
(
400
*
mtab
->
size
);
width
=
period
*
mtab
->
peak_per2wid
/
(
400
*
mtab
->
size
);
add_peak
(
period
,
width
,
shape
,
ppc_gain
,
speech
,
mtab
->
ppc_shape_len
);
}
...
...
@@ -504,27 +510,26 @@ static void dec_gain(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype,
{
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
i
,
j
;
int
sub
=
mtab
->
fmode
[
ftype
].
sub
;
float
step
=
AMP_MAX
/
((
1
<<
GAIN_BITS
)
-
1
);
int
sub
=
mtab
->
fmode
[
ftype
].
sub
;
float
step
=
AMP_MAX
/
((
1
<<
GAIN_BITS
)
-
1
);
float
sub_step
=
SUB_AMP_MAX
/
((
1
<<
SUB_GAIN_BITS
)
-
1
);
if
(
ftype
==
FT_LONG
)
{
for
(
i
=
0
;
i
<
tctx
->
avctx
->
channels
;
i
++
)
out
[
i
]
=
(
1
.
/
(
1
<<
13
))
*
mulawinv
(
step
*
0
.
5
+
step
*
get_bits
(
gb
,
GAIN_BITS
),
AMP_MAX
,
MULAW_MU
);
out
[
i
]
=
(
1
.
/
(
1
<<
13
))
*
mulawinv
(
step
*
0
.
5
+
step
*
get_bits
(
gb
,
GAIN_BITS
),
AMP_MAX
,
MULAW_MU
);
}
else
{
for
(
i
=
0
;
i
<
tctx
->
avctx
->
channels
;
i
++
)
{
float
val
=
(
1
.
/
(
1
<<
23
))
*
mulawinv
(
step
*
0
.
5
+
step
*
get_bits
(
gb
,
GAIN_BITS
),
AMP_MAX
,
MULAW_MU
);
for
(
j
=
0
;
j
<
sub
;
j
++
)
{
out
[
i
*
sub
+
j
]
=
val
*
mulawinv
(
sub_step
*
0
.
5
+
sub_step
*
get_bits
(
gb
,
SUB_GAIN_BITS
),
SUB_AMP_MAX
,
MULAW_MU
);
}
float
val
=
(
1
.
/
(
1
<<
23
))
*
mulawinv
(
step
*
0
.
5
+
step
*
get_bits
(
gb
,
GAIN_BITS
),
AMP_MAX
,
MULAW_MU
);
for
(
j
=
0
;
j
<
sub
;
j
++
)
out
[
i
*
sub
+
j
]
=
val
*
mulawinv
(
sub_step
*
0
.
5
+
sub_step
*
get_bits
(
gb
,
SUB_GAIN_BITS
),
SUB_AMP_MAX
,
MULAW_MU
);
}
}
}
...
...
@@ -540,11 +545,11 @@ static void rearrange_lsp(int order, float *lsp, float min_dist)
int
i
;
float
min_dist2
=
min_dist
*
0
.
5
;
for
(
i
=
1
;
i
<
order
;
i
++
)
if
(
lsp
[
i
]
-
lsp
[
i
-
1
]
<
min_dist
)
{
float
avg
=
(
lsp
[
i
]
+
lsp
[
i
-
1
])
*
0
.
5
;
if
(
lsp
[
i
]
-
lsp
[
i
-
1
]
<
min_dist
)
{
float
avg
=
(
lsp
[
i
]
+
lsp
[
i
-
1
])
*
0
.
5
;
lsp
[
i
-
1
]
=
avg
-
min_dist2
;
lsp
[
i
]
=
avg
+
min_dist2
;
lsp
[
i
-
1
]
=
avg
-
min_dist2
;
lsp
[
i
]
=
avg
+
min_dist2
;
}
}
...
...
@@ -554,9 +559,9 @@ static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2,
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
i
,
j
;
const
float
*
cb
=
mtab
->
lspcodebook
;
const
float
*
cb2
=
cb
+
(
1
<<
mtab
->
lsp_bit1
)
*
mtab
->
n_lsp
;
const
float
*
cb3
=
cb2
+
(
1
<<
mtab
->
lsp_bit2
)
*
mtab
->
n_lsp
;
const
float
*
cb
=
mtab
->
lspcodebook
;
const
float
*
cb2
=
cb
+
(
1
<<
mtab
->
lsp_bit1
)
*
mtab
->
n_lsp
;
const
float
*
cb3
=
cb2
+
(
1
<<
mtab
->
lsp_bit2
)
*
mtab
->
n_lsp
;
const
int8_t
funny_rounding
[
4
]
=
{
-
2
,
...
...
@@ -567,17 +572,18 @@ static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2,
j
=
0
;
for
(
i
=
0
;
i
<
mtab
->
lsp_split
;
i
++
)
{
int
chunk_end
=
((
i
+
1
)
*
mtab
->
n_lsp
+
funny_rounding
[
i
])
/
mtab
->
lsp_split
;
int
chunk_end
=
((
i
+
1
)
*
mtab
->
n_lsp
+
funny_rounding
[
i
])
/
mtab
->
lsp_split
;
for
(;
j
<
chunk_end
;
j
++
)
lsp
[
j
]
=
cb
[
lpc_idx1
*
mtab
->
n_lsp
+
j
]
+
lsp
[
j
]
=
cb
[
lpc_idx1
*
mtab
->
n_lsp
+
j
]
+
cb2
[
lpc_idx2
[
i
]
*
mtab
->
n_lsp
+
j
];
}
rearrange_lsp
(
mtab
->
n_lsp
,
lsp
,
0
.
0001
);
for
(
i
=
0
;
i
<
mtab
->
n_lsp
;
i
++
)
{
float
tmp1
=
1
.
-
cb3
[
lpc_hist_idx
*
mtab
->
n_lsp
+
i
];
float
tmp2
=
hist
[
i
]
*
cb3
[
lpc_hist_idx
*
mtab
->
n_lsp
+
i
];
float
tmp1
=
1
.
-
cb3
[
lpc_hist_idx
*
mtab
->
n_lsp
+
i
];
float
tmp2
=
hist
[
i
]
*
cb3
[
lpc_hist_idx
*
mtab
->
n_lsp
+
i
];
hist
[
i
]
=
lsp
[
i
];
lsp
[
i
]
=
lsp
[
i
]
*
tmp1
+
tmp2
;
}
...
...
@@ -594,7 +600,7 @@ static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp,
int
size
=
tctx
->
mtab
->
size
/
tctx
->
mtab
->
fmode
[
ftype
].
sub
;
for
(
i
=
0
;
i
<
tctx
->
mtab
->
n_lsp
;
i
++
)
lsp
[
i
]
=
2
*
cos
(
lsp
[
i
]);
lsp
[
i
]
=
2
*
cos
(
lsp
[
i
]);
switch
(
ftype
)
{
case
FT_LONG
:
...
...
@@ -609,74 +615,71 @@ static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp,
}
}
static
const
uint8_t
wtype_to_wsize
[]
=
{
0
,
0
,
2
,
2
,
2
,
1
,
0
,
1
,
1
};
static
void
imdct_and_window
(
TwinContext
*
tctx
,
enum
FrameType
ftype
,
int
wtype
,
float
*
in
,
float
*
prev
,
int
ch
)
float
*
in
,
float
*
prev
,
int
ch
)
{
FFTContext
*
mdct
=
&
tctx
->
mdct_ctx
[
ftype
];
FFTContext
*
mdct
=
&
tctx
->
mdct_ctx
[
ftype
];
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
bsize
=
mtab
->
size
/
mtab
->
fmode
[
ftype
].
sub
;
int
size
=
mtab
->
size
;
float
*
buf1
=
tctx
->
tmp_buf
;
int
j
;
int
wsize
;
// Window size
float
*
out
=
tctx
->
curr_frame
+
2
*
ch
*
mtab
->
size
;
int
bsize
=
mtab
->
size
/
mtab
->
fmode
[
ftype
].
sub
;
int
size
=
mtab
->
size
;
float
*
buf1
=
tctx
->
tmp_buf
;
int
j
,
first_wsize
,
wsize
;
// Window size
float
*
out
=
tctx
->
curr_frame
+
2
*
ch
*
mtab
->
size
;
float
*
out2
=
out
;
float
*
prev_buf
;
int
first_wsize
;
static
const
uint8_t
wtype_to_wsize
[]
=
{
0
,
0
,
2
,
2
,
2
,
1
,
0
,
1
,
1
};
int
types_sizes
[]
=
{
mtab
->
size
/
mtab
->
fmode
[
FT_LONG
].
sub
,
mtab
->
size
/
mtab
->
fmode
[
FT_MEDIUM
].
sub
,
mtab
->
size
/
(
2
*
mtab
->
fmode
[
FT_SHORT
].
sub
),
mtab
->
size
/
mtab
->
fmode
[
FT_LONG
].
sub
,
mtab
->
size
/
mtab
->
fmode
[
FT_MEDIUM
].
sub
,
mtab
->
size
/
(
mtab
->
fmode
[
FT_SHORT
].
sub
*
2
),
};
wsize
=
types_sizes
[
wtype_to_wsize
[
wtype
]];
wsize
=
types_sizes
[
wtype_to_wsize
[
wtype
]];
first_wsize
=
wsize
;
prev_buf
=
prev
+
(
size
-
bsize
)
/
2
;
prev_buf
=
prev
+
(
size
-
bsize
)
/
2
;
for
(
j
=
0
;
j
<
mtab
->
fmode
[
ftype
].
sub
;
j
++
)
{
int
sub_wtype
=
ftype
==
FT_MEDIUM
?
8
:
wtype
;
if
(
!
j
&&
wtype
==
4
)
sub_wtype
=
4
;
else
if
(
j
==
mtab
->
fmode
[
ftype
].
sub
-
1
&&
wtype
==
7
)
else
if
(
j
==
mtab
->
fmode
[
ftype
].
sub
-
1
&&
wtype
==
7
)
sub_wtype
=
7
;
wsize
=
types_sizes
[
wtype_to_wsize
[
sub_wtype
]];
mdct
->
imdct_half
(
mdct
,
buf1
+
bsize
*
j
,
in
+
bsize
*
j
);
mdct
->
imdct_half
(
mdct
,
buf1
+
bsize
*
j
,
in
+
bsize
*
j
);
tctx
->
fdsp
.
vector_fmul_window
(
out2
,
prev_buf
+
(
bsize
-
wsize
)
/
2
,
tctx
->
fdsp
.
vector_fmul_window
(
out2
,
prev_buf
+
(
bsize
-
wsize
)
/
2
,
buf1
+
bsize
*
j
,
ff_sine_windows
[
av_log2
(
wsize
)],
wsize
/
2
);
out2
+=
wsize
;
memcpy
(
out2
,
buf1
+
bsize
*
j
+
wsize
/
2
,
(
bsize
-
wsize
/
2
)
*
sizeof
(
float
));
memcpy
(
out2
,
buf1
+
bsize
*
j
+
wsize
/
2
,
(
bsize
-
wsize
/
2
)
*
sizeof
(
float
));
out2
+=
ftype
==
FT_MEDIUM
?
(
bsize
-
wsize
)
/
2
:
bsize
-
wsize
;
out2
+=
ftype
==
FT_MEDIUM
?
(
bsize
-
wsize
)
/
2
:
bsize
-
wsize
;
prev_buf
=
buf1
+
bsize
*
j
+
bsize
/
2
;
prev_buf
=
buf1
+
bsize
*
j
+
bsize
/
2
;
}
tctx
->
last_block_pos
[
ch
]
=
(
size
+
first_wsize
)
/
2
;
tctx
->
last_block_pos
[
ch
]
=
(
size
+
first_wsize
)
/
2
;
}
static
void
imdct_output
(
TwinContext
*
tctx
,
enum
FrameType
ftype
,
int
wtype
,
float
**
out
)
{
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
size1
,
size2
;
float
*
prev_buf
=
tctx
->
prev_frame
+
tctx
->
last_block_pos
[
0
];
int
i
;
float
*
prev_buf
=
tctx
->
prev_frame
+
tctx
->
last_block_pos
[
0
];
int
size1
,
size2
,
i
;
for
(
i
=
0
;
i
<
tctx
->
avctx
->
channels
;
i
++
)
{
for
(
i
=
0
;
i
<
tctx
->
avctx
->
channels
;
i
++
)
imdct_and_window
(
tctx
,
ftype
,
wtype
,
tctx
->
spectrum
+
i
*
mtab
->
size
,
prev_buf
+
2
*
i
*
mtab
->
size
,
tctx
->
spectrum
+
i
*
mtab
->
size
,
prev_buf
+
2
*
i
*
mtab
->
size
,
i
);
}
if
(
!
out
)
return
;
...
...
@@ -684,12 +687,14 @@ static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype,
size2
=
tctx
->
last_block_pos
[
0
];
size1
=
mtab
->
size
-
size2
;
memcpy
(
&
out
[
0
][
0
],
prev_buf
,
size1
*
sizeof
(
out
[
0
][
0
]));
memcpy
(
&
out
[
0
][
0
],
prev_buf
,
size1
*
sizeof
(
out
[
0
][
0
]));
memcpy
(
&
out
[
0
][
size1
],
tctx
->
curr_frame
,
size2
*
sizeof
(
out
[
0
][
0
]));
if
(
tctx
->
avctx
->
channels
==
2
)
{
memcpy
(
&
out
[
1
][
0
],
&
prev_buf
[
2
*
mtab
->
size
],
size1
*
sizeof
(
out
[
1
][
0
]));
memcpy
(
&
out
[
1
][
size1
],
&
tctx
->
curr_frame
[
2
*
mtab
->
size
],
size2
*
sizeof
(
out
[
1
][
0
]));
memcpy
(
&
out
[
1
][
0
],
&
prev_buf
[
2
*
mtab
->
size
],
size1
*
sizeof
(
out
[
1
][
0
]));
memcpy
(
&
out
[
1
][
size1
],
&
tctx
->
curr_frame
[
2
*
mtab
->
size
],
size2
*
sizeof
(
out
[
1
][
0
]));
tctx
->
fdsp
.
butterflies_float
(
out
[
0
],
out
[
1
],
mtab
->
size
);
}
}
...
...
@@ -698,37 +703,37 @@ static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist,
int
ch
,
float
*
out
,
float
gain
,
enum
FrameType
ftype
)
{
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
i
,
j
;
float
*
hist
=
tctx
->
bark_hist
[
ftype
][
ch
];
float
val
=
((
const
float
[])
{
0
.
4
,
0
.
35
,
0
.
28
})[
ftype
];
int
bark_n_coef
=
mtab
->
fmode
[
ftype
].
bark_n_coef
;
int
fw_cb_len
=
mtab
->
fmode
[
ftype
].
bark_env_size
/
bark_n_coef
;
int
idx
=
0
;
int
i
,
j
;
float
*
hist
=
tctx
->
bark_hist
[
ftype
][
ch
];
float
val
=
((
const
float
[])
{
0
.
4
,
0
.
35
,
0
.
28
})[
ftype
];
int
bark_n_coef
=
mtab
->
fmode
[
ftype
].
bark_n_coef
;
int
fw_cb_len
=
mtab
->
fmode
[
ftype
].
bark_env_size
/
bark_n_coef
;
int
idx
=
0
;
for
(
i
=
0
;
i
<
fw_cb_len
;
i
++
)
for
(
j
=
0
;
j
<
bark_n_coef
;
j
++
,
idx
++
)
{
float
tmp2
=
mtab
->
fmode
[
ftype
].
bark_cb
[
fw_cb_len
*
in
[
j
]
+
i
]
*
(
1
.
/
4096
);
float
st
=
use_hist
?
(
1
.
-
val
)
*
tmp2
+
val
*
hist
[
idx
]
+
1
.
:
tmp2
+
1
.;
float
tmp2
=
mtab
->
fmode
[
ftype
].
bark_cb
[
fw_cb_len
*
in
[
j
]
+
i
]
*
(
1
.
/
4096
);
float
st
=
use_hist
?
(
1
.
-
val
)
*
tmp2
+
val
*
hist
[
idx
]
+
1
.
:
tmp2
+
1
.;
hist
[
idx
]
=
tmp2
;
if
(
st
<
-
1
.)
st
=
1
.;
if
(
st
<
-
1
.)
st
=
1
.;
memset_float
(
out
,
st
*
gain
,
mtab
->
fmode
[
ftype
].
bark_tab
[
idx
]);
out
+=
mtab
->
fmode
[
ftype
].
bark_tab
[
idx
];
}
}
static
void
read_and_decode_spectrum
(
TwinContext
*
tctx
,
GetBitContext
*
gb
,
float
*
out
,
enum
FrameType
ftype
)
{
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
channels
=
tctx
->
avctx
->
channels
;
int
sub
=
mtab
->
fmode
[
ftype
].
sub
;
int
block_size
=
mtab
->
size
/
sub
;
float
gain
[
CHANNELS_MAX
*
SUBBLOCKS_MAX
];
int
channels
=
tctx
->
avctx
->
channels
;
int
sub
=
mtab
->
fmode
[
ftype
].
sub
;
int
block_size
=
mtab
->
size
/
sub
;
float
gain
[
CHANNELS_MAX
*
SUBBLOCKS_MAX
];
float
ppc_shape
[
PPC_SHAPE_LEN_MAX
*
CHANNELS_MAX
*
4
];
uint8_t
bark1
[
CHANNELS_MAX
][
SUBBLOCKS_MAX
][
BARK_N_COEF_MAX
];
uint8_t
bark_use_hist
[
CHANNELS_MAX
][
SUBBLOCKS_MAX
];
...
...
@@ -757,17 +762,17 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
for
(
i
=
0
;
i
<
channels
;
i
++
)
{
lpc_hist_idx
[
i
]
=
get_bits
(
gb
,
tctx
->
mtab
->
lsp_bit0
);
lpc_idx1
[
i
]
=
get_bits
(
gb
,
tctx
->
mtab
->
lsp_bit1
);
lpc_idx1
[
i
]
=
get_bits
(
gb
,
tctx
->
mtab
->
lsp_bit1
);
for
(
j
=
0
;
j
<
tctx
->
mtab
->
lsp_split
;
j
++
)
lpc_idx2
[
i
][
j
]
=
get_bits
(
gb
,
tctx
->
mtab
->
lsp_bit2
);
}
if
(
ftype
==
FT_LONG
)
{
int
cb_len_p
=
(
tctx
->
n_div
[
3
]
+
mtab
->
ppc_shape_len
*
channels
-
1
)
/
tctx
->
n_div
[
3
];
int
cb_len_p
=
(
tctx
->
n_div
[
3
]
+
mtab
->
ppc_shape_len
*
channels
-
1
)
/
tctx
->
n_div
[
3
];
dequant
(
tctx
,
gb
,
ppc_shape
,
FT_PPC
,
mtab
->
ppc_shape_cb
,
mtab
->
ppc_shape_cb
+
cb_len_p
*
PPC_SHAPE_CB_SIZE
,
cb_len_p
);
mtab
->
ppc_shape_cb
+
cb_len_p
*
PPC_SHAPE_CB_SIZE
,
cb_len_p
);
}
for
(
i
=
0
;
i
<
channels
;
i
++
)
{
...
...
@@ -776,21 +781,22 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
for
(
j
=
0
;
j
<
sub
;
j
++
)
{
dec_bark_env
(
tctx
,
bark1
[
i
][
j
],
bark_use_hist
[
i
][
j
],
i
,
tctx
->
tmp_buf
,
gain
[
sub
*
i
+
j
],
ftype
);
tctx
->
tmp_buf
,
gain
[
sub
*
i
+
j
],
ftype
);
tctx
->
fdsp
.
vector_fmul
(
chunk
+
block_size
*
j
,
chunk
+
block_size
*
j
,
tctx
->
fdsp
.
vector_fmul
(
chunk
+
block_size
*
j
,
chunk
+
block_size
*
j
,
tctx
->
tmp_buf
,
block_size
);
}
if
(
ftype
==
FT_LONG
)
{
float
pgain_step
=
25000
.
/
((
1
<<
mtab
->
pgain_bit
)
-
1
);
int
p_coef
=
get_bits
(
gb
,
tctx
->
mtab
->
ppc_period_bit
);
int
g_coef
=
get_bits
(
gb
,
tctx
->
mtab
->
pgain_bit
);
float
v
=
1
.
/
8192
*
mulawinv
(
pgain_step
*
g_coef
+
pgain_step
/
2
,
25000
.,
PGAIN_MU
);
int
p_coef
=
get_bits
(
gb
,
tctx
->
mtab
->
ppc_period_bit
);
int
g_coef
=
get_bits
(
gb
,
tctx
->
mtab
->
pgain_bit
);
float
v
=
1
.
/
8192
*
mulawinv
(
pgain_step
*
g_coef
+
pgain_step
/
2
,
25000
.,
PGAIN_MU
);
decode_ppc
(
tctx
,
p_coef
,
ppc_shape
+
i
*
mtab
->
ppc_shape_len
,
v
,
decode_ppc
(
tctx
,
p_coef
,
ppc_shape
+
i
*
mtab
->
ppc_shape_len
,
v
,
chunk
);
}
...
...
@@ -806,16 +812,16 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
}
}
static
int
twin_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
static
int
twin_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
AVFrame
*
frame
=
data
;
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
;
TwinContext
*
tctx
=
avctx
->
priv_data
;
int
buf_size
=
avpkt
->
size
;
TwinContext
*
tctx
=
avctx
->
priv_data
;
GetBitContext
gb
;
const
ModeTab
*
mtab
=
tctx
->
mtab
;
float
**
out
=
NULL
;
float
**
out
=
NULL
;
enum
FrameType
ftype
;
int
window_type
,
ret
;
static
const
enum
FrameType
wtype_to_ftype_table
[]
=
{
...
...
@@ -823,7 +829,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
FT_MEDIUM
,
FT_LONG
,
FT_LONG
,
FT_MEDIUM
,
FT_MEDIUM
};
if
(
buf_size
*
8
<
avctx
->
bit_rate
*
mtab
->
size
/
avctx
->
sample_rate
+
8
)
{
if
(
buf_size
*
8
<
avctx
->
bit_rate
*
mtab
->
size
/
avctx
->
sample_rate
+
8
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Frame too small (%d bytes). Truncated file?
\n
"
,
buf_size
);
return
AVERROR
(
EINVAL
);
...
...
@@ -854,7 +860,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
imdct_output
(
tctx
,
ftype
,
window_type
,
out
);
FFSWAP
(
float
*
,
tctx
->
curr_frame
,
tctx
->
prev_frame
);
FFSWAP
(
float
*
,
tctx
->
curr_frame
,
tctx
->
prev_frame
);
if
(
tctx
->
discarded_packets
<
2
)
{
tctx
->
discarded_packets
++
;
...
...
@@ -874,15 +880,15 @@ static av_cold int init_mdct_win(TwinContext *tctx)
{
int
i
,
j
,
ret
;
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
size_s
=
mtab
->
size
/
mtab
->
fmode
[
FT_SHORT
].
sub
;
int
size_m
=
mtab
->
size
/
mtab
->
fmode
[
FT_MEDIUM
].
sub
;
int
channels
=
tctx
->
avctx
->
channels
;
float
norm
=
channels
==
1
?
2
.
:
1
.;
int
size_s
=
mtab
->
size
/
mtab
->
fmode
[
FT_SHORT
].
sub
;
int
size_m
=
mtab
->
size
/
mtab
->
fmode
[
FT_MEDIUM
].
sub
;
int
channels
=
tctx
->
avctx
->
channels
;
float
norm
=
channels
==
1
?
2
.
:
1
.;
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
bsize
=
tctx
->
mtab
->
size
/
tctx
->
mtab
->
fmode
[
i
].
sub
;
int
bsize
=
tctx
->
mtab
->
size
/
tctx
->
mtab
->
fmode
[
i
].
sub
;
if
((
ret
=
ff_mdct_init
(
&
tctx
->
mdct_ctx
[
i
],
av_log2
(
bsize
)
+
1
,
1
,
-
sqrt
(
norm
/
bsize
)
/
(
1
<<
15
))))
-
sqrt
(
norm
/
bsize
)
/
(
1
<<
15
))))
return
ret
;
}
...
...
@@ -900,23 +906,23 @@ static av_cold int init_mdct_win(TwinContext *tctx)
alloc_fail
);
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
m
=
4
*
mtab
->
size
/
mtab
->
fmode
[
i
].
sub
;
double
freq
=
2
*
M_PI
/
m
;
int
m
=
4
*
mtab
->
size
/
mtab
->
fmode
[
i
].
sub
;
double
freq
=
2
*
M_PI
/
m
;
FF_ALLOC_OR_GOTO
(
tctx
->
avctx
,
tctx
->
cos_tabs
[
i
],
(
m
/
4
)
*
sizeof
(
*
tctx
->
cos_tabs
[
i
]),
alloc_fail
);
for
(
j
=
0
;
j
<=
m
/
8
;
j
++
)
tctx
->
cos_tabs
[
i
][
j
]
=
cos
((
2
*
j
+
1
)
*
freq
);
for
(
j
=
1
;
j
<
m
/
8
;
j
++
)
tctx
->
cos_tabs
[
i
][
m
/
4
-
j
]
=
tctx
->
cos_tabs
[
i
][
j
];
for
(
j
=
0
;
j
<=
m
/
8
;
j
++
)
tctx
->
cos_tabs
[
i
][
j
]
=
cos
((
2
*
j
+
1
)
*
freq
);
for
(
j
=
1
;
j
<
m
/
8
;
j
++
)
tctx
->
cos_tabs
[
i
][
m
/
4
-
j
]
=
tctx
->
cos_tabs
[
i
][
j
];
}
ff_init_ff_sine_windows
(
av_log2
(
size_m
));
ff_init_ff_sine_windows
(
av_log2
(
size_s
/
2
));
ff_init_ff_sine_windows
(
av_log2
(
size_s
/
2
));
ff_init_ff_sine_windows
(
av_log2
(
mtab
->
size
));
return
0
;
alloc_fail:
return
AVERROR
(
ENOMEM
);
}
...
...
@@ -931,25 +937,24 @@ static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks,
int
block_size
,
const
uint8_t
line_len
[
2
],
int
length_div
,
enum
FrameType
ftype
)
{
int
i
,
j
;
int
i
,
j
;
for
(
i
=
0
;
i
<
line_len
[
0
];
i
++
)
{
int
shift
;
if
(
num_blocks
==
1
||
if
(
num_blocks
==
1
||
(
ftype
==
FT_LONG
&&
num_vect
%
num_blocks
)
||
(
ftype
!=
FT_LONG
&&
num_vect
&
1
)
||
(
ftype
!=
FT_LONG
&&
num_vect
&
1
)
||
i
==
line_len
[
1
])
{
shift
=
0
;
}
else
if
(
ftype
==
FT_LONG
)
{
shift
=
i
;
}
else
shift
=
i
*
i
;
shift
=
i
*
i
;
for
(
j
=
0
;
j
<
num_vect
&&
(
j
+
num_vect
*
i
<
block_size
*
num_blocks
);
j
++
)
tab
[
i
*
num_vect
+
j
]
=
i
*
num_vect
+
(
j
+
shift
)
%
num_vect
;
for
(
j
=
0
;
j
<
num_vect
&&
(
j
+
num_vect
*
i
<
block_size
*
num_blocks
);
j
++
)
tab
[
i
*
num_vect
+
j
]
=
i
*
num_vect
+
(
j
+
shift
)
%
num_vect
;
}
}
...
...
@@ -971,31 +976,32 @@ static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks,
static
void
transpose_perm
(
int16_t
*
out
,
int16_t
*
in
,
int
num_vect
,
const
uint8_t
line_len
[
2
],
int
length_div
)
{
int
i
,
j
;
int
cont
=
0
;
int
i
,
j
;
int
cont
=
0
;
for
(
i
=
0
;
i
<
num_vect
;
i
++
)
for
(
j
=
0
;
j
<
line_len
[
i
>=
length_div
];
j
++
)
out
[
cont
++
]
=
in
[
j
*
num_vect
+
i
];
out
[
cont
++
]
=
in
[
j
*
num_vect
+
i
];
}
static
void
linear_perm
(
int16_t
*
out
,
int16_t
*
in
,
int
n_blocks
,
int
size
)
{
int
block_size
=
size
/
n_blocks
;
int
block_size
=
size
/
n_blocks
;
int
i
;
for
(
i
=
0
;
i
<
size
;
i
++
)
out
[
i
]
=
block_size
*
(
in
[
i
]
%
n_blocks
)
+
in
[
i
]
/
n_blocks
;
}
static
av_cold
void
construct_perm_table
(
TwinContext
*
tctx
,
enum
FrameType
ftype
)
static
av_cold
void
construct_perm_table
(
TwinContext
*
tctx
,
enum
FrameType
ftype
)
{
int
block_size
;
int
block_size
,
size
;
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
size
;
int16_t
*
tmp_perm
=
(
int16_t
*
)
tctx
->
tmp_buf
;
int16_t
*
tmp_perm
=
(
int16_t
*
)
tctx
->
tmp_buf
;
if
(
ftype
==
FT_PPC
)
{
size
=
tctx
->
avctx
->
channels
;
size
=
tctx
->
avctx
->
channels
;
block_size
=
mtab
->
ppc_shape_len
;
}
else
{
size
=
tctx
->
avctx
->
channels
*
mtab
->
fmode
[
ftype
].
sub
;
...
...
@@ -1010,71 +1016,71 @@ static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype)
tctx
->
length
[
ftype
],
tctx
->
length_change
[
ftype
]);
linear_perm
(
tctx
->
permut
[
ftype
],
tctx
->
permut
[
ftype
],
size
,
size
*
block_size
);
size
*
block_size
);
}
static
av_cold
void
init_bitstream_params
(
TwinContext
*
tctx
)
{
const
ModeTab
*
mtab
=
tctx
->
mtab
;
int
n_ch
=
tctx
->
avctx
->
channels
;
int
total_fr_bits
=
tctx
->
avctx
->
bit_rate
*
mtab
->
size
/
tctx
->
avctx
->
sample_rate
;
int
n_ch
=
tctx
->
avctx
->
channels
;
int
total_fr_bits
=
tctx
->
avctx
->
bit_rate
*
mtab
->
size
/
tctx
->
avctx
->
sample_rate
;
int
lsp_bits_per_block
=
n_ch
*
(
mtab
->
lsp_bit0
+
mtab
->
lsp_bit1
+
mtab
->
lsp_split
*
mtab
->
lsp_bit2
);
int
lsp_bits_per_block
=
n_ch
*
(
mtab
->
lsp_bit0
+
mtab
->
lsp_bit1
+
mtab
->
lsp_split
*
mtab
->
lsp_bit2
);
int
ppc_bits
=
n_ch
*
(
mtab
->
pgain_bit
+
mtab
->
ppc_shape_bit
+
mtab
->
ppc_period_bit
);
int
ppc_bits
=
n_ch
*
(
mtab
->
pgain_bit
+
mtab
->
ppc_shape_bit
+
mtab
->
ppc_period_bit
);
int
bsize_no_main_cb
[
3
];
int
bse_bits
[
3
];
int
i
;
int
bsize_no_main_cb
[
3
],
bse_bits
[
3
],
i
;
enum
FrameType
frametype
;
for
(
i
=
0
;
i
<
3
;
i
++
)
// +1 for history usage switch
bse_bits
[
i
]
=
n_ch
*
(
mtab
->
fmode
[
i
].
bark_n_coef
*
mtab
->
fmode
[
i
].
bark_n_bit
+
1
);
(
mtab
->
fmode
[
i
].
bark_n_coef
*
mtab
->
fmode
[
i
].
bark_n_bit
+
1
);
bsize_no_main_cb
[
2
]
=
bse_bits
[
2
]
+
lsp_bits_per_block
+
ppc_bits
+
WINDOW_TYPE_BITS
+
n_ch
*
GAIN_BITS
;
WINDOW_TYPE_BITS
+
n_ch
*
GAIN_BITS
;
for
(
i
=
0
;
i
<
2
;
i
++
)
bsize_no_main_cb
[
i
]
=
lsp_bits_per_block
+
n_ch
*
GAIN_BITS
+
WINDOW_TYPE_BITS
+
mtab
->
fmode
[
i
].
sub
*
(
bse_bits
[
i
]
+
n_ch
*
SUB_GAIN_BITS
);
lsp_bits_per_block
+
n_ch
*
GAIN_BITS
+
WINDOW_TYPE_BITS
+
mtab
->
fmode
[
i
].
sub
*
(
bse_bits
[
i
]
+
n_ch
*
SUB_GAIN_BITS
);
// The remaining bits are all used for the main spectrum coefficients
for
(
i
=
0
;
i
<
4
;
i
++
)
{
int
bit_size
;
int
vect_size
;
int
bit_size
,
vect_size
;
int
rounded_up
,
rounded_down
,
num_rounded_down
,
num_rounded_up
;
if
(
i
==
3
)
{
bit_size
=
n_ch
*
mtab
->
ppc_shape_bit
;
vect_size
=
n_ch
*
mtab
->
ppc_shape_len
;
}
else
{
bit_size
=
total_fr_bits
-
bsize_no_main_cb
[
i
];
bit_size
=
total_fr_bits
-
bsize_no_main_cb
[
i
];
vect_size
=
n_ch
*
mtab
->
size
;
}
tctx
->
n_div
[
i
]
=
(
bit_size
+
13
)
/
14
;
rounded_up
=
(
bit_size
+
tctx
->
n_div
[
i
]
-
1
)
/
tctx
->
n_div
[
i
];
rounded_down
=
(
bit_size
)
/
tctx
->
n_div
[
i
];
num_rounded_down
=
rounded_up
*
tctx
->
n_div
[
i
]
-
bit_size
;
num_rounded_up
=
tctx
->
n_div
[
i
]
-
num_rounded_down
;
tctx
->
bits_main_spec
[
0
][
i
][
0
]
=
(
rounded_up
+
1
)
/
2
;
tctx
->
bits_main_spec
[
1
][
i
][
0
]
=
(
rounded_up
)
/
2
;
tctx
->
bits_main_spec
[
0
][
i
][
1
]
=
(
rounded_down
+
1
)
/
2
;
tctx
->
bits_main_spec
[
1
][
i
][
1
]
=
(
rounded_down
)
/
2
;
rounded_up
=
(
bit_size
+
tctx
->
n_div
[
i
]
-
1
)
/
tctx
->
n_div
[
i
];
rounded_down
=
(
bit_size
)
/
tctx
->
n_div
[
i
];
num_rounded_down
=
rounded_up
*
tctx
->
n_div
[
i
]
-
bit_size
;
num_rounded_up
=
tctx
->
n_div
[
i
]
-
num_rounded_down
;
tctx
->
bits_main_spec
[
0
][
i
][
0
]
=
(
rounded_up
+
1
)
/
2
;
tctx
->
bits_main_spec
[
1
][
i
][
0
]
=
rounded_up
/
2
;
tctx
->
bits_main_spec
[
0
][
i
][
1
]
=
(
rounded_down
+
1
)
/
2
;
tctx
->
bits_main_spec
[
1
][
i
][
1
]
=
rounded_down
/
2
;
tctx
->
bits_main_spec_change
[
i
]
=
num_rounded_up
;
rounded_up
=
(
vect_size
+
tctx
->
n_div
[
i
]
-
1
)
/
tctx
->
n_div
[
i
];
rounded_down
=
(
vect_size
)
/
tctx
->
n_div
[
i
];
num_rounded_down
=
rounded_up
*
tctx
->
n_div
[
i
]
-
vect_size
;
num_rounded_up
=
tctx
->
n_div
[
i
]
-
num_rounded_down
;
tctx
->
length
[
i
][
0
]
=
rounded_up
;
tctx
->
length
[
i
][
1
]
=
rounded_down
;
rounded_up
=
(
vect_size
+
tctx
->
n_div
[
i
]
-
1
)
/
tctx
->
n_div
[
i
];
rounded_down
=
(
vect_size
)
/
tctx
->
n_div
[
i
];
num_rounded_down
=
rounded_up
*
tctx
->
n_div
[
i
]
-
vect_size
;
num_rounded_up
=
tctx
->
n_div
[
i
]
-
num_rounded_down
;
tctx
->
length
[
i
][
0
]
=
rounded_up
;
tctx
->
length
[
i
][
1
]
=
rounded_down
;
tctx
->
length_change
[
i
]
=
num_rounded_up
;
}
...
...
@@ -1092,7 +1098,6 @@ static av_cold int twin_decode_close(AVCodecContext *avctx)
av_free
(
tctx
->
cos_tabs
[
i
]);
}
av_free
(
tctx
->
curr_frame
);
av_free
(
tctx
->
spectrum
);
av_free
(
tctx
->
prev_frame
);
...
...
@@ -1103,9 +1108,8 @@ static av_cold int twin_decode_close(AVCodecContext *avctx)
static
av_cold
int
twin_decode_init
(
AVCodecContext
*
avctx
)
{
int
ret
;
int
ret
,
isampf
,
ibps
;
TwinContext
*
tctx
=
avctx
->
priv_data
;
int
isampf
,
ibps
;
tctx
->
avctx
=
avctx
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLTP
;
...
...
@@ -1114,7 +1118,7 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
av_log
(
avctx
,
AV_LOG_ERROR
,
"Missing or incomplete extradata
\n
"
);
return
AVERROR_INVALIDDATA
;
}
avctx
->
channels
=
AV_RB32
(
avctx
->
extradata
)
+
1
;
avctx
->
channels
=
AV_RB32
(
avctx
->
extradata
)
+
1
;
avctx
->
bit_rate
=
AV_RB32
(
avctx
->
extradata
+
4
)
*
1000
;
isampf
=
AV_RB32
(
avctx
->
extradata
+
8
);
...
...
@@ -1123,10 +1127,18 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
return
AVERROR_INVALIDDATA
;
}
switch
(
isampf
)
{
case
44
:
avctx
->
sample_rate
=
44100
;
break
;
case
22
:
avctx
->
sample_rate
=
22050
;
break
;
case
11
:
avctx
->
sample_rate
=
11025
;
break
;
default:
avctx
->
sample_rate
=
isampf
*
1000
;
break
;
case
44
:
avctx
->
sample_rate
=
44100
;
break
;
case
22
:
avctx
->
sample_rate
=
22050
;
break
;
case
11
:
avctx
->
sample_rate
=
11025
;
break
;
default:
avctx
->
sample_rate
=
isampf
*
1000
;
break
;
}
if
(
avctx
->
channels
<=
0
||
avctx
->
channels
>
CHANNELS_MAX
)
{
...
...
@@ -1134,23 +1146,43 @@ static av_cold int twin_decode_init(AVCodecContext *avctx)
avctx
->
channels
);
return
-
1
;
}
avctx
->
channel_layout
=
avctx
->
channels
==
1
?
AV_CH_LAYOUT_MONO
:
AV_CH_LAYOUT_STEREO
;
avctx
->
channel_layout
=
avctx
->
channels
==
1
?
AV_CH_LAYOUT_MONO
:
AV_CH_LAYOUT_STEREO
;
ibps
=
avctx
->
bit_rate
/
(
1000
*
avctx
->
channels
);
switch
((
isampf
<<
8
)
+
ibps
)
{
case
(
8
<<
8
)
+
8
:
tctx
->
mtab
=
&
mode_08_08
;
break
;
case
(
11
<<
8
)
+
8
:
tctx
->
mtab
=
&
mode_11_08
;
break
;
case
(
11
<<
8
)
+
10
:
tctx
->
mtab
=
&
mode_11_10
;
break
;
case
(
16
<<
8
)
+
16
:
tctx
->
mtab
=
&
mode_16_16
;
break
;
case
(
22
<<
8
)
+
20
:
tctx
->
mtab
=
&
mode_22_20
;
break
;
case
(
22
<<
8
)
+
24
:
tctx
->
mtab
=
&
mode_22_24
;
break
;
case
(
22
<<
8
)
+
32
:
tctx
->
mtab
=
&
mode_22_32
;
break
;
case
(
44
<<
8
)
+
40
:
tctx
->
mtab
=
&
mode_44_40
;
break
;
case
(
44
<<
8
)
+
48
:
tctx
->
mtab
=
&
mode_44_48
;
break
;
switch
((
isampf
<<
8
)
+
ibps
)
{
case
(
8
<<
8
)
+
8
:
tctx
->
mtab
=
&
mode_08_08
;
break
;
case
(
11
<<
8
)
+
8
:
tctx
->
mtab
=
&
mode_11_08
;
break
;
case
(
11
<<
8
)
+
10
:
tctx
->
mtab
=
&
mode_11_10
;
break
;
case
(
16
<<
8
)
+
16
:
tctx
->
mtab
=
&
mode_16_16
;
break
;
case
(
22
<<
8
)
+
20
:
tctx
->
mtab
=
&
mode_22_20
;
break
;
case
(
22
<<
8
)
+
24
:
tctx
->
mtab
=
&
mode_22_24
;
break
;
case
(
22
<<
8
)
+
32
:
tctx
->
mtab
=
&
mode_22_32
;
break
;
case
(
44
<<
8
)
+
40
:
tctx
->
mtab
=
&
mode_44_40
;
break
;
case
(
44
<<
8
)
+
48
:
tctx
->
mtab
=
&
mode_44_48
;
break
;
default:
av_log
(
avctx
,
AV_LOG_ERROR
,
"This version does not support %d kHz - %d kbit/s/ch mode.
\n
"
,
isampf
,
isampf
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"This version does not support %d kHz - %d kbit/s/ch mode.
\n
"
,
isampf
,
isampf
);
return
-
1
;
}
...
...
libavcodec/twinvq_data.h
View file @
6c145ecf
...
...
@@ -39,95 +39,94 @@
* for some slightly nonconventional bark-scale function
*/
static
const
uint16_t
bark_tab_l08_512
[]
=
{
7
,
8
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
9
,
9
,
10
,
10
,
11
,
11
,
12
,
12
,
14
,
15
,
16
,
18
,
19
,
21
,
24
,
27
,
30
,
35
,
40
,
46
,
53
7
,
8
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
9
,
9
,
10
,
10
,
11
,
11
,
12
,
12
,
14
,
15
,
16
,
18
,
19
,
21
,
24
,
27
,
30
,
35
,
40
,
46
,
53
};
static
const
uint16_t
bark_tab_l11_512
[]
=
{
6
,
6
,
6
,
6
,
6
,
6
,
7
,
6
,
7
,
7
,
8
,
8
,
8
,
9
,
10
,
10
,
11
,
13
,
13
,
15
,
17
,
18
,
21
,
25
,
27
,
33
,
38
,
45
,
54
,
66
6
,
6
,
6
,
6
,
6
,
6
,
7
,
6
,
7
,
7
,
8
,
8
,
8
,
9
,
10
,
10
,
11
,
13
,
13
,
15
,
17
,
18
,
21
,
25
,
27
,
33
,
38
,
45
,
54
,
66
};
static
const
uint16_t
bark_tab_l16_1024
[]
=
{
9
,
9
,
8
,
9
,
10
,
9
,
10
,
10
,
10
,
12
,
11
,
13
,
13
,
14
,
16
,
17
,
19
,
20
,
24
,
26
,
30
,
35
,
40
,
48
,
56
,
68
,
83
,
102
,
128
,
165
9
,
9
,
8
,
9
,
10
,
9
,
10
,
10
,
10
,
12
,
11
,
13
,
13
,
14
,
16
,
17
,
19
,
20
,
24
,
26
,
30
,
35
,
40
,
48
,
56
,
68
,
83
,
102
,
128
,
165
};
static
const
uint16_t
bark_tab_l22_1024
[]
=
{
6
,
7
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
8
,
9
,
8
,
10
,
10
,
11
,
12
,
13
,
15
,
16
,
18
,
21
,
24
,
27
,
33
,
38
,
46
,
55
,
68
,
84
,
107
,
140
,
191
6
,
7
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
8
,
9
,
8
,
10
,
10
,
11
,
12
,
13
,
15
,
16
,
18
,
21
,
24
,
27
,
33
,
38
,
46
,
55
,
68
,
84
,
107
,
140
,
191
};
static
const
uint16_t
bark_tab_l22_512
[]
=
{
3
,
3
,
3
,
4
,
3
,
3
,
4
,
3
,
4
,
4
,
4
,
5
,
4
,
5
,
6
,
6
,
7
,
7
,
8
,
9
,
10
,
12
,
14
,
16
,
20
,
22
,
28
,
34
,
42
,
53
,
71
,
95
3
,
3
,
3
,
4
,
3
,
3
,
4
,
3
,
4
,
4
,
4
,
5
,
4
,
5
,
6
,
6
,
7
,
7
,
8
,
9
,
10
,
12
,
14
,
16
,
20
,
22
,
28
,
34
,
42
,
53
,
71
,
95
};
static
const
uint16_t
bark_tab_l44_2048
[]
=
{
5
,
6
,
5
,
6
,
5
,
6
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
8
,
8
,
9
,
9
,
10
,
11
,
11
,
13
,
14
,
16
,
17
,
19
,
22
,
25
,
29
,
33
,
39
,
46
,
54
,
64
,
79
,
98
,
123
,
161
,
220
,
320
,
512
5
,
6
,
5
,
6
,
5
,
6
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
8
,
8
,
9
,
9
,
10
,
11
,
11
,
13
,
14
,
16
,
17
,
19
,
22
,
25
,
29
,
33
,
39
,
46
,
54
,
64
,
79
,
98
,
123
,
161
,
220
,
320
,
512
};
static
const
uint16_t
bark_tab_m08_256
[]
=
{
6
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
8
,
8
,
9
,
10
,
11
,
13
,
15
,
18
,
20
,
25
,
31
,
39
6
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
8
,
8
,
9
,
10
,
11
,
13
,
15
,
18
,
20
,
25
,
31
,
39
};
static
const
uint16_t
bark_tab_m11_256
[]
=
{
4
,
5
,
4
,
5
,
5
,
5
,
6
,
5
,
7
,
7
,
8
,
9
,
10
,
12
,
15
,
17
,
22
,
28
,
35
,
47
4
,
5
,
4
,
5
,
5
,
5
,
6
,
5
,
7
,
7
,
8
,
9
,
10
,
12
,
15
,
17
,
22
,
28
,
35
,
47
};
static
const
uint16_t
bark_tab_m16_512
[]
=
{
7
,
6
,
7
,
7
,
7
,
8
,
9
,
9
,
10
,
11
,
14
,
15
,
18
,
22
,
27
,
34
,
44
,
59
,
81
,
117
7
,
6
,
7
,
7
,
7
,
8
,
9
,
9
,
10
,
11
,
14
,
15
,
18
,
22
,
27
,
34
,
44
,
59
,
81
,
117
};
static
const
uint16_t
bark_tab_m22_256
[]
=
{
3
,
2
,
3
,
2
,
3
,
3
,
4
,
3
,
4
,
5
,
5
,
7
,
8
,
9
,
13
,
16
,
22
,
30
,
44
,
70
3
,
2
,
3
,
2
,
3
,
3
,
4
,
3
,
4
,
5
,
5
,
7
,
8
,
9
,
13
,
16
,
22
,
30
,
44
,
70
};
static
const
uint16_t
bark_tab_m22_512
[]
=
{
5
,
5
,
5
,
6
,
5
,
7
,
6
,
7
,
9
,
9
,
11
,
13
,
15
,
20
,
24
,
33
,
43
,
61
,
88
,
140
5
,
5
,
5
,
6
,
5
,
7
,
6
,
7
,
9
,
9
,
11
,
13
,
15
,
20
,
24
,
33
,
43
,
61
,
88
,
140
};
static
const
uint16_t
bark_tab_m44_512
[]
=
{
3
,
2
,
3
,
3
,
3
,
4
,
3
,
5
,
4
,
6
,
7
,
8
,
10
,
14
,
18
,
25
,
36
,
55
,
95
,
208
3
,
2
,
3
,
3
,
3
,
4
,
3
,
5
,
4
,
6
,
7
,
8
,
10
,
14
,
18
,
25
,
36
,
55
,
95
,
208
};
static
const
uint16_t
bark_tab_s08_64
[]
=
{
3
,
3
,
3
,
3
,
4
,
5
,
6
,
8
,
12
,
17
3
,
3
,
3
,
3
,
4
,
5
,
6
,
8
,
12
,
17
};
static
const
uint16_t
bark_tab_s11_64
[]
=
{
2
,
3
,
2
,
3
,
3
,
4
,
6
,
8
,
12
,
21
2
,
3
,
2
,
3
,
3
,
4
,
6
,
8
,
12
,
21
};
static
const
uint16_t
bark_tab_s16_128
[]
=
{
3
,
4
,
4
,
4
,
5
,
7
,
10
,
16
,
26
,
49
3
,
4
,
4
,
4
,
5
,
7
,
10
,
16
,
26
,
49
};
static
const
uint16_t
bark_tab_s22_128
[]
=
{
3
,
2
,
3
,
4
,
4
,
6
,
9
,
14
,
26
,
57
3
,
2
,
3
,
4
,
4
,
6
,
9
,
14
,
26
,
57
};
static
const
uint16_t
bark_tab_s44_128
[]
=
{
1
,
2
,
1
,
2
,
3
,
4
,
6
,
10
,
23
,
76
1
,
2
,
1
,
2
,
3
,
4
,
6
,
10
,
23
,
76
};
/**
* TwinVQ codebooks. They are coded in a struct so we can use code such as
*
...
...
@@ -10991,147 +10990,155 @@ static const struct twinvq_data {
},
};
static
const
uint8_t
tab7
[][
35
]
=
{
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}
};
static
const
uint8_t
tab8
[][
5
]
=
{
{
0
,
0
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
},
{
1
,
1
,
0
,
0
,
0
},
{
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
},
{
1
,
1
,
0
,
0
,
0
},
{
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
},
{
1
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
1
,
0
}
{
0
,
0
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
},
{
1
,
1
,
0
,
0
,
0
},
{
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
},
{
1
,
1
,
0
,
0
,
0
},
{
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
},
{
1
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
1
,
0
}
};
static
const
uint8_t
tab9
[][
45
]
=
{
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}
};
static
const
uint8_t
tab10
[][
25
]
=
{
{
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
},
{
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
},
{
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
},
{
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
},
{
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
},
{
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
},
{
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
}
static
const
uint8_t
tab10
[][
25
]
=
{
{
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
},
{
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
},
{
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
},
{
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
},
{
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
},
{
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
},
{
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
}
};
static
const
uint8_t
tab11
[][
55
]
=
{
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
},{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
},{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
},{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
},{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},{
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
}
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
},
{
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
}
};
static
const
uint8_t
tab12
[][
15
]
=
{
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
},
};
static
const
struct
{
int
size
;
const
uint8_t
*
tab
;
}
tabs
[]
=
{
{
0
,
NULL
},
{
5
,
&
tab8
[
0
][
0
]},{
5
,
&
tab8
[
0
][
0
]},
{
15
,
&
tab12
[
0
][
0
]
},
{
5
,
&
tab8
[
0
][
0
]},{
25
,
&
tab10
[
0
][
0
]},
{
15
,
&
tab12
[
0
][
0
]
},
{
35
,
&
tab7
[
0
][
0
]},{
5
,
&
tab8
[
0
][
0
]},
{
45
,
&
tab9
[
0
][
0
]
},
{
25
,
&
tab10
[
0
][
0
]},{
55
,
&
tab11
[
0
][
0
]},
{
15
,
&
tab12
[
0
][
0
]
}
{
0
,
NULL
},
{
5
,
&
tab8
[
0
][
0
]
},
{
5
,
&
tab8
[
0
][
0
]
},
{
15
,
&
tab12
[
0
][
0
]
},
{
5
,
&
tab8
[
0
][
0
]
},
{
25
,
&
tab10
[
0
][
0
]
},
{
15
,
&
tab12
[
0
][
0
]
},
{
35
,
&
tab7
[
0
][
0
]
},
{
5
,
&
tab8
[
0
][
0
]
},
{
45
,
&
tab9
[
0
][
0
]
},
{
25
,
&
tab10
[
0
][
0
]
},
{
55
,
&
tab11
[
0
][
0
]
},
{
15
,
&
tab12
[
0
][
0
]
}
};
#endif
/* AVCODEC_TWINVQ_DATA_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment