2 * Header file for hardcoded QDM2 tables
4 * Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #ifndef AVCODEC_QDM2_TABLEGEN_H
24 #define AVCODEC_QDM2_TABLEGEN_H
28 #include "libavutil/attributes.h"
31 #define SOFTCLIP_THRESHOLD 27600
32 #define HARDCLIP_THRESHOLD 35716
34 #if CONFIG_HARDCODED_TABLES
35 #define softclip_table_init()
36 #define rnd_table_init()
37 #define init_noise_samples()
38 #define qdm2_init_vlc()
39 #include "libavcodec/qdm2_tables.h"
41 static uint16_t softclip_table
[HARDCLIP_THRESHOLD
- SOFTCLIP_THRESHOLD
+ 1];
42 static float noise_table
[4096 + 20];
43 static uint8_t random_dequant_index
[256][5];
44 static uint8_t random_dequant_type24
[128][3];
45 static float noise_samples
[128];
47 static av_cold
void softclip_table_init(void) {
49 double dfl
= SOFTCLIP_THRESHOLD
- 32767;
50 float delta
= 1.0 / -dfl
;
51 for (i
= 0; i
< HARDCLIP_THRESHOLD
- SOFTCLIP_THRESHOLD
+ 1; i
++)
52 softclip_table
[i
] = SOFTCLIP_THRESHOLD
- ((int)(sin((float)i
* delta
) * dfl
) & 0x0000FFFF);
56 // random generated table
57 static av_cold
void rnd_table_init(void) {
60 uint64_t random_seed
= 0;
61 float delta
= 1.0 / 16384.0;
62 for(i
= 0; i
< 4096 ;i
++) {
63 random_seed
= random_seed
* 214013 + 2531011;
64 noise_table
[i
] = (delta
* (float)(((int32_t)random_seed
>> 16) & 0x00007FFF)- 1.0) * 1.3;
67 for (i
= 0; i
< 256 ;i
++) {
70 for (j
= 0; j
< 5 ;j
++) {
71 random_dequant_index
[i
][j
] = ldw
/ random_seed
;
76 for (i
= 0; i
< 128 ;i
++) {
79 for (j
= 0; j
< 3 ;j
++) {
80 random_dequant_type24
[i
][j
] = ldw
/ random_seed
;
88 static av_cold
void init_noise_samples(void) {
90 unsigned random_seed
= 0;
91 float delta
= 1.0 / 16384.0;
92 for (i
= 0; i
< 128;i
++) {
93 random_seed
= random_seed
* 214013 + 2531011;
94 noise_samples
[i
] = (delta
* (float)((random_seed
>> 16) & 0x00007fff) - 1.0);
98 static VLC vlc_tab_level
;
99 static VLC vlc_tab_diff
;
100 static VLC vlc_tab_run
;
101 static VLC fft_level_exp_alt_vlc
;
102 static VLC fft_level_exp_vlc
;
103 static VLC fft_stereo_exp_vlc
;
104 static VLC fft_stereo_phase_vlc
;
105 static VLC vlc_tab_tone_level_idx_hi1
;
106 static VLC vlc_tab_tone_level_idx_mid
;
107 static VLC vlc_tab_tone_level_idx_hi2
;
108 static VLC vlc_tab_type30
;
109 static VLC vlc_tab_type34
;
110 static VLC vlc_tab_fft_tone_offset
[5];
112 static VLCElem qdm2_table
[3838];
114 static av_cold
void build_vlc(VLC
*vlc
, int nb_bits
, int nb_codes
,
115 unsigned *offset
, const uint8_t tab
[][2])
117 vlc
->table
= &qdm2_table
[*offset
];
118 vlc
->table_allocated
= FF_ARRAY_ELEMS(qdm2_table
) - *offset
;
119 ff_vlc_init_from_lengths(vlc
, nb_bits
, nb_codes
,
120 &tab
[0][1], 2, &tab
[0][0], 2, 1,
121 -1, VLC_INIT_STATIC_OVERLONG
| VLC_INIT_LE
, NULL
);
122 *offset
+= vlc
->table_size
;
125 static av_cold
void qdm2_init_vlc(void)
127 const uint8_t (*tab
)[2] = tab_fft_tone_offset
;
130 build_vlc(&vlc_tab_level
, 8, 24, &offset
, tab_level
);
131 build_vlc(&vlc_tab_diff
, 8, 33, &offset
, tab_diff
);
132 build_vlc(&vlc_tab_run
, 5, 6, &offset
, tab_run
);
134 build_vlc(&fft_level_exp_alt_vlc
, 8, 28, &offset
, fft_level_exp_alt
);
135 build_vlc(&fft_level_exp_vlc
, 8, 20, &offset
, fft_level_exp
);
137 build_vlc(&fft_stereo_exp_vlc
, 6, 7, &offset
, fft_stereo_exp
);
138 build_vlc(&fft_stereo_phase_vlc
, 6, 9, &offset
, fft_stereo_phase
);
140 build_vlc(&vlc_tab_tone_level_idx_hi1
, 8, 20, &offset
, tab_tone_level_idx_hi1
);
141 build_vlc(&vlc_tab_tone_level_idx_mid
, 8, 13, &offset
, tab_tone_level_idx_mid
);
142 build_vlc(&vlc_tab_tone_level_idx_hi2
, 8, 18, &offset
, tab_tone_level_idx_hi2
);
144 build_vlc(&vlc_tab_type30
, 6, 9, &offset
, tab_type30
);
145 build_vlc(&vlc_tab_type34
, 5, 10, &offset
, tab_type34
);
147 for (int i
= 0; i
< 5; i
++) {
148 build_vlc(&vlc_tab_fft_tone_offset
[i
], 8, tab_fft_tone_offset_sizes
[i
],
150 tab
+= tab_fft_tone_offset_sizes
[i
];
154 #endif /* CONFIG_HARDCODED_TABLES */
156 #endif /* AVCODEC_QDM2_TABLEGEN_H */