annotate qdm2.c @ 12408:ae72506d4c2a libavcodec

acenc: LAME-inspired window decision This performs quite a bit better than the current 3GPP-inspired window decision on all the samples I have tested. On the castanets.wav sample it performs very similar to iTunes window selection, and seems to perform better than Nero. On fatboy.wav, it seems to perform at least as good as iTunes, if not better. Nero performs horribly on this sample. Patch by: Nathan Caldwell <saintdev@gmail.com>
author alexc
date Mon, 23 Aug 2010 20:00:03 +0000
parents c69dd071f7d4
children b31e6ace12f6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1 /*
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
2 * QDM2 compatible decoder
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
3 * Copyright (c) 2003 Ewald Snel
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
4 * Copyright (c) 2005 Benjamin Larsson
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
5 * Copyright (c) 2005 Alex Beregszaszi
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
6 * Copyright (c) 2005 Roberto Togni
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
7 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3333
diff changeset
8 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3333
diff changeset
9 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3333
diff changeset
10 * FFmpeg is free software; you can redistribute it and/or
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
11 * modify it under the terms of the GNU Lesser General Public
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
12 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3333
diff changeset
13 * version 2.1 of the License, or (at your option) any later version.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
14 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3333
diff changeset
15 * FFmpeg is distributed in the hope that it will be useful,
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
18 * Lesser General Public License for more details.
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
19 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
20 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3333
diff changeset
21 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
23 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
24
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
25 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
26 * @file
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
27 * QDM2 decoder
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
28 * @author Ewald Snel, Benjamin Larsson, Alex Beregszaszi, Roberto Togni
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
29 * The decoder is not perfect yet, there are still some distortions
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
30 * especially on files encoded with 16 or 8 subbands.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
31 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
32
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
33 #include <math.h>
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
34 #include <stddef.h>
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
35 #include <stdio.h>
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
36
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
37 #define ALT_BITSTREAM_READER_LE
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
38 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
39 #include "get_bits.h"
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
40 #include "dsputil.h"
11370
4b3da727d832 Move FFT parts from dsputil.h to fft.h
mru
parents: 11369
diff changeset
41 #include "fft.h"
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
42 #include "mpegaudio.h"
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
43
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
44 #include "qdm2data.h"
11488
424b8482f316 Allow hard-coding several QDM2 tables (about 32 kB size).
reimar
parents: 11391
diff changeset
45 #include "qdm2_tablegen.h"
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
46
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
47 #undef NDEBUG
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
48 #include <assert.h>
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
49
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
50
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
51 #define QDM2_LIST_ADD(list, size, packet) \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
52 do { \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
53 if (size > 0) { \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
54 list[size - 1].next = &list[size]; \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
55 } \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
56 list[size].packet = packet; \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
57 list[size].next = NULL; \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
58 size++; \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
59 } while(0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
60
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
61 // Result is 8, 16 or 30
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
62 #define QDM2_SB_USED(sub_sampling) (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
63
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
64 #define FIX_NOISE_IDX(noise_idx) \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
65 if ((noise_idx) >= 3840) \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
66 (noise_idx) -= 3840; \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
67
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
68 #define SB_DITHERING_NOISE(sb,noise_idx) (noise_table[(noise_idx)++] * sb_noise_attenuation[(sb)])
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
69
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
70 #define BITS_LEFT(length,gb) ((length) - get_bits_count ((gb)))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
71
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
72 #define SAMPLES_NEEDED \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
73 av_log (NULL,AV_LOG_INFO,"This file triggers some untested code. Please contact the developers.\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
74
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
75 #define SAMPLES_NEEDED_2(why) \
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
76 av_log (NULL,AV_LOG_INFO,"This file triggers some missing code. Please contact the developers.\nPosition: %s\n",why);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
77
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
78
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
79 typedef int8_t sb_int8_array[2][30][64];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
80
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
81 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
82 * Subpacket
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
83 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
84 typedef struct {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
85 int type; ///< subpacket type
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
86 unsigned int size; ///< subpacket size
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
87 const uint8_t *data; ///< pointer to subpacket data (points to input data buffer, it's not a private copy)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
88 } QDM2SubPacket;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
89
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
90 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
91 * A node in the subpacket list
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
92 */
6122
61f95f3a62e0 Rename two structures, identifiers starting with _[A-Z] are reserved.
diego
parents: 5215
diff changeset
93 typedef struct QDM2SubPNode {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
94 QDM2SubPacket *packet; ///< packet
6122
61f95f3a62e0 Rename two structures, identifiers starting with _[A-Z] are reserved.
diego
parents: 5215
diff changeset
95 struct QDM2SubPNode *next; ///< pointer to next packet in the list, NULL if leaf node
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
96 } QDM2SubPNode;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
97
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
98 typedef struct {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
99 float re;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
100 float im;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
101 } QDM2Complex;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
102
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
103 typedef struct {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
104 float level;
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
105 QDM2Complex *complex;
6273
michael
parents: 6122
diff changeset
106 const float *table;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
107 int phase;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
108 int phase_shift;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
109 int duration;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
110 short time_index;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
111 short cutoff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
112 } FFTTone;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
113
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
114 typedef struct {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
115 int16_t sub_packet;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
116 uint8_t channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
117 int16_t offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
118 int16_t exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
119 uint8_t phase;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
120 } FFTCoefficient;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
121
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
122 typedef struct {
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
123 DECLARE_ALIGNED(16, QDM2Complex, complex)[MPA_MAX_CHANNELS][256];
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
124 } QDM2FFT;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
125
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
126 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
127 * QDM2 decoder context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
128 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
129 typedef struct {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
130 /// Parameters from codec header, do not change during playback
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
131 int nb_channels; ///< number of channels
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
132 int channels; ///< number of channels
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
133 int group_size; ///< size of frame group (16 frames per group)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
134 int fft_size; ///< size of FFT, in complex numbers
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
135 int checksum_size; ///< size of data block, used also for checksum
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
136
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
137 /// Parameters built from header parameters, do not change during playback
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
138 int group_order; ///< order of frame group
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
139 int fft_order; ///< order of FFT (actually fftorder+1)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
140 int fft_frame_size; ///< size of fft frame, in components (1 comples = re + im)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
141 int frame_size; ///< size of data frame
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
142 int frequency_range;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
143 int sub_sampling; ///< subsampling: 0=25%, 1=50%, 2=100% */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
144 int coeff_per_sb_select; ///< selector for "num. of coeffs. per subband" tables. Can be 0, 1, 2
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
145 int cm_table_select; ///< selector for "coding method" tables. Can be 0, 1 (from init: 0-4)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
146
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
147 /// Packets and packet lists
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
148 QDM2SubPacket sub_packets[16]; ///< the packets themselves
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
149 QDM2SubPNode sub_packet_list_A[16]; ///< list of all packets
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
150 QDM2SubPNode sub_packet_list_B[16]; ///< FFT packets B are on list
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
151 int sub_packets_B; ///< number of packets on 'B' list
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
152 QDM2SubPNode sub_packet_list_C[16]; ///< packets with errors?
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
153 QDM2SubPNode sub_packet_list_D[16]; ///< DCT packets
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
154
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
155 /// FFT and tones
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
156 FFTTone fft_tones[1000];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
157 int fft_tone_start;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
158 int fft_tone_end;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
159 FFTCoefficient fft_coefs[1000];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
160 int fft_coefs_index;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
161 int fft_coefs_min_index[5];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
162 int fft_coefs_max_index[5];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
163 int fft_level_exp[6];
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
164 RDFTContext rdft_ctx;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
165 QDM2FFT fft;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
166
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
167 /// I/O data
6273
michael
parents: 6122
diff changeset
168 const uint8_t *compressed_data;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
169 int compressed_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
170 float output_buffer[1024];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
171
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
172 /// Synthesis filter
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
173 DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512*2];
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
174 int synth_buf_offset[MPA_MAX_CHANNELS];
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
175 DECLARE_ALIGNED(16, int32_t, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
176
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
177 /// Mixed temporary data used in decoding
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
178 float tone_level[MPA_MAX_CHANNELS][30][64];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
179 int8_t coding_method[MPA_MAX_CHANNELS][30][64];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
180 int8_t quantized_coeffs[MPA_MAX_CHANNELS][10][8];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
181 int8_t tone_level_idx_base[MPA_MAX_CHANNELS][30][8];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
182 int8_t tone_level_idx_hi1[MPA_MAX_CHANNELS][3][8][8];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
183 int8_t tone_level_idx_mid[MPA_MAX_CHANNELS][26][8];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
184 int8_t tone_level_idx_hi2[MPA_MAX_CHANNELS][26];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
185 int8_t tone_level_idx[MPA_MAX_CHANNELS][30][64];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
186 int8_t tone_level_idx_temp[MPA_MAX_CHANNELS][30][64];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
187
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
188 // Flags
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
189 int has_errors; ///< packet has errors
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
190 int superblocktype_2_3; ///< select fft tables and some algorithm based on superblock type
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
191 int do_synth_filter; ///< used to perform or skip synthesis filter
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
192
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
193 int sub_packet;
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
194 int noise_idx; ///< index for dithering noise table
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
195 } QDM2Context;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
196
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
197
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
198 static uint8_t empty_buffer[FF_INPUT_BUFFER_PADDING_SIZE];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
199
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
200 static VLC vlc_tab_level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
201 static VLC vlc_tab_diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
202 static VLC vlc_tab_run;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
203 static VLC fft_level_exp_alt_vlc;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
204 static VLC fft_level_exp_vlc;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
205 static VLC fft_stereo_exp_vlc;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
206 static VLC fft_stereo_phase_vlc;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
207 static VLC vlc_tab_tone_level_idx_hi1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
208 static VLC vlc_tab_tone_level_idx_mid;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
209 static VLC vlc_tab_tone_level_idx_hi2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
210 static VLC vlc_tab_type30;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
211 static VLC vlc_tab_type34;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
212 static VLC vlc_tab_fft_tone_offset[5];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
213
9664
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
214 static const uint16_t qdm2_vlc_offs[] = {
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
215 0,260,566,598,894,1166,1230,1294,1678,1950,2214,2278,2310,2570,2834,3124,3448,3838,
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
216 };
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
217
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
218 static av_cold void qdm2_init_vlc(void)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
219 {
9664
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
220 static int vlcs_initialized = 0;
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
221 static VLC_TYPE qdm2_table[3838][2];
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
222
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
223 if (!vlcs_initialized) {
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
224
9665
banan
parents: 9664
diff changeset
225 vlc_tab_level.table = &qdm2_table[qdm2_vlc_offs[0]];
banan
parents: 9664
diff changeset
226 vlc_tab_level.table_allocated = qdm2_vlc_offs[1] - qdm2_vlc_offs[0];
banan
parents: 9664
diff changeset
227 init_vlc (&vlc_tab_level, 8, 24,
banan
parents: 9664
diff changeset
228 vlc_tab_level_huffbits, 1, 1,
banan
parents: 9664
diff changeset
229 vlc_tab_level_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
230
9665
banan
parents: 9664
diff changeset
231 vlc_tab_diff.table = &qdm2_table[qdm2_vlc_offs[1]];
banan
parents: 9664
diff changeset
232 vlc_tab_diff.table_allocated = qdm2_vlc_offs[2] - qdm2_vlc_offs[1];
banan
parents: 9664
diff changeset
233 init_vlc (&vlc_tab_diff, 8, 37,
banan
parents: 9664
diff changeset
234 vlc_tab_diff_huffbits, 1, 1,
banan
parents: 9664
diff changeset
235 vlc_tab_diff_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
236
9665
banan
parents: 9664
diff changeset
237 vlc_tab_run.table = &qdm2_table[qdm2_vlc_offs[2]];
banan
parents: 9664
diff changeset
238 vlc_tab_run.table_allocated = qdm2_vlc_offs[3] - qdm2_vlc_offs[2];
banan
parents: 9664
diff changeset
239 init_vlc (&vlc_tab_run, 5, 6,
banan
parents: 9664
diff changeset
240 vlc_tab_run_huffbits, 1, 1,
banan
parents: 9664
diff changeset
241 vlc_tab_run_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
242
9665
banan
parents: 9664
diff changeset
243 fft_level_exp_alt_vlc.table = &qdm2_table[qdm2_vlc_offs[3]];
banan
parents: 9664
diff changeset
244 fft_level_exp_alt_vlc.table_allocated = qdm2_vlc_offs[4] - qdm2_vlc_offs[3];
banan
parents: 9664
diff changeset
245 init_vlc (&fft_level_exp_alt_vlc, 8, 28,
banan
parents: 9664
diff changeset
246 fft_level_exp_alt_huffbits, 1, 1,
banan
parents: 9664
diff changeset
247 fft_level_exp_alt_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
9664
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
248
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
249
9665
banan
parents: 9664
diff changeset
250 fft_level_exp_vlc.table = &qdm2_table[qdm2_vlc_offs[4]];
banan
parents: 9664
diff changeset
251 fft_level_exp_vlc.table_allocated = qdm2_vlc_offs[5] - qdm2_vlc_offs[4];
banan
parents: 9664
diff changeset
252 init_vlc (&fft_level_exp_vlc, 8, 20,
banan
parents: 9664
diff changeset
253 fft_level_exp_huffbits, 1, 1,
banan
parents: 9664
diff changeset
254 fft_level_exp_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
255
9665
banan
parents: 9664
diff changeset
256 fft_stereo_exp_vlc.table = &qdm2_table[qdm2_vlc_offs[5]];
banan
parents: 9664
diff changeset
257 fft_stereo_exp_vlc.table_allocated = qdm2_vlc_offs[6] - qdm2_vlc_offs[5];
banan
parents: 9664
diff changeset
258 init_vlc (&fft_stereo_exp_vlc, 6, 7,
banan
parents: 9664
diff changeset
259 fft_stereo_exp_huffbits, 1, 1,
banan
parents: 9664
diff changeset
260 fft_stereo_exp_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
261
9665
banan
parents: 9664
diff changeset
262 fft_stereo_phase_vlc.table = &qdm2_table[qdm2_vlc_offs[6]];
banan
parents: 9664
diff changeset
263 fft_stereo_phase_vlc.table_allocated = qdm2_vlc_offs[7] - qdm2_vlc_offs[6];
banan
parents: 9664
diff changeset
264 init_vlc (&fft_stereo_phase_vlc, 6, 9,
banan
parents: 9664
diff changeset
265 fft_stereo_phase_huffbits, 1, 1,
banan
parents: 9664
diff changeset
266 fft_stereo_phase_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
267
9665
banan
parents: 9664
diff changeset
268 vlc_tab_tone_level_idx_hi1.table = &qdm2_table[qdm2_vlc_offs[7]];
banan
parents: 9664
diff changeset
269 vlc_tab_tone_level_idx_hi1.table_allocated = qdm2_vlc_offs[8] - qdm2_vlc_offs[7];
banan
parents: 9664
diff changeset
270 init_vlc (&vlc_tab_tone_level_idx_hi1, 8, 20,
banan
parents: 9664
diff changeset
271 vlc_tab_tone_level_idx_hi1_huffbits, 1, 1,
banan
parents: 9664
diff changeset
272 vlc_tab_tone_level_idx_hi1_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
273
9665
banan
parents: 9664
diff changeset
274 vlc_tab_tone_level_idx_mid.table = &qdm2_table[qdm2_vlc_offs[8]];
banan
parents: 9664
diff changeset
275 vlc_tab_tone_level_idx_mid.table_allocated = qdm2_vlc_offs[9] - qdm2_vlc_offs[8];
banan
parents: 9664
diff changeset
276 init_vlc (&vlc_tab_tone_level_idx_mid, 8, 24,
banan
parents: 9664
diff changeset
277 vlc_tab_tone_level_idx_mid_huffbits, 1, 1,
banan
parents: 9664
diff changeset
278 vlc_tab_tone_level_idx_mid_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
279
9665
banan
parents: 9664
diff changeset
280 vlc_tab_tone_level_idx_hi2.table = &qdm2_table[qdm2_vlc_offs[9]];
banan
parents: 9664
diff changeset
281 vlc_tab_tone_level_idx_hi2.table_allocated = qdm2_vlc_offs[10] - qdm2_vlc_offs[9];
banan
parents: 9664
diff changeset
282 init_vlc (&vlc_tab_tone_level_idx_hi2, 8, 24,
banan
parents: 9664
diff changeset
283 vlc_tab_tone_level_idx_hi2_huffbits, 1, 1,
banan
parents: 9664
diff changeset
284 vlc_tab_tone_level_idx_hi2_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
285
9665
banan
parents: 9664
diff changeset
286 vlc_tab_type30.table = &qdm2_table[qdm2_vlc_offs[10]];
banan
parents: 9664
diff changeset
287 vlc_tab_type30.table_allocated = qdm2_vlc_offs[11] - qdm2_vlc_offs[10];
banan
parents: 9664
diff changeset
288 init_vlc (&vlc_tab_type30, 6, 9,
banan
parents: 9664
diff changeset
289 vlc_tab_type30_huffbits, 1, 1,
banan
parents: 9664
diff changeset
290 vlc_tab_type30_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
291
9665
banan
parents: 9664
diff changeset
292 vlc_tab_type34.table = &qdm2_table[qdm2_vlc_offs[11]];
banan
parents: 9664
diff changeset
293 vlc_tab_type34.table_allocated = qdm2_vlc_offs[12] - qdm2_vlc_offs[11];
banan
parents: 9664
diff changeset
294 init_vlc (&vlc_tab_type34, 5, 10,
banan
parents: 9664
diff changeset
295 vlc_tab_type34_huffbits, 1, 1,
banan
parents: 9664
diff changeset
296 vlc_tab_type34_huffcodes, 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
297
9665
banan
parents: 9664
diff changeset
298 vlc_tab_fft_tone_offset[0].table = &qdm2_table[qdm2_vlc_offs[12]];
banan
parents: 9664
diff changeset
299 vlc_tab_fft_tone_offset[0].table_allocated = qdm2_vlc_offs[13] - qdm2_vlc_offs[12];
banan
parents: 9664
diff changeset
300 init_vlc (&vlc_tab_fft_tone_offset[0], 8, 23,
banan
parents: 9664
diff changeset
301 vlc_tab_fft_tone_offset_0_huffbits, 1, 1,
banan
parents: 9664
diff changeset
302 vlc_tab_fft_tone_offset_0_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
303
9665
banan
parents: 9664
diff changeset
304 vlc_tab_fft_tone_offset[1].table = &qdm2_table[qdm2_vlc_offs[13]];
banan
parents: 9664
diff changeset
305 vlc_tab_fft_tone_offset[1].table_allocated = qdm2_vlc_offs[14] - qdm2_vlc_offs[13];
banan
parents: 9664
diff changeset
306 init_vlc (&vlc_tab_fft_tone_offset[1], 8, 28,
banan
parents: 9664
diff changeset
307 vlc_tab_fft_tone_offset_1_huffbits, 1, 1,
banan
parents: 9664
diff changeset
308 vlc_tab_fft_tone_offset_1_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
309
9665
banan
parents: 9664
diff changeset
310 vlc_tab_fft_tone_offset[2].table = &qdm2_table[qdm2_vlc_offs[14]];
banan
parents: 9664
diff changeset
311 vlc_tab_fft_tone_offset[2].table_allocated = qdm2_vlc_offs[15] - qdm2_vlc_offs[14];
banan
parents: 9664
diff changeset
312 init_vlc (&vlc_tab_fft_tone_offset[2], 8, 32,
banan
parents: 9664
diff changeset
313 vlc_tab_fft_tone_offset_2_huffbits, 1, 1,
banan
parents: 9664
diff changeset
314 vlc_tab_fft_tone_offset_2_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
315
9665
banan
parents: 9664
diff changeset
316 vlc_tab_fft_tone_offset[3].table = &qdm2_table[qdm2_vlc_offs[15]];
banan
parents: 9664
diff changeset
317 vlc_tab_fft_tone_offset[3].table_allocated = qdm2_vlc_offs[16] - qdm2_vlc_offs[15];
banan
parents: 9664
diff changeset
318 init_vlc (&vlc_tab_fft_tone_offset[3], 8, 35,
banan
parents: 9664
diff changeset
319 vlc_tab_fft_tone_offset_3_huffbits, 1, 1,
banan
parents: 9664
diff changeset
320 vlc_tab_fft_tone_offset_3_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
321
9665
banan
parents: 9664
diff changeset
322 vlc_tab_fft_tone_offset[4].table = &qdm2_table[qdm2_vlc_offs[16]];
banan
parents: 9664
diff changeset
323 vlc_tab_fft_tone_offset[4].table_allocated = qdm2_vlc_offs[17] - qdm2_vlc_offs[16];
banan
parents: 9664
diff changeset
324 init_vlc (&vlc_tab_fft_tone_offset[4], 8, 38,
banan
parents: 9664
diff changeset
325 vlc_tab_fft_tone_offset_4_huffbits, 1, 1,
banan
parents: 9664
diff changeset
326 vlc_tab_fft_tone_offset_4_huffcodes, 2, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
9664
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
327
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
328 vlcs_initialized=1;
df1875099613 Switch from INIT_VLC_USE_STATIC to INIT_VLC_USE_NEW_STATIC in qdm2.
banan
parents: 9538
diff changeset
329 }
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
330 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
331
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
332
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
333 /* for floating point to fixed point conversion */
7129
322023e630a6 mark read-only data as const
stefang
parents: 7040
diff changeset
334 static const float f2i_scale = (float) (1 << (FRAC_BITS - 15));
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
335
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
336
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
337 static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
338 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
339 int value;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
340
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
341 value = get_vlc2(gb, vlc->table, vlc->bits, depth);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
342
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
343 /* stage-2, 3 bits exponent escape sequence */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
344 if (value-- == 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
345 value = get_bits (gb, get_bits (gb, 3) + 1);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
346
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
347 /* stage-3, optional */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
348 if (flag) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
349 int tmp = vlc_stage3_values[value];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
350
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
351 if ((value & ~3) > 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
352 tmp += get_bits (gb, (value >> 2));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
353 value = tmp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
354 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
355
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
356 return value;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
357 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
358
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
359
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
360 static int qdm2_get_se_vlc (VLC *vlc, GetBitContext *gb, int depth)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
361 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
362 int value = qdm2_get_vlc (gb, vlc, 0, depth);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
363
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
364 return (value & 1) ? ((value + 1) >> 1) : -(value >> 1);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
365 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
366
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
367
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
368 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
369 * QDM2 checksum
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
370 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
371 * @param data pointer to data to be checksum'ed
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
372 * @param length data length
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
373 * @param value checksum value
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
374 *
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
375 * @return 0 if checksum is OK
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
376 */
6273
michael
parents: 6122
diff changeset
377 static uint16_t qdm2_packet_checksum (const uint8_t *data, int length, int value) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
378 int i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
379
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
380 for (i=0; i < length; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
381 value -= data[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
382
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
383 return (uint16_t)(value & 0xffff);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
384 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
385
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
386
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
387 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
388 * Fill a QDM2SubPacket structure with packet type, size, and data pointer.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
389 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
390 * @param gb bitreader context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
391 * @param sub_packet packet under analysis
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
392 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
393 static void qdm2_decode_sub_packet_header (GetBitContext *gb, QDM2SubPacket *sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
394 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
395 sub_packet->type = get_bits (gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
396
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
397 if (sub_packet->type == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
398 sub_packet->size = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
399 sub_packet->data = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
400 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
401 sub_packet->size = get_bits (gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
402
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
403 if (sub_packet->type & 0x80) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
404 sub_packet->size <<= 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
405 sub_packet->size |= get_bits (gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
406 sub_packet->type &= 0x7f;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
407 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
408
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
409 if (sub_packet->type == 0x7f)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
410 sub_packet->type |= (get_bits (gb, 8) << 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
411
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
412 sub_packet->data = &gb->buffer[get_bits_count(gb) / 8]; // FIXME: this depends on bitreader internal data
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
413 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
414
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
415 av_log(NULL,AV_LOG_DEBUG,"Subpacket: type=%d size=%d start_offs=%x\n",
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
416 sub_packet->type, sub_packet->size, get_bits_count(gb) / 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
417 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
418
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
419
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
420 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
421 * Return node pointer to first packet of requested type in list.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
422 *
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
423 * @param list list of subpackets to be scanned
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
424 * @param type type of searched subpacket
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
425 * @return node pointer for subpacket if found, else NULL
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
426 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
427 static QDM2SubPNode* qdm2_search_subpacket_type_in_list (QDM2SubPNode *list, int type)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
428 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
429 while (list != NULL && list->packet != NULL) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
430 if (list->packet->type == type)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
431 return list;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
432 list = list->next;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
433 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
434 return NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
435 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
436
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
437
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
438 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
439 * Replace 8 elements with their average value.
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
440 * Called by qdm2_decode_superblock before starting subblock decoding.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
441 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
442 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
443 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
444 static void average_quantized_coeffs (QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
445 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
446 int i, j, n, ch, sum;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
447
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
448 n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
449
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
450 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
451 for (i = 0; i < n; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
452 sum = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
453
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
454 for (j = 0; j < 8; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
455 sum += q->quantized_coeffs[ch][i][j];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
456
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
457 sum /= 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
458 if (sum > 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
459 sum--;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
460
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
461 for (j=0; j < 8; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
462 q->quantized_coeffs[ch][i][j] = sum;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
463 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
464 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
465
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
466
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
467 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
468 * Build subband samples with noise weighted by q->tone_level.
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
469 * Called by synthfilt_build_sb_samples.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
470 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
471 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
472 * @param sb subband index
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
473 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
474 static void build_sb_samples_from_noise (QDM2Context *q, int sb)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
475 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
476 int ch, j;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
477
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
478 FIX_NOISE_IDX(q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
479
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
480 if (!q->nb_channels)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
481 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
482
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
483 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
484 for (j = 0; j < 64; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
485 q->sb_samples[ch][j * 2][sb] = (int32_t)(f2i_scale * SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j] + .5);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
486 q->sb_samples[ch][j * 2 + 1][sb] = (int32_t)(f2i_scale * SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j] + .5);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
487 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
488 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
489
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
490
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
491 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
492 * Called while processing data from subpackets 11 and 12.
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
493 * Used after making changes to coding_method array.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
494 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
495 * @param sb subband index
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
496 * @param channels number of channels
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
497 * @param coding_method q->coding_method[0][0][0]
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
498 */
3076
50d80b04f150 add static keyword to some functions
mru
parents: 3043
diff changeset
499 static void fix_coding_method_array (int sb, int channels, sb_int8_array coding_method)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
500 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
501 int j,k;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
502 int ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
503 int run, case_val;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
504 int switchtable[23] = {0,5,1,5,5,5,5,5,2,5,5,5,5,5,5,5,3,5,5,5,5,5,4};
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
505
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
506 for (ch = 0; ch < channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
507 for (j = 0; j < 64; ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
508 if((coding_method[ch][sb][j] - 8) > 22) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
509 run = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
510 case_val = 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
511 } else {
3333
6bfe6c09d837 Fixed a possible bug, checked against the assembly.
banan
parents: 3320
diff changeset
512 switch (switchtable[coding_method[ch][sb][j]-8]) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
513 case 0: run = 10; case_val = 10; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
514 case 1: run = 1; case_val = 16; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
515 case 2: run = 5; case_val = 24; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
516 case 3: run = 3; case_val = 30; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
517 case 4: run = 1; case_val = 30; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
518 case 5: run = 1; case_val = 8; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
519 default: run = 1; case_val = 8; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
520 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
521 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
522 for (k = 0; k < run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
523 if (j + k < 128)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
524 if (coding_method[ch][sb + (j + k) / 64][(j + k) % 64] > coding_method[ch][sb][j])
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
525 if (k > 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
526 SAMPLES_NEEDED
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
527 //not debugged, almost never used
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
528 memset(&coding_method[ch][sb][j + k], case_val, k * sizeof(int8_t));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
529 memset(&coding_method[ch][sb][j + k], case_val, 3 * sizeof(int8_t));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
530 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
531 j += run;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
532 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
533 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
534 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
535
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
536
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
537 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
538 * Related to synthesis filter
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
539 * Called by process_subpacket_10
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
540 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
541 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
542 * @param flag 1 if called after getting data from subpacket 10, 0 if no subpacket 10
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
543 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
544 static void fill_tone_level_array (QDM2Context *q, int flag)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
545 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
546 int i, sb, ch, sb_used;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
547 int tmp, tab;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
548
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
549 // This should never happen
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
550 if (q->nb_channels <= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
551 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
552
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
553 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
554 for (sb = 0; sb < 30; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
555 for (i = 0; i < 8; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
556 if ((tab=coeff_per_sb_for_dequant[q->coeff_per_sb_select][sb]) < (last_coeff[q->coeff_per_sb_select] - 1))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
557 tmp = q->quantized_coeffs[ch][tab + 1][i] * dequant_table[q->coeff_per_sb_select][tab + 1][sb]+
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
558 q->quantized_coeffs[ch][tab][i] * dequant_table[q->coeff_per_sb_select][tab][sb];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
559 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
560 tmp = q->quantized_coeffs[ch][tab][i] * dequant_table[q->coeff_per_sb_select][tab][sb];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
561 if(tmp < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
562 tmp += 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
563 q->tone_level_idx_base[ch][sb][i] = (tmp / 256) & 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
564 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
565
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
566 sb_used = QDM2_SB_USED(q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
567
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
568 if ((q->superblocktype_2_3 != 0) && !flag) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
569 for (sb = 0; sb < sb_used; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
570 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
571 for (i = 0; i < 64; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
572 q->tone_level_idx[ch][sb][i] = q->tone_level_idx_base[ch][sb][i / 8];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
573 if (q->tone_level_idx[ch][sb][i] < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
574 q->tone_level[ch][sb][i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
575 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
576 q->tone_level[ch][sb][i] = fft_tone_level_table[0][q->tone_level_idx[ch][sb][i] & 0x3f];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
577 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
578 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
579 tab = q->superblocktype_2_3 ? 0 : 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
580 for (sb = 0; sb < sb_used; sb++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
581 if ((sb >= 4) && (sb <= 23)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
582 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
583 for (i = 0; i < 64; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
584 tmp = q->tone_level_idx_base[ch][sb][i / 8] -
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
585 q->tone_level_idx_hi1[ch][sb / 8][i / 8][i % 8] -
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
586 q->tone_level_idx_mid[ch][sb - 4][i / 8] -
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
587 q->tone_level_idx_hi2[ch][sb - 4];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
588 q->tone_level_idx[ch][sb][i] = tmp & 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
589 if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
590 q->tone_level[ch][sb][i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
591 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
592 q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
593 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
594 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
595 if (sb > 4) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
596 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
597 for (i = 0; i < 64; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
598 tmp = q->tone_level_idx_base[ch][sb][i / 8] -
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
599 q->tone_level_idx_hi1[ch][2][i / 8][i % 8] -
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
600 q->tone_level_idx_hi2[ch][sb - 4];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
601 q->tone_level_idx[ch][sb][i] = tmp & 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
602 if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
603 q->tone_level[ch][sb][i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
604 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
605 q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
606 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
607 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
608 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
609 for (i = 0; i < 64; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
610 tmp = q->tone_level_idx[ch][sb][i] = q->tone_level_idx_base[ch][sb][i / 8];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
611 if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
612 q->tone_level[ch][sb][i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
613 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
614 q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
615 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
616 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
617 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
618 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
619 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
620
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
621 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
622 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
623
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
624
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
625 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
626 * Related to synthesis filter
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
627 * Called by process_subpacket_11
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
628 * c is built with data from subpacket 11
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
629 * Most of this function is used only if superblock_type_2_3 == 0, never seen it in samples
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
630 *
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
631 * @param tone_level_idx
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
632 * @param tone_level_idx_temp
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
633 * @param coding_method q->coding_method[0][0][0]
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
634 * @param nb_channels number of channels
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
635 * @param c coming from subpacket 11, passed as 8*c
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
636 * @param superblocktype_2_3 flag based on superblock packet type
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
637 * @param cm_table_select q->cm_table_select
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
638 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
639 static void fill_coding_method_array (sb_int8_array tone_level_idx, sb_int8_array tone_level_idx_temp,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
640 sb_int8_array coding_method, int nb_channels,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
641 int c, int superblocktype_2_3, int cm_table_select)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
642 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
643 int ch, sb, j;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
644 int tmp, acc, esp_40, comp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
645 int add1, add2, add3, add4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
646 int64_t multres;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
647
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
648 // This should never happen
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
649 if (nb_channels <= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
650 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
651
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
652 if (!superblocktype_2_3) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
653 /* This case is untested, no samples available */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
654 SAMPLES_NEEDED
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
655 for (ch = 0; ch < nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
656 for (sb = 0; sb < 30; sb++) {
7326
fe8a7f5905e4 Prevent the qdm2 code from overreading/overflowing. Fixes Coverity ID 112 run 2
banan
parents: 7323
diff changeset
657 for (j = 1; j < 63; j++) { // The loop only iterates to 63 so the code doesn't overflow the buffer
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
658 add1 = tone_level_idx[ch][sb][j] - 10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
659 if (add1 < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
660 add1 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
661 add2 = add3 = add4 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
662 if (sb > 1) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
663 add2 = tone_level_idx[ch][sb - 2][j] + tone_level_idx_offset_table[sb][0] - 6;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
664 if (add2 < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
665 add2 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
666 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
667 if (sb > 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
668 add3 = tone_level_idx[ch][sb - 1][j] + tone_level_idx_offset_table[sb][1] - 6;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
669 if (add3 < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
670 add3 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
671 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
672 if (sb < 29) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
673 add4 = tone_level_idx[ch][sb + 1][j] + tone_level_idx_offset_table[sb][3] - 6;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
674 if (add4 < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
675 add4 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
676 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
677 tmp = tone_level_idx[ch][sb][j + 1] * 2 - add4 - add3 - add2 - add1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
678 if (tmp < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
679 tmp = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
680 tone_level_idx_temp[ch][sb][j + 1] = tmp & 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
681 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
682 tone_level_idx_temp[ch][sb][0] = tone_level_idx_temp[ch][sb][1];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
683 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
684 acc = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
685 for (ch = 0; ch < nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
686 for (sb = 0; sb < 30; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
687 for (j = 0; j < 64; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
688 acc += tone_level_idx_temp[ch][sb][j];
9538
b76f2d264edb Remove redundant code, found by CSA
banan
parents: 9428
diff changeset
689
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
690 multres = 0x66666667 * (acc * 10);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
691 esp_40 = (multres >> 32) / 8 + ((multres & 0xffffffff) >> 31);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
692 for (ch = 0; ch < nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
693 for (sb = 0; sb < 30; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
694 for (j = 0; j < 64; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
695 comp = tone_level_idx_temp[ch][sb][j]* esp_40 * 10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
696 if (comp < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
697 comp += 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
698 comp /= 256; // signed shift
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
699 switch(sb) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
700 case 0:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
701 if (comp < 30)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
702 comp = 30;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
703 comp += 15;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
704 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
705 case 1:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
706 if (comp < 24)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
707 comp = 24;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
708 comp += 10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
709 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
710 case 2:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
711 case 3:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
712 case 4:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
713 if (comp < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
714 comp = 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
715 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
716 if (comp <= 5)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
717 tmp = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
718 else if (comp <= 10)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
719 tmp = 10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
720 else if (comp <= 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
721 tmp = 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
722 else if (comp <= 24)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
723 tmp = -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
724 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
725 tmp = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
726 coding_method[ch][sb][j] = ((tmp & 0xfffa) + 30 )& 0xff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
727 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
728 for (sb = 0; sb < 30; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
729 fix_coding_method_array(sb, nb_channels, coding_method);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
730 for (ch = 0; ch < nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
731 for (sb = 0; sb < 30; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
732 for (j = 0; j < 64; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
733 if (sb >= 10) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
734 if (coding_method[ch][sb][j] < 10)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
735 coding_method[ch][sb][j] = 10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
736 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
737 if (sb >= 2) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
738 if (coding_method[ch][sb][j] < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
739 coding_method[ch][sb][j] = 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
740 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
741 if (coding_method[ch][sb][j] < 30)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
742 coding_method[ch][sb][j] = 30;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
743 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
744 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
745 } else { // superblocktype_2_3 != 0
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
746 for (ch = 0; ch < nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
747 for (sb = 0; sb < 30; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
748 for (j = 0; j < 64; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
749 coding_method[ch][sb][j] = coding_method_table[cm_table_select][sb];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
750 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
751
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
752 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
753 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
754
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
755
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
756 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
757 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
758 * Called by process_subpacket_11 to process more data from subpacket 11 with sb 0-8
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
759 * Called by process_subpacket_12 to process data from subpacket 12 with sb 8-sb_used
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
760 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
761 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
762 * @param gb bitreader context
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
763 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
764 * @param sb_min lower subband processed (sb_min included)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
765 * @param sb_max higher subband processed (sb_max excluded)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
766 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
767 static void synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int length, int sb_min, int sb_max)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
768 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
769 int sb, j, k, n, ch, run, channels;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
770 int joined_stereo, zero_encoding, chs;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
771 int type34_first;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
772 float type34_div = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
773 float type34_predictor;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
774 float samples[10], sign_bits[16];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
775
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
776 if (length == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
777 // If no data use noise
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
778 for (sb=sb_min; sb < sb_max; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
779 build_sb_samples_from_noise (q, sb);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
780
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
781 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
782 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
783
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
784 for (sb = sb_min; sb < sb_max; sb++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
785 FIX_NOISE_IDX(q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
786
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
787 channels = q->nb_channels;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
788
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
789 if (q->nb_channels <= 1 || sb < 12)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
790 joined_stereo = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
791 else if (sb >= 24)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
792 joined_stereo = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
793 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
794 joined_stereo = (BITS_LEFT(length,gb) >= 1) ? get_bits1 (gb) : 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
795
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
796 if (joined_stereo) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
797 if (BITS_LEFT(length,gb) >= 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
798 for (j = 0; j < 16; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
799 sign_bits[j] = get_bits1 (gb);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
800
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
801 for (j = 0; j < 64; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
802 if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
803 q->coding_method[0][sb][j] = q->coding_method[1][sb][j];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
804
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
805 fix_coding_method_array(sb, q->nb_channels, q->coding_method);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
806 channels = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
807 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
808
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
809 for (ch = 0; ch < channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
810 zero_encoding = (BITS_LEFT(length,gb) >= 1) ? get_bits1(gb) : 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
811 type34_predictor = 0.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
812 type34_first = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
813
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
814 for (j = 0; j < 128; ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
815 switch (q->coding_method[ch][sb][j / 2]) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
816 case 8:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
817 if (BITS_LEFT(length,gb) >= 10) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
818 if (zero_encoding) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
819 for (k = 0; k < 5; k++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
820 if ((j + 2 * k) >= 128)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
821 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
822 samples[2 * k] = get_bits1(gb) ? dequant_1bit[joined_stereo][2 * get_bits1(gb)] : 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
823 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
824 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
825 n = get_bits(gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
826 for (k = 0; k < 5; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
827 samples[2 * k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
828 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
829 for (k = 0; k < 5; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
830 samples[2 * k + 1] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
831 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
832 for (k = 0; k < 10; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
833 samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
834 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
835 run = 10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
836 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
837
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
838 case 10:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
839 if (BITS_LEFT(length,gb) >= 1) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
840 float f = 0.81;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
841
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
842 if (get_bits1(gb))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
843 f = -f;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
844 f -= noise_samples[((sb + 1) * (j +5 * ch + 1)) & 127] * 9.0 / 40.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
845 samples[0] = f;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
846 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
847 samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
848 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
849 run = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
850 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
851
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
852 case 16:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
853 if (BITS_LEFT(length,gb) >= 10) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
854 if (zero_encoding) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
855 for (k = 0; k < 5; k++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
856 if ((j + k) >= 128)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
857 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
858 samples[k] = (get_bits1(gb) == 0) ? 0 : dequant_1bit[joined_stereo][2 * get_bits1(gb)];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
859 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
860 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
861 n = get_bits (gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
862 for (k = 0; k < 5; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
863 samples[k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
864 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
865 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
866 for (k = 0; k < 5; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
867 samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
868 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
869 run = 5;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
870 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
871
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
872 case 24:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
873 if (BITS_LEFT(length,gb) >= 7) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
874 n = get_bits(gb, 7);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
875 for (k = 0; k < 3; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
876 samples[k] = (random_dequant_type24[n][k] - 2.0) * 0.5;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
877 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
878 for (k = 0; k < 3; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
879 samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
880 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
881 run = 3;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
882 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
883
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
884 case 30:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
885 if (BITS_LEFT(length,gb) >= 4)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
886 samples[0] = type30_dequant[qdm2_get_vlc(gb, &vlc_tab_type30, 0, 1)];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
887 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
888 samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
889
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
890 run = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
891 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
892
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
893 case 34:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
894 if (BITS_LEFT(length,gb) >= 7) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
895 if (type34_first) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
896 type34_div = (float)(1 << get_bits(gb, 2));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
897 samples[0] = ((float)get_bits(gb, 5) - 16.0) / 15.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
898 type34_predictor = samples[0];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
899 type34_first = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
900 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
901 samples[0] = type34_delta[qdm2_get_vlc(gb, &vlc_tab_type34, 0, 1)] / type34_div + type34_predictor;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
902 type34_predictor = samples[0];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
903 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
904 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
905 samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
906 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
907 run = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
908 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
909
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
910 default:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
911 samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
912 run = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
913 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
914 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
915
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
916 if (joined_stereo) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
917 float tmp[10][MPA_MAX_CHANNELS];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
918
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
919 for (k = 0; k < run; k++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
920 tmp[k][0] = samples[k];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
921 tmp[k][1] = (sign_bits[(j + k) / 8]) ? -samples[k] : samples[k];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
922 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
923 for (chs = 0; chs < q->nb_channels; chs++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
924 for (k = 0; k < run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
925 if ((j + k) < 128)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
926 q->sb_samples[chs][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[chs][sb][((j + k)/2)] * tmp[k][chs] + .5);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
927 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
928 for (k = 0; k < run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
929 if ((j + k) < 128)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
930 q->sb_samples[ch][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[ch][sb][(j + k)/2] * samples[k] + .5);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
931 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
932
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
933 j += run;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
934 } // j loop
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
935 } // channel loop
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
936 } // subband loop
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
937 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
938
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
939
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
940 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
941 * Init the first element of a channel in quantized_coeffs with data from packet 10 (quantized_coeffs[ch][0]).
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
942 * This is similar to process_subpacket_9, but for a single channel and for element [0]
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
943 * same VLC tables as process_subpacket_9 are used.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
944 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
945 * @param quantized_coeffs pointer to quantized_coeffs[ch][0]
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
946 * @param gb bitreader context
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
947 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
948 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
949 static void init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
950 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
951 int i, k, run, level, diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
952
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
953 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
954 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
955 level = qdm2_get_vlc(gb, &vlc_tab_level, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
956
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
957 quantized_coeffs[0] = level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
958
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
959 for (i = 0; i < 7; ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
960 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
961 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
962 run = qdm2_get_vlc(gb, &vlc_tab_run, 0, 1) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
963
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
964 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
965 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
966 diff = qdm2_get_se_vlc(&vlc_tab_diff, gb, 2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
967
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
968 for (k = 1; k <= run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
969 quantized_coeffs[i + k] = (level + ((k * diff) / run));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
970
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
971 level += diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
972 i += run;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
973 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
974 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
975
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
976
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
977 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
978 * Related to synthesis filter, process data from packet 10
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
979 * Init part of quantized_coeffs via function init_quantized_coeffs_elem0
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
980 * Init tone_level_idx_hi1, tone_level_idx_hi2, tone_level_idx_mid with data from packet 10
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
981 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
982 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
983 * @param gb bitreader context
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
984 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
985 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
986 static void init_tone_level_dequantization (QDM2Context *q, GetBitContext *gb, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
987 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
988 int sb, j, k, n, ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
989
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
990 for (ch = 0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
991 init_quantized_coeffs_elem0(q->quantized_coeffs[ch][0], gb, length);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
992
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
993 if (BITS_LEFT(length,gb) < 16) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
994 memset(q->quantized_coeffs[ch][0], 0, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
995 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
996 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
997 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
998
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
999 n = q->sub_sampling + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1000
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1001 for (sb = 0; sb < n; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1002 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1003 for (j = 0; j < 8; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1004 if (BITS_LEFT(length,gb) < 1)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1005 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1006 if (get_bits1(gb)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1007 for (k=0; k < 8; k++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1008 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1009 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1010 q->tone_level_idx_hi1[ch][sb][j][k] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_hi1, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1011 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1012 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1013 for (k=0; k < 8; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1014 q->tone_level_idx_hi1[ch][sb][j][k] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1015 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1016 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1017
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1018 n = QDM2_SB_USED(q->sub_sampling) - 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1019
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1020 for (sb = 0; sb < n; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1021 for (ch = 0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1022 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1023 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1024 q->tone_level_idx_hi2[ch][sb] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_hi2, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1025 if (sb > 19)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1026 q->tone_level_idx_hi2[ch][sb] -= 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1027 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1028 for (j = 0; j < 8; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1029 q->tone_level_idx_mid[ch][sb][j] = -16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1030 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1031
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1032 n = QDM2_SB_USED(q->sub_sampling) - 5;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1033
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1034 for (sb = 0; sb < n; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1035 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1036 for (j = 0; j < 8; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1037 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1038 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1039 q->tone_level_idx_mid[ch][sb][j] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_mid, 0, 2) - 32;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1040 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1041 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1042
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1043 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1044 * Process subpacket 9, init quantized_coeffs with data from it
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1045 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1046 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1047 * @param node pointer to node with packet
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1048 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1049 static void process_subpacket_9 (QDM2Context *q, QDM2SubPNode *node)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1050 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1051 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1052 int i, j, k, n, ch, run, level, diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1053
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1054 init_get_bits(&gb, node->packet->data, node->packet->size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1055
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1056 n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1; // same as averagesomething function
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1057
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1058 for (i = 1; i < n; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1059 for (ch=0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1060 level = qdm2_get_vlc(&gb, &vlc_tab_level, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1061 q->quantized_coeffs[ch][i][0] = level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1062
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1063 for (j = 0; j < (8 - 1); ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1064 run = qdm2_get_vlc(&gb, &vlc_tab_run, 0, 1) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1065 diff = qdm2_get_se_vlc(&vlc_tab_diff, &gb, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1066
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1067 for (k = 1; k <= run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1068 q->quantized_coeffs[ch][i][j + k] = (level + ((k*diff) / run));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1069
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1070 level += diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1071 j += run;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1072 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1073 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1074
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1075 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1076 for (i = 0; i < 8; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1077 q->quantized_coeffs[ch][0][i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1078 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1079
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1080
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1081 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1082 * Process subpacket 10 if not null, else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1083 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1084 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1085 * @param node pointer to node with packet
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1086 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1087 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1088 static void process_subpacket_10 (QDM2Context *q, QDM2SubPNode *node, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1089 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1090 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1091
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1092 init_get_bits(&gb, ((node == NULL) ? empty_buffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1093
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1094 if (length != 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1095 init_tone_level_dequantization(q, &gb, length);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1096 fill_tone_level_array(q, 1);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1097 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1098 fill_tone_level_array(q, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1099 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1100 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1101
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1102
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1103 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1104 * Process subpacket 11
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1105 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1106 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1107 * @param node pointer to node with packet
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1108 * @param length packet length in bit
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1109 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1110 static void process_subpacket_11 (QDM2Context *q, QDM2SubPNode *node, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1111 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1112 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1113
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1114 init_get_bits(&gb, ((node == NULL) ? empty_buffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1115 if (length >= 32) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1116 int c = get_bits (&gb, 13);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1117
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1118 if (c > 3)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1119 fill_coding_method_array (q->tone_level_idx, q->tone_level_idx_temp, q->coding_method,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1120 q->nb_channels, 8*c, q->superblocktype_2_3, q->cm_table_select);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1121 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1122
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1123 synthfilt_build_sb_samples(q, &gb, length, 0, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1124 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1125
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1126
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1127 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1128 * Process subpacket 12
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1129 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1130 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1131 * @param node pointer to node with packet
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1132 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1133 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1134 static void process_subpacket_12 (QDM2Context *q, QDM2SubPNode *node, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1135 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1136 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1137
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1138 init_get_bits(&gb, ((node == NULL) ? empty_buffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1139 synthfilt_build_sb_samples(q, &gb, length, 8, QDM2_SB_USED(q->sub_sampling));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1140 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1141
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1142 /*
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1143 * Process new subpackets for synthesis filter
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1144 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1145 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1146 * @param list list with synthesis filter packets (list D)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1147 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1148 static void process_synthesis_subpackets (QDM2Context *q, QDM2SubPNode *list)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1149 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1150 QDM2SubPNode *nodes[4];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1151
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1152 nodes[0] = qdm2_search_subpacket_type_in_list(list, 9);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1153 if (nodes[0] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1154 process_subpacket_9(q, nodes[0]);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1155
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1156 nodes[1] = qdm2_search_subpacket_type_in_list(list, 10);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1157 if (nodes[1] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1158 process_subpacket_10(q, nodes[1], nodes[1]->packet->size << 3);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1159 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1160 process_subpacket_10(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1161
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1162 nodes[2] = qdm2_search_subpacket_type_in_list(list, 11);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1163 if (nodes[0] != NULL && nodes[1] != NULL && nodes[2] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1164 process_subpacket_11(q, nodes[2], (nodes[2]->packet->size << 3));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1165 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1166 process_subpacket_11(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1167
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1168 nodes[3] = qdm2_search_subpacket_type_in_list(list, 12);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1169 if (nodes[0] != NULL && nodes[1] != NULL && nodes[3] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1170 process_subpacket_12(q, nodes[3], (nodes[3]->packet->size << 3));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1171 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1172 process_subpacket_12(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1173 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1174
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1175
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1176 /*
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1177 * Decode superblock, fill packet lists.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1178 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1179 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1180 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1181 static void qdm2_decode_super_block (QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1182 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1183 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1184 QDM2SubPacket header, *packet;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1185 int i, packet_bytes, sub_packet_size, sub_packets_D;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1186 unsigned int next_index = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1187
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1188 memset(q->tone_level_idx_hi1, 0, sizeof(q->tone_level_idx_hi1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1189 memset(q->tone_level_idx_mid, 0, sizeof(q->tone_level_idx_mid));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1190 memset(q->tone_level_idx_hi2, 0, sizeof(q->tone_level_idx_hi2));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1191
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1192 q->sub_packets_B = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1193 sub_packets_D = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1194
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1195 average_quantized_coeffs(q); // average elements in quantized_coeffs[max_ch][10][8]
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1196
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1197 init_get_bits(&gb, q->compressed_data, q->compressed_size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1198 qdm2_decode_sub_packet_header(&gb, &header);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1199
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1200 if (header.type < 2 || header.type >= 8) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1201 q->has_errors = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1202 av_log(NULL,AV_LOG_ERROR,"bad superblock type\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1203 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1204 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1205
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1206 q->superblocktype_2_3 = (header.type == 2 || header.type == 3);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1207 packet_bytes = (q->compressed_size - get_bits_count(&gb) / 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1208
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1209 init_get_bits(&gb, header.data, header.size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1210
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1211 if (header.type == 2 || header.type == 4 || header.type == 5) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1212 int csum = 257 * get_bits(&gb, 8) + 2 * get_bits(&gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1213
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1214 csum = qdm2_packet_checksum(q->compressed_data, q->checksum_size, csum);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1215
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1216 if (csum != 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1217 q->has_errors = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1218 av_log(NULL,AV_LOG_ERROR,"bad packet checksum\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1219 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1220 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1221 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1222
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1223 q->sub_packet_list_B[0].packet = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1224 q->sub_packet_list_D[0].packet = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1225
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1226 for (i = 0; i < 6; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1227 if (--q->fft_level_exp[i] < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1228 q->fft_level_exp[i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1229
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1230 for (i = 0; packet_bytes > 0; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1231 int j;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1232
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1233 q->sub_packet_list_A[i].next = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1234
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1235 if (i > 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1236 q->sub_packet_list_A[i - 1].next = &q->sub_packet_list_A[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1237
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1238 /* seek to next block */
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1239 init_get_bits(&gb, header.data, header.size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1240 skip_bits(&gb, next_index*8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1241
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1242 if (next_index >= header.size)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1243 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1244 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1245
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1246 /* decode subpacket */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1247 packet = &q->sub_packets[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1248 qdm2_decode_sub_packet_header(&gb, packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1249 next_index = packet->size + get_bits_count(&gb) / 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1250 sub_packet_size = ((packet->size > 0xff) ? 1 : 0) + packet->size + 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1251
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1252 if (packet->type == 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1253 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1254
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1255 if (sub_packet_size > packet_bytes) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1256 if (packet->type != 10 && packet->type != 11 && packet->type != 12)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1257 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1258 packet->size += packet_bytes - sub_packet_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1259 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1260
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1261 packet_bytes -= sub_packet_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1262
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1263 /* add subpacket to 'all subpackets' list */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1264 q->sub_packet_list_A[i].packet = packet;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1265
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1266 /* add subpacket to related list */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1267 if (packet->type == 8) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1268 SAMPLES_NEEDED_2("packet type 8");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1269 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1270 } else if (packet->type >= 9 && packet->type <= 12) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1271 /* packets for MPEG Audio like Synthesis Filter */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1272 QDM2_LIST_ADD(q->sub_packet_list_D, sub_packets_D, packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1273 } else if (packet->type == 13) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1274 for (j = 0; j < 6; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1275 q->fft_level_exp[j] = get_bits(&gb, 6);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1276 } else if (packet->type == 14) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1277 for (j = 0; j < 6; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1278 q->fft_level_exp[j] = qdm2_get_vlc(&gb, &fft_level_exp_vlc, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1279 } else if (packet->type == 15) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1280 SAMPLES_NEEDED_2("packet type 15")
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1281 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1282 } else if (packet->type >= 16 && packet->type < 48 && !fft_subpackets[packet->type - 16]) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1283 /* packets for FFT */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1284 QDM2_LIST_ADD(q->sub_packet_list_B, q->sub_packets_B, packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1285 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1286 } // Packet bytes loop
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1287
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1288 /* **************************************************************** */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1289 if (q->sub_packet_list_D[0].packet != NULL) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1290 process_synthesis_subpackets(q, q->sub_packet_list_D);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1291 q->do_synth_filter = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1292 } else if (q->do_synth_filter) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1293 process_subpacket_10(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1294 process_subpacket_11(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1295 process_subpacket_12(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1296 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1297 /* **************************************************************** */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1298 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1299
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1300
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1301 static void qdm2_fft_init_coefficient (QDM2Context *q, int sub_packet,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1302 int offset, int duration, int channel,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1303 int exp, int phase)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1304 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1305 if (q->fft_coefs_min_index[duration] < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1306 q->fft_coefs_min_index[duration] = q->fft_coefs_index;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1307
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1308 q->fft_coefs[q->fft_coefs_index].sub_packet = ((sub_packet >= 16) ? (sub_packet - 16) : sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1309 q->fft_coefs[q->fft_coefs_index].channel = channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1310 q->fft_coefs[q->fft_coefs_index].offset = offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1311 q->fft_coefs[q->fft_coefs_index].exp = exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1312 q->fft_coefs[q->fft_coefs_index].phase = phase;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1313 q->fft_coefs_index++;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1314 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1315
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1316
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1317 static void qdm2_fft_decode_tones (QDM2Context *q, int duration, GetBitContext *gb, int b)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1318 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1319 int channel, stereo, phase, exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1320 int local_int_4, local_int_8, stereo_phase, local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1321 int local_int_14, stereo_exp, local_int_20, local_int_28;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1322 int n, offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1323
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1324 local_int_4 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1325 local_int_28 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1326 local_int_20 = 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1327 local_int_8 = (4 - duration);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1328 local_int_10 = 1 << (q->group_order - duration - 1);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1329 offset = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1330
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1331 while (1) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1332 if (q->superblocktype_2_3) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1333 while ((n = qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2)) < 2) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1334 offset = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1335 if (n == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1336 local_int_4 += local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1337 local_int_28 += (1 << local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1338 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1339 local_int_4 += 8*local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1340 local_int_28 += (8 << local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1341 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1342 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1343 offset += (n - 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1344 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1345 offset += qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1346 while (offset >= (local_int_10 - 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1347 offset += (1 - (local_int_10 - 1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1348 local_int_4 += local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1349 local_int_28 += (1 << local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1350 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1351 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1352
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1353 if (local_int_4 >= q->group_size)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1354 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1355
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1356 local_int_14 = (offset >> local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1357
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1358 if (q->nb_channels > 1) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1359 channel = get_bits1(gb);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1360 stereo = get_bits1(gb);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1361 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1362 channel = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1363 stereo = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1364 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1365
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1366 exp = qdm2_get_vlc(gb, (b ? &fft_level_exp_vlc : &fft_level_exp_alt_vlc), 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1367 exp += q->fft_level_exp[fft_level_index_table[local_int_14]];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1368 exp = (exp < 0) ? 0 : exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1369
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1370 phase = get_bits(gb, 3);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1371 stereo_exp = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1372 stereo_phase = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1373
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1374 if (stereo) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1375 stereo_exp = (exp - qdm2_get_vlc(gb, &fft_stereo_exp_vlc, 0, 1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1376 stereo_phase = (phase - qdm2_get_vlc(gb, &fft_stereo_phase_vlc, 0, 1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1377 if (stereo_phase < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1378 stereo_phase += 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1379 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1380
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1381 if (q->frequency_range > (local_int_14 + 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1382 int sub_packet = (local_int_20 + local_int_28);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1383
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1384 qdm2_fft_init_coefficient(q, sub_packet, offset, duration, channel, exp, phase);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1385 if (stereo)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1386 qdm2_fft_init_coefficient(q, sub_packet, offset, duration, (1 - channel), stereo_exp, stereo_phase);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1387 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1388
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1389 offset++;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1390 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1391 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1392
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1393
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1394 static void qdm2_decode_fft_packets (QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1395 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1396 int i, j, min, max, value, type, unknown_flag;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1397 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1398
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1399 if (q->sub_packet_list_B[0].packet == NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1400 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1401
6903
0f63fc62ea8b consistency cosmetics: indices --> indexes
diego
parents: 6712
diff changeset
1402 /* reset minimum indexes for FFT coefficients */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1403 q->fft_coefs_index = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1404 for (i=0; i < 5; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1405 q->fft_coefs_min_index[i] = -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1406
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1407 /* process subpackets ordered by type, largest type first */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1408 for (i = 0, max = 256; i < q->sub_packets_B; i++) {
7306
7950572e58eb minor simplification of qdm2_decode_fft_packets()
michael
parents: 7129
diff changeset
1409 QDM2SubPacket *packet= NULL;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1410
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1411 /* find subpacket with largest type less than max */
7306
7950572e58eb minor simplification of qdm2_decode_fft_packets()
michael
parents: 7129
diff changeset
1412 for (j = 0, min = 0; j < q->sub_packets_B; j++) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1413 value = q->sub_packet_list_B[j].packet->type;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1414 if (value > min && value < max) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1415 min = value;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1416 packet = q->sub_packet_list_B[j].packet;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1417 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1418 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1419
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1420 max = min;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1421
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1422 /* check for errors (?) */
7323
5d6c51a125d0 Fix for possible null pointer dereferencing, closes Coverity report 68 run 2.
banan
parents: 7306
diff changeset
1423 if (!packet)
5d6c51a125d0 Fix for possible null pointer dereferencing, closes Coverity report 68 run 2.
banan
parents: 7306
diff changeset
1424 return;
5d6c51a125d0 Fix for possible null pointer dereferencing, closes Coverity report 68 run 2.
banan
parents: 7306
diff changeset
1425
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1426 if (i == 0 && (packet->type < 16 || packet->type >= 48 || fft_subpackets[packet->type - 16]))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1427 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1428
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1429 /* decode FFT tones */
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1430 init_get_bits (&gb, packet->data, packet->size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1431
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1432 if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16])
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1433 unknown_flag = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1434 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1435 unknown_flag = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1436
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1437 type = packet->type;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1438
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1439 if ((type >= 17 && type < 24) || (type >= 33 && type < 40)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1440 int duration = q->sub_sampling + 5 - (type & 15);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1441
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1442 if (duration >= 0 && duration < 4)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1443 qdm2_fft_decode_tones(q, duration, &gb, unknown_flag);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1444 } else if (type == 31) {
3320
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1445 for (j=0; j < 4; j++)
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1446 qdm2_fft_decode_tones(q, j, &gb, unknown_flag);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1447 } else if (type == 46) {
3320
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1448 for (j=0; j < 6; j++)
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1449 q->fft_level_exp[j] = get_bits(&gb, 6);
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1450 for (j=0; j < 4; j++)
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1451 qdm2_fft_decode_tones(q, j, &gb, unknown_flag);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1452 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1453 } // Loop on B packets
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1454
6903
0f63fc62ea8b consistency cosmetics: indices --> indexes
diego
parents: 6712
diff changeset
1455 /* calculate maximum indexes for FFT coefficients */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1456 for (i = 0, j = -1; i < 5; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1457 if (q->fft_coefs_min_index[i] >= 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1458 if (j >= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1459 q->fft_coefs_max_index[j] = q->fft_coefs_min_index[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1460 j = i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1461 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1462 if (j >= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1463 q->fft_coefs_max_index[j] = q->fft_coefs_index;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1464 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1465
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1466
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1467 static void qdm2_fft_generate_tone (QDM2Context *q, FFTTone *tone)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1468 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1469 float level, f[6];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1470 int i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1471 QDM2Complex c;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1472 const double iscale = 2.0*M_PI / 512.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1473
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1474 tone->phase += tone->phase_shift;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1475
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1476 /* calculate current level (maximum amplitude) of tone */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1477 level = fft_tone_envelope_table[tone->duration][tone->time_index] * tone->level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1478 c.im = level * sin(tone->phase*iscale);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1479 c.re = level * cos(tone->phase*iscale);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1480
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1481 /* generate FFT coefficients for tone */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1482 if (tone->duration >= 3 || tone->cutoff >= 3) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1483 tone->complex[0].im += c.im;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1484 tone->complex[0].re += c.re;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1485 tone->complex[1].im -= c.im;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1486 tone->complex[1].re -= c.re;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1487 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1488 f[1] = -tone->table[4];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1489 f[0] = tone->table[3] - tone->table[0];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1490 f[2] = 1.0 - tone->table[2] - tone->table[3];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1491 f[3] = tone->table[1] + tone->table[4] - 1.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1492 f[4] = tone->table[0] - tone->table[1];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1493 f[5] = tone->table[2];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1494 for (i = 0; i < 2; i++) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1495 tone->complex[fft_cutoff_index_table[tone->cutoff][i]].re += c.re * f[i];
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1496 tone->complex[fft_cutoff_index_table[tone->cutoff][i]].im += c.im *((tone->cutoff <= i) ? -f[i] : f[i]);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1497 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1498 for (i = 0; i < 4; i++) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1499 tone->complex[i].re += c.re * f[i+2];
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1500 tone->complex[i].im += c.im * f[i+2];
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1501 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1502 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1503
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1504 /* copy the tone if it has not yet died out */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1505 if (++tone->time_index < ((1 << (5 - tone->duration)) - 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1506 memcpy(&q->fft_tones[q->fft_tone_end], tone, sizeof(FFTTone));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1507 q->fft_tone_end = (q->fft_tone_end + 1) % 1000;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1508 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1509 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1510
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1511
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1512 static void qdm2_fft_tone_synthesizer (QDM2Context *q, int sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1513 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1514 int i, j, ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1515 const double iscale = 0.25 * M_PI;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1516
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1517 for (ch = 0; ch < q->channels; ch++) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1518 memset(q->fft.complex[ch], 0, q->fft_size * sizeof(QDM2Complex));
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1519 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1520
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1521
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1522 /* apply FFT tones with duration 4 (1 FFT period) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1523 if (q->fft_coefs_min_index[4] >= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1524 for (i = q->fft_coefs_min_index[4]; i < q->fft_coefs_max_index[4]; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1525 float level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1526 QDM2Complex c;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1527
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1528 if (q->fft_coefs[i].sub_packet != sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1529 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1530
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1531 ch = (q->channels == 1) ? 0 : q->fft_coefs[i].channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1532 level = (q->fft_coefs[i].exp < 0) ? 0.0 : fft_tone_level_table[q->superblocktype_2_3 ? 0 : 1][q->fft_coefs[i].exp & 63];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1533
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1534 c.re = level * cos(q->fft_coefs[i].phase * iscale);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1535 c.im = level * sin(q->fft_coefs[i].phase * iscale);
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1536 q->fft.complex[ch][q->fft_coefs[i].offset + 0].re += c.re;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1537 q->fft.complex[ch][q->fft_coefs[i].offset + 0].im += c.im;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1538 q->fft.complex[ch][q->fft_coefs[i].offset + 1].re -= c.re;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1539 q->fft.complex[ch][q->fft_coefs[i].offset + 1].im -= c.im;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1540 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1541
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1542 /* generate existing FFT tones */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1543 for (i = q->fft_tone_end; i != q->fft_tone_start; ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1544 qdm2_fft_generate_tone(q, &q->fft_tones[q->fft_tone_start]);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1545 q->fft_tone_start = (q->fft_tone_start + 1) % 1000;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1546 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1547
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1548 /* create and generate new FFT tones with duration 0 (long) to 3 (short) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1549 for (i = 0; i < 4; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1550 if (q->fft_coefs_min_index[i] >= 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1551 for (j = q->fft_coefs_min_index[i]; j < q->fft_coefs_max_index[i]; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1552 int offset, four_i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1553 FFTTone tone;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1554
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1555 if (q->fft_coefs[j].sub_packet != sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1556 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1557
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1558 four_i = (4 - i);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1559 offset = q->fft_coefs[j].offset >> four_i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1560 ch = (q->channels == 1) ? 0 : q->fft_coefs[j].channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1561
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1562 if (offset < q->frequency_range) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1563 if (offset < 2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1564 tone.cutoff = offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1565 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1566 tone.cutoff = (offset >= 60) ? 3 : 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1567
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1568 tone.level = (q->fft_coefs[j].exp < 0) ? 0.0 : fft_tone_level_table[q->superblocktype_2_3 ? 0 : 1][q->fft_coefs[j].exp & 63];
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1569 tone.complex = &q->fft.complex[ch][offset];
6273
michael
parents: 6122
diff changeset
1570 tone.table = fft_tone_sample_table[i][q->fft_coefs[j].offset - (offset << four_i)];
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1571 tone.phase = 64 * q->fft_coefs[j].phase - (offset << 8) - 128;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1572 tone.phase_shift = (2 * q->fft_coefs[j].offset + 1) << (7 - four_i);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1573 tone.duration = i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1574 tone.time_index = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1575
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1576 qdm2_fft_generate_tone(q, &tone);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1577 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1578 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1579 q->fft_coefs_min_index[i] = j;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1580 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1581 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1582
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1583
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1584 static void qdm2_calculate_fft (QDM2Context *q, int channel, int sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1585 {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1586 const float gain = (q->channels == 1 && q->nb_channels == 2) ? 0.5f : 1.0f;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1587 int i;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1588 q->fft.complex[channel][0].re *= 2.0f;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1589 q->fft.complex[channel][0].im = 0.0f;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1590 ff_rdft_calc(&q->rdft_ctx, (FFTSample *)q->fft.complex[channel]);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1591 /* add samples to output buffer */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1592 for (i = 0; i < ((q->fft_frame_size + 15) & ~15); i++)
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1593 q->output_buffer[q->channels * i + channel] += ((float *) q->fft.complex[channel])[i] * gain;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1594 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1595
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1596
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1597 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1598 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1599 * @param index subpacket number
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1600 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1601 static void qdm2_synthesis_filter (QDM2Context *q, int index)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1602 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1603 OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1604 int i, k, ch, sb_used, sub_sampling, dither_state = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1605
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1606 /* copy sb_samples */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1607 sb_used = QDM2_SB_USED(q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1608
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1609 for (ch = 0; ch < q->channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1610 for (i = 0; i < 8; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1611 for (k=sb_used; k < SBLIMIT; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1612 q->sb_samples[ch][(8 * index) + i][k] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1613
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1614 for (ch = 0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1615 OUT_INT *samples_ptr = samples + ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1616
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1617 for (i = 0; i < 8; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1618 ff_mpa_synth_filter(q->synth_buf[ch], &(q->synth_buf_offset[ch]),
10440
899237b1961f mpegaudiodec, mpc and qdm2 all use the same mpa_synth window, so make
reimar
parents: 9665
diff changeset
1619 ff_mpa_synth_window, &dither_state,
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1620 samples_ptr, q->nb_channels,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1621 q->sb_samples[ch][(8 * index) + i]);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1622 samples_ptr += 32 * q->nb_channels;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1623 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1624 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1625
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1626 /* add samples to output buffer */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1627 sub_sampling = (4 >> q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1628
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1629 for (ch = 0; ch < q->channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1630 for (i = 0; i < q->frame_size; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1631 q->output_buffer[q->channels * i + ch] += (float)(samples[q->nb_channels * sub_sampling * i + ch] >> (sizeof(OUT_INT)*8-16));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1632 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1633
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1634
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1635 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1636 * Init static data (does not depend on specific file)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1637 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1638 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1639 */
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
1640 static av_cold void qdm2_init(QDM2Context *q) {
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6273
diff changeset
1641 static int initialized = 0;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1642
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6273
diff changeset
1643 if (initialized != 0)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1644 return;
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6273
diff changeset
1645 initialized = 1;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1646
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1647 qdm2_init_vlc();
10440
899237b1961f mpegaudiodec, mpc and qdm2 all use the same mpa_synth window, so make
reimar
parents: 9665
diff changeset
1648 ff_mpa_synth_init(ff_mpa_synth_window);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1649 softclip_table_init();
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1650 rnd_table_init();
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1651 init_noise_samples();
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1652
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1653 av_log(NULL, AV_LOG_DEBUG, "init done\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1654 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1655
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1656
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1657 #if 0
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1658 static void dump_context(QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1659 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1660 int i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1661 #define PRINT(a,b) av_log(NULL,AV_LOG_DEBUG," %s = %d\n", a, b);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1662 PRINT("compressed_data",q->compressed_data);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1663 PRINT("compressed_size",q->compressed_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1664 PRINT("frame_size",q->frame_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1665 PRINT("checksum_size",q->checksum_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1666 PRINT("channels",q->channels);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1667 PRINT("nb_channels",q->nb_channels);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1668 PRINT("fft_frame_size",q->fft_frame_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1669 PRINT("fft_size",q->fft_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1670 PRINT("sub_sampling",q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1671 PRINT("fft_order",q->fft_order);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1672 PRINT("group_order",q->group_order);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1673 PRINT("group_size",q->group_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1674 PRINT("sub_packet",q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1675 PRINT("frequency_range",q->frequency_range);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1676 PRINT("has_errors",q->has_errors);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1677 PRINT("fft_tone_end",q->fft_tone_end);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1678 PRINT("fft_tone_start",q->fft_tone_start);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1679 PRINT("fft_coefs_index",q->fft_coefs_index);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1680 PRINT("coeff_per_sb_select",q->coeff_per_sb_select);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1681 PRINT("cm_table_select",q->cm_table_select);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1682 PRINT("noise_idx",q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1683
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1684 for (i = q->fft_tone_start; i < q->fft_tone_end; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1685 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1686 FFTTone *t = &q->fft_tones[i];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1687
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1688 av_log(NULL,AV_LOG_DEBUG,"Tone (%d) dump:\n", i);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1689 av_log(NULL,AV_LOG_DEBUG," level = %f\n", t->level);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1690 // PRINT(" level", t->level);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1691 PRINT(" phase", t->phase);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1692 PRINT(" phase_shift", t->phase_shift);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1693 PRINT(" duration", t->duration);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1694 PRINT(" samples_im", t->samples_im);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1695 PRINT(" samples_re", t->samples_re);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1696 PRINT(" table", t->table);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1697 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1698
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1699 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1700 #endif
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1701
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1702
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1703 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1704 * Init parameters from codec extradata
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1705 */
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
1706 static av_cold int qdm2_decode_init(AVCodecContext *avctx)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1707 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1708 QDM2Context *s = avctx->priv_data;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1709 uint8_t *extradata;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1710 int extradata_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1711 int tmp_val, tmp, size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1712
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1713 /* extradata parsing
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1714
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1715 Structure:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1716 wave {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1717 frma (QDM2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1718 QDCA
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1719 QDCP
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1720 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1721
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1722 32 size (including this field)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1723 32 tag (=frma)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1724 32 type (=QDM2 or QDMC)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1725
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1726 32 size (including this field, in bytes)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1727 32 tag (=QDCA) // maybe mandatory parameters
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1728 32 unknown (=1)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1729 32 channels (=2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1730 32 samplerate (=44100)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1731 32 bitrate (=96000)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1732 32 block size (=4096)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1733 32 frame size (=256) (for one channel)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1734 32 packet size (=1300)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1735
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1736 32 size (including this field, in bytes)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1737 32 tag (=QDCP) // maybe some tuneable parameters
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1738 32 float1 (=1.0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1739 32 zero ?
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1740 32 float2 (=1.0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1741 32 float3 (=1.0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1742 32 unknown (27)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1743 32 unknown (8)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1744 32 zero ?
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1745 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1746
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1747 if (!avctx->extradata || (avctx->extradata_size < 48)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1748 av_log(avctx, AV_LOG_ERROR, "extradata missing or truncated\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1749 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1750 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1751
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1752 extradata = avctx->extradata;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1753 extradata_size = avctx->extradata_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1754
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1755 while (extradata_size > 7) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1756 if (!memcmp(extradata, "frmaQDM", 7))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1757 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1758 extradata++;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1759 extradata_size--;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1760 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1761
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1762 if (extradata_size < 12) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1763 av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n",
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1764 extradata_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1765 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1766 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1767
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1768 if (memcmp(extradata, "frmaQDM", 7)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1769 av_log(avctx, AV_LOG_ERROR, "invalid headers, QDM? not found\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1770 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1771 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1772
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1773 if (extradata[7] == 'C') {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1774 // s->is_qdmc = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1775 av_log(avctx, AV_LOG_ERROR, "stream is QDMC version 1, which is not supported\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1776 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1777 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1778
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1779 extradata += 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1780 extradata_size -= 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1781
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1782 size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1783
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1784 if(size > extradata_size){
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1785 av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n",
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1786 extradata_size, size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1787 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1788 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1789
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1790 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1791 av_log(avctx, AV_LOG_DEBUG, "size: %d\n", size);
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1792 if (AV_RB32(extradata) != MKBETAG('Q','D','C','A')) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1793 av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1794 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1795 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1796
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1797 extradata += 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1798
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1799 avctx->channels = s->nb_channels = s->channels = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1800 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1801
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1802 avctx->sample_rate = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1803 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1804
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1805 avctx->bit_rate = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1806 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1807
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1808 s->group_size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1809 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1810
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1811 s->fft_size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1812 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1813
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1814 s->checksum_size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1815
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1816 s->fft_order = av_log2(s->fft_size) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1817 s->fft_frame_size = 2 * s->fft_size; // complex has two floats
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1818
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1819 // something like max decodable tones
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1820 s->group_order = av_log2(s->group_size) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1821 s->frame_size = s->group_size / 16; // 16 iterations per super block
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1822
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1823 s->sub_sampling = s->fft_order - 7;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1824 s->frequency_range = 255 / (1 << (2 - s->sub_sampling));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1825
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1826 switch ((s->sub_sampling * 2 + s->channels - 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1827 case 0: tmp = 40; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1828 case 1: tmp = 48; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1829 case 2: tmp = 56; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1830 case 3: tmp = 72; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1831 case 4: tmp = 80; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1832 case 5: tmp = 100;break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1833 default: tmp=s->sub_sampling; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1834 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1835 tmp_val = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1836 if ((tmp * 1000) < avctx->bit_rate) tmp_val = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1837 if ((tmp * 1440) < avctx->bit_rate) tmp_val = 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1838 if ((tmp * 1760) < avctx->bit_rate) tmp_val = 3;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1839 if ((tmp * 2240) < avctx->bit_rate) tmp_val = 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1840 s->cm_table_select = tmp_val;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1841
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1842 if (s->sub_sampling == 0)
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1843 tmp = 7999;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1844 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1845 tmp = ((-(s->sub_sampling -1)) & 8000) + 20000;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1846 /*
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1847 0: 7999 -> 0
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1848 1: 20000 -> 2
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1849 2: 28000 -> 2
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1850 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1851 if (tmp < 8000)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1852 s->coeff_per_sb_select = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1853 else if (tmp <= 16000)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1854 s->coeff_per_sb_select = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1855 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1856 s->coeff_per_sb_select = 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1857
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1858 // Fail on unknown fft order
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1859 if ((s->fft_order < 7) || (s->fft_order > 9)) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1860 av_log(avctx, AV_LOG_ERROR, "Unknown FFT order (%d), contact the developers!\n", s->fft_order);
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1861 return -1;
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1862 }
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1863
11391
4c7afa50df6f Give RDFT types more meaningful names
mru
parents: 11370
diff changeset
1864 ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1865
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1866 qdm2_init(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1867
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7326
diff changeset
1868 avctx->sample_fmt = SAMPLE_FMT_S16;
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7326
diff changeset
1869
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1870 // dump_context(s);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1871 return 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1872 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1873
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1874
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
1875 static av_cold int qdm2_decode_close(AVCodecContext *avctx)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1876 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1877 QDM2Context *s = avctx->priv_data;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1878
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1879 ff_rdft_end(&s->rdft_ctx);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1880
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1881 return 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1882 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1883
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1884
6273
michael
parents: 6122
diff changeset
1885 static void qdm2_decode (QDM2Context *q, const uint8_t *in, int16_t *out)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1886 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1887 int ch, i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1888 const int frame_size = (q->frame_size * q->channels);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1889
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1890 /* select input buffer */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1891 q->compressed_data = in;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1892 q->compressed_size = q->checksum_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1893
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1894 // dump_context(q);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1895
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1896 /* copy old block, clear new block of output samples */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1897 memmove(q->output_buffer, &q->output_buffer[frame_size], frame_size * sizeof(float));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1898 memset(&q->output_buffer[frame_size], 0, frame_size * sizeof(float));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1899
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1900 /* decode block of QDM2 compressed data */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1901 if (q->sub_packet == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1902 q->has_errors = 0; // zero it for a new super block
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1903 av_log(NULL,AV_LOG_DEBUG,"Superblock follows\n");
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1904 qdm2_decode_super_block(q);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1905 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1906
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1907 /* parse subpackets */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1908 if (!q->has_errors) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1909 if (q->sub_packet == 2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1910 qdm2_decode_fft_packets(q);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1911
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1912 qdm2_fft_tone_synthesizer(q, q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1913 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1915 /* sound synthesis stage 1 (FFT) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1916 for (ch = 0; ch < q->channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1917 qdm2_calculate_fft(q, ch, q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1918
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1919 if (!q->has_errors && q->sub_packet_list_C[0].packet != NULL) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1920 SAMPLES_NEEDED_2("has errors, and C list is not empty")
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1921 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1922 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1923 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1924
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1925 /* sound synthesis stage 2 (MPEG audio like synthesis filter) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1926 if (!q->has_errors && q->do_synth_filter)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1927 qdm2_synthesis_filter(q, q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1928
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1929 q->sub_packet = (q->sub_packet + 1) % 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1930
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1931 /* clip and convert output float[] to 16bit signed samples */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1932 for (i = 0; i < frame_size; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1933 int value = (int)q->output_buffer[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1934
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1935 if (value > SOFTCLIP_THRESHOLD)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1936 value = (value > HARDCLIP_THRESHOLD) ? 32767 : softclip_table[ value - SOFTCLIP_THRESHOLD];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1937 else if (value < -SOFTCLIP_THRESHOLD)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1938 value = (value < -HARDCLIP_THRESHOLD) ? -32767 : -softclip_table[-value - SOFTCLIP_THRESHOLD];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1939
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1940 out[i] = value;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1941 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1942 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1943
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1944
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1945 static int qdm2_decode_frame(AVCodecContext *avctx,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1946 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9007
diff changeset
1947 AVPacket *avpkt)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1948 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9007
diff changeset
1949 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9007
diff changeset
1950 int buf_size = avpkt->size;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1951 QDM2Context *s = avctx->priv_data;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1952
3158
5b2a0e54dfa7 fix infinite loop
michael
parents: 3076
diff changeset
1953 if(!buf)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1954 return 0;
3158
5b2a0e54dfa7 fix infinite loop
michael
parents: 3076
diff changeset
1955 if(buf_size < s->checksum_size)
5b2a0e54dfa7 fix infinite loop
michael
parents: 3076
diff changeset
1956 return -1;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1957
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1958 *data_size = s->channels * s->frame_size * sizeof(int16_t);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1959
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1960 av_log(avctx, AV_LOG_DEBUG, "decode(%d): %p[%d] -> %p[%d]\n",
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1961 buf_size, buf, s->checksum_size, data, *data_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1962
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1963 qdm2_decode(s, buf, data);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1964
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1965 // reading only when next superblock found
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1966 if (s->sub_packet == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1967 return s->checksum_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1968 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1969
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1970 return 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1971 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1972
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1973 AVCodec qdm2_decoder =
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1974 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1975 .name = "qdm2",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11488
diff changeset
1976 .type = AVMEDIA_TYPE_AUDIO,
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1977 .id = CODEC_ID_QDM2,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1978 .priv_data_size = sizeof(QDM2Context),
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1979 .init = qdm2_decode_init,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1980 .close = qdm2_decode_close,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1981 .decode = qdm2_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6903
diff changeset
1982 .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1983 };