annotate qdm2.c @ 11560:8a4984c5cacc libavcodec

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 424b8482f316
children 7dd2a45249a9
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8695
diff changeset
26 * @file libavcodec/qdm2.c
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 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
388 * Fills 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 /**
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
439 * Replaces 8 elements with their average value.
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 q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
946 * @param quantized_coeffs pointer to quantized_coeffs[ch][0]
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
947 * @param gb bitreader context
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
948 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
949 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
950 static void init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
951 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
952 int i, k, run, level, diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
953
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
954 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
955 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
956 level = qdm2_get_vlc(gb, &vlc_tab_level, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
957
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
958 quantized_coeffs[0] = level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
959
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
960 for (i = 0; i < 7; ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
961 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
962 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
963 run = qdm2_get_vlc(gb, &vlc_tab_run, 0, 1) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
964
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
965 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
966 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
967 diff = qdm2_get_se_vlc(&vlc_tab_diff, gb, 2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
968
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
969 for (k = 1; k <= run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
970 quantized_coeffs[i + k] = (level + ((k * diff) / run));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
971
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
972 level += diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
973 i += run;
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
979 * Related to synthesis filter, process data from packet 10
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
980 * Init part of quantized_coeffs via function init_quantized_coeffs_elem0
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
981 * 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
982 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
983 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
984 * @param gb bitreader context
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
985 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
986 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
987 static void init_tone_level_dequantization (QDM2Context *q, GetBitContext *gb, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
988 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
989 int sb, j, k, n, ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
990
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
991 for (ch = 0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
992 init_quantized_coeffs_elem0(q->quantized_coeffs[ch][0], gb, length);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
993
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
994 if (BITS_LEFT(length,gb) < 16) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
995 memset(q->quantized_coeffs[ch][0], 0, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
996 break;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1000 n = q->sub_sampling + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1001
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1002 for (sb = 0; sb < n; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1003 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1004 for (j = 0; j < 8; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1005 if (BITS_LEFT(length,gb) < 1)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1006 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1007 if (get_bits1(gb)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1008 for (k=0; k < 8; k++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1009 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1010 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1011 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
1012 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1013 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1014 for (k=0; k < 8; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1015 q->tone_level_idx_hi1[ch][sb][j][k] = 0;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1019 n = QDM2_SB_USED(q->sub_sampling) - 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1020
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1021 for (sb = 0; sb < n; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1022 for (ch = 0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1023 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1024 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1025 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
1026 if (sb > 19)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1027 q->tone_level_idx_hi2[ch][sb] -= 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1028 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1029 for (j = 0; j < 8; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1030 q->tone_level_idx_mid[ch][sb][j] = -16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1031 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1032
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1033 n = QDM2_SB_USED(q->sub_sampling) - 5;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1034
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1035 for (sb = 0; sb < n; sb++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1036 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1037 for (j = 0; j < 8; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1038 if (BITS_LEFT(length,gb) < 16)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1039 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1040 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
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1045 * Process subpacket 9, init quantized_coeffs with data from it
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1046 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1047 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1048 * @param node pointer to node with packet
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1049 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1050 static void process_subpacket_9 (QDM2Context *q, QDM2SubPNode *node)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1051 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1052 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1053 int i, j, k, n, ch, run, level, diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1054
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1055 init_get_bits(&gb, node->packet->data, node->packet->size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1056
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1057 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
1058
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1059 for (i = 1; i < n; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1060 for (ch=0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1061 level = qdm2_get_vlc(&gb, &vlc_tab_level, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1062 q->quantized_coeffs[ch][i][0] = level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1063
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1064 for (j = 0; j < (8 - 1); ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1065 run = qdm2_get_vlc(&gb, &vlc_tab_run, 0, 1) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1066 diff = qdm2_get_se_vlc(&vlc_tab_diff, &gb, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1067
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1068 for (k = 1; k <= run; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1069 q->quantized_coeffs[ch][i][j + k] = (level + ((k*diff) / run));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1070
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1071 level += diff;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1072 j += run;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1076 for (ch = 0; ch < q->nb_channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1077 for (i = 0; i < 8; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1078 q->quantized_coeffs[ch][0][i] = 0;
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1083 * Process subpacket 10 if not null, else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1084 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1085 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1086 * @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
1087 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1088 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1089 static void process_subpacket_10 (QDM2Context *q, QDM2SubPNode *node, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1090 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1091 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1092
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1093 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
1094
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1095 if (length != 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1096 init_tone_level_dequantization(q, &gb, length);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1097 fill_tone_level_array(q, 1);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1098 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1099 fill_tone_level_array(q, 0);
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1105 * Process subpacket 11
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1106 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1107 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1108 * @param node pointer to node with packet
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1109 * @param length packet length in bit
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1110 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1111 static void process_subpacket_11 (QDM2Context *q, QDM2SubPNode *node, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1112 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1113 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1114
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1115 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
1116 if (length >= 32) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1117 int c = get_bits (&gb, 13);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1118
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1119 if (c > 3)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1120 fill_coding_method_array (q->tone_level_idx, q->tone_level_idx_temp, q->coding_method,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1121 q->nb_channels, 8*c, q->superblocktype_2_3, q->cm_table_select);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1122 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1123
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1124 synthfilt_build_sb_samples(q, &gb, length, 0, 8);
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1129 * Process subpacket 12
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1130 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1131 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1132 * @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
1133 * @param length packet length in bits
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1134 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1135 static void process_subpacket_12 (QDM2Context *q, QDM2SubPNode *node, int length)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1136 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1137 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1138
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1139 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
1140 synthfilt_build_sb_samples(q, &gb, length, 8, QDM2_SB_USED(q->sub_sampling));
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 /*
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1144 * Process new subpackets for synthesis filter
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1145 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1146 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1147 * @param list list with synthesis filter packets (list D)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1148 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1149 static void process_synthesis_subpackets (QDM2Context *q, QDM2SubPNode *list)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1150 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1151 QDM2SubPNode *nodes[4];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1152
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1153 nodes[0] = qdm2_search_subpacket_type_in_list(list, 9);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1154 if (nodes[0] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1155 process_subpacket_9(q, nodes[0]);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1156
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1157 nodes[1] = qdm2_search_subpacket_type_in_list(list, 10);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1158 if (nodes[1] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1159 process_subpacket_10(q, nodes[1], nodes[1]->packet->size << 3);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1160 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1161 process_subpacket_10(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1162
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1163 nodes[2] = qdm2_search_subpacket_type_in_list(list, 11);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1164 if (nodes[0] != NULL && nodes[1] != NULL && nodes[2] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1165 process_subpacket_11(q, nodes[2], (nodes[2]->packet->size << 3));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1166 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1167 process_subpacket_11(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1168
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1169 nodes[3] = qdm2_search_subpacket_type_in_list(list, 12);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1170 if (nodes[0] != NULL && nodes[1] != NULL && nodes[3] != NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1171 process_subpacket_12(q, nodes[3], (nodes[3]->packet->size << 3));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1172 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1173 process_subpacket_12(q, NULL, 0);
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1177 /*
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1178 * Decode superblock, fill packet lists.
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1179 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1180 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1181 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1182 static void qdm2_decode_super_block (QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1183 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1184 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1185 QDM2SubPacket header, *packet;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1186 int i, packet_bytes, sub_packet_size, sub_packets_D;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1187 unsigned int next_index = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1188
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1189 memset(q->tone_level_idx_hi1, 0, sizeof(q->tone_level_idx_hi1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1190 memset(q->tone_level_idx_mid, 0, sizeof(q->tone_level_idx_mid));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1191 memset(q->tone_level_idx_hi2, 0, sizeof(q->tone_level_idx_hi2));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1192
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1193 q->sub_packets_B = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1194 sub_packets_D = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1195
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1196 average_quantized_coeffs(q); // average elements in quantized_coeffs[max_ch][10][8]
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1197
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1198 init_get_bits(&gb, q->compressed_data, q->compressed_size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1199 qdm2_decode_sub_packet_header(&gb, &header);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1200
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1201 if (header.type < 2 || header.type >= 8) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1202 q->has_errors = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1203 av_log(NULL,AV_LOG_ERROR,"bad superblock type\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1204 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1205 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1206
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1207 q->superblocktype_2_3 = (header.type == 2 || header.type == 3);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1208 packet_bytes = (q->compressed_size - get_bits_count(&gb) / 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1209
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1210 init_get_bits(&gb, header.data, header.size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1211
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1212 if (header.type == 2 || header.type == 4 || header.type == 5) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1213 int csum = 257 * get_bits(&gb, 8) + 2 * get_bits(&gb, 8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1214
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1215 csum = qdm2_packet_checksum(q->compressed_data, q->checksum_size, csum);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1216
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1217 if (csum != 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1218 q->has_errors = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1219 av_log(NULL,AV_LOG_ERROR,"bad packet checksum\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1220 return;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1224 q->sub_packet_list_B[0].packet = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1225 q->sub_packet_list_D[0].packet = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1226
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1227 for (i = 0; i < 6; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1228 if (--q->fft_level_exp[i] < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1229 q->fft_level_exp[i] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1230
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1231 for (i = 0; packet_bytes > 0; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1232 int j;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1233
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1234 q->sub_packet_list_A[i].next = NULL;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1235
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1236 if (i > 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1237 q->sub_packet_list_A[i - 1].next = &q->sub_packet_list_A[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1238
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1239 /* seek to next block */
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1240 init_get_bits(&gb, header.data, header.size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1241 skip_bits(&gb, next_index*8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1242
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1243 if (next_index >= header.size)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1244 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1245 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1246
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1247 /* decode subpacket */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1248 packet = &q->sub_packets[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1249 qdm2_decode_sub_packet_header(&gb, packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1250 next_index = packet->size + get_bits_count(&gb) / 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1251 sub_packet_size = ((packet->size > 0xff) ? 1 : 0) + packet->size + 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1252
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1253 if (packet->type == 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1254 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1255
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1256 if (sub_packet_size > packet_bytes) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1257 if (packet->type != 10 && packet->type != 11 && packet->type != 12)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1258 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1259 packet->size += packet_bytes - sub_packet_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1260 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1261
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1262 packet_bytes -= sub_packet_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1263
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1264 /* add subpacket to 'all subpackets' list */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1265 q->sub_packet_list_A[i].packet = packet;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1266
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1267 /* add subpacket to related list */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1268 if (packet->type == 8) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1269 SAMPLES_NEEDED_2("packet type 8");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1270 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1271 } else if (packet->type >= 9 && packet->type <= 12) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1272 /* packets for MPEG Audio like Synthesis Filter */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1273 QDM2_LIST_ADD(q->sub_packet_list_D, sub_packets_D, packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1274 } else if (packet->type == 13) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1275 for (j = 0; j < 6; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1276 q->fft_level_exp[j] = get_bits(&gb, 6);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1277 } else if (packet->type == 14) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1278 for (j = 0; j < 6; j++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1279 q->fft_level_exp[j] = qdm2_get_vlc(&gb, &fft_level_exp_vlc, 0, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1280 } else if (packet->type == 15) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1281 SAMPLES_NEEDED_2("packet type 15")
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1282 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1283 } else if (packet->type >= 16 && packet->type < 48 && !fft_subpackets[packet->type - 16]) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1284 /* packets for FFT */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1285 QDM2_LIST_ADD(q->sub_packet_list_B, q->sub_packets_B, packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1286 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1287 } // Packet bytes loop
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1288
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1289 /* **************************************************************** */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1290 if (q->sub_packet_list_D[0].packet != NULL) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1291 process_synthesis_subpackets(q, q->sub_packet_list_D);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1292 q->do_synth_filter = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1293 } else if (q->do_synth_filter) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1294 process_subpacket_10(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1295 process_subpacket_11(q, NULL, 0);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1296 process_subpacket_12(q, NULL, 0);
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1302 static void qdm2_fft_init_coefficient (QDM2Context *q, int sub_packet,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1303 int offset, int duration, int channel,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1304 int exp, int phase)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1305 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1306 if (q->fft_coefs_min_index[duration] < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1307 q->fft_coefs_min_index[duration] = q->fft_coefs_index;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1308
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1309 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
1310 q->fft_coefs[q->fft_coefs_index].channel = channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1311 q->fft_coefs[q->fft_coefs_index].offset = offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1312 q->fft_coefs[q->fft_coefs_index].exp = exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1313 q->fft_coefs[q->fft_coefs_index].phase = phase;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1314 q->fft_coefs_index++;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1318 static void qdm2_fft_decode_tones (QDM2Context *q, int duration, GetBitContext *gb, int b)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1319 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1320 int channel, stereo, phase, exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1321 int local_int_4, local_int_8, stereo_phase, local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1322 int local_int_14, stereo_exp, local_int_20, local_int_28;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1323 int n, offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1324
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1325 local_int_4 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1326 local_int_28 = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1327 local_int_20 = 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1328 local_int_8 = (4 - duration);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1329 local_int_10 = 1 << (q->group_order - duration - 1);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1330 offset = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1331
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1332 while (1) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1333 if (q->superblocktype_2_3) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1334 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
1335 offset = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1336 if (n == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1337 local_int_4 += local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1338 local_int_28 += (1 << local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1339 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1340 local_int_4 += 8*local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1341 local_int_28 += (8 << local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1342 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1343 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1344 offset += (n - 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1345 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1346 offset += qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1347 while (offset >= (local_int_10 - 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1348 offset += (1 - (local_int_10 - 1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1349 local_int_4 += local_int_10;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1350 local_int_28 += (1 << local_int_8);
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1354 if (local_int_4 >= q->group_size)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1355 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1356
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1357 local_int_14 = (offset >> local_int_8);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1358
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1359 if (q->nb_channels > 1) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1360 channel = get_bits1(gb);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1361 stereo = get_bits1(gb);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1362 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1363 channel = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1364 stereo = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1365 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1366
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1367 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
1368 exp += q->fft_level_exp[fft_level_index_table[local_int_14]];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1369 exp = (exp < 0) ? 0 : exp;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1370
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1371 phase = get_bits(gb, 3);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1372 stereo_exp = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1373 stereo_phase = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1374
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1375 if (stereo) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1376 stereo_exp = (exp - qdm2_get_vlc(gb, &fft_stereo_exp_vlc, 0, 1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1377 stereo_phase = (phase - qdm2_get_vlc(gb, &fft_stereo_phase_vlc, 0, 1));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1378 if (stereo_phase < 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1379 stereo_phase += 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1380 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1381
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1382 if (q->frequency_range > (local_int_14 + 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1383 int sub_packet = (local_int_20 + local_int_28);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1384
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1385 qdm2_fft_init_coefficient(q, sub_packet, offset, duration, channel, exp, phase);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1386 if (stereo)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1387 qdm2_fft_init_coefficient(q, sub_packet, offset, duration, (1 - channel), stereo_exp, stereo_phase);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1388 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1389
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1390 offset++;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1395 static void qdm2_decode_fft_packets (QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1396 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1397 int i, j, min, max, value, type, unknown_flag;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1398 GetBitContext gb;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1399
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1400 if (q->sub_packet_list_B[0].packet == NULL)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1401 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1402
6903
0f63fc62ea8b consistency cosmetics: indices --> indexes
diego
parents: 6712
diff changeset
1403 /* reset minimum indexes for FFT coefficients */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1404 q->fft_coefs_index = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1405 for (i=0; i < 5; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1406 q->fft_coefs_min_index[i] = -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1407
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1408 /* process subpackets ordered by type, largest type first */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1409 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
1410 QDM2SubPacket *packet= NULL;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1411
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1412 /* find subpacket with largest type less than max */
7306
7950572e58eb minor simplification of qdm2_decode_fft_packets()
michael
parents: 7129
diff changeset
1413 for (j = 0, min = 0; j < q->sub_packets_B; j++) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1414 value = q->sub_packet_list_B[j].packet->type;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1415 if (value > min && value < max) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1416 min = value;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1417 packet = q->sub_packet_list_B[j].packet;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1421 max = min;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1422
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1423 /* check for errors (?) */
7323
5d6c51a125d0 Fix for possible null pointer dereferencing, closes Coverity report 68 run 2.
banan
parents: 7306
diff changeset
1424 if (!packet)
5d6c51a125d0 Fix for possible null pointer dereferencing, closes Coverity report 68 run 2.
banan
parents: 7306
diff changeset
1425 return;
5d6c51a125d0 Fix for possible null pointer dereferencing, closes Coverity report 68 run 2.
banan
parents: 7306
diff changeset
1426
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1427 if (i == 0 && (packet->type < 16 || packet->type >= 48 || fft_subpackets[packet->type - 16]))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1428 return;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1429
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1430 /* decode FFT tones */
2916
767156b9aa0d init_get_bits() requires size in bits, not bytes
rtognimp
parents: 2914
diff changeset
1431 init_get_bits (&gb, packet->data, packet->size*8);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1432
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1433 if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16])
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1434 unknown_flag = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1435 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1436 unknown_flag = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1437
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1438 type = packet->type;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1439
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1440 if ((type >= 17 && type < 24) || (type >= 33 && type < 40)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1441 int duration = q->sub_sampling + 5 - (type & 15);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1442
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1443 if (duration >= 0 && duration < 4)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1444 qdm2_fft_decode_tones(q, duration, &gb, unknown_flag);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1445 } else if (type == 31) {
3320
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1446 for (j=0; j < 4; j++)
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1447 qdm2_fft_decode_tones(q, j, &gb, unknown_flag);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1448 } else if (type == 46) {
3320
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1449 for (j=0; j < 6; j++)
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1450 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
1451 for (j=0; j < 4; j++)
888e539459f4 10000l don't reuse outer loop index in inner loops
rtogni
parents: 3158
diff changeset
1452 qdm2_fft_decode_tones(q, j, &gb, unknown_flag);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1453 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1454 } // Loop on B packets
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1455
6903
0f63fc62ea8b consistency cosmetics: indices --> indexes
diego
parents: 6712
diff changeset
1456 /* calculate maximum indexes for FFT coefficients */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1457 for (i = 0, j = -1; i < 5; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1458 if (q->fft_coefs_min_index[i] >= 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1459 if (j >= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1460 q->fft_coefs_max_index[j] = q->fft_coefs_min_index[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1461 j = i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1462 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1463 if (j >= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1464 q->fft_coefs_max_index[j] = q->fft_coefs_index;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1468 static void qdm2_fft_generate_tone (QDM2Context *q, FFTTone *tone)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1469 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1470 float level, f[6];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1471 int i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1472 QDM2Complex c;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1473 const double iscale = 2.0*M_PI / 512.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1474
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1475 tone->phase += tone->phase_shift;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1476
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1477 /* calculate current level (maximum amplitude) of tone */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1478 level = fft_tone_envelope_table[tone->duration][tone->time_index] * tone->level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1479 c.im = level * sin(tone->phase*iscale);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1480 c.re = level * cos(tone->phase*iscale);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1481
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1482 /* generate FFT coefficients for tone */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1483 if (tone->duration >= 3 || tone->cutoff >= 3) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1484 tone->complex[0].im += c.im;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1485 tone->complex[0].re += c.re;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1486 tone->complex[1].im -= c.im;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1487 tone->complex[1].re -= c.re;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1488 } else {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1489 f[1] = -tone->table[4];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1490 f[0] = tone->table[3] - tone->table[0];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1491 f[2] = 1.0 - tone->table[2] - tone->table[3];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1492 f[3] = tone->table[1] + tone->table[4] - 1.0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1493 f[4] = tone->table[0] - tone->table[1];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1494 f[5] = tone->table[2];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1495 for (i = 0; i < 2; i++) {
8695
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]].re += c.re * f[i];
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1497 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
1498 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1499 for (i = 0; i < 4; i++) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1500 tone->complex[i].re += c.re * f[i+2];
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1501 tone->complex[i].im += c.im * f[i+2];
2914
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1505 /* copy the tone if it has not yet died out */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1506 if (++tone->time_index < ((1 << (5 - tone->duration)) - 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1507 memcpy(&q->fft_tones[q->fft_tone_end], tone, sizeof(FFTTone));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1508 q->fft_tone_end = (q->fft_tone_end + 1) % 1000;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1513 static void qdm2_fft_tone_synthesizer (QDM2Context *q, int sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1514 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1515 int i, j, ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1516 const double iscale = 0.25 * M_PI;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1517
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1518 for (ch = 0; ch < q->channels; ch++) {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1519 memset(q->fft.complex[ch], 0, q->fft_size * sizeof(QDM2Complex));
2914
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1523 /* apply FFT tones with duration 4 (1 FFT period) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1524 if (q->fft_coefs_min_index[4] >= 0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1525 for (i = q->fft_coefs_min_index[4]; i < q->fft_coefs_max_index[4]; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1526 float level;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1527 QDM2Complex c;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1528
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1529 if (q->fft_coefs[i].sub_packet != sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1530 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1531
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1532 ch = (q->channels == 1) ? 0 : q->fft_coefs[i].channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1533 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
1534
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1535 c.re = level * cos(q->fft_coefs[i].phase * iscale);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1536 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
1537 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
1538 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
1539 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
1540 q->fft.complex[ch][q->fft_coefs[i].offset + 1].im -= c.im;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1541 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1542
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1543 /* generate existing FFT tones */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1544 for (i = q->fft_tone_end; i != q->fft_tone_start; ) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1545 qdm2_fft_generate_tone(q, &q->fft_tones[q->fft_tone_start]);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1546 q->fft_tone_start = (q->fft_tone_start + 1) % 1000;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1547 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1548
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1549 /* create and generate new FFT tones with duration 0 (long) to 3 (short) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1550 for (i = 0; i < 4; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1551 if (q->fft_coefs_min_index[i] >= 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1552 for (j = q->fft_coefs_min_index[i]; j < q->fft_coefs_max_index[i]; j++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1553 int offset, four_i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1554 FFTTone tone;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1555
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1556 if (q->fft_coefs[j].sub_packet != sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1557 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1558
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1559 four_i = (4 - i);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1560 offset = q->fft_coefs[j].offset >> four_i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1561 ch = (q->channels == 1) ? 0 : q->fft_coefs[j].channel;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1562
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1563 if (offset < q->frequency_range) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1564 if (offset < 2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1565 tone.cutoff = offset;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1566 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1567 tone.cutoff = (offset >= 60) ? 3 : 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1568
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1569 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
1570 tone.complex = &q->fft.complex[ch][offset];
6273
michael
parents: 6122
diff changeset
1571 tone.table = fft_tone_sample_table[i][q->fft_coefs[j].offset - (offset << four_i)];
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1572 tone.phase = 64 * q->fft_coefs[j].phase - (offset << 8) - 128;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1573 tone.phase_shift = (2 * q->fft_coefs[j].offset + 1) << (7 - four_i);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1574 tone.duration = i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1575 tone.time_index = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1576
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1577 qdm2_fft_generate_tone(q, &tone);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1578 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1579 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1580 q->fft_coefs_min_index[i] = j;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1585 static void qdm2_calculate_fft (QDM2Context *q, int channel, int sub_packet)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1586 {
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1587 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
1588 int i;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1589 q->fft.complex[channel][0].re *= 2.0f;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1590 q->fft.complex[channel][0].im = 0.0f;
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1591 ff_rdft_calc(&q->rdft_ctx, (FFTSample *)q->fft.complex[channel]);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1592 /* add samples to output buffer */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1593 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
1594 q->output_buffer[q->channels * i + channel] += ((float *) q->fft.complex[channel])[i] * gain;
2914
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1599 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1600 * @param index subpacket number
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1601 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1602 static void qdm2_synthesis_filter (QDM2Context *q, int index)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1603 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1604 OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1605 int i, k, ch, sb_used, sub_sampling, dither_state = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1606
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1607 /* copy sb_samples */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1608 sb_used = QDM2_SB_USED(q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1609
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1610 for (ch = 0; ch < q->channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1611 for (i = 0; i < 8; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1612 for (k=sb_used; k < SBLIMIT; k++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1613 q->sb_samples[ch][(8 * index) + i][k] = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1614
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1615 for (ch = 0; ch < q->nb_channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1616 OUT_INT *samples_ptr = samples + ch;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1617
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1618 for (i = 0; i < 8; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1619 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
1620 ff_mpa_synth_window, &dither_state,
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1621 samples_ptr, q->nb_channels,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1622 q->sb_samples[ch][(8 * index) + i]);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1623 samples_ptr += 32 * q->nb_channels;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1627 /* add samples to output buffer */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1628 sub_sampling = (4 >> q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1629
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1630 for (ch = 0; ch < q->channels; ch++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1631 for (i = 0; i < q->frame_size; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1632 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
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1637 * Init static data (does not depend on specific file)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1638 *
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1639 * @param q context
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1640 */
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
1641 static av_cold void qdm2_init(QDM2Context *q) {
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6273
diff changeset
1642 static int initialized = 0;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1643
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6273
diff changeset
1644 if (initialized != 0)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1645 return;
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6273
diff changeset
1646 initialized = 1;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1647
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1648 qdm2_init_vlc();
10440
899237b1961f mpegaudiodec, mpc and qdm2 all use the same mpa_synth window, so make
reimar
parents: 9665
diff changeset
1649 ff_mpa_synth_init(ff_mpa_synth_window);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1650 softclip_table_init();
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1651 rnd_table_init();
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1652 init_noise_samples();
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1653
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1654 av_log(NULL, AV_LOG_DEBUG, "init done\n");
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1658 #if 0
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1659 static void dump_context(QDM2Context *q)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1660 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1661 int i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1662 #define PRINT(a,b) av_log(NULL,AV_LOG_DEBUG," %s = %d\n", a, b);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1663 PRINT("compressed_data",q->compressed_data);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1664 PRINT("compressed_size",q->compressed_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1665 PRINT("frame_size",q->frame_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1666 PRINT("checksum_size",q->checksum_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1667 PRINT("channels",q->channels);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1668 PRINT("nb_channels",q->nb_channels);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1669 PRINT("fft_frame_size",q->fft_frame_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1670 PRINT("fft_size",q->fft_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1671 PRINT("sub_sampling",q->sub_sampling);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1672 PRINT("fft_order",q->fft_order);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1673 PRINT("group_order",q->group_order);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1674 PRINT("group_size",q->group_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1675 PRINT("sub_packet",q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1676 PRINT("frequency_range",q->frequency_range);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1677 PRINT("has_errors",q->has_errors);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1678 PRINT("fft_tone_end",q->fft_tone_end);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1679 PRINT("fft_tone_start",q->fft_tone_start);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1680 PRINT("fft_coefs_index",q->fft_coefs_index);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1681 PRINT("coeff_per_sb_select",q->coeff_per_sb_select);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1682 PRINT("cm_table_select",q->cm_table_select);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1683 PRINT("noise_idx",q->noise_idx);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1684
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1685 for (i = q->fft_tone_start; i < q->fft_tone_end; i++)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1686 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1687 FFTTone *t = &q->fft_tones[i];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1688
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1689 av_log(NULL,AV_LOG_DEBUG,"Tone (%d) dump:\n", i);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1690 av_log(NULL,AV_LOG_DEBUG," level = %f\n", t->level);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1691 // PRINT(" level", t->level);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1692 PRINT(" phase", t->phase);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1693 PRINT(" phase_shift", t->phase_shift);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1694 PRINT(" duration", t->duration);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1695 PRINT(" samples_im", t->samples_im);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1696 PRINT(" samples_re", t->samples_re);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1697 PRINT(" table", t->table);
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 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1701 #endif
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 /**
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1705 * Init parameters from codec extradata
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1706 */
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
1707 static av_cold int qdm2_decode_init(AVCodecContext *avctx)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1708 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1709 QDM2Context *s = avctx->priv_data;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1710 uint8_t *extradata;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1711 int extradata_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1712 int tmp_val, tmp, size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1713
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1714 /* extradata parsing
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1715
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1716 Structure:
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1717 wave {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1718 frma (QDM2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1719 QDCA
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1720 QDCP
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1721 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1722
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1723 32 size (including this field)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1724 32 tag (=frma)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1725 32 type (=QDM2 or QDMC)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1726
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1727 32 size (including this field, in bytes)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1728 32 tag (=QDCA) // maybe mandatory parameters
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1729 32 unknown (=1)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1730 32 channels (=2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1731 32 samplerate (=44100)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1732 32 bitrate (=96000)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1733 32 block size (=4096)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1734 32 frame size (=256) (for one channel)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1735 32 packet size (=1300)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1736
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1737 32 size (including this field, in bytes)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1738 32 tag (=QDCP) // maybe some tuneable parameters
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1739 32 float1 (=1.0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1740 32 zero ?
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1741 32 float2 (=1.0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1742 32 float3 (=1.0)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1743 32 unknown (27)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1744 32 unknown (8)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1745 32 zero ?
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1746 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1747
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1748 if (!avctx->extradata || (avctx->extradata_size < 48)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1749 av_log(avctx, AV_LOG_ERROR, "extradata missing or truncated\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1750 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1751 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1752
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1753 extradata = avctx->extradata;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1754 extradata_size = avctx->extradata_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1755
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1756 while (extradata_size > 7) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1757 if (!memcmp(extradata, "frmaQDM", 7))
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1758 break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1759 extradata++;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1760 extradata_size--;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1761 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1762
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1763 if (extradata_size < 12) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1764 av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n",
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1765 extradata_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1766 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1767 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1768
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1769 if (memcmp(extradata, "frmaQDM", 7)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1770 av_log(avctx, AV_LOG_ERROR, "invalid headers, QDM? not found\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1771 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1772 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1773
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1774 if (extradata[7] == 'C') {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1775 // s->is_qdmc = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1776 av_log(avctx, AV_LOG_ERROR, "stream is QDMC version 1, which is not supported\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1777 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1778 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1779
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1780 extradata += 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1781 extradata_size -= 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1782
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1783 size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1784
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1785 if(size > extradata_size){
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1786 av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n",
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1787 extradata_size, size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1788 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1789 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1790
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1791 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1792 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
1793 if (AV_RB32(extradata) != MKBETAG('Q','D','C','A')) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1794 av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n");
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1795 return -1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1796 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1797
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1798 extradata += 8;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1799
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1800 avctx->channels = s->nb_channels = s->channels = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1801 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1802
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1803 avctx->sample_rate = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1804 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1805
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1806 avctx->bit_rate = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1807 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1808
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1809 s->group_size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1810 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1811
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1812 s->fft_size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1813 extradata += 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1814
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
1815 s->checksum_size = AV_RB32(extradata);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1816
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1817 s->fft_order = av_log2(s->fft_size) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1818 s->fft_frame_size = 2 * s->fft_size; // complex has two floats
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1819
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1820 // something like max decodable tones
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1821 s->group_order = av_log2(s->group_size) + 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1822 s->frame_size = s->group_size / 16; // 16 iterations per super block
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1823
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1824 s->sub_sampling = s->fft_order - 7;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1825 s->frequency_range = 255 / (1 << (2 - s->sub_sampling));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1826
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1827 switch ((s->sub_sampling * 2 + s->channels - 1)) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1828 case 0: tmp = 40; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1829 case 1: tmp = 48; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1830 case 2: tmp = 56; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1831 case 3: tmp = 72; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1832 case 4: tmp = 80; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1833 case 5: tmp = 100;break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1834 default: tmp=s->sub_sampling; break;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1835 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1836 tmp_val = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1837 if ((tmp * 1000) < avctx->bit_rate) tmp_val = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1838 if ((tmp * 1440) < avctx->bit_rate) tmp_val = 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1839 if ((tmp * 1760) < avctx->bit_rate) tmp_val = 3;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1840 if ((tmp * 2240) < avctx->bit_rate) tmp_val = 4;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1841 s->cm_table_select = tmp_val;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1842
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1843 if (s->sub_sampling == 0)
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1844 tmp = 7999;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1845 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1846 tmp = ((-(s->sub_sampling -1)) & 8000) + 20000;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1847 /*
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1848 0: 7999 -> 0
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1849 1: 20000 -> 2
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1850 2: 28000 -> 2
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1851 */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1852 if (tmp < 8000)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1853 s->coeff_per_sb_select = 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1854 else if (tmp <= 16000)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1855 s->coeff_per_sb_select = 1;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1856 else
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1857 s->coeff_per_sb_select = 2;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1858
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1859 // Fail on unknown fft order
2954
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1860 if ((s->fft_order < 7) || (s->fft_order > 9)) {
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1861 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
1862 return -1;
43f14ef874de Support for samples with fft_order = 7
rtognimp
parents: 2953
diff changeset
1863 }
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1864
11391
4c7afa50df6f Give RDFT types more meaningful names
mru
parents: 11370
diff changeset
1865 ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1866
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1867 qdm2_init(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1868
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7326
diff changeset
1869 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
1870
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1871 // dump_context(s);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1872 return 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1873 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1874
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1875
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
1876 static av_cold int qdm2_decode_close(AVCodecContext *avctx)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1877 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1878 QDM2Context *s = avctx->priv_data;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1879
8695
d8a784fb1bbe Use the new RDFT code in the QDM2 decoder.
alexc
parents: 8592
diff changeset
1880 ff_rdft_end(&s->rdft_ctx);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1881
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1882 return 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1883 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1884
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1885
6273
michael
parents: 6122
diff changeset
1886 static void qdm2_decode (QDM2Context *q, const uint8_t *in, int16_t *out)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1887 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1888 int ch, i;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1889 const int frame_size = (q->frame_size * q->channels);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2954
diff changeset
1890
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1891 /* select input buffer */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1892 q->compressed_data = in;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1893 q->compressed_size = q->checksum_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1894
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1895 // dump_context(q);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1896
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1897 /* copy old block, clear new block of output samples */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1898 memmove(q->output_buffer, &q->output_buffer[frame_size], frame_size * sizeof(float));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1899 memset(&q->output_buffer[frame_size], 0, frame_size * sizeof(float));
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1900
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1901 /* decode block of QDM2 compressed data */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1902 if (q->sub_packet == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1903 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
1904 av_log(NULL,AV_LOG_DEBUG,"Superblock follows\n");
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1905 qdm2_decode_super_block(q);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1906 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1907
3043
583020ce54a8 Fix a bunch of spelling/grammar mistakes in doxygen comments and output.
diego
parents: 3036
diff changeset
1908 /* parse subpackets */
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1909 if (!q->has_errors) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1910 if (q->sub_packet == 2)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1911 qdm2_decode_fft_packets(q);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1912
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1913 qdm2_fft_tone_synthesizer(q, q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1914 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1915
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1916 /* sound synthesis stage 1 (FFT) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1917 for (ch = 0; ch < q->channels; ch++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1918 qdm2_calculate_fft(q, ch, q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1919
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1920 if (!q->has_errors && q->sub_packet_list_C[0].packet != NULL) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1921 SAMPLES_NEEDED_2("has errors, and C list is not empty")
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1922 return;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1926 /* sound synthesis stage 2 (MPEG audio like synthesis filter) */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1927 if (!q->has_errors && q->do_synth_filter)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1928 qdm2_synthesis_filter(q, q->sub_packet);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1929
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1930 q->sub_packet = (q->sub_packet + 1) % 16;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1931
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1932 /* clip and convert output float[] to 16bit signed samples */
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1933 for (i = 0; i < frame_size; i++) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1934 int value = (int)q->output_buffer[i];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1935
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1936 if (value > SOFTCLIP_THRESHOLD)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1937 value = (value > HARDCLIP_THRESHOLD) ? 32767 : softclip_table[ value - SOFTCLIP_THRESHOLD];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1938 else if (value < -SOFTCLIP_THRESHOLD)
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1939 value = (value < -HARDCLIP_THRESHOLD) ? -32767 : -softclip_table[-value - SOFTCLIP_THRESHOLD];
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1940
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1941 out[i] = value;
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
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1946 static int qdm2_decode_frame(AVCodecContext *avctx,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1947 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9007
diff changeset
1948 AVPacket *avpkt)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1949 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9007
diff changeset
1950 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9007
diff changeset
1951 int buf_size = avpkt->size;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1952 QDM2Context *s = avctx->priv_data;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1953
3158
5b2a0e54dfa7 fix infinite loop
michael
parents: 3076
diff changeset
1954 if(!buf)
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1955 return 0;
3158
5b2a0e54dfa7 fix infinite loop
michael
parents: 3076
diff changeset
1956 if(buf_size < s->checksum_size)
5b2a0e54dfa7 fix infinite loop
michael
parents: 3076
diff changeset
1957 return -1;
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1958
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1959 *data_size = s->channels * s->frame_size * sizeof(int16_t);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1960
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1961 av_log(avctx, AV_LOG_DEBUG, "decode(%d): %p[%d] -> %p[%d]\n",
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1962 buf_size, buf, s->checksum_size, data, *data_size);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1963
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1964 qdm2_decode(s, buf, data);
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1965
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1966 // reading only when next superblock found
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1967 if (s->sub_packet == 0) {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1968 return s->checksum_size;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1969 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1970
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1971 return 0;
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1972 }
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1973
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1974 AVCodec qdm2_decoder =
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1975 {
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1976 .name = "qdm2",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11488
diff changeset
1977 .type = AVMEDIA_TYPE_AUDIO,
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1978 .id = CODEC_ID_QDM2,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1979 .priv_data_size = sizeof(QDM2Context),
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1980 .init = qdm2_decode_init,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1981 .close = qdm2_decode_close,
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1982 .decode = qdm2_decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6903
diff changeset
1983 .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
2914
4a52affac0e0 QDM2 compatible decoder
rtognimp
parents:
diff changeset
1984 };