annotate ffmpeg/libavcodec/qdm2.c @ 13:844d341cf643 tip

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