summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-11-08 11:05:15 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-12-08 17:51:47 +0100
commitb21d9339fe68b2765c73ce7933a476f9a9d3c2da (patch)
treedcb6e482d38e5164a7c17f774cd13b6aca3576ac
parentfb0ae037d024e96093ccbf8cb366dd1fbbdf9644 (diff)
avcodec/qdmc: Apply offset when creating VLC
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r--libavcodec/qdmc.c56
1 files changed, 17 insertions, 39 deletions
diff --git a/libavcodec/qdmc.c b/libavcodec/qdmc.c
index 8b50fbf30a..2c870fcc1b 100644
--- a/libavcodec/qdmc.c
+++ b/libavcodec/qdmc.c
@@ -151,58 +151,38 @@ static const uint8_t freq_diff[][2] = {
{ 18, 6 }, { 6, 4 }, { 12, 5 }, { 21, 6 }, { 25, 6 },
};
-static const uint8_t amplitude_diff_bits[] = {
- 8, 2, 1, 3, 4, 5, 6, 7, 8,
+static const uint8_t amplitude_diff[][2] = {
+ { 1, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 },
+ { 8, 8 }, { 0, 8 }, { 2, 1 },
};
-static const uint8_t amplitude_diff_codes[] = {
- 0xFE, 0x0, 0x1, 0x2, 0x6, 0xE, 0x1E, 0x3E, 0x7E,
+static const uint8_t phase_diff[][2] = {
+ { 2, 2 }, { 1, 2 }, { 3, 4 }, { 7, 4 }, { 6, 5 }, { 5, 6 },
+ { 0, 6 }, { 4, 4 }, { 8, 2 },
};
-static const uint8_t phase_diff_bits[] = {
- 6, 2, 2, 4, 4, 6, 5, 4, 2,
-};
-
-static const uint8_t phase_diff_codes[] = {
- 0x35, 0x2, 0x0, 0x1, 0xD, 0x15, 0x5, 0x9, 0x3,
-};
-
-#define INIT_VLC_STATIC_LE(vlc, nb_bits, nb_codes, \
- bits, bits_wrap, bits_size, \
- codes, codes_wrap, codes_size, \
- symbols, symbols_wrap, symbols_size, \
- static_size) \
- do { \
- static VLC_TYPE table[static_size][2]; \
- (vlc)->table = table; \
- (vlc)->table_allocated = static_size; \
- ff_init_vlc_sparse(vlc, nb_bits, nb_codes, \
- bits, bits_wrap, bits_size, \
- codes, codes_wrap, codes_size, \
- symbols, symbols_wrap, symbols_size, \
- INIT_VLC_LE | INIT_VLC_USE_NEW_STATIC); \
- } while (0)
-
static av_cold void qdmc_init_static_data(void)
{
int i;
INIT_VLC_STATIC_FROM_LENGTHS(&vtable[0], 12, FF_ARRAY_ELEMS(noise_value),
&noise_value[0][1], 2,
- &noise_value[0][0], 2, 1, 0, INIT_VLC_LE, 4096);
+ &noise_value[0][0], 2, 1, -1, INIT_VLC_LE, 4096);
INIT_VLC_STATIC_FROM_LENGTHS(&vtable[1], 10, FF_ARRAY_ELEMS(noise_segment_length),
&noise_segment_length[0][1], 2,
- &noise_segment_length[0][0], 2, 1, 0, INIT_VLC_LE, 1024);
+ &noise_segment_length[0][0], 2, 1, -1, INIT_VLC_LE, 1024);
INIT_VLC_STATIC_FROM_LENGTHS(&vtable[2], 12, FF_ARRAY_ELEMS(amplitude),
&amplitude[0][1], 2,
- &amplitude[0][0], 2, 1, 0, INIT_VLC_LE, 4098);
+ &amplitude[0][0], 2, 1, -1, INIT_VLC_LE, 4098);
INIT_VLC_STATIC_FROM_LENGTHS(&vtable[3], 12, FF_ARRAY_ELEMS(freq_diff),
&freq_diff[0][1], 2,
- &freq_diff[0][0], 2, 1, 0, INIT_VLC_LE, 4160);
- INIT_VLC_STATIC_LE(&vtable[4], 8, FF_ARRAY_ELEMS(amplitude_diff_bits),
- amplitude_diff_bits, 1, 1, amplitude_diff_codes, 1, 1, NULL, 0, 0, 256);
- INIT_VLC_STATIC_LE(&vtable[5], 6, FF_ARRAY_ELEMS(phase_diff_bits),
- phase_diff_bits, 1, 1, phase_diff_codes, 1, 1, NULL, 0, 0, 64);
+ &freq_diff[0][0], 2, 1, -1, INIT_VLC_LE, 4160);
+ INIT_VLC_STATIC_FROM_LENGTHS(&vtable[4], 8, FF_ARRAY_ELEMS(amplitude_diff),
+ &amplitude_diff[0][1], 2,
+ &amplitude_diff[0][0], 2, 1, -1, INIT_VLC_LE, 256);
+ INIT_VLC_STATIC_FROM_LENGTHS(&vtable[5], 6, FF_ARRAY_ELEMS(phase_diff),
+ &phase_diff[0][1], 2,
+ &phase_diff[0][0], 2, 1, -1, INIT_VLC_LE, 64);
for (i = 0; i < 512; i++)
sin_table[i] = sin(2.0f * i * M_PI * 0.001953125f);
@@ -351,9 +331,7 @@ static int qdmc_get_vlc(GetBitContext *gb, VLC *table, int flag)
if (get_bits_left(gb) < 1)
return AVERROR_INVALIDDATA;
v = get_vlc2(gb, table->table, table->bits, 2);
- if (v)
- v = v - 1;
- else
+ if (v < 0)
v = get_bits(gb, get_bits(gb, 3) + 1);
if (flag) {