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