annotate qdm2.c @ 5876:731ee5ad6bde libavcodec

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