1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * AAC decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org ) 4cabdff1aSopenharmony_ci * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com ) 5cabdff1aSopenharmony_ci * Copyright (c) 2008-2013 Alex Converse <alex.converse@gmail.com> 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * AAC LATM decoder 8cabdff1aSopenharmony_ci * Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz> 9cabdff1aSopenharmony_ci * Copyright (c) 2010 Janne Grunau <janne-libav@jannau.net> 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * AAC decoder fixed-point implementation 12cabdff1aSopenharmony_ci * Copyright (c) 2013 13cabdff1aSopenharmony_ci * MIPS Technologies, Inc., California. 14cabdff1aSopenharmony_ci * 15cabdff1aSopenharmony_ci * This file is part of FFmpeg. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 18cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 20cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 21cabdff1aSopenharmony_ci * 22cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 23cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 24cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 25cabdff1aSopenharmony_ci * Lesser General Public License for more details. 26cabdff1aSopenharmony_ci * 27cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 28cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 29cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 30cabdff1aSopenharmony_ci */ 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci/** 33cabdff1aSopenharmony_ci * @file 34cabdff1aSopenharmony_ci * AAC decoder 35cabdff1aSopenharmony_ci * @author Oded Shimon ( ods15 ods15 dyndns org ) 36cabdff1aSopenharmony_ci * @author Maxim Gavrilov ( maxim.gavrilov gmail com ) 37cabdff1aSopenharmony_ci * 38cabdff1aSopenharmony_ci * AAC decoder fixed-point implementation 39cabdff1aSopenharmony_ci * @author Stanislav Ocovaj ( stanislav.ocovaj imgtec com ) 40cabdff1aSopenharmony_ci * @author Nedeljko Babic ( nedeljko.babic imgtec com ) 41cabdff1aSopenharmony_ci */ 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci/* 44cabdff1aSopenharmony_ci * supported tools 45cabdff1aSopenharmony_ci * 46cabdff1aSopenharmony_ci * Support? Name 47cabdff1aSopenharmony_ci * N (code in SoC repo) gain control 48cabdff1aSopenharmony_ci * Y block switching 49cabdff1aSopenharmony_ci * Y window shapes - standard 50cabdff1aSopenharmony_ci * N window shapes - Low Delay 51cabdff1aSopenharmony_ci * Y filterbank - standard 52cabdff1aSopenharmony_ci * N (code in SoC repo) filterbank - Scalable Sample Rate 53cabdff1aSopenharmony_ci * Y Temporal Noise Shaping 54cabdff1aSopenharmony_ci * Y Long Term Prediction 55cabdff1aSopenharmony_ci * Y intensity stereo 56cabdff1aSopenharmony_ci * Y channel coupling 57cabdff1aSopenharmony_ci * Y frequency domain prediction 58cabdff1aSopenharmony_ci * Y Perceptual Noise Substitution 59cabdff1aSopenharmony_ci * Y Mid/Side stereo 60cabdff1aSopenharmony_ci * N Scalable Inverse AAC Quantization 61cabdff1aSopenharmony_ci * N Frequency Selective Switch 62cabdff1aSopenharmony_ci * N upsampling filter 63cabdff1aSopenharmony_ci * Y quantization & coding - AAC 64cabdff1aSopenharmony_ci * N quantization & coding - TwinVQ 65cabdff1aSopenharmony_ci * N quantization & coding - BSAC 66cabdff1aSopenharmony_ci * N AAC Error Resilience tools 67cabdff1aSopenharmony_ci * N Error Resilience payload syntax 68cabdff1aSopenharmony_ci * N Error Protection tool 69cabdff1aSopenharmony_ci * N CELP 70cabdff1aSopenharmony_ci * N Silence Compression 71cabdff1aSopenharmony_ci * N HVXC 72cabdff1aSopenharmony_ci * N HVXC 4kbits/s VR 73cabdff1aSopenharmony_ci * N Structured Audio tools 74cabdff1aSopenharmony_ci * N Structured Audio Sample Bank Format 75cabdff1aSopenharmony_ci * N MIDI 76cabdff1aSopenharmony_ci * N Harmonic and Individual Lines plus Noise 77cabdff1aSopenharmony_ci * N Text-To-Speech Interface 78cabdff1aSopenharmony_ci * Y Spectral Band Replication 79cabdff1aSopenharmony_ci * Y (not in this code) Layer-1 80cabdff1aSopenharmony_ci * Y (not in this code) Layer-2 81cabdff1aSopenharmony_ci * Y (not in this code) Layer-3 82cabdff1aSopenharmony_ci * N SinuSoidal Coding (Transient, Sinusoid, Noise) 83cabdff1aSopenharmony_ci * Y Parametric Stereo 84cabdff1aSopenharmony_ci * N Direct Stream Transfer 85cabdff1aSopenharmony_ci * Y (not in fixed point code) Enhanced AAC Low Delay (ER AAC ELD) 86cabdff1aSopenharmony_ci * 87cabdff1aSopenharmony_ci * Note: - HE AAC v1 comprises LC AAC with Spectral Band Replication. 88cabdff1aSopenharmony_ci * - HE AAC v2 comprises LC AAC with Spectral Band Replication and 89cabdff1aSopenharmony_ci Parametric Stereo. 90cabdff1aSopenharmony_ci */ 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 93cabdff1aSopenharmony_ci#include "libavutil/thread.h" 94cabdff1aSopenharmony_ci#include "internal.h" 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_cistatic VLC vlc_scalefactors; 97cabdff1aSopenharmony_cistatic VLC vlc_spectral[11]; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_cistatic int output_configure(AACContext *ac, 100cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3], int tags, 101cabdff1aSopenharmony_ci enum OCStatus oc_type, int get_new_frame); 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci#define overread_err "Input buffer exhausted before END element found\n" 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_cistatic int count_channels(uint8_t (*layout)[3], int tags) 106cabdff1aSopenharmony_ci{ 107cabdff1aSopenharmony_ci int i, sum = 0; 108cabdff1aSopenharmony_ci for (i = 0; i < tags; i++) { 109cabdff1aSopenharmony_ci int syn_ele = layout[i][0]; 110cabdff1aSopenharmony_ci int pos = layout[i][2]; 111cabdff1aSopenharmony_ci sum += (1 + (syn_ele == TYPE_CPE)) * 112cabdff1aSopenharmony_ci (pos != AAC_CHANNEL_OFF && pos != AAC_CHANNEL_CC); 113cabdff1aSopenharmony_ci } 114cabdff1aSopenharmony_ci return sum; 115cabdff1aSopenharmony_ci} 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci/** 118cabdff1aSopenharmony_ci * Check for the channel element in the current channel position configuration. 119cabdff1aSopenharmony_ci * If it exists, make sure the appropriate element is allocated and map the 120cabdff1aSopenharmony_ci * channel order to match the internal FFmpeg channel layout. 121cabdff1aSopenharmony_ci * 122cabdff1aSopenharmony_ci * @param che_pos current channel position configuration 123cabdff1aSopenharmony_ci * @param type channel element type 124cabdff1aSopenharmony_ci * @param id channel element id 125cabdff1aSopenharmony_ci * @param channels count of the number of channels in the configuration 126cabdff1aSopenharmony_ci * 127cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 128cabdff1aSopenharmony_ci */ 129cabdff1aSopenharmony_cistatic av_cold int che_configure(AACContext *ac, 130cabdff1aSopenharmony_ci enum ChannelPosition che_pos, 131cabdff1aSopenharmony_ci int type, int id, int *channels) 132cabdff1aSopenharmony_ci{ 133cabdff1aSopenharmony_ci if (*channels >= MAX_CHANNELS) 134cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 135cabdff1aSopenharmony_ci if (che_pos) { 136cabdff1aSopenharmony_ci if (!ac->che[type][id]) { 137cabdff1aSopenharmony_ci if (!(ac->che[type][id] = av_mallocz(sizeof(ChannelElement)))) 138cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 139cabdff1aSopenharmony_ci AAC_RENAME(ff_aac_sbr_ctx_init)(ac, &ac->che[type][id]->sbr, type); 140cabdff1aSopenharmony_ci } 141cabdff1aSopenharmony_ci if (type != TYPE_CCE) { 142cabdff1aSopenharmony_ci if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1))) { 143cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Too many channels\n"); 144cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 145cabdff1aSopenharmony_ci } 146cabdff1aSopenharmony_ci ac->output_element[(*channels)++] = &ac->che[type][id]->ch[0]; 147cabdff1aSopenharmony_ci if (type == TYPE_CPE || 148cabdff1aSopenharmony_ci (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1)) { 149cabdff1aSopenharmony_ci ac->output_element[(*channels)++] = &ac->che[type][id]->ch[1]; 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci } 152cabdff1aSopenharmony_ci } else { 153cabdff1aSopenharmony_ci if (ac->che[type][id]) 154cabdff1aSopenharmony_ci AAC_RENAME(ff_aac_sbr_ctx_close)(&ac->che[type][id]->sbr); 155cabdff1aSopenharmony_ci av_freep(&ac->che[type][id]); 156cabdff1aSopenharmony_ci } 157cabdff1aSopenharmony_ci return 0; 158cabdff1aSopenharmony_ci} 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_cistatic int frame_configure_elements(AVCodecContext *avctx) 161cabdff1aSopenharmony_ci{ 162cabdff1aSopenharmony_ci AACContext *ac = avctx->priv_data; 163cabdff1aSopenharmony_ci int type, id, ch, ret; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci /* set channel pointers to internal buffers by default */ 166cabdff1aSopenharmony_ci for (type = 0; type < 4; type++) { 167cabdff1aSopenharmony_ci for (id = 0; id < MAX_ELEM_ID; id++) { 168cabdff1aSopenharmony_ci ChannelElement *che = ac->che[type][id]; 169cabdff1aSopenharmony_ci if (che) { 170cabdff1aSopenharmony_ci che->ch[0].ret = che->ch[0].ret_buf; 171cabdff1aSopenharmony_ci che->ch[1].ret = che->ch[1].ret_buf; 172cabdff1aSopenharmony_ci } 173cabdff1aSopenharmony_ci } 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci /* get output buffer */ 177cabdff1aSopenharmony_ci av_frame_unref(ac->frame); 178cabdff1aSopenharmony_ci if (!avctx->ch_layout.nb_channels) 179cabdff1aSopenharmony_ci return 1; 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci ac->frame->nb_samples = 2048; 182cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, ac->frame, 0)) < 0) 183cabdff1aSopenharmony_ci return ret; 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_ci /* map output channel pointers to AVFrame data */ 186cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { 187cabdff1aSopenharmony_ci if (ac->output_element[ch]) 188cabdff1aSopenharmony_ci ac->output_element[ch]->ret = (INTFLOAT *)ac->frame->extended_data[ch]; 189cabdff1aSopenharmony_ci } 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci return 0; 192cabdff1aSopenharmony_ci} 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_cistruct elem_to_channel { 195cabdff1aSopenharmony_ci uint64_t av_position; 196cabdff1aSopenharmony_ci uint8_t syn_ele; 197cabdff1aSopenharmony_ci uint8_t elem_id; 198cabdff1aSopenharmony_ci uint8_t aac_position; 199cabdff1aSopenharmony_ci}; 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_cistatic int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID], 202cabdff1aSopenharmony_ci uint8_t (*layout_map)[3], int offset, uint64_t left, 203cabdff1aSopenharmony_ci uint64_t right, int pos, uint64_t *layout) 204cabdff1aSopenharmony_ci{ 205cabdff1aSopenharmony_ci if (layout_map[offset][0] == TYPE_CPE) { 206cabdff1aSopenharmony_ci e2c_vec[offset] = (struct elem_to_channel) { 207cabdff1aSopenharmony_ci .av_position = left | right, 208cabdff1aSopenharmony_ci .syn_ele = TYPE_CPE, 209cabdff1aSopenharmony_ci .elem_id = layout_map[offset][1], 210cabdff1aSopenharmony_ci .aac_position = pos 211cabdff1aSopenharmony_ci }; 212cabdff1aSopenharmony_ci if (e2c_vec[offset].av_position != UINT64_MAX) 213cabdff1aSopenharmony_ci *layout |= e2c_vec[offset].av_position; 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci return 1; 216cabdff1aSopenharmony_ci } else { 217cabdff1aSopenharmony_ci e2c_vec[offset] = (struct elem_to_channel) { 218cabdff1aSopenharmony_ci .av_position = left, 219cabdff1aSopenharmony_ci .syn_ele = TYPE_SCE, 220cabdff1aSopenharmony_ci .elem_id = layout_map[offset][1], 221cabdff1aSopenharmony_ci .aac_position = pos 222cabdff1aSopenharmony_ci }; 223cabdff1aSopenharmony_ci e2c_vec[offset + 1] = (struct elem_to_channel) { 224cabdff1aSopenharmony_ci .av_position = right, 225cabdff1aSopenharmony_ci .syn_ele = TYPE_SCE, 226cabdff1aSopenharmony_ci .elem_id = layout_map[offset + 1][1], 227cabdff1aSopenharmony_ci .aac_position = pos 228cabdff1aSopenharmony_ci }; 229cabdff1aSopenharmony_ci if (left != UINT64_MAX) 230cabdff1aSopenharmony_ci *layout |= left; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci if (right != UINT64_MAX) 233cabdff1aSopenharmony_ci *layout |= right; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci return 2; 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci} 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_cistatic int count_paired_channels(uint8_t (*layout_map)[3], int tags, int pos, 240cabdff1aSopenharmony_ci int *current) 241cabdff1aSopenharmony_ci{ 242cabdff1aSopenharmony_ci int num_pos_channels = 0; 243cabdff1aSopenharmony_ci int first_cpe = 0; 244cabdff1aSopenharmony_ci int sce_parity = 0; 245cabdff1aSopenharmony_ci int i; 246cabdff1aSopenharmony_ci for (i = *current; i < tags; i++) { 247cabdff1aSopenharmony_ci if (layout_map[i][2] != pos) 248cabdff1aSopenharmony_ci break; 249cabdff1aSopenharmony_ci if (layout_map[i][0] == TYPE_CPE) { 250cabdff1aSopenharmony_ci if (sce_parity) { 251cabdff1aSopenharmony_ci if (pos == AAC_CHANNEL_FRONT && !first_cpe) { 252cabdff1aSopenharmony_ci sce_parity = 0; 253cabdff1aSopenharmony_ci } else { 254cabdff1aSopenharmony_ci return -1; 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci } 257cabdff1aSopenharmony_ci num_pos_channels += 2; 258cabdff1aSopenharmony_ci first_cpe = 1; 259cabdff1aSopenharmony_ci } else { 260cabdff1aSopenharmony_ci num_pos_channels++; 261cabdff1aSopenharmony_ci sce_parity ^= 1; 262cabdff1aSopenharmony_ci } 263cabdff1aSopenharmony_ci } 264cabdff1aSopenharmony_ci if (sce_parity && 265cabdff1aSopenharmony_ci ((pos == AAC_CHANNEL_FRONT && first_cpe) || pos == AAC_CHANNEL_SIDE)) 266cabdff1aSopenharmony_ci return -1; 267cabdff1aSopenharmony_ci *current = i; 268cabdff1aSopenharmony_ci return num_pos_channels; 269cabdff1aSopenharmony_ci} 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci#define PREFIX_FOR_22POINT2 (AV_CH_LAYOUT_7POINT1_WIDE_BACK|AV_CH_BACK_CENTER|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_LOW_FREQUENCY_2) 272cabdff1aSopenharmony_cistatic uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags) 273cabdff1aSopenharmony_ci{ 274cabdff1aSopenharmony_ci int i, n, total_non_cc_elements; 275cabdff1aSopenharmony_ci struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } }; 276cabdff1aSopenharmony_ci int num_front_channels, num_side_channels, num_back_channels; 277cabdff1aSopenharmony_ci uint64_t layout = 0; 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci if (FF_ARRAY_ELEMS(e2c_vec) < tags) 280cabdff1aSopenharmony_ci return 0; 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_ci i = 0; 283cabdff1aSopenharmony_ci num_front_channels = 284cabdff1aSopenharmony_ci count_paired_channels(layout_map, tags, AAC_CHANNEL_FRONT, &i); 285cabdff1aSopenharmony_ci if (num_front_channels < 0) 286cabdff1aSopenharmony_ci return 0; 287cabdff1aSopenharmony_ci num_side_channels = 288cabdff1aSopenharmony_ci count_paired_channels(layout_map, tags, AAC_CHANNEL_SIDE, &i); 289cabdff1aSopenharmony_ci if (num_side_channels < 0) 290cabdff1aSopenharmony_ci return 0; 291cabdff1aSopenharmony_ci num_back_channels = 292cabdff1aSopenharmony_ci count_paired_channels(layout_map, tags, AAC_CHANNEL_BACK, &i); 293cabdff1aSopenharmony_ci if (num_back_channels < 0) 294cabdff1aSopenharmony_ci return 0; 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_ci if (num_side_channels == 0 && num_back_channels >= 4) { 297cabdff1aSopenharmony_ci num_side_channels = 2; 298cabdff1aSopenharmony_ci num_back_channels -= 2; 299cabdff1aSopenharmony_ci } 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci i = 0; 302cabdff1aSopenharmony_ci if (num_front_channels & 1) { 303cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 304cabdff1aSopenharmony_ci .av_position = AV_CH_FRONT_CENTER, 305cabdff1aSopenharmony_ci .syn_ele = TYPE_SCE, 306cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 307cabdff1aSopenharmony_ci .aac_position = AAC_CHANNEL_FRONT 308cabdff1aSopenharmony_ci }; 309cabdff1aSopenharmony_ci layout |= e2c_vec[i].av_position; 310cabdff1aSopenharmony_ci i++; 311cabdff1aSopenharmony_ci num_front_channels--; 312cabdff1aSopenharmony_ci } 313cabdff1aSopenharmony_ci if (num_front_channels >= 4) { 314cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 315cabdff1aSopenharmony_ci AV_CH_FRONT_LEFT_OF_CENTER, 316cabdff1aSopenharmony_ci AV_CH_FRONT_RIGHT_OF_CENTER, 317cabdff1aSopenharmony_ci AAC_CHANNEL_FRONT, &layout); 318cabdff1aSopenharmony_ci num_front_channels -= 2; 319cabdff1aSopenharmony_ci } 320cabdff1aSopenharmony_ci if (num_front_channels >= 2) { 321cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 322cabdff1aSopenharmony_ci AV_CH_FRONT_LEFT, 323cabdff1aSopenharmony_ci AV_CH_FRONT_RIGHT, 324cabdff1aSopenharmony_ci AAC_CHANNEL_FRONT, &layout); 325cabdff1aSopenharmony_ci num_front_channels -= 2; 326cabdff1aSopenharmony_ci } 327cabdff1aSopenharmony_ci while (num_front_channels >= 2) { 328cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 329cabdff1aSopenharmony_ci UINT64_MAX, 330cabdff1aSopenharmony_ci UINT64_MAX, 331cabdff1aSopenharmony_ci AAC_CHANNEL_FRONT, &layout); 332cabdff1aSopenharmony_ci num_front_channels -= 2; 333cabdff1aSopenharmony_ci } 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci if (num_side_channels >= 2) { 336cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 337cabdff1aSopenharmony_ci AV_CH_SIDE_LEFT, 338cabdff1aSopenharmony_ci AV_CH_SIDE_RIGHT, 339cabdff1aSopenharmony_ci AAC_CHANNEL_FRONT, &layout); 340cabdff1aSopenharmony_ci num_side_channels -= 2; 341cabdff1aSopenharmony_ci } 342cabdff1aSopenharmony_ci while (num_side_channels >= 2) { 343cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 344cabdff1aSopenharmony_ci UINT64_MAX, 345cabdff1aSopenharmony_ci UINT64_MAX, 346cabdff1aSopenharmony_ci AAC_CHANNEL_SIDE, &layout); 347cabdff1aSopenharmony_ci num_side_channels -= 2; 348cabdff1aSopenharmony_ci } 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_ci while (num_back_channels >= 4) { 351cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 352cabdff1aSopenharmony_ci UINT64_MAX, 353cabdff1aSopenharmony_ci UINT64_MAX, 354cabdff1aSopenharmony_ci AAC_CHANNEL_BACK, &layout); 355cabdff1aSopenharmony_ci num_back_channels -= 2; 356cabdff1aSopenharmony_ci } 357cabdff1aSopenharmony_ci if (num_back_channels >= 2) { 358cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 359cabdff1aSopenharmony_ci AV_CH_BACK_LEFT, 360cabdff1aSopenharmony_ci AV_CH_BACK_RIGHT, 361cabdff1aSopenharmony_ci AAC_CHANNEL_BACK, &layout); 362cabdff1aSopenharmony_ci num_back_channels -= 2; 363cabdff1aSopenharmony_ci } 364cabdff1aSopenharmony_ci if (num_back_channels) { 365cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 366cabdff1aSopenharmony_ci .av_position = AV_CH_BACK_CENTER, 367cabdff1aSopenharmony_ci .syn_ele = TYPE_SCE, 368cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 369cabdff1aSopenharmony_ci .aac_position = AAC_CHANNEL_BACK 370cabdff1aSopenharmony_ci }; 371cabdff1aSopenharmony_ci layout |= e2c_vec[i].av_position; 372cabdff1aSopenharmony_ci i++; 373cabdff1aSopenharmony_ci num_back_channels--; 374cabdff1aSopenharmony_ci } 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { 377cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 378cabdff1aSopenharmony_ci .av_position = AV_CH_LOW_FREQUENCY, 379cabdff1aSopenharmony_ci .syn_ele = TYPE_LFE, 380cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 381cabdff1aSopenharmony_ci .aac_position = AAC_CHANNEL_LFE 382cabdff1aSopenharmony_ci }; 383cabdff1aSopenharmony_ci layout |= e2c_vec[i].av_position; 384cabdff1aSopenharmony_ci i++; 385cabdff1aSopenharmony_ci } 386cabdff1aSopenharmony_ci if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { 387cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 388cabdff1aSopenharmony_ci .av_position = AV_CH_LOW_FREQUENCY_2, 389cabdff1aSopenharmony_ci .syn_ele = TYPE_LFE, 390cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 391cabdff1aSopenharmony_ci .aac_position = AAC_CHANNEL_LFE 392cabdff1aSopenharmony_ci }; 393cabdff1aSopenharmony_ci layout |= e2c_vec[i].av_position; 394cabdff1aSopenharmony_ci i++; 395cabdff1aSopenharmony_ci } 396cabdff1aSopenharmony_ci while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { 397cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 398cabdff1aSopenharmony_ci .av_position = UINT64_MAX, 399cabdff1aSopenharmony_ci .syn_ele = TYPE_LFE, 400cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 401cabdff1aSopenharmony_ci .aac_position = AAC_CHANNEL_LFE 402cabdff1aSopenharmony_ci }; 403cabdff1aSopenharmony_ci i++; 404cabdff1aSopenharmony_ci } 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci // The previous checks would end up at 8 at this point for 22.2 407cabdff1aSopenharmony_ci if (layout == PREFIX_FOR_22POINT2 && tags == 16 && i == 8) { 408cabdff1aSopenharmony_ci const uint8_t (*reference_layout_map)[3] = aac_channel_layout_map[12]; 409cabdff1aSopenharmony_ci for (int j = 0; j < tags; j++) { 410cabdff1aSopenharmony_ci if (layout_map[j][0] != reference_layout_map[j][0] || 411cabdff1aSopenharmony_ci layout_map[j][2] != reference_layout_map[j][2]) 412cabdff1aSopenharmony_ci goto end_of_layout_definition; 413cabdff1aSopenharmony_ci } 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 416cabdff1aSopenharmony_ci .av_position = AV_CH_TOP_FRONT_CENTER, 417cabdff1aSopenharmony_ci .syn_ele = layout_map[i][0], 418cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 419cabdff1aSopenharmony_ci .aac_position = layout_map[i][2] 420cabdff1aSopenharmony_ci }; layout |= e2c_vec[i].av_position; i++; 421cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 422cabdff1aSopenharmony_ci AV_CH_TOP_FRONT_LEFT, 423cabdff1aSopenharmony_ci AV_CH_TOP_FRONT_RIGHT, 424cabdff1aSopenharmony_ci AAC_CHANNEL_FRONT, 425cabdff1aSopenharmony_ci &layout); 426cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 427cabdff1aSopenharmony_ci AV_CH_TOP_SIDE_LEFT, 428cabdff1aSopenharmony_ci AV_CH_TOP_SIDE_RIGHT, 429cabdff1aSopenharmony_ci AAC_CHANNEL_SIDE, 430cabdff1aSopenharmony_ci &layout); 431cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 432cabdff1aSopenharmony_ci .av_position = AV_CH_TOP_CENTER, 433cabdff1aSopenharmony_ci .syn_ele = layout_map[i][0], 434cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 435cabdff1aSopenharmony_ci .aac_position = layout_map[i][2] 436cabdff1aSopenharmony_ci }; layout |= e2c_vec[i].av_position; i++; 437cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 438cabdff1aSopenharmony_ci AV_CH_TOP_BACK_LEFT, 439cabdff1aSopenharmony_ci AV_CH_TOP_BACK_RIGHT, 440cabdff1aSopenharmony_ci AAC_CHANNEL_BACK, 441cabdff1aSopenharmony_ci &layout); 442cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 443cabdff1aSopenharmony_ci .av_position = AV_CH_TOP_BACK_CENTER, 444cabdff1aSopenharmony_ci .syn_ele = layout_map[i][0], 445cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 446cabdff1aSopenharmony_ci .aac_position = layout_map[i][2] 447cabdff1aSopenharmony_ci }; layout |= e2c_vec[i].av_position; i++; 448cabdff1aSopenharmony_ci e2c_vec[i] = (struct elem_to_channel) { 449cabdff1aSopenharmony_ci .av_position = AV_CH_BOTTOM_FRONT_CENTER, 450cabdff1aSopenharmony_ci .syn_ele = layout_map[i][0], 451cabdff1aSopenharmony_ci .elem_id = layout_map[i][1], 452cabdff1aSopenharmony_ci .aac_position = layout_map[i][2] 453cabdff1aSopenharmony_ci }; layout |= e2c_vec[i].av_position; i++; 454cabdff1aSopenharmony_ci i += assign_pair(e2c_vec, layout_map, i, 455cabdff1aSopenharmony_ci AV_CH_BOTTOM_FRONT_LEFT, 456cabdff1aSopenharmony_ci AV_CH_BOTTOM_FRONT_RIGHT, 457cabdff1aSopenharmony_ci AAC_CHANNEL_FRONT, 458cabdff1aSopenharmony_ci &layout); 459cabdff1aSopenharmony_ci } 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_ciend_of_layout_definition: 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci total_non_cc_elements = n = i; 464cabdff1aSopenharmony_ci 465cabdff1aSopenharmony_ci if (layout == AV_CH_LAYOUT_22POINT2) { 466cabdff1aSopenharmony_ci // For 22.2 reorder the result as needed 467cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[2], e2c_vec[0]); // FL & FR first (final), FC third 468cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[2], e2c_vec[1]); // FC second (final), FLc & FRc third 469cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[6], e2c_vec[2]); // LFE1 third (final), FLc & FRc seventh 470cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[4], e2c_vec[3]); // BL & BR fourth (final), SiL & SiR fifth 471cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[6], e2c_vec[4]); // FLc & FRc fifth (final), SiL & SiR seventh 472cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[7], e2c_vec[6]); // LFE2 seventh (final), SiL & SiR eight (final) 473cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[9], e2c_vec[8]); // TpFL & TpFR ninth (final), TFC tenth (final) 474cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[11], e2c_vec[10]); // TC eleventh (final), TpSiL & TpSiR twelth 475cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[12], e2c_vec[11]); // TpBL & TpBR twelth (final), TpSiL & TpSiR thirteenth (final) 476cabdff1aSopenharmony_ci } else { 477cabdff1aSopenharmony_ci // For everything else, utilize the AV channel position define as a 478cabdff1aSopenharmony_ci // stable sort. 479cabdff1aSopenharmony_ci do { 480cabdff1aSopenharmony_ci int next_n = 0; 481cabdff1aSopenharmony_ci for (i = 1; i < n; i++) 482cabdff1aSopenharmony_ci if (e2c_vec[i - 1].av_position > e2c_vec[i].av_position) { 483cabdff1aSopenharmony_ci FFSWAP(struct elem_to_channel, e2c_vec[i - 1], e2c_vec[i]); 484cabdff1aSopenharmony_ci next_n = i; 485cabdff1aSopenharmony_ci } 486cabdff1aSopenharmony_ci n = next_n; 487cabdff1aSopenharmony_ci } while (n > 0); 488cabdff1aSopenharmony_ci 489cabdff1aSopenharmony_ci } 490cabdff1aSopenharmony_ci 491cabdff1aSopenharmony_ci for (i = 0; i < total_non_cc_elements; i++) { 492cabdff1aSopenharmony_ci layout_map[i][0] = e2c_vec[i].syn_ele; 493cabdff1aSopenharmony_ci layout_map[i][1] = e2c_vec[i].elem_id; 494cabdff1aSopenharmony_ci layout_map[i][2] = e2c_vec[i].aac_position; 495cabdff1aSopenharmony_ci } 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci return layout; 498cabdff1aSopenharmony_ci} 499cabdff1aSopenharmony_ci 500cabdff1aSopenharmony_ci/** 501cabdff1aSopenharmony_ci * Save current output configuration if and only if it has been locked. 502cabdff1aSopenharmony_ci */ 503cabdff1aSopenharmony_cistatic int push_output_configuration(AACContext *ac) { 504cabdff1aSopenharmony_ci int pushed = 0; 505cabdff1aSopenharmony_ci 506cabdff1aSopenharmony_ci if (ac->oc[1].status == OC_LOCKED || ac->oc[0].status == OC_NONE) { 507cabdff1aSopenharmony_ci ac->oc[0] = ac->oc[1]; 508cabdff1aSopenharmony_ci pushed = 1; 509cabdff1aSopenharmony_ci } 510cabdff1aSopenharmony_ci ac->oc[1].status = OC_NONE; 511cabdff1aSopenharmony_ci return pushed; 512cabdff1aSopenharmony_ci} 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci/** 515cabdff1aSopenharmony_ci * Restore the previous output configuration if and only if the current 516cabdff1aSopenharmony_ci * configuration is unlocked. 517cabdff1aSopenharmony_ci */ 518cabdff1aSopenharmony_cistatic void pop_output_configuration(AACContext *ac) { 519cabdff1aSopenharmony_ci if (ac->oc[1].status != OC_LOCKED && ac->oc[0].status != OC_NONE) { 520cabdff1aSopenharmony_ci ac->oc[1] = ac->oc[0]; 521cabdff1aSopenharmony_ci ac->avctx->ch_layout = ac->oc[1].ch_layout; 522cabdff1aSopenharmony_ci output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags, 523cabdff1aSopenharmony_ci ac->oc[1].status, 0); 524cabdff1aSopenharmony_ci } 525cabdff1aSopenharmony_ci} 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci/** 528cabdff1aSopenharmony_ci * Configure output channel order based on the current program 529cabdff1aSopenharmony_ci * configuration element. 530cabdff1aSopenharmony_ci * 531cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 532cabdff1aSopenharmony_ci */ 533cabdff1aSopenharmony_cistatic int output_configure(AACContext *ac, 534cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID * 4][3], int tags, 535cabdff1aSopenharmony_ci enum OCStatus oc_type, int get_new_frame) 536cabdff1aSopenharmony_ci{ 537cabdff1aSopenharmony_ci AVCodecContext *avctx = ac->avctx; 538cabdff1aSopenharmony_ci int i, channels = 0, ret; 539cabdff1aSopenharmony_ci uint64_t layout = 0; 540cabdff1aSopenharmony_ci uint8_t id_map[TYPE_END][MAX_ELEM_ID] = {{ 0 }}; 541cabdff1aSopenharmony_ci uint8_t type_counts[TYPE_END] = { 0 }; 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_ci if (ac->oc[1].layout_map != layout_map) { 544cabdff1aSopenharmony_ci memcpy(ac->oc[1].layout_map, layout_map, tags * sizeof(layout_map[0])); 545cabdff1aSopenharmony_ci ac->oc[1].layout_map_tags = tags; 546cabdff1aSopenharmony_ci } 547cabdff1aSopenharmony_ci for (i = 0; i < tags; i++) { 548cabdff1aSopenharmony_ci int type = layout_map[i][0]; 549cabdff1aSopenharmony_ci int id = layout_map[i][1]; 550cabdff1aSopenharmony_ci id_map[type][id] = type_counts[type]++; 551cabdff1aSopenharmony_ci if (id_map[type][id] >= MAX_ELEM_ID) { 552cabdff1aSopenharmony_ci avpriv_request_sample(ac->avctx, "Too large remapped id"); 553cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 554cabdff1aSopenharmony_ci } 555cabdff1aSopenharmony_ci } 556cabdff1aSopenharmony_ci // Try to sniff a reasonable channel order, otherwise output the 557cabdff1aSopenharmony_ci // channels in the order the PCE declared them. 558cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 559cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS 560cabdff1aSopenharmony_ci if (avctx->request_channel_layout == AV_CH_LAYOUT_NATIVE) 561cabdff1aSopenharmony_ci ac->output_channel_order = CHANNEL_ORDER_CODED; 562cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS 563cabdff1aSopenharmony_ci#endif 564cabdff1aSopenharmony_ci 565cabdff1aSopenharmony_ci if (ac->output_channel_order == CHANNEL_ORDER_DEFAULT) 566cabdff1aSopenharmony_ci layout = sniff_channel_order(layout_map, tags); 567cabdff1aSopenharmony_ci for (i = 0; i < tags; i++) { 568cabdff1aSopenharmony_ci int type = layout_map[i][0]; 569cabdff1aSopenharmony_ci int id = layout_map[i][1]; 570cabdff1aSopenharmony_ci int iid = id_map[type][id]; 571cabdff1aSopenharmony_ci int position = layout_map[i][2]; 572cabdff1aSopenharmony_ci // Allocate or free elements depending on if they are in the 573cabdff1aSopenharmony_ci // current program configuration. 574cabdff1aSopenharmony_ci ret = che_configure(ac, position, type, iid, &channels); 575cabdff1aSopenharmony_ci if (ret < 0) 576cabdff1aSopenharmony_ci return ret; 577cabdff1aSopenharmony_ci ac->tag_che_map[type][id] = ac->che[type][iid]; 578cabdff1aSopenharmony_ci } 579cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.ps == 1 && channels == 2) { 580cabdff1aSopenharmony_ci if (layout == AV_CH_FRONT_CENTER) { 581cabdff1aSopenharmony_ci layout = AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT; 582cabdff1aSopenharmony_ci } else { 583cabdff1aSopenharmony_ci layout = 0; 584cabdff1aSopenharmony_ci } 585cabdff1aSopenharmony_ci } 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci av_channel_layout_uninit(&ac->oc[1].ch_layout); 588cabdff1aSopenharmony_ci if (layout) 589cabdff1aSopenharmony_ci av_channel_layout_from_mask(&ac->oc[1].ch_layout, layout); 590cabdff1aSopenharmony_ci else { 591cabdff1aSopenharmony_ci ac->oc[1].ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; 592cabdff1aSopenharmony_ci ac->oc[1].ch_layout.nb_channels = channels; 593cabdff1aSopenharmony_ci } 594cabdff1aSopenharmony_ci 595cabdff1aSopenharmony_ci av_channel_layout_copy(&avctx->ch_layout, &ac->oc[1].ch_layout); 596cabdff1aSopenharmony_ci ac->oc[1].status = oc_type; 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci if (get_new_frame) { 599cabdff1aSopenharmony_ci if ((ret = frame_configure_elements(ac->avctx)) < 0) 600cabdff1aSopenharmony_ci return ret; 601cabdff1aSopenharmony_ci } 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_ci return 0; 604cabdff1aSopenharmony_ci} 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_cistatic void flush(AVCodecContext *avctx) 607cabdff1aSopenharmony_ci{ 608cabdff1aSopenharmony_ci AACContext *ac= avctx->priv_data; 609cabdff1aSopenharmony_ci int type, i, j; 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci for (type = 3; type >= 0; type--) { 612cabdff1aSopenharmony_ci for (i = 0; i < MAX_ELEM_ID; i++) { 613cabdff1aSopenharmony_ci ChannelElement *che = ac->che[type][i]; 614cabdff1aSopenharmony_ci if (che) { 615cabdff1aSopenharmony_ci for (j = 0; j <= 1; j++) { 616cabdff1aSopenharmony_ci memset(che->ch[j].saved, 0, sizeof(che->ch[j].saved)); 617cabdff1aSopenharmony_ci } 618cabdff1aSopenharmony_ci } 619cabdff1aSopenharmony_ci } 620cabdff1aSopenharmony_ci } 621cabdff1aSopenharmony_ci} 622cabdff1aSopenharmony_ci 623cabdff1aSopenharmony_ci/** 624cabdff1aSopenharmony_ci * Set up channel positions based on a default channel configuration 625cabdff1aSopenharmony_ci * as specified in table 1.17. 626cabdff1aSopenharmony_ci * 627cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 628cabdff1aSopenharmony_ci */ 629cabdff1aSopenharmony_cistatic int set_default_channel_config(AACContext *ac, AVCodecContext *avctx, 630cabdff1aSopenharmony_ci uint8_t (*layout_map)[3], 631cabdff1aSopenharmony_ci int *tags, 632cabdff1aSopenharmony_ci int channel_config) 633cabdff1aSopenharmony_ci{ 634cabdff1aSopenharmony_ci if (channel_config < 1 || (channel_config > 7 && channel_config < 11) || 635cabdff1aSopenharmony_ci channel_config > 13) { 636cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 637cabdff1aSopenharmony_ci "invalid default channel configuration (%d)\n", 638cabdff1aSopenharmony_ci channel_config); 639cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 640cabdff1aSopenharmony_ci } 641cabdff1aSopenharmony_ci *tags = tags_per_config[channel_config]; 642cabdff1aSopenharmony_ci memcpy(layout_map, aac_channel_layout_map[channel_config - 1], 643cabdff1aSopenharmony_ci *tags * sizeof(*layout_map)); 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_ci /* 646cabdff1aSopenharmony_ci * AAC specification has 7.1(wide) as a default layout for 8-channel streams. 647cabdff1aSopenharmony_ci * However, at least Nero AAC encoder encodes 7.1 streams using the default 648cabdff1aSopenharmony_ci * channel config 7, mapping the side channels of the original audio stream 649cabdff1aSopenharmony_ci * to the second AAC_CHANNEL_FRONT pair in the AAC stream. Similarly, e.g. FAAD 650cabdff1aSopenharmony_ci * decodes the second AAC_CHANNEL_FRONT pair as side channels, therefore decoding 651cabdff1aSopenharmony_ci * the incorrect streams as if they were correct (and as the encoder intended). 652cabdff1aSopenharmony_ci * 653cabdff1aSopenharmony_ci * As actual intended 7.1(wide) streams are very rare, default to assuming a 654cabdff1aSopenharmony_ci * 7.1 layout was intended. 655cabdff1aSopenharmony_ci */ 656cabdff1aSopenharmony_ci if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT) { 657cabdff1aSopenharmony_ci layout_map[2][2] = AAC_CHANNEL_SIDE; 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci if (!ac || !ac->warned_71_wide++) { 660cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout" 661cabdff1aSopenharmony_ci " instead of a spec-compliant 7.1(wide) layout, use -strict %d to decode" 662cabdff1aSopenharmony_ci " according to the specification instead.\n", FF_COMPLIANCE_STRICT); 663cabdff1aSopenharmony_ci } 664cabdff1aSopenharmony_ci } 665cabdff1aSopenharmony_ci 666cabdff1aSopenharmony_ci return 0; 667cabdff1aSopenharmony_ci} 668cabdff1aSopenharmony_ci 669cabdff1aSopenharmony_cistatic ChannelElement *get_che(AACContext *ac, int type, int elem_id) 670cabdff1aSopenharmony_ci{ 671cabdff1aSopenharmony_ci /* For PCE based channel configurations map the channels solely based 672cabdff1aSopenharmony_ci * on tags. */ 673cabdff1aSopenharmony_ci if (!ac->oc[1].m4ac.chan_config) { 674cabdff1aSopenharmony_ci return ac->tag_che_map[type][elem_id]; 675cabdff1aSopenharmony_ci } 676cabdff1aSopenharmony_ci // Allow single CPE stereo files to be signalled with mono configuration. 677cabdff1aSopenharmony_ci if (!ac->tags_mapped && type == TYPE_CPE && 678cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config == 1) { 679cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3]; 680cabdff1aSopenharmony_ci int layout_map_tags; 681cabdff1aSopenharmony_ci push_output_configuration(ac); 682cabdff1aSopenharmony_ci 683cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_DEBUG, "mono with CPE\n"); 684cabdff1aSopenharmony_ci 685cabdff1aSopenharmony_ci if (set_default_channel_config(ac, ac->avctx, layout_map, 686cabdff1aSopenharmony_ci &layout_map_tags, 2) < 0) 687cabdff1aSopenharmony_ci return NULL; 688cabdff1aSopenharmony_ci if (output_configure(ac, layout_map, layout_map_tags, 689cabdff1aSopenharmony_ci OC_TRIAL_FRAME, 1) < 0) 690cabdff1aSopenharmony_ci return NULL; 691cabdff1aSopenharmony_ci 692cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config = 2; 693cabdff1aSopenharmony_ci ac->oc[1].m4ac.ps = 0; 694cabdff1aSopenharmony_ci } 695cabdff1aSopenharmony_ci // And vice-versa 696cabdff1aSopenharmony_ci if (!ac->tags_mapped && type == TYPE_SCE && 697cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config == 2) { 698cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID * 4][3]; 699cabdff1aSopenharmony_ci int layout_map_tags; 700cabdff1aSopenharmony_ci push_output_configuration(ac); 701cabdff1aSopenharmony_ci 702cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_DEBUG, "stereo with SCE\n"); 703cabdff1aSopenharmony_ci 704cabdff1aSopenharmony_ci layout_map_tags = 2; 705cabdff1aSopenharmony_ci layout_map[0][0] = layout_map[1][0] = TYPE_SCE; 706cabdff1aSopenharmony_ci layout_map[0][2] = layout_map[1][2] = AAC_CHANNEL_FRONT; 707cabdff1aSopenharmony_ci layout_map[0][1] = 0; 708cabdff1aSopenharmony_ci layout_map[1][1] = 1; 709cabdff1aSopenharmony_ci if (output_configure(ac, layout_map, layout_map_tags, 710cabdff1aSopenharmony_ci OC_TRIAL_FRAME, 1) < 0) 711cabdff1aSopenharmony_ci return NULL; 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.sbr) 714cabdff1aSopenharmony_ci ac->oc[1].m4ac.ps = -1; 715cabdff1aSopenharmony_ci } 716cabdff1aSopenharmony_ci /* For indexed channel configurations map the channels solely based 717cabdff1aSopenharmony_ci * on position. */ 718cabdff1aSopenharmony_ci switch (ac->oc[1].m4ac.chan_config) { 719cabdff1aSopenharmony_ci case 13: 720cabdff1aSopenharmony_ci if (ac->tags_mapped > 3 && ((type == TYPE_CPE && elem_id < 8) || 721cabdff1aSopenharmony_ci (type == TYPE_SCE && elem_id < 6) || 722cabdff1aSopenharmony_ci (type == TYPE_LFE && elem_id < 2))) { 723cabdff1aSopenharmony_ci ac->tags_mapped++; 724cabdff1aSopenharmony_ci return ac->tag_che_map[type][elem_id] = ac->che[type][elem_id]; 725cabdff1aSopenharmony_ci } 726cabdff1aSopenharmony_ci case 12: 727cabdff1aSopenharmony_ci case 7: 728cabdff1aSopenharmony_ci if (ac->tags_mapped == 3 && type == TYPE_CPE) { 729cabdff1aSopenharmony_ci ac->tags_mapped++; 730cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2]; 731cabdff1aSopenharmony_ci } 732cabdff1aSopenharmony_ci case 11: 733cabdff1aSopenharmony_ci if (ac->tags_mapped == 3 && type == TYPE_SCE) { 734cabdff1aSopenharmony_ci ac->tags_mapped++; 735cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1]; 736cabdff1aSopenharmony_ci } 737cabdff1aSopenharmony_ci case 6: 738cabdff1aSopenharmony_ci /* Some streams incorrectly code 5.1 audio as 739cabdff1aSopenharmony_ci * SCE[0] CPE[0] CPE[1] SCE[1] 740cabdff1aSopenharmony_ci * instead of 741cabdff1aSopenharmony_ci * SCE[0] CPE[0] CPE[1] LFE[0]. 742cabdff1aSopenharmony_ci * If we seem to have encountered such a stream, transfer 743cabdff1aSopenharmony_ci * the LFE[0] element to the SCE[1]'s mapping */ 744cabdff1aSopenharmony_ci if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) { 745cabdff1aSopenharmony_ci if (!ac->warned_remapping_once && (type != TYPE_LFE || elem_id != 0)) { 746cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_WARNING, 747cabdff1aSopenharmony_ci "This stream seems to incorrectly report its last channel as %s[%d], mapping to LFE[0]\n", 748cabdff1aSopenharmony_ci type == TYPE_SCE ? "SCE" : "LFE", elem_id); 749cabdff1aSopenharmony_ci ac->warned_remapping_once++; 750cabdff1aSopenharmony_ci } 751cabdff1aSopenharmony_ci ac->tags_mapped++; 752cabdff1aSopenharmony_ci return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0]; 753cabdff1aSopenharmony_ci } 754cabdff1aSopenharmony_ci case 5: 755cabdff1aSopenharmony_ci if (ac->tags_mapped == 2 && type == TYPE_CPE) { 756cabdff1aSopenharmony_ci ac->tags_mapped++; 757cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1]; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci case 4: 760cabdff1aSopenharmony_ci /* Some streams incorrectly code 4.0 audio as 761cabdff1aSopenharmony_ci * SCE[0] CPE[0] LFE[0] 762cabdff1aSopenharmony_ci * instead of 763cabdff1aSopenharmony_ci * SCE[0] CPE[0] SCE[1]. 764cabdff1aSopenharmony_ci * If we seem to have encountered such a stream, transfer 765cabdff1aSopenharmony_ci * the SCE[1] element to the LFE[0]'s mapping */ 766cabdff1aSopenharmony_ci if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) { 767cabdff1aSopenharmony_ci if (!ac->warned_remapping_once && (type != TYPE_SCE || elem_id != 1)) { 768cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_WARNING, 769cabdff1aSopenharmony_ci "This stream seems to incorrectly report its last channel as %s[%d], mapping to SCE[1]\n", 770cabdff1aSopenharmony_ci type == TYPE_SCE ? "SCE" : "LFE", elem_id); 771cabdff1aSopenharmony_ci ac->warned_remapping_once++; 772cabdff1aSopenharmony_ci } 773cabdff1aSopenharmony_ci ac->tags_mapped++; 774cabdff1aSopenharmony_ci return ac->tag_che_map[type][elem_id] = ac->che[TYPE_SCE][1]; 775cabdff1aSopenharmony_ci } 776cabdff1aSopenharmony_ci if (ac->tags_mapped == 2 && 777cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config == 4 && 778cabdff1aSopenharmony_ci type == TYPE_SCE) { 779cabdff1aSopenharmony_ci ac->tags_mapped++; 780cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1]; 781cabdff1aSopenharmony_ci } 782cabdff1aSopenharmony_ci case 3: 783cabdff1aSopenharmony_ci case 2: 784cabdff1aSopenharmony_ci if (ac->tags_mapped == (ac->oc[1].m4ac.chan_config != 2) && 785cabdff1aSopenharmony_ci type == TYPE_CPE) { 786cabdff1aSopenharmony_ci ac->tags_mapped++; 787cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0]; 788cabdff1aSopenharmony_ci } else if (ac->tags_mapped == 1 && ac->oc[1].m4ac.chan_config == 2 && 789cabdff1aSopenharmony_ci type == TYPE_SCE) { 790cabdff1aSopenharmony_ci ac->tags_mapped++; 791cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1]; 792cabdff1aSopenharmony_ci } 793cabdff1aSopenharmony_ci case 1: 794cabdff1aSopenharmony_ci if (!ac->tags_mapped && type == TYPE_SCE) { 795cabdff1aSopenharmony_ci ac->tags_mapped++; 796cabdff1aSopenharmony_ci return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0]; 797cabdff1aSopenharmony_ci } 798cabdff1aSopenharmony_ci default: 799cabdff1aSopenharmony_ci return NULL; 800cabdff1aSopenharmony_ci } 801cabdff1aSopenharmony_ci} 802cabdff1aSopenharmony_ci 803cabdff1aSopenharmony_ci/** 804cabdff1aSopenharmony_ci * Decode an array of 4 bit element IDs, optionally interleaved with a 805cabdff1aSopenharmony_ci * stereo/mono switching bit. 806cabdff1aSopenharmony_ci * 807cabdff1aSopenharmony_ci * @param type speaker type/position for these channels 808cabdff1aSopenharmony_ci */ 809cabdff1aSopenharmony_cistatic void decode_channel_map(uint8_t layout_map[][3], 810cabdff1aSopenharmony_ci enum ChannelPosition type, 811cabdff1aSopenharmony_ci GetBitContext *gb, int n) 812cabdff1aSopenharmony_ci{ 813cabdff1aSopenharmony_ci while (n--) { 814cabdff1aSopenharmony_ci enum RawDataBlockType syn_ele; 815cabdff1aSopenharmony_ci switch (type) { 816cabdff1aSopenharmony_ci case AAC_CHANNEL_FRONT: 817cabdff1aSopenharmony_ci case AAC_CHANNEL_BACK: 818cabdff1aSopenharmony_ci case AAC_CHANNEL_SIDE: 819cabdff1aSopenharmony_ci syn_ele = get_bits1(gb); 820cabdff1aSopenharmony_ci break; 821cabdff1aSopenharmony_ci case AAC_CHANNEL_CC: 822cabdff1aSopenharmony_ci skip_bits1(gb); 823cabdff1aSopenharmony_ci syn_ele = TYPE_CCE; 824cabdff1aSopenharmony_ci break; 825cabdff1aSopenharmony_ci case AAC_CHANNEL_LFE: 826cabdff1aSopenharmony_ci syn_ele = TYPE_LFE; 827cabdff1aSopenharmony_ci break; 828cabdff1aSopenharmony_ci default: 829cabdff1aSopenharmony_ci // AAC_CHANNEL_OFF has no channel map 830cabdff1aSopenharmony_ci av_assert0(0); 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci layout_map[0][0] = syn_ele; 833cabdff1aSopenharmony_ci layout_map[0][1] = get_bits(gb, 4); 834cabdff1aSopenharmony_ci layout_map[0][2] = type; 835cabdff1aSopenharmony_ci layout_map++; 836cabdff1aSopenharmony_ci } 837cabdff1aSopenharmony_ci} 838cabdff1aSopenharmony_ci 839cabdff1aSopenharmony_cistatic inline void relative_align_get_bits(GetBitContext *gb, 840cabdff1aSopenharmony_ci int reference_position) { 841cabdff1aSopenharmony_ci int n = (reference_position - get_bits_count(gb) & 7); 842cabdff1aSopenharmony_ci if (n) 843cabdff1aSopenharmony_ci skip_bits(gb, n); 844cabdff1aSopenharmony_ci} 845cabdff1aSopenharmony_ci 846cabdff1aSopenharmony_ci/** 847cabdff1aSopenharmony_ci * Decode program configuration element; reference: table 4.2. 848cabdff1aSopenharmony_ci * 849cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 850cabdff1aSopenharmony_ci */ 851cabdff1aSopenharmony_cistatic int decode_pce(AVCodecContext *avctx, MPEG4AudioConfig *m4ac, 852cabdff1aSopenharmony_ci uint8_t (*layout_map)[3], 853cabdff1aSopenharmony_ci GetBitContext *gb, int byte_align_ref) 854cabdff1aSopenharmony_ci{ 855cabdff1aSopenharmony_ci int num_front, num_side, num_back, num_lfe, num_assoc_data, num_cc; 856cabdff1aSopenharmony_ci int sampling_index; 857cabdff1aSopenharmony_ci int comment_len; 858cabdff1aSopenharmony_ci int tags; 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_ci skip_bits(gb, 2); // object_type 861cabdff1aSopenharmony_ci 862cabdff1aSopenharmony_ci sampling_index = get_bits(gb, 4); 863cabdff1aSopenharmony_ci if (m4ac->sampling_index != sampling_index) 864cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, 865cabdff1aSopenharmony_ci "Sample rate index in program config element does not " 866cabdff1aSopenharmony_ci "match the sample rate index configured by the container.\n"); 867cabdff1aSopenharmony_ci 868cabdff1aSopenharmony_ci num_front = get_bits(gb, 4); 869cabdff1aSopenharmony_ci num_side = get_bits(gb, 4); 870cabdff1aSopenharmony_ci num_back = get_bits(gb, 4); 871cabdff1aSopenharmony_ci num_lfe = get_bits(gb, 2); 872cabdff1aSopenharmony_ci num_assoc_data = get_bits(gb, 3); 873cabdff1aSopenharmony_ci num_cc = get_bits(gb, 4); 874cabdff1aSopenharmony_ci 875cabdff1aSopenharmony_ci if (get_bits1(gb)) 876cabdff1aSopenharmony_ci skip_bits(gb, 4); // mono_mixdown_tag 877cabdff1aSopenharmony_ci if (get_bits1(gb)) 878cabdff1aSopenharmony_ci skip_bits(gb, 4); // stereo_mixdown_tag 879cabdff1aSopenharmony_ci 880cabdff1aSopenharmony_ci if (get_bits1(gb)) 881cabdff1aSopenharmony_ci skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround 882cabdff1aSopenharmony_ci 883cabdff1aSopenharmony_ci if (get_bits_left(gb) < 5 * (num_front + num_side + num_back + num_cc) + 4 *(num_lfe + num_assoc_data + num_cc)) { 884cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "decode_pce: " overread_err); 885cabdff1aSopenharmony_ci return -1; 886cabdff1aSopenharmony_ci } 887cabdff1aSopenharmony_ci decode_channel_map(layout_map , AAC_CHANNEL_FRONT, gb, num_front); 888cabdff1aSopenharmony_ci tags = num_front; 889cabdff1aSopenharmony_ci decode_channel_map(layout_map + tags, AAC_CHANNEL_SIDE, gb, num_side); 890cabdff1aSopenharmony_ci tags += num_side; 891cabdff1aSopenharmony_ci decode_channel_map(layout_map + tags, AAC_CHANNEL_BACK, gb, num_back); 892cabdff1aSopenharmony_ci tags += num_back; 893cabdff1aSopenharmony_ci decode_channel_map(layout_map + tags, AAC_CHANNEL_LFE, gb, num_lfe); 894cabdff1aSopenharmony_ci tags += num_lfe; 895cabdff1aSopenharmony_ci 896cabdff1aSopenharmony_ci skip_bits_long(gb, 4 * num_assoc_data); 897cabdff1aSopenharmony_ci 898cabdff1aSopenharmony_ci decode_channel_map(layout_map + tags, AAC_CHANNEL_CC, gb, num_cc); 899cabdff1aSopenharmony_ci tags += num_cc; 900cabdff1aSopenharmony_ci 901cabdff1aSopenharmony_ci relative_align_get_bits(gb, byte_align_ref); 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_ci /* comment field, first byte is length */ 904cabdff1aSopenharmony_ci comment_len = get_bits(gb, 8) * 8; 905cabdff1aSopenharmony_ci if (get_bits_left(gb) < comment_len) { 906cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "decode_pce: " overread_err); 907cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 908cabdff1aSopenharmony_ci } 909cabdff1aSopenharmony_ci skip_bits_long(gb, comment_len); 910cabdff1aSopenharmony_ci return tags; 911cabdff1aSopenharmony_ci} 912cabdff1aSopenharmony_ci 913cabdff1aSopenharmony_ci/** 914cabdff1aSopenharmony_ci * Decode GA "General Audio" specific configuration; reference: table 4.1. 915cabdff1aSopenharmony_ci * 916cabdff1aSopenharmony_ci * @param ac pointer to AACContext, may be null 917cabdff1aSopenharmony_ci * @param avctx pointer to AVCCodecContext, used for logging 918cabdff1aSopenharmony_ci * 919cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 920cabdff1aSopenharmony_ci */ 921cabdff1aSopenharmony_cistatic int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx, 922cabdff1aSopenharmony_ci GetBitContext *gb, 923cabdff1aSopenharmony_ci int get_bit_alignment, 924cabdff1aSopenharmony_ci MPEG4AudioConfig *m4ac, 925cabdff1aSopenharmony_ci int channel_config) 926cabdff1aSopenharmony_ci{ 927cabdff1aSopenharmony_ci int extension_flag, ret, ep_config, res_flags; 928cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3]; 929cabdff1aSopenharmony_ci int tags = 0; 930cabdff1aSopenharmony_ci 931cabdff1aSopenharmony_ci#if USE_FIXED 932cabdff1aSopenharmony_ci if (get_bits1(gb)) { // frameLengthFlag 933cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, "Fixed point 960/120 MDCT window"); 934cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 935cabdff1aSopenharmony_ci } 936cabdff1aSopenharmony_ci m4ac->frame_length_short = 0; 937cabdff1aSopenharmony_ci#else 938cabdff1aSopenharmony_ci m4ac->frame_length_short = get_bits1(gb); 939cabdff1aSopenharmony_ci if (m4ac->frame_length_short && m4ac->sbr == 1) { 940cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, "SBR with 960 frame length"); 941cabdff1aSopenharmony_ci if (ac) ac->warned_960_sbr = 1; 942cabdff1aSopenharmony_ci m4ac->sbr = 0; 943cabdff1aSopenharmony_ci m4ac->ps = 0; 944cabdff1aSopenharmony_ci } 945cabdff1aSopenharmony_ci#endif 946cabdff1aSopenharmony_ci 947cabdff1aSopenharmony_ci if (get_bits1(gb)) // dependsOnCoreCoder 948cabdff1aSopenharmony_ci skip_bits(gb, 14); // coreCoderDelay 949cabdff1aSopenharmony_ci extension_flag = get_bits1(gb); 950cabdff1aSopenharmony_ci 951cabdff1aSopenharmony_ci if (m4ac->object_type == AOT_AAC_SCALABLE || 952cabdff1aSopenharmony_ci m4ac->object_type == AOT_ER_AAC_SCALABLE) 953cabdff1aSopenharmony_ci skip_bits(gb, 3); // layerNr 954cabdff1aSopenharmony_ci 955cabdff1aSopenharmony_ci if (channel_config == 0) { 956cabdff1aSopenharmony_ci skip_bits(gb, 4); // element_instance_tag 957cabdff1aSopenharmony_ci tags = decode_pce(avctx, m4ac, layout_map, gb, get_bit_alignment); 958cabdff1aSopenharmony_ci if (tags < 0) 959cabdff1aSopenharmony_ci return tags; 960cabdff1aSopenharmony_ci } else { 961cabdff1aSopenharmony_ci if ((ret = set_default_channel_config(ac, avctx, layout_map, 962cabdff1aSopenharmony_ci &tags, channel_config))) 963cabdff1aSopenharmony_ci return ret; 964cabdff1aSopenharmony_ci } 965cabdff1aSopenharmony_ci 966cabdff1aSopenharmony_ci if (count_channels(layout_map, tags) > 1) { 967cabdff1aSopenharmony_ci m4ac->ps = 0; 968cabdff1aSopenharmony_ci } else if (m4ac->sbr == 1 && m4ac->ps == -1) 969cabdff1aSopenharmony_ci m4ac->ps = 1; 970cabdff1aSopenharmony_ci 971cabdff1aSopenharmony_ci if (ac && (ret = output_configure(ac, layout_map, tags, OC_GLOBAL_HDR, 0))) 972cabdff1aSopenharmony_ci return ret; 973cabdff1aSopenharmony_ci 974cabdff1aSopenharmony_ci if (extension_flag) { 975cabdff1aSopenharmony_ci switch (m4ac->object_type) { 976cabdff1aSopenharmony_ci case AOT_ER_BSAC: 977cabdff1aSopenharmony_ci skip_bits(gb, 5); // numOfSubFrame 978cabdff1aSopenharmony_ci skip_bits(gb, 11); // layer_length 979cabdff1aSopenharmony_ci break; 980cabdff1aSopenharmony_ci case AOT_ER_AAC_LC: 981cabdff1aSopenharmony_ci case AOT_ER_AAC_LTP: 982cabdff1aSopenharmony_ci case AOT_ER_AAC_SCALABLE: 983cabdff1aSopenharmony_ci case AOT_ER_AAC_LD: 984cabdff1aSopenharmony_ci res_flags = get_bits(gb, 3); 985cabdff1aSopenharmony_ci if (res_flags) { 986cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 987cabdff1aSopenharmony_ci "AAC data resilience (flags %x)", 988cabdff1aSopenharmony_ci res_flags); 989cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 990cabdff1aSopenharmony_ci } 991cabdff1aSopenharmony_ci break; 992cabdff1aSopenharmony_ci } 993cabdff1aSopenharmony_ci skip_bits1(gb); // extensionFlag3 (TBD in version 3) 994cabdff1aSopenharmony_ci } 995cabdff1aSopenharmony_ci switch (m4ac->object_type) { 996cabdff1aSopenharmony_ci case AOT_ER_AAC_LC: 997cabdff1aSopenharmony_ci case AOT_ER_AAC_LTP: 998cabdff1aSopenharmony_ci case AOT_ER_AAC_SCALABLE: 999cabdff1aSopenharmony_ci case AOT_ER_AAC_LD: 1000cabdff1aSopenharmony_ci ep_config = get_bits(gb, 2); 1001cabdff1aSopenharmony_ci if (ep_config) { 1002cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 1003cabdff1aSopenharmony_ci "epConfig %d", ep_config); 1004cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1005cabdff1aSopenharmony_ci } 1006cabdff1aSopenharmony_ci } 1007cabdff1aSopenharmony_ci return 0; 1008cabdff1aSopenharmony_ci} 1009cabdff1aSopenharmony_ci 1010cabdff1aSopenharmony_cistatic int decode_eld_specific_config(AACContext *ac, AVCodecContext *avctx, 1011cabdff1aSopenharmony_ci GetBitContext *gb, 1012cabdff1aSopenharmony_ci MPEG4AudioConfig *m4ac, 1013cabdff1aSopenharmony_ci int channel_config) 1014cabdff1aSopenharmony_ci{ 1015cabdff1aSopenharmony_ci int ret, ep_config, res_flags; 1016cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3]; 1017cabdff1aSopenharmony_ci int tags = 0; 1018cabdff1aSopenharmony_ci const int ELDEXT_TERM = 0; 1019cabdff1aSopenharmony_ci 1020cabdff1aSopenharmony_ci m4ac->ps = 0; 1021cabdff1aSopenharmony_ci m4ac->sbr = 0; 1022cabdff1aSopenharmony_ci#if USE_FIXED 1023cabdff1aSopenharmony_ci if (get_bits1(gb)) { // frameLengthFlag 1024cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "960/120 MDCT window"); 1025cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1026cabdff1aSopenharmony_ci } 1027cabdff1aSopenharmony_ci#else 1028cabdff1aSopenharmony_ci m4ac->frame_length_short = get_bits1(gb); 1029cabdff1aSopenharmony_ci#endif 1030cabdff1aSopenharmony_ci res_flags = get_bits(gb, 3); 1031cabdff1aSopenharmony_ci if (res_flags) { 1032cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 1033cabdff1aSopenharmony_ci "AAC data resilience (flags %x)", 1034cabdff1aSopenharmony_ci res_flags); 1035cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1036cabdff1aSopenharmony_ci } 1037cabdff1aSopenharmony_ci 1038cabdff1aSopenharmony_ci if (get_bits1(gb)) { // ldSbrPresentFlag 1039cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 1040cabdff1aSopenharmony_ci "Low Delay SBR"); 1041cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1042cabdff1aSopenharmony_ci } 1043cabdff1aSopenharmony_ci 1044cabdff1aSopenharmony_ci while (get_bits(gb, 4) != ELDEXT_TERM) { 1045cabdff1aSopenharmony_ci int len = get_bits(gb, 4); 1046cabdff1aSopenharmony_ci if (len == 15) 1047cabdff1aSopenharmony_ci len += get_bits(gb, 8); 1048cabdff1aSopenharmony_ci if (len == 15 + 255) 1049cabdff1aSopenharmony_ci len += get_bits(gb, 16); 1050cabdff1aSopenharmony_ci if (get_bits_left(gb) < len * 8 + 4) { 1051cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, overread_err); 1052cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1053cabdff1aSopenharmony_ci } 1054cabdff1aSopenharmony_ci skip_bits_long(gb, 8 * len); 1055cabdff1aSopenharmony_ci } 1056cabdff1aSopenharmony_ci 1057cabdff1aSopenharmony_ci if ((ret = set_default_channel_config(ac, avctx, layout_map, 1058cabdff1aSopenharmony_ci &tags, channel_config))) 1059cabdff1aSopenharmony_ci return ret; 1060cabdff1aSopenharmony_ci 1061cabdff1aSopenharmony_ci if (ac && (ret = output_configure(ac, layout_map, tags, OC_GLOBAL_HDR, 0))) 1062cabdff1aSopenharmony_ci return ret; 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_ci ep_config = get_bits(gb, 2); 1065cabdff1aSopenharmony_ci if (ep_config) { 1066cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 1067cabdff1aSopenharmony_ci "epConfig %d", ep_config); 1068cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1069cabdff1aSopenharmony_ci } 1070cabdff1aSopenharmony_ci return 0; 1071cabdff1aSopenharmony_ci} 1072cabdff1aSopenharmony_ci 1073cabdff1aSopenharmony_ci/** 1074cabdff1aSopenharmony_ci * Decode audio specific configuration; reference: table 1.13. 1075cabdff1aSopenharmony_ci * 1076cabdff1aSopenharmony_ci * @param ac pointer to AACContext, may be null 1077cabdff1aSopenharmony_ci * @param avctx pointer to AVCCodecContext, used for logging 1078cabdff1aSopenharmony_ci * @param m4ac pointer to MPEG4AudioConfig, used for parsing 1079cabdff1aSopenharmony_ci * @param gb buffer holding an audio specific config 1080cabdff1aSopenharmony_ci * @param get_bit_alignment relative alignment for byte align operations 1081cabdff1aSopenharmony_ci * @param sync_extension look for an appended sync extension 1082cabdff1aSopenharmony_ci * 1083cabdff1aSopenharmony_ci * @return Returns error status or number of consumed bits. <0 - error 1084cabdff1aSopenharmony_ci */ 1085cabdff1aSopenharmony_cistatic int decode_audio_specific_config_gb(AACContext *ac, 1086cabdff1aSopenharmony_ci AVCodecContext *avctx, 1087cabdff1aSopenharmony_ci MPEG4AudioConfig *m4ac, 1088cabdff1aSopenharmony_ci GetBitContext *gb, 1089cabdff1aSopenharmony_ci int get_bit_alignment, 1090cabdff1aSopenharmony_ci int sync_extension) 1091cabdff1aSopenharmony_ci{ 1092cabdff1aSopenharmony_ci int i, ret; 1093cabdff1aSopenharmony_ci GetBitContext gbc = *gb; 1094cabdff1aSopenharmony_ci MPEG4AudioConfig m4ac_bak = *m4ac; 1095cabdff1aSopenharmony_ci 1096cabdff1aSopenharmony_ci if ((i = ff_mpeg4audio_get_config_gb(m4ac, &gbc, sync_extension, avctx)) < 0) { 1097cabdff1aSopenharmony_ci *m4ac = m4ac_bak; 1098cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1099cabdff1aSopenharmony_ci } 1100cabdff1aSopenharmony_ci 1101cabdff1aSopenharmony_ci if (m4ac->sampling_index > 12) { 1102cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 1103cabdff1aSopenharmony_ci "invalid sampling rate index %d\n", 1104cabdff1aSopenharmony_ci m4ac->sampling_index); 1105cabdff1aSopenharmony_ci *m4ac = m4ac_bak; 1106cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1107cabdff1aSopenharmony_ci } 1108cabdff1aSopenharmony_ci if (m4ac->object_type == AOT_ER_AAC_LD && 1109cabdff1aSopenharmony_ci (m4ac->sampling_index < 3 || m4ac->sampling_index > 7)) { 1110cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 1111cabdff1aSopenharmony_ci "invalid low delay sampling rate index %d\n", 1112cabdff1aSopenharmony_ci m4ac->sampling_index); 1113cabdff1aSopenharmony_ci *m4ac = m4ac_bak; 1114cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1115cabdff1aSopenharmony_ci } 1116cabdff1aSopenharmony_ci 1117cabdff1aSopenharmony_ci skip_bits_long(gb, i); 1118cabdff1aSopenharmony_ci 1119cabdff1aSopenharmony_ci switch (m4ac->object_type) { 1120cabdff1aSopenharmony_ci case AOT_AAC_MAIN: 1121cabdff1aSopenharmony_ci case AOT_AAC_LC: 1122cabdff1aSopenharmony_ci case AOT_AAC_SSR: 1123cabdff1aSopenharmony_ci case AOT_AAC_LTP: 1124cabdff1aSopenharmony_ci case AOT_ER_AAC_LC: 1125cabdff1aSopenharmony_ci case AOT_ER_AAC_LD: 1126cabdff1aSopenharmony_ci if ((ret = decode_ga_specific_config(ac, avctx, gb, get_bit_alignment, 1127cabdff1aSopenharmony_ci m4ac, m4ac->chan_config)) < 0) 1128cabdff1aSopenharmony_ci return ret; 1129cabdff1aSopenharmony_ci break; 1130cabdff1aSopenharmony_ci case AOT_ER_AAC_ELD: 1131cabdff1aSopenharmony_ci if ((ret = decode_eld_specific_config(ac, avctx, gb, 1132cabdff1aSopenharmony_ci m4ac, m4ac->chan_config)) < 0) 1133cabdff1aSopenharmony_ci return ret; 1134cabdff1aSopenharmony_ci break; 1135cabdff1aSopenharmony_ci default: 1136cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 1137cabdff1aSopenharmony_ci "Audio object type %s%d", 1138cabdff1aSopenharmony_ci m4ac->sbr == 1 ? "SBR+" : "", 1139cabdff1aSopenharmony_ci m4ac->object_type); 1140cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 1141cabdff1aSopenharmony_ci } 1142cabdff1aSopenharmony_ci 1143cabdff1aSopenharmony_ci ff_dlog(avctx, 1144cabdff1aSopenharmony_ci "AOT %d chan config %d sampling index %d (%d) SBR %d PS %d\n", 1145cabdff1aSopenharmony_ci m4ac->object_type, m4ac->chan_config, m4ac->sampling_index, 1146cabdff1aSopenharmony_ci m4ac->sample_rate, m4ac->sbr, 1147cabdff1aSopenharmony_ci m4ac->ps); 1148cabdff1aSopenharmony_ci 1149cabdff1aSopenharmony_ci return get_bits_count(gb); 1150cabdff1aSopenharmony_ci} 1151cabdff1aSopenharmony_ci 1152cabdff1aSopenharmony_cistatic int decode_audio_specific_config(AACContext *ac, 1153cabdff1aSopenharmony_ci AVCodecContext *avctx, 1154cabdff1aSopenharmony_ci MPEG4AudioConfig *m4ac, 1155cabdff1aSopenharmony_ci const uint8_t *data, int64_t bit_size, 1156cabdff1aSopenharmony_ci int sync_extension) 1157cabdff1aSopenharmony_ci{ 1158cabdff1aSopenharmony_ci int i, ret; 1159cabdff1aSopenharmony_ci GetBitContext gb; 1160cabdff1aSopenharmony_ci 1161cabdff1aSopenharmony_ci if (bit_size < 0 || bit_size > INT_MAX) { 1162cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Audio specific config size is invalid\n"); 1163cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1164cabdff1aSopenharmony_ci } 1165cabdff1aSopenharmony_ci 1166cabdff1aSopenharmony_ci ff_dlog(avctx, "audio specific config size %d\n", (int)bit_size >> 3); 1167cabdff1aSopenharmony_ci for (i = 0; i < bit_size >> 3; i++) 1168cabdff1aSopenharmony_ci ff_dlog(avctx, "%02x ", data[i]); 1169cabdff1aSopenharmony_ci ff_dlog(avctx, "\n"); 1170cabdff1aSopenharmony_ci 1171cabdff1aSopenharmony_ci if ((ret = init_get_bits(&gb, data, bit_size)) < 0) 1172cabdff1aSopenharmony_ci return ret; 1173cabdff1aSopenharmony_ci 1174cabdff1aSopenharmony_ci return decode_audio_specific_config_gb(ac, avctx, m4ac, &gb, 0, 1175cabdff1aSopenharmony_ci sync_extension); 1176cabdff1aSopenharmony_ci} 1177cabdff1aSopenharmony_ci 1178cabdff1aSopenharmony_ci/** 1179cabdff1aSopenharmony_ci * linear congruential pseudorandom number generator 1180cabdff1aSopenharmony_ci * 1181cabdff1aSopenharmony_ci * @param previous_val pointer to the current state of the generator 1182cabdff1aSopenharmony_ci * 1183cabdff1aSopenharmony_ci * @return Returns a 32-bit pseudorandom integer 1184cabdff1aSopenharmony_ci */ 1185cabdff1aSopenharmony_cistatic av_always_inline int lcg_random(unsigned previous_val) 1186cabdff1aSopenharmony_ci{ 1187cabdff1aSopenharmony_ci union { unsigned u; int s; } v = { previous_val * 1664525u + 1013904223 }; 1188cabdff1aSopenharmony_ci return v.s; 1189cabdff1aSopenharmony_ci} 1190cabdff1aSopenharmony_ci 1191cabdff1aSopenharmony_cistatic void reset_all_predictors(PredictorState *ps) 1192cabdff1aSopenharmony_ci{ 1193cabdff1aSopenharmony_ci int i; 1194cabdff1aSopenharmony_ci for (i = 0; i < MAX_PREDICTORS; i++) 1195cabdff1aSopenharmony_ci reset_predict_state(&ps[i]); 1196cabdff1aSopenharmony_ci} 1197cabdff1aSopenharmony_ci 1198cabdff1aSopenharmony_cistatic int sample_rate_idx (int rate) 1199cabdff1aSopenharmony_ci{ 1200cabdff1aSopenharmony_ci if (92017 <= rate) return 0; 1201cabdff1aSopenharmony_ci else if (75132 <= rate) return 1; 1202cabdff1aSopenharmony_ci else if (55426 <= rate) return 2; 1203cabdff1aSopenharmony_ci else if (46009 <= rate) return 3; 1204cabdff1aSopenharmony_ci else if (37566 <= rate) return 4; 1205cabdff1aSopenharmony_ci else if (27713 <= rate) return 5; 1206cabdff1aSopenharmony_ci else if (23004 <= rate) return 6; 1207cabdff1aSopenharmony_ci else if (18783 <= rate) return 7; 1208cabdff1aSopenharmony_ci else if (13856 <= rate) return 8; 1209cabdff1aSopenharmony_ci else if (11502 <= rate) return 9; 1210cabdff1aSopenharmony_ci else if (9391 <= rate) return 10; 1211cabdff1aSopenharmony_ci else return 11; 1212cabdff1aSopenharmony_ci} 1213cabdff1aSopenharmony_ci 1214cabdff1aSopenharmony_cistatic void reset_predictor_group(PredictorState *ps, int group_num) 1215cabdff1aSopenharmony_ci{ 1216cabdff1aSopenharmony_ci int i; 1217cabdff1aSopenharmony_ci for (i = group_num - 1; i < MAX_PREDICTORS; i += 30) 1218cabdff1aSopenharmony_ci reset_predict_state(&ps[i]); 1219cabdff1aSopenharmony_ci} 1220cabdff1aSopenharmony_ci 1221cabdff1aSopenharmony_cistatic void aacdec_init(AACContext *ac); 1222cabdff1aSopenharmony_ci 1223cabdff1aSopenharmony_cistatic av_cold void aac_static_table_init(void) 1224cabdff1aSopenharmony_ci{ 1225cabdff1aSopenharmony_ci static VLCElem vlc_buf[304 + 270 + 550 + 300 + 328 + 1226cabdff1aSopenharmony_ci 294 + 306 + 268 + 510 + 366 + 462]; 1227cabdff1aSopenharmony_ci for (unsigned i = 0, offset = 0; i < 11; i++) { 1228cabdff1aSopenharmony_ci vlc_spectral[i].table = &vlc_buf[offset]; 1229cabdff1aSopenharmony_ci vlc_spectral[i].table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset; 1230cabdff1aSopenharmony_ci ff_init_vlc_sparse(&vlc_spectral[i], 8, ff_aac_spectral_sizes[i], 1231cabdff1aSopenharmony_ci ff_aac_spectral_bits[i], sizeof(ff_aac_spectral_bits[i][0]), 1232cabdff1aSopenharmony_ci sizeof(ff_aac_spectral_bits[i][0]), 1233cabdff1aSopenharmony_ci ff_aac_spectral_codes[i], sizeof(ff_aac_spectral_codes[i][0]), 1234cabdff1aSopenharmony_ci sizeof(ff_aac_spectral_codes[i][0]), 1235cabdff1aSopenharmony_ci ff_aac_codebook_vector_idx[i], sizeof(ff_aac_codebook_vector_idx[i][0]), 1236cabdff1aSopenharmony_ci sizeof(ff_aac_codebook_vector_idx[i][0]), 1237cabdff1aSopenharmony_ci INIT_VLC_STATIC_OVERLONG); 1238cabdff1aSopenharmony_ci offset += vlc_spectral[i].table_size; 1239cabdff1aSopenharmony_ci } 1240cabdff1aSopenharmony_ci 1241cabdff1aSopenharmony_ci AAC_RENAME(ff_aac_sbr_init)(); 1242cabdff1aSopenharmony_ci 1243cabdff1aSopenharmony_ci ff_aac_tableinit(); 1244cabdff1aSopenharmony_ci 1245cabdff1aSopenharmony_ci INIT_VLC_STATIC(&vlc_scalefactors, 7, 1246cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(ff_aac_scalefactor_code), 1247cabdff1aSopenharmony_ci ff_aac_scalefactor_bits, 1248cabdff1aSopenharmony_ci sizeof(ff_aac_scalefactor_bits[0]), 1249cabdff1aSopenharmony_ci sizeof(ff_aac_scalefactor_bits[0]), 1250cabdff1aSopenharmony_ci ff_aac_scalefactor_code, 1251cabdff1aSopenharmony_ci sizeof(ff_aac_scalefactor_code[0]), 1252cabdff1aSopenharmony_ci sizeof(ff_aac_scalefactor_code[0]), 1253cabdff1aSopenharmony_ci 352); 1254cabdff1aSopenharmony_ci 1255cabdff1aSopenharmony_ci // window initialization 1256cabdff1aSopenharmony_ci#if !USE_FIXED 1257cabdff1aSopenharmony_ci AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(aac_kbd_long_960), 4.0, 960); 1258cabdff1aSopenharmony_ci AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(aac_kbd_short_120), 6.0, 120); 1259cabdff1aSopenharmony_ci AAC_RENAME(ff_sine_window_init)(AAC_RENAME(sine_960), 960); 1260cabdff1aSopenharmony_ci AAC_RENAME(ff_sine_window_init)(AAC_RENAME(sine_120), 120); 1261cabdff1aSopenharmony_ci AAC_RENAME(ff_init_ff_sine_windows)(9); 1262cabdff1aSopenharmony_ci ff_aac_float_common_init(); 1263cabdff1aSopenharmony_ci#else 1264cabdff1aSopenharmony_ci AAC_RENAME(ff_kbd_window_init)(AAC_RENAME2(aac_kbd_long_1024), 4.0, 1024); 1265cabdff1aSopenharmony_ci AAC_RENAME(ff_kbd_window_init)(AAC_RENAME2(aac_kbd_short_128), 6.0, 128); 1266cabdff1aSopenharmony_ci init_sine_windows_fixed(); 1267cabdff1aSopenharmony_ci#endif 1268cabdff1aSopenharmony_ci 1269cabdff1aSopenharmony_ci AAC_RENAME(ff_cbrt_tableinit)(); 1270cabdff1aSopenharmony_ci} 1271cabdff1aSopenharmony_ci 1272cabdff1aSopenharmony_cistatic AVOnce aac_table_init = AV_ONCE_INIT; 1273cabdff1aSopenharmony_ci 1274cabdff1aSopenharmony_cistatic av_cold int aac_decode_init(AVCodecContext *avctx) 1275cabdff1aSopenharmony_ci{ 1276cabdff1aSopenharmony_ci AACContext *ac = avctx->priv_data; 1277cabdff1aSopenharmony_ci int ret; 1278cabdff1aSopenharmony_ci 1279cabdff1aSopenharmony_ci if (avctx->sample_rate > 96000) 1280cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1281cabdff1aSopenharmony_ci 1282cabdff1aSopenharmony_ci ret = ff_thread_once(&aac_table_init, &aac_static_table_init); 1283cabdff1aSopenharmony_ci if (ret != 0) 1284cabdff1aSopenharmony_ci return AVERROR_UNKNOWN; 1285cabdff1aSopenharmony_ci 1286cabdff1aSopenharmony_ci ac->avctx = avctx; 1287cabdff1aSopenharmony_ci ac->oc[1].m4ac.sample_rate = avctx->sample_rate; 1288cabdff1aSopenharmony_ci 1289cabdff1aSopenharmony_ci aacdec_init(ac); 1290cabdff1aSopenharmony_ci#if USE_FIXED 1291cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S32P; 1292cabdff1aSopenharmony_ci#else 1293cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 1294cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1295cabdff1aSopenharmony_ci 1296cabdff1aSopenharmony_ci if (avctx->extradata_size > 0) { 1297cabdff1aSopenharmony_ci if ((ret = decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac, 1298cabdff1aSopenharmony_ci avctx->extradata, 1299cabdff1aSopenharmony_ci avctx->extradata_size * 8LL, 1300cabdff1aSopenharmony_ci 1)) < 0) 1301cabdff1aSopenharmony_ci return ret; 1302cabdff1aSopenharmony_ci } else { 1303cabdff1aSopenharmony_ci int sr, i; 1304cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3]; 1305cabdff1aSopenharmony_ci int layout_map_tags; 1306cabdff1aSopenharmony_ci 1307cabdff1aSopenharmony_ci sr = sample_rate_idx(avctx->sample_rate); 1308cabdff1aSopenharmony_ci ac->oc[1].m4ac.sampling_index = sr; 1309cabdff1aSopenharmony_ci ac->oc[1].m4ac.channels = avctx->ch_layout.nb_channels; 1310cabdff1aSopenharmony_ci ac->oc[1].m4ac.sbr = -1; 1311cabdff1aSopenharmony_ci ac->oc[1].m4ac.ps = -1; 1312cabdff1aSopenharmony_ci 1313cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(ff_mpeg4audio_channels); i++) 1314cabdff1aSopenharmony_ci if (ff_mpeg4audio_channels[i] == avctx->ch_layout.nb_channels) 1315cabdff1aSopenharmony_ci break; 1316cabdff1aSopenharmony_ci if (i == FF_ARRAY_ELEMS(ff_mpeg4audio_channels)) { 1317cabdff1aSopenharmony_ci i = 0; 1318cabdff1aSopenharmony_ci } 1319cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config = i; 1320cabdff1aSopenharmony_ci 1321cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.chan_config) { 1322cabdff1aSopenharmony_ci int ret = set_default_channel_config(ac, avctx, layout_map, 1323cabdff1aSopenharmony_ci &layout_map_tags, ac->oc[1].m4ac.chan_config); 1324cabdff1aSopenharmony_ci if (!ret) 1325cabdff1aSopenharmony_ci output_configure(ac, layout_map, layout_map_tags, 1326cabdff1aSopenharmony_ci OC_GLOBAL_HDR, 0); 1327cabdff1aSopenharmony_ci else if (avctx->err_recognition & AV_EF_EXPLODE) 1328cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1329cabdff1aSopenharmony_ci } 1330cabdff1aSopenharmony_ci } 1331cabdff1aSopenharmony_ci 1332cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels > MAX_CHANNELS) { 1333cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Too many channels\n"); 1334cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1335cabdff1aSopenharmony_ci } 1336cabdff1aSopenharmony_ci 1337cabdff1aSopenharmony_ci#if USE_FIXED 1338cabdff1aSopenharmony_ci ac->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & AV_CODEC_FLAG_BITEXACT); 1339cabdff1aSopenharmony_ci#else 1340cabdff1aSopenharmony_ci ac->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 1341cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1342cabdff1aSopenharmony_ci if (!ac->fdsp) { 1343cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1344cabdff1aSopenharmony_ci } 1345cabdff1aSopenharmony_ci 1346cabdff1aSopenharmony_ci ac->random_state = 0x1f2e3d4c; 1347cabdff1aSopenharmony_ci 1348cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_init)(&ac->mdct, 11, 1, 1.0 / RANGE15(1024.0)); 1349cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_init)(&ac->mdct_ld, 10, 1, 1.0 / RANGE15(512.0)); 1350cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_init)(&ac->mdct_small, 8, 1, 1.0 / RANGE15(128.0)); 1351cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_init)(&ac->mdct_ltp, 11, 0, RANGE15(-2.0)); 1352cabdff1aSopenharmony_ci#if !USE_FIXED 1353cabdff1aSopenharmony_ci ret = ff_mdct15_init(&ac->mdct120, 1, 3, 1.0f/(16*1024*120*2)); 1354cabdff1aSopenharmony_ci if (ret < 0) 1355cabdff1aSopenharmony_ci return ret; 1356cabdff1aSopenharmony_ci ret = ff_mdct15_init(&ac->mdct480, 1, 5, 1.0f/(16*1024*960)); 1357cabdff1aSopenharmony_ci if (ret < 0) 1358cabdff1aSopenharmony_ci return ret; 1359cabdff1aSopenharmony_ci ret = ff_mdct15_init(&ac->mdct960, 1, 6, 1.0f/(16*1024*960*2)); 1360cabdff1aSopenharmony_ci if (ret < 0) 1361cabdff1aSopenharmony_ci return ret; 1362cabdff1aSopenharmony_ci#endif 1363cabdff1aSopenharmony_ci 1364cabdff1aSopenharmony_ci return 0; 1365cabdff1aSopenharmony_ci} 1366cabdff1aSopenharmony_ci 1367cabdff1aSopenharmony_ci/** 1368cabdff1aSopenharmony_ci * Skip data_stream_element; reference: table 4.10. 1369cabdff1aSopenharmony_ci */ 1370cabdff1aSopenharmony_cistatic int skip_data_stream_element(AACContext *ac, GetBitContext *gb) 1371cabdff1aSopenharmony_ci{ 1372cabdff1aSopenharmony_ci int byte_align = get_bits1(gb); 1373cabdff1aSopenharmony_ci int count = get_bits(gb, 8); 1374cabdff1aSopenharmony_ci if (count == 255) 1375cabdff1aSopenharmony_ci count += get_bits(gb, 8); 1376cabdff1aSopenharmony_ci if (byte_align) 1377cabdff1aSopenharmony_ci align_get_bits(gb); 1378cabdff1aSopenharmony_ci 1379cabdff1aSopenharmony_ci if (get_bits_left(gb) < 8 * count) { 1380cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "skip_data_stream_element: "overread_err); 1381cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1382cabdff1aSopenharmony_ci } 1383cabdff1aSopenharmony_ci skip_bits_long(gb, 8 * count); 1384cabdff1aSopenharmony_ci return 0; 1385cabdff1aSopenharmony_ci} 1386cabdff1aSopenharmony_ci 1387cabdff1aSopenharmony_cistatic int decode_prediction(AACContext *ac, IndividualChannelStream *ics, 1388cabdff1aSopenharmony_ci GetBitContext *gb) 1389cabdff1aSopenharmony_ci{ 1390cabdff1aSopenharmony_ci int sfb; 1391cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1392cabdff1aSopenharmony_ci ics->predictor_reset_group = get_bits(gb, 5); 1393cabdff1aSopenharmony_ci if (ics->predictor_reset_group == 0 || 1394cabdff1aSopenharmony_ci ics->predictor_reset_group > 30) { 1395cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1396cabdff1aSopenharmony_ci "Invalid Predictor Reset Group.\n"); 1397cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1398cabdff1aSopenharmony_ci } 1399cabdff1aSopenharmony_ci } 1400cabdff1aSopenharmony_ci for (sfb = 0; sfb < FFMIN(ics->max_sfb, ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index]); sfb++) { 1401cabdff1aSopenharmony_ci ics->prediction_used[sfb] = get_bits1(gb); 1402cabdff1aSopenharmony_ci } 1403cabdff1aSopenharmony_ci return 0; 1404cabdff1aSopenharmony_ci} 1405cabdff1aSopenharmony_ci 1406cabdff1aSopenharmony_ci/** 1407cabdff1aSopenharmony_ci * Decode Long Term Prediction data; reference: table 4.xx. 1408cabdff1aSopenharmony_ci */ 1409cabdff1aSopenharmony_cistatic void decode_ltp(LongTermPrediction *ltp, 1410cabdff1aSopenharmony_ci GetBitContext *gb, uint8_t max_sfb) 1411cabdff1aSopenharmony_ci{ 1412cabdff1aSopenharmony_ci int sfb; 1413cabdff1aSopenharmony_ci 1414cabdff1aSopenharmony_ci ltp->lag = get_bits(gb, 11); 1415cabdff1aSopenharmony_ci ltp->coef = ltp_coef[get_bits(gb, 3)]; 1416cabdff1aSopenharmony_ci for (sfb = 0; sfb < FFMIN(max_sfb, MAX_LTP_LONG_SFB); sfb++) 1417cabdff1aSopenharmony_ci ltp->used[sfb] = get_bits1(gb); 1418cabdff1aSopenharmony_ci} 1419cabdff1aSopenharmony_ci 1420cabdff1aSopenharmony_ci/** 1421cabdff1aSopenharmony_ci * Decode Individual Channel Stream info; reference: table 4.6. 1422cabdff1aSopenharmony_ci */ 1423cabdff1aSopenharmony_cistatic int decode_ics_info(AACContext *ac, IndividualChannelStream *ics, 1424cabdff1aSopenharmony_ci GetBitContext *gb) 1425cabdff1aSopenharmony_ci{ 1426cabdff1aSopenharmony_ci const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac; 1427cabdff1aSopenharmony_ci const int aot = m4ac->object_type; 1428cabdff1aSopenharmony_ci const int sampling_index = m4ac->sampling_index; 1429cabdff1aSopenharmony_ci int ret_fail = AVERROR_INVALIDDATA; 1430cabdff1aSopenharmony_ci 1431cabdff1aSopenharmony_ci if (aot != AOT_ER_AAC_ELD) { 1432cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1433cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n"); 1434cabdff1aSopenharmony_ci if (ac->avctx->err_recognition & AV_EF_BITSTREAM) 1435cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1436cabdff1aSopenharmony_ci } 1437cabdff1aSopenharmony_ci ics->window_sequence[1] = ics->window_sequence[0]; 1438cabdff1aSopenharmony_ci ics->window_sequence[0] = get_bits(gb, 2); 1439cabdff1aSopenharmony_ci if (aot == AOT_ER_AAC_LD && 1440cabdff1aSopenharmony_ci ics->window_sequence[0] != ONLY_LONG_SEQUENCE) { 1441cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1442cabdff1aSopenharmony_ci "AAC LD is only defined for ONLY_LONG_SEQUENCE but " 1443cabdff1aSopenharmony_ci "window sequence %d found.\n", ics->window_sequence[0]); 1444cabdff1aSopenharmony_ci ics->window_sequence[0] = ONLY_LONG_SEQUENCE; 1445cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1446cabdff1aSopenharmony_ci } 1447cabdff1aSopenharmony_ci ics->use_kb_window[1] = ics->use_kb_window[0]; 1448cabdff1aSopenharmony_ci ics->use_kb_window[0] = get_bits1(gb); 1449cabdff1aSopenharmony_ci } 1450cabdff1aSopenharmony_ci ics->num_window_groups = 1; 1451cabdff1aSopenharmony_ci ics->group_len[0] = 1; 1452cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 1453cabdff1aSopenharmony_ci int i; 1454cabdff1aSopenharmony_ci ics->max_sfb = get_bits(gb, 4); 1455cabdff1aSopenharmony_ci for (i = 0; i < 7; i++) { 1456cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1457cabdff1aSopenharmony_ci ics->group_len[ics->num_window_groups - 1]++; 1458cabdff1aSopenharmony_ci } else { 1459cabdff1aSopenharmony_ci ics->num_window_groups++; 1460cabdff1aSopenharmony_ci ics->group_len[ics->num_window_groups - 1] = 1; 1461cabdff1aSopenharmony_ci } 1462cabdff1aSopenharmony_ci } 1463cabdff1aSopenharmony_ci ics->num_windows = 8; 1464cabdff1aSopenharmony_ci if (m4ac->frame_length_short) { 1465cabdff1aSopenharmony_ci ics->swb_offset = ff_swb_offset_120[sampling_index]; 1466cabdff1aSopenharmony_ci ics->num_swb = ff_aac_num_swb_120[sampling_index]; 1467cabdff1aSopenharmony_ci } else { 1468cabdff1aSopenharmony_ci ics->swb_offset = ff_swb_offset_128[sampling_index]; 1469cabdff1aSopenharmony_ci ics->num_swb = ff_aac_num_swb_128[sampling_index]; 1470cabdff1aSopenharmony_ci } 1471cabdff1aSopenharmony_ci ics->tns_max_bands = ff_tns_max_bands_128[sampling_index]; 1472cabdff1aSopenharmony_ci ics->predictor_present = 0; 1473cabdff1aSopenharmony_ci } else { 1474cabdff1aSopenharmony_ci ics->max_sfb = get_bits(gb, 6); 1475cabdff1aSopenharmony_ci ics->num_windows = 1; 1476cabdff1aSopenharmony_ci if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) { 1477cabdff1aSopenharmony_ci if (m4ac->frame_length_short) { 1478cabdff1aSopenharmony_ci ics->swb_offset = ff_swb_offset_480[sampling_index]; 1479cabdff1aSopenharmony_ci ics->num_swb = ff_aac_num_swb_480[sampling_index]; 1480cabdff1aSopenharmony_ci ics->tns_max_bands = ff_tns_max_bands_480[sampling_index]; 1481cabdff1aSopenharmony_ci } else { 1482cabdff1aSopenharmony_ci ics->swb_offset = ff_swb_offset_512[sampling_index]; 1483cabdff1aSopenharmony_ci ics->num_swb = ff_aac_num_swb_512[sampling_index]; 1484cabdff1aSopenharmony_ci ics->tns_max_bands = ff_tns_max_bands_512[sampling_index]; 1485cabdff1aSopenharmony_ci } 1486cabdff1aSopenharmony_ci if (!ics->num_swb || !ics->swb_offset) { 1487cabdff1aSopenharmony_ci ret_fail = AVERROR_BUG; 1488cabdff1aSopenharmony_ci goto fail; 1489cabdff1aSopenharmony_ci } 1490cabdff1aSopenharmony_ci } else { 1491cabdff1aSopenharmony_ci if (m4ac->frame_length_short) { 1492cabdff1aSopenharmony_ci ics->num_swb = ff_aac_num_swb_960[sampling_index]; 1493cabdff1aSopenharmony_ci ics->swb_offset = ff_swb_offset_960[sampling_index]; 1494cabdff1aSopenharmony_ci } else { 1495cabdff1aSopenharmony_ci ics->num_swb = ff_aac_num_swb_1024[sampling_index]; 1496cabdff1aSopenharmony_ci ics->swb_offset = ff_swb_offset_1024[sampling_index]; 1497cabdff1aSopenharmony_ci } 1498cabdff1aSopenharmony_ci ics->tns_max_bands = ff_tns_max_bands_1024[sampling_index]; 1499cabdff1aSopenharmony_ci } 1500cabdff1aSopenharmony_ci if (aot != AOT_ER_AAC_ELD) { 1501cabdff1aSopenharmony_ci ics->predictor_present = get_bits1(gb); 1502cabdff1aSopenharmony_ci ics->predictor_reset_group = 0; 1503cabdff1aSopenharmony_ci } 1504cabdff1aSopenharmony_ci if (ics->predictor_present) { 1505cabdff1aSopenharmony_ci if (aot == AOT_AAC_MAIN) { 1506cabdff1aSopenharmony_ci if (decode_prediction(ac, ics, gb)) { 1507cabdff1aSopenharmony_ci goto fail; 1508cabdff1aSopenharmony_ci } 1509cabdff1aSopenharmony_ci } else if (aot == AOT_AAC_LC || 1510cabdff1aSopenharmony_ci aot == AOT_ER_AAC_LC) { 1511cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1512cabdff1aSopenharmony_ci "Prediction is not allowed in AAC-LC.\n"); 1513cabdff1aSopenharmony_ci goto fail; 1514cabdff1aSopenharmony_ci } else { 1515cabdff1aSopenharmony_ci if (aot == AOT_ER_AAC_LD) { 1516cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1517cabdff1aSopenharmony_ci "LTP in ER AAC LD not yet implemented.\n"); 1518cabdff1aSopenharmony_ci ret_fail = AVERROR_PATCHWELCOME; 1519cabdff1aSopenharmony_ci goto fail; 1520cabdff1aSopenharmony_ci } 1521cabdff1aSopenharmony_ci if ((ics->ltp.present = get_bits(gb, 1))) 1522cabdff1aSopenharmony_ci decode_ltp(&ics->ltp, gb, ics->max_sfb); 1523cabdff1aSopenharmony_ci } 1524cabdff1aSopenharmony_ci } 1525cabdff1aSopenharmony_ci } 1526cabdff1aSopenharmony_ci 1527cabdff1aSopenharmony_ci if (ics->max_sfb > ics->num_swb) { 1528cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1529cabdff1aSopenharmony_ci "Number of scalefactor bands in group (%d) " 1530cabdff1aSopenharmony_ci "exceeds limit (%d).\n", 1531cabdff1aSopenharmony_ci ics->max_sfb, ics->num_swb); 1532cabdff1aSopenharmony_ci goto fail; 1533cabdff1aSopenharmony_ci } 1534cabdff1aSopenharmony_ci 1535cabdff1aSopenharmony_ci return 0; 1536cabdff1aSopenharmony_cifail: 1537cabdff1aSopenharmony_ci ics->max_sfb = 0; 1538cabdff1aSopenharmony_ci return ret_fail; 1539cabdff1aSopenharmony_ci} 1540cabdff1aSopenharmony_ci 1541cabdff1aSopenharmony_ci/** 1542cabdff1aSopenharmony_ci * Decode band types (section_data payload); reference: table 4.46. 1543cabdff1aSopenharmony_ci * 1544cabdff1aSopenharmony_ci * @param band_type array of the used band type 1545cabdff1aSopenharmony_ci * @param band_type_run_end array of the last scalefactor band of a band type run 1546cabdff1aSopenharmony_ci * 1547cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 1548cabdff1aSopenharmony_ci */ 1549cabdff1aSopenharmony_cistatic int decode_band_types(AACContext *ac, enum BandType band_type[120], 1550cabdff1aSopenharmony_ci int band_type_run_end[120], GetBitContext *gb, 1551cabdff1aSopenharmony_ci IndividualChannelStream *ics) 1552cabdff1aSopenharmony_ci{ 1553cabdff1aSopenharmony_ci int g, idx = 0; 1554cabdff1aSopenharmony_ci const int bits = (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) ? 3 : 5; 1555cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 1556cabdff1aSopenharmony_ci int k = 0; 1557cabdff1aSopenharmony_ci while (k < ics->max_sfb) { 1558cabdff1aSopenharmony_ci uint8_t sect_end = k; 1559cabdff1aSopenharmony_ci int sect_len_incr; 1560cabdff1aSopenharmony_ci int sect_band_type = get_bits(gb, 4); 1561cabdff1aSopenharmony_ci if (sect_band_type == 12) { 1562cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "invalid band type\n"); 1563cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1564cabdff1aSopenharmony_ci } 1565cabdff1aSopenharmony_ci do { 1566cabdff1aSopenharmony_ci sect_len_incr = get_bits(gb, bits); 1567cabdff1aSopenharmony_ci sect_end += sect_len_incr; 1568cabdff1aSopenharmony_ci if (get_bits_left(gb) < 0) { 1569cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "decode_band_types: "overread_err); 1570cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1571cabdff1aSopenharmony_ci } 1572cabdff1aSopenharmony_ci if (sect_end > ics->max_sfb) { 1573cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1574cabdff1aSopenharmony_ci "Number of bands (%d) exceeds limit (%d).\n", 1575cabdff1aSopenharmony_ci sect_end, ics->max_sfb); 1576cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1577cabdff1aSopenharmony_ci } 1578cabdff1aSopenharmony_ci } while (sect_len_incr == (1 << bits) - 1); 1579cabdff1aSopenharmony_ci for (; k < sect_end; k++) { 1580cabdff1aSopenharmony_ci band_type [idx] = sect_band_type; 1581cabdff1aSopenharmony_ci band_type_run_end[idx++] = sect_end; 1582cabdff1aSopenharmony_ci } 1583cabdff1aSopenharmony_ci } 1584cabdff1aSopenharmony_ci } 1585cabdff1aSopenharmony_ci return 0; 1586cabdff1aSopenharmony_ci} 1587cabdff1aSopenharmony_ci 1588cabdff1aSopenharmony_ci/** 1589cabdff1aSopenharmony_ci * Decode scalefactors; reference: table 4.47. 1590cabdff1aSopenharmony_ci * 1591cabdff1aSopenharmony_ci * @param global_gain first scalefactor value as scalefactors are differentially coded 1592cabdff1aSopenharmony_ci * @param band_type array of the used band type 1593cabdff1aSopenharmony_ci * @param band_type_run_end array of the last scalefactor band of a band type run 1594cabdff1aSopenharmony_ci * @param sf array of scalefactors or intensity stereo positions 1595cabdff1aSopenharmony_ci * 1596cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 1597cabdff1aSopenharmony_ci */ 1598cabdff1aSopenharmony_cistatic int decode_scalefactors(AACContext *ac, INTFLOAT sf[120], GetBitContext *gb, 1599cabdff1aSopenharmony_ci unsigned int global_gain, 1600cabdff1aSopenharmony_ci IndividualChannelStream *ics, 1601cabdff1aSopenharmony_ci enum BandType band_type[120], 1602cabdff1aSopenharmony_ci int band_type_run_end[120]) 1603cabdff1aSopenharmony_ci{ 1604cabdff1aSopenharmony_ci int g, i, idx = 0; 1605cabdff1aSopenharmony_ci int offset[3] = { global_gain, global_gain - NOISE_OFFSET, 0 }; 1606cabdff1aSopenharmony_ci int clipped_offset; 1607cabdff1aSopenharmony_ci int noise_flag = 1; 1608cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 1609cabdff1aSopenharmony_ci for (i = 0; i < ics->max_sfb;) { 1610cabdff1aSopenharmony_ci int run_end = band_type_run_end[idx]; 1611cabdff1aSopenharmony_ci if (band_type[idx] == ZERO_BT) { 1612cabdff1aSopenharmony_ci for (; i < run_end; i++, idx++) 1613cabdff1aSopenharmony_ci sf[idx] = FIXR(0.); 1614cabdff1aSopenharmony_ci } else if ((band_type[idx] == INTENSITY_BT) || 1615cabdff1aSopenharmony_ci (band_type[idx] == INTENSITY_BT2)) { 1616cabdff1aSopenharmony_ci for (; i < run_end; i++, idx++) { 1617cabdff1aSopenharmony_ci offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - SCALE_DIFF_ZERO; 1618cabdff1aSopenharmony_ci clipped_offset = av_clip(offset[2], -155, 100); 1619cabdff1aSopenharmony_ci if (offset[2] != clipped_offset) { 1620cabdff1aSopenharmony_ci avpriv_request_sample(ac->avctx, 1621cabdff1aSopenharmony_ci "If you heard an audible artifact, there may be a bug in the decoder. " 1622cabdff1aSopenharmony_ci "Clipped intensity stereo position (%d -> %d)", 1623cabdff1aSopenharmony_ci offset[2], clipped_offset); 1624cabdff1aSopenharmony_ci } 1625cabdff1aSopenharmony_ci#if USE_FIXED 1626cabdff1aSopenharmony_ci sf[idx] = 100 - clipped_offset; 1627cabdff1aSopenharmony_ci#else 1628cabdff1aSopenharmony_ci sf[idx] = ff_aac_pow2sf_tab[-clipped_offset + POW_SF2_ZERO]; 1629cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1630cabdff1aSopenharmony_ci } 1631cabdff1aSopenharmony_ci } else if (band_type[idx] == NOISE_BT) { 1632cabdff1aSopenharmony_ci for (; i < run_end; i++, idx++) { 1633cabdff1aSopenharmony_ci if (noise_flag-- > 0) 1634cabdff1aSopenharmony_ci offset[1] += get_bits(gb, NOISE_PRE_BITS) - NOISE_PRE; 1635cabdff1aSopenharmony_ci else 1636cabdff1aSopenharmony_ci offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - SCALE_DIFF_ZERO; 1637cabdff1aSopenharmony_ci clipped_offset = av_clip(offset[1], -100, 155); 1638cabdff1aSopenharmony_ci if (offset[1] != clipped_offset) { 1639cabdff1aSopenharmony_ci avpriv_request_sample(ac->avctx, 1640cabdff1aSopenharmony_ci "If you heard an audible artifact, there may be a bug in the decoder. " 1641cabdff1aSopenharmony_ci "Clipped noise gain (%d -> %d)", 1642cabdff1aSopenharmony_ci offset[1], clipped_offset); 1643cabdff1aSopenharmony_ci } 1644cabdff1aSopenharmony_ci#if USE_FIXED 1645cabdff1aSopenharmony_ci sf[idx] = -(100 + clipped_offset); 1646cabdff1aSopenharmony_ci#else 1647cabdff1aSopenharmony_ci sf[idx] = -ff_aac_pow2sf_tab[clipped_offset + POW_SF2_ZERO]; 1648cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1649cabdff1aSopenharmony_ci } 1650cabdff1aSopenharmony_ci } else { 1651cabdff1aSopenharmony_ci for (; i < run_end; i++, idx++) { 1652cabdff1aSopenharmony_ci offset[0] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - SCALE_DIFF_ZERO; 1653cabdff1aSopenharmony_ci if (offset[0] > 255U) { 1654cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1655cabdff1aSopenharmony_ci "Scalefactor (%d) out of range.\n", offset[0]); 1656cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1657cabdff1aSopenharmony_ci } 1658cabdff1aSopenharmony_ci#if USE_FIXED 1659cabdff1aSopenharmony_ci sf[idx] = -offset[0]; 1660cabdff1aSopenharmony_ci#else 1661cabdff1aSopenharmony_ci sf[idx] = -ff_aac_pow2sf_tab[offset[0] - 100 + POW_SF2_ZERO]; 1662cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1663cabdff1aSopenharmony_ci } 1664cabdff1aSopenharmony_ci } 1665cabdff1aSopenharmony_ci } 1666cabdff1aSopenharmony_ci } 1667cabdff1aSopenharmony_ci return 0; 1668cabdff1aSopenharmony_ci} 1669cabdff1aSopenharmony_ci 1670cabdff1aSopenharmony_ci/** 1671cabdff1aSopenharmony_ci * Decode pulse data; reference: table 4.7. 1672cabdff1aSopenharmony_ci */ 1673cabdff1aSopenharmony_cistatic int decode_pulses(Pulse *pulse, GetBitContext *gb, 1674cabdff1aSopenharmony_ci const uint16_t *swb_offset, int num_swb) 1675cabdff1aSopenharmony_ci{ 1676cabdff1aSopenharmony_ci int i, pulse_swb; 1677cabdff1aSopenharmony_ci pulse->num_pulse = get_bits(gb, 2) + 1; 1678cabdff1aSopenharmony_ci pulse_swb = get_bits(gb, 6); 1679cabdff1aSopenharmony_ci if (pulse_swb >= num_swb) 1680cabdff1aSopenharmony_ci return -1; 1681cabdff1aSopenharmony_ci pulse->pos[0] = swb_offset[pulse_swb]; 1682cabdff1aSopenharmony_ci pulse->pos[0] += get_bits(gb, 5); 1683cabdff1aSopenharmony_ci if (pulse->pos[0] >= swb_offset[num_swb]) 1684cabdff1aSopenharmony_ci return -1; 1685cabdff1aSopenharmony_ci pulse->amp[0] = get_bits(gb, 4); 1686cabdff1aSopenharmony_ci for (i = 1; i < pulse->num_pulse; i++) { 1687cabdff1aSopenharmony_ci pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i - 1]; 1688cabdff1aSopenharmony_ci if (pulse->pos[i] >= swb_offset[num_swb]) 1689cabdff1aSopenharmony_ci return -1; 1690cabdff1aSopenharmony_ci pulse->amp[i] = get_bits(gb, 4); 1691cabdff1aSopenharmony_ci } 1692cabdff1aSopenharmony_ci return 0; 1693cabdff1aSopenharmony_ci} 1694cabdff1aSopenharmony_ci 1695cabdff1aSopenharmony_ci/** 1696cabdff1aSopenharmony_ci * Decode Temporal Noise Shaping data; reference: table 4.48. 1697cabdff1aSopenharmony_ci * 1698cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 1699cabdff1aSopenharmony_ci */ 1700cabdff1aSopenharmony_cistatic int decode_tns(AACContext *ac, TemporalNoiseShaping *tns, 1701cabdff1aSopenharmony_ci GetBitContext *gb, const IndividualChannelStream *ics) 1702cabdff1aSopenharmony_ci{ 1703cabdff1aSopenharmony_ci int w, filt, i, coef_len, coef_res, coef_compress; 1704cabdff1aSopenharmony_ci const int is8 = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE; 1705cabdff1aSopenharmony_ci const int tns_max_order = is8 ? 7 : ac->oc[1].m4ac.object_type == AOT_AAC_MAIN ? 20 : 12; 1706cabdff1aSopenharmony_ci for (w = 0; w < ics->num_windows; w++) { 1707cabdff1aSopenharmony_ci if ((tns->n_filt[w] = get_bits(gb, 2 - is8))) { 1708cabdff1aSopenharmony_ci coef_res = get_bits1(gb); 1709cabdff1aSopenharmony_ci 1710cabdff1aSopenharmony_ci for (filt = 0; filt < tns->n_filt[w]; filt++) { 1711cabdff1aSopenharmony_ci int tmp2_idx; 1712cabdff1aSopenharmony_ci tns->length[w][filt] = get_bits(gb, 6 - 2 * is8); 1713cabdff1aSopenharmony_ci 1714cabdff1aSopenharmony_ci if ((tns->order[w][filt] = get_bits(gb, 5 - 2 * is8)) > tns_max_order) { 1715cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1716cabdff1aSopenharmony_ci "TNS filter order %d is greater than maximum %d.\n", 1717cabdff1aSopenharmony_ci tns->order[w][filt], tns_max_order); 1718cabdff1aSopenharmony_ci tns->order[w][filt] = 0; 1719cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1720cabdff1aSopenharmony_ci } 1721cabdff1aSopenharmony_ci if (tns->order[w][filt]) { 1722cabdff1aSopenharmony_ci tns->direction[w][filt] = get_bits1(gb); 1723cabdff1aSopenharmony_ci coef_compress = get_bits1(gb); 1724cabdff1aSopenharmony_ci coef_len = coef_res + 3 - coef_compress; 1725cabdff1aSopenharmony_ci tmp2_idx = 2 * coef_compress + coef_res; 1726cabdff1aSopenharmony_ci 1727cabdff1aSopenharmony_ci for (i = 0; i < tns->order[w][filt]; i++) 1728cabdff1aSopenharmony_ci tns->coef[w][filt][i] = tns_tmp2_map[tmp2_idx][get_bits(gb, coef_len)]; 1729cabdff1aSopenharmony_ci } 1730cabdff1aSopenharmony_ci } 1731cabdff1aSopenharmony_ci } 1732cabdff1aSopenharmony_ci } 1733cabdff1aSopenharmony_ci return 0; 1734cabdff1aSopenharmony_ci} 1735cabdff1aSopenharmony_ci 1736cabdff1aSopenharmony_ci/** 1737cabdff1aSopenharmony_ci * Decode Mid/Side data; reference: table 4.54. 1738cabdff1aSopenharmony_ci * 1739cabdff1aSopenharmony_ci * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; 1740cabdff1aSopenharmony_ci * [1] mask is decoded from bitstream; [2] mask is all 1s; 1741cabdff1aSopenharmony_ci * [3] reserved for scalable AAC 1742cabdff1aSopenharmony_ci */ 1743cabdff1aSopenharmony_cistatic void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb, 1744cabdff1aSopenharmony_ci int ms_present) 1745cabdff1aSopenharmony_ci{ 1746cabdff1aSopenharmony_ci int idx; 1747cabdff1aSopenharmony_ci int max_idx = cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb; 1748cabdff1aSopenharmony_ci if (ms_present == 1) { 1749cabdff1aSopenharmony_ci for (idx = 0; idx < max_idx; idx++) 1750cabdff1aSopenharmony_ci cpe->ms_mask[idx] = get_bits1(gb); 1751cabdff1aSopenharmony_ci } else if (ms_present == 2) { 1752cabdff1aSopenharmony_ci memset(cpe->ms_mask, 1, max_idx * sizeof(cpe->ms_mask[0])); 1753cabdff1aSopenharmony_ci } 1754cabdff1aSopenharmony_ci} 1755cabdff1aSopenharmony_ci 1756cabdff1aSopenharmony_ci/** 1757cabdff1aSopenharmony_ci * Decode spectral data; reference: table 4.50. 1758cabdff1aSopenharmony_ci * Dequantize and scale spectral data; reference: 4.6.3.3. 1759cabdff1aSopenharmony_ci * 1760cabdff1aSopenharmony_ci * @param coef array of dequantized, scaled spectral data 1761cabdff1aSopenharmony_ci * @param sf array of scalefactors or intensity stereo positions 1762cabdff1aSopenharmony_ci * @param pulse_present set if pulses are present 1763cabdff1aSopenharmony_ci * @param pulse pointer to pulse data struct 1764cabdff1aSopenharmony_ci * @param band_type array of the used band type 1765cabdff1aSopenharmony_ci * 1766cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 1767cabdff1aSopenharmony_ci */ 1768cabdff1aSopenharmony_cistatic int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024], 1769cabdff1aSopenharmony_ci GetBitContext *gb, const INTFLOAT sf[120], 1770cabdff1aSopenharmony_ci int pulse_present, const Pulse *pulse, 1771cabdff1aSopenharmony_ci const IndividualChannelStream *ics, 1772cabdff1aSopenharmony_ci enum BandType band_type[120]) 1773cabdff1aSopenharmony_ci{ 1774cabdff1aSopenharmony_ci int i, k, g, idx = 0; 1775cabdff1aSopenharmony_ci const int c = 1024 / ics->num_windows; 1776cabdff1aSopenharmony_ci const uint16_t *offsets = ics->swb_offset; 1777cabdff1aSopenharmony_ci INTFLOAT *coef_base = coef; 1778cabdff1aSopenharmony_ci 1779cabdff1aSopenharmony_ci for (g = 0; g < ics->num_windows; g++) 1780cabdff1aSopenharmony_ci memset(coef + g * 128 + offsets[ics->max_sfb], 0, 1781cabdff1aSopenharmony_ci sizeof(INTFLOAT) * (c - offsets[ics->max_sfb])); 1782cabdff1aSopenharmony_ci 1783cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 1784cabdff1aSopenharmony_ci unsigned g_len = ics->group_len[g]; 1785cabdff1aSopenharmony_ci 1786cabdff1aSopenharmony_ci for (i = 0; i < ics->max_sfb; i++, idx++) { 1787cabdff1aSopenharmony_ci const unsigned cbt_m1 = band_type[idx] - 1; 1788cabdff1aSopenharmony_ci INTFLOAT *cfo = coef + offsets[i]; 1789cabdff1aSopenharmony_ci int off_len = offsets[i + 1] - offsets[i]; 1790cabdff1aSopenharmony_ci int group; 1791cabdff1aSopenharmony_ci 1792cabdff1aSopenharmony_ci if (cbt_m1 >= INTENSITY_BT2 - 1) { 1793cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1794cabdff1aSopenharmony_ci memset(cfo, 0, off_len * sizeof(*cfo)); 1795cabdff1aSopenharmony_ci } 1796cabdff1aSopenharmony_ci } else if (cbt_m1 == NOISE_BT - 1) { 1797cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1798cabdff1aSopenharmony_ci INTFLOAT band_energy; 1799cabdff1aSopenharmony_ci#if USE_FIXED 1800cabdff1aSopenharmony_ci for (k = 0; k < off_len; k++) { 1801cabdff1aSopenharmony_ci ac->random_state = lcg_random(ac->random_state); 1802cabdff1aSopenharmony_ci cfo[k] = ac->random_state >> 3; 1803cabdff1aSopenharmony_ci } 1804cabdff1aSopenharmony_ci 1805cabdff1aSopenharmony_ci band_energy = ac->fdsp->scalarproduct_fixed(cfo, cfo, off_len); 1806cabdff1aSopenharmony_ci band_energy = fixed_sqrt(band_energy, 31); 1807cabdff1aSopenharmony_ci noise_scale(cfo, sf[idx], band_energy, off_len); 1808cabdff1aSopenharmony_ci#else 1809cabdff1aSopenharmony_ci float scale; 1810cabdff1aSopenharmony_ci 1811cabdff1aSopenharmony_ci for (k = 0; k < off_len; k++) { 1812cabdff1aSopenharmony_ci ac->random_state = lcg_random(ac->random_state); 1813cabdff1aSopenharmony_ci cfo[k] = ac->random_state; 1814cabdff1aSopenharmony_ci } 1815cabdff1aSopenharmony_ci 1816cabdff1aSopenharmony_ci band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len); 1817cabdff1aSopenharmony_ci scale = sf[idx] / sqrtf(band_energy); 1818cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len); 1819cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1820cabdff1aSopenharmony_ci } 1821cabdff1aSopenharmony_ci } else { 1822cabdff1aSopenharmony_ci#if !USE_FIXED 1823cabdff1aSopenharmony_ci const float *vq = ff_aac_codebook_vector_vals[cbt_m1]; 1824cabdff1aSopenharmony_ci#endif /* !USE_FIXED */ 1825cabdff1aSopenharmony_ci const VLCElem *vlc_tab = vlc_spectral[cbt_m1].table; 1826cabdff1aSopenharmony_ci OPEN_READER(re, gb); 1827cabdff1aSopenharmony_ci 1828cabdff1aSopenharmony_ci switch (cbt_m1 >> 1) { 1829cabdff1aSopenharmony_ci case 0: 1830cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1831cabdff1aSopenharmony_ci INTFLOAT *cf = cfo; 1832cabdff1aSopenharmony_ci int len = off_len; 1833cabdff1aSopenharmony_ci 1834cabdff1aSopenharmony_ci do { 1835cabdff1aSopenharmony_ci int code; 1836cabdff1aSopenharmony_ci unsigned cb_idx; 1837cabdff1aSopenharmony_ci 1838cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 1839cabdff1aSopenharmony_ci GET_VLC(code, re, gb, vlc_tab, 8, 2); 1840cabdff1aSopenharmony_ci cb_idx = code; 1841cabdff1aSopenharmony_ci#if USE_FIXED 1842cabdff1aSopenharmony_ci cf = DEC_SQUAD(cf, cb_idx); 1843cabdff1aSopenharmony_ci#else 1844cabdff1aSopenharmony_ci cf = VMUL4(cf, vq, cb_idx, sf + idx); 1845cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1846cabdff1aSopenharmony_ci } while (len -= 4); 1847cabdff1aSopenharmony_ci } 1848cabdff1aSopenharmony_ci break; 1849cabdff1aSopenharmony_ci 1850cabdff1aSopenharmony_ci case 1: 1851cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1852cabdff1aSopenharmony_ci INTFLOAT *cf = cfo; 1853cabdff1aSopenharmony_ci int len = off_len; 1854cabdff1aSopenharmony_ci 1855cabdff1aSopenharmony_ci do { 1856cabdff1aSopenharmony_ci int code; 1857cabdff1aSopenharmony_ci unsigned nnz; 1858cabdff1aSopenharmony_ci unsigned cb_idx; 1859cabdff1aSopenharmony_ci uint32_t bits; 1860cabdff1aSopenharmony_ci 1861cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 1862cabdff1aSopenharmony_ci GET_VLC(code, re, gb, vlc_tab, 8, 2); 1863cabdff1aSopenharmony_ci cb_idx = code; 1864cabdff1aSopenharmony_ci nnz = cb_idx >> 8 & 15; 1865cabdff1aSopenharmony_ci bits = nnz ? GET_CACHE(re, gb) : 0; 1866cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, nnz); 1867cabdff1aSopenharmony_ci#if USE_FIXED 1868cabdff1aSopenharmony_ci cf = DEC_UQUAD(cf, cb_idx, bits); 1869cabdff1aSopenharmony_ci#else 1870cabdff1aSopenharmony_ci cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx); 1871cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1872cabdff1aSopenharmony_ci } while (len -= 4); 1873cabdff1aSopenharmony_ci } 1874cabdff1aSopenharmony_ci break; 1875cabdff1aSopenharmony_ci 1876cabdff1aSopenharmony_ci case 2: 1877cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1878cabdff1aSopenharmony_ci INTFLOAT *cf = cfo; 1879cabdff1aSopenharmony_ci int len = off_len; 1880cabdff1aSopenharmony_ci 1881cabdff1aSopenharmony_ci do { 1882cabdff1aSopenharmony_ci int code; 1883cabdff1aSopenharmony_ci unsigned cb_idx; 1884cabdff1aSopenharmony_ci 1885cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 1886cabdff1aSopenharmony_ci GET_VLC(code, re, gb, vlc_tab, 8, 2); 1887cabdff1aSopenharmony_ci cb_idx = code; 1888cabdff1aSopenharmony_ci#if USE_FIXED 1889cabdff1aSopenharmony_ci cf = DEC_SPAIR(cf, cb_idx); 1890cabdff1aSopenharmony_ci#else 1891cabdff1aSopenharmony_ci cf = VMUL2(cf, vq, cb_idx, sf + idx); 1892cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1893cabdff1aSopenharmony_ci } while (len -= 2); 1894cabdff1aSopenharmony_ci } 1895cabdff1aSopenharmony_ci break; 1896cabdff1aSopenharmony_ci 1897cabdff1aSopenharmony_ci case 3: 1898cabdff1aSopenharmony_ci case 4: 1899cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1900cabdff1aSopenharmony_ci INTFLOAT *cf = cfo; 1901cabdff1aSopenharmony_ci int len = off_len; 1902cabdff1aSopenharmony_ci 1903cabdff1aSopenharmony_ci do { 1904cabdff1aSopenharmony_ci int code; 1905cabdff1aSopenharmony_ci unsigned nnz; 1906cabdff1aSopenharmony_ci unsigned cb_idx; 1907cabdff1aSopenharmony_ci unsigned sign; 1908cabdff1aSopenharmony_ci 1909cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 1910cabdff1aSopenharmony_ci GET_VLC(code, re, gb, vlc_tab, 8, 2); 1911cabdff1aSopenharmony_ci cb_idx = code; 1912cabdff1aSopenharmony_ci nnz = cb_idx >> 8 & 15; 1913cabdff1aSopenharmony_ci sign = nnz ? SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12) : 0; 1914cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, nnz); 1915cabdff1aSopenharmony_ci#if USE_FIXED 1916cabdff1aSopenharmony_ci cf = DEC_UPAIR(cf, cb_idx, sign); 1917cabdff1aSopenharmony_ci#else 1918cabdff1aSopenharmony_ci cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx); 1919cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1920cabdff1aSopenharmony_ci } while (len -= 2); 1921cabdff1aSopenharmony_ci } 1922cabdff1aSopenharmony_ci break; 1923cabdff1aSopenharmony_ci 1924cabdff1aSopenharmony_ci default: 1925cabdff1aSopenharmony_ci for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) { 1926cabdff1aSopenharmony_ci#if USE_FIXED 1927cabdff1aSopenharmony_ci int *icf = cfo; 1928cabdff1aSopenharmony_ci int v; 1929cabdff1aSopenharmony_ci#else 1930cabdff1aSopenharmony_ci float *cf = cfo; 1931cabdff1aSopenharmony_ci uint32_t *icf = (uint32_t *) cf; 1932cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1933cabdff1aSopenharmony_ci int len = off_len; 1934cabdff1aSopenharmony_ci 1935cabdff1aSopenharmony_ci do { 1936cabdff1aSopenharmony_ci int code; 1937cabdff1aSopenharmony_ci unsigned nzt, nnz; 1938cabdff1aSopenharmony_ci unsigned cb_idx; 1939cabdff1aSopenharmony_ci uint32_t bits; 1940cabdff1aSopenharmony_ci int j; 1941cabdff1aSopenharmony_ci 1942cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 1943cabdff1aSopenharmony_ci GET_VLC(code, re, gb, vlc_tab, 8, 2); 1944cabdff1aSopenharmony_ci cb_idx = code; 1945cabdff1aSopenharmony_ci 1946cabdff1aSopenharmony_ci if (cb_idx == 0x0000) { 1947cabdff1aSopenharmony_ci *icf++ = 0; 1948cabdff1aSopenharmony_ci *icf++ = 0; 1949cabdff1aSopenharmony_ci continue; 1950cabdff1aSopenharmony_ci } 1951cabdff1aSopenharmony_ci 1952cabdff1aSopenharmony_ci nnz = cb_idx >> 12; 1953cabdff1aSopenharmony_ci nzt = cb_idx >> 8; 1954cabdff1aSopenharmony_ci bits = SHOW_UBITS(re, gb, nnz) << (32-nnz); 1955cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, nnz); 1956cabdff1aSopenharmony_ci 1957cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 1958cabdff1aSopenharmony_ci if (nzt & 1<<j) { 1959cabdff1aSopenharmony_ci uint32_t b; 1960cabdff1aSopenharmony_ci int n; 1961cabdff1aSopenharmony_ci /* The total length of escape_sequence must be < 22 bits according 1962cabdff1aSopenharmony_ci to the specification (i.e. max is 111111110xxxxxxxxxxxx). */ 1963cabdff1aSopenharmony_ci UPDATE_CACHE(re, gb); 1964cabdff1aSopenharmony_ci b = GET_CACHE(re, gb); 1965cabdff1aSopenharmony_ci b = 31 - av_log2(~b); 1966cabdff1aSopenharmony_ci 1967cabdff1aSopenharmony_ci if (b > 8) { 1968cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "error in spectral data, ESC overflow\n"); 1969cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1970cabdff1aSopenharmony_ci } 1971cabdff1aSopenharmony_ci 1972cabdff1aSopenharmony_ci SKIP_BITS(re, gb, b + 1); 1973cabdff1aSopenharmony_ci b += 4; 1974cabdff1aSopenharmony_ci n = (1 << b) + SHOW_UBITS(re, gb, b); 1975cabdff1aSopenharmony_ci LAST_SKIP_BITS(re, gb, b); 1976cabdff1aSopenharmony_ci#if USE_FIXED 1977cabdff1aSopenharmony_ci v = n; 1978cabdff1aSopenharmony_ci if (bits & 1U<<31) 1979cabdff1aSopenharmony_ci v = -v; 1980cabdff1aSopenharmony_ci *icf++ = v; 1981cabdff1aSopenharmony_ci#else 1982cabdff1aSopenharmony_ci *icf++ = ff_cbrt_tab[n] | (bits & 1U<<31); 1983cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1984cabdff1aSopenharmony_ci bits <<= 1; 1985cabdff1aSopenharmony_ci } else { 1986cabdff1aSopenharmony_ci#if USE_FIXED 1987cabdff1aSopenharmony_ci v = cb_idx & 15; 1988cabdff1aSopenharmony_ci if (bits & 1U<<31) 1989cabdff1aSopenharmony_ci v = -v; 1990cabdff1aSopenharmony_ci *icf++ = v; 1991cabdff1aSopenharmony_ci#else 1992cabdff1aSopenharmony_ci unsigned v = ((const uint32_t*)vq)[cb_idx & 15]; 1993cabdff1aSopenharmony_ci *icf++ = (bits & 1U<<31) | v; 1994cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1995cabdff1aSopenharmony_ci bits <<= !!v; 1996cabdff1aSopenharmony_ci } 1997cabdff1aSopenharmony_ci cb_idx >>= 4; 1998cabdff1aSopenharmony_ci } 1999cabdff1aSopenharmony_ci } while (len -= 2); 2000cabdff1aSopenharmony_ci#if !USE_FIXED 2001cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_scalar(cfo, cfo, sf[idx], off_len); 2002cabdff1aSopenharmony_ci#endif /* !USE_FIXED */ 2003cabdff1aSopenharmony_ci } 2004cabdff1aSopenharmony_ci } 2005cabdff1aSopenharmony_ci 2006cabdff1aSopenharmony_ci CLOSE_READER(re, gb); 2007cabdff1aSopenharmony_ci } 2008cabdff1aSopenharmony_ci } 2009cabdff1aSopenharmony_ci coef += g_len << 7; 2010cabdff1aSopenharmony_ci } 2011cabdff1aSopenharmony_ci 2012cabdff1aSopenharmony_ci if (pulse_present) { 2013cabdff1aSopenharmony_ci idx = 0; 2014cabdff1aSopenharmony_ci for (i = 0; i < pulse->num_pulse; i++) { 2015cabdff1aSopenharmony_ci INTFLOAT co = coef_base[ pulse->pos[i] ]; 2016cabdff1aSopenharmony_ci while (offsets[idx + 1] <= pulse->pos[i]) 2017cabdff1aSopenharmony_ci idx++; 2018cabdff1aSopenharmony_ci if (band_type[idx] != NOISE_BT && sf[idx]) { 2019cabdff1aSopenharmony_ci INTFLOAT ico = -pulse->amp[i]; 2020cabdff1aSopenharmony_ci#if USE_FIXED 2021cabdff1aSopenharmony_ci if (co) { 2022cabdff1aSopenharmony_ci ico = co + (co > 0 ? -ico : ico); 2023cabdff1aSopenharmony_ci } 2024cabdff1aSopenharmony_ci coef_base[ pulse->pos[i] ] = ico; 2025cabdff1aSopenharmony_ci#else 2026cabdff1aSopenharmony_ci if (co) { 2027cabdff1aSopenharmony_ci co /= sf[idx]; 2028cabdff1aSopenharmony_ci ico = co / sqrtf(sqrtf(fabsf(co))) + (co > 0 ? -ico : ico); 2029cabdff1aSopenharmony_ci } 2030cabdff1aSopenharmony_ci coef_base[ pulse->pos[i] ] = cbrtf(fabsf(ico)) * ico * sf[idx]; 2031cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2032cabdff1aSopenharmony_ci } 2033cabdff1aSopenharmony_ci } 2034cabdff1aSopenharmony_ci } 2035cabdff1aSopenharmony_ci#if USE_FIXED 2036cabdff1aSopenharmony_ci coef = coef_base; 2037cabdff1aSopenharmony_ci idx = 0; 2038cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 2039cabdff1aSopenharmony_ci unsigned g_len = ics->group_len[g]; 2040cabdff1aSopenharmony_ci 2041cabdff1aSopenharmony_ci for (i = 0; i < ics->max_sfb; i++, idx++) { 2042cabdff1aSopenharmony_ci const unsigned cbt_m1 = band_type[idx] - 1; 2043cabdff1aSopenharmony_ci int *cfo = coef + offsets[i]; 2044cabdff1aSopenharmony_ci int off_len = offsets[i + 1] - offsets[i]; 2045cabdff1aSopenharmony_ci int group; 2046cabdff1aSopenharmony_ci 2047cabdff1aSopenharmony_ci if (cbt_m1 < NOISE_BT - 1) { 2048cabdff1aSopenharmony_ci for (group = 0; group < (int)g_len; group++, cfo+=128) { 2049cabdff1aSopenharmony_ci ac->vector_pow43(cfo, off_len); 2050cabdff1aSopenharmony_ci ac->subband_scale(cfo, cfo, sf[idx], 34, off_len, ac->avctx); 2051cabdff1aSopenharmony_ci } 2052cabdff1aSopenharmony_ci } 2053cabdff1aSopenharmony_ci } 2054cabdff1aSopenharmony_ci coef += g_len << 7; 2055cabdff1aSopenharmony_ci } 2056cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2057cabdff1aSopenharmony_ci return 0; 2058cabdff1aSopenharmony_ci} 2059cabdff1aSopenharmony_ci 2060cabdff1aSopenharmony_ci/** 2061cabdff1aSopenharmony_ci * Apply AAC-Main style frequency domain prediction. 2062cabdff1aSopenharmony_ci */ 2063cabdff1aSopenharmony_cistatic void apply_prediction(AACContext *ac, SingleChannelElement *sce) 2064cabdff1aSopenharmony_ci{ 2065cabdff1aSopenharmony_ci int sfb, k; 2066cabdff1aSopenharmony_ci 2067cabdff1aSopenharmony_ci if (!sce->ics.predictor_initialized) { 2068cabdff1aSopenharmony_ci reset_all_predictors(sce->predictor_state); 2069cabdff1aSopenharmony_ci sce->ics.predictor_initialized = 1; 2070cabdff1aSopenharmony_ci } 2071cabdff1aSopenharmony_ci 2072cabdff1aSopenharmony_ci if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { 2073cabdff1aSopenharmony_ci for (sfb = 0; 2074cabdff1aSopenharmony_ci sfb < ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index]; 2075cabdff1aSopenharmony_ci sfb++) { 2076cabdff1aSopenharmony_ci for (k = sce->ics.swb_offset[sfb]; 2077cabdff1aSopenharmony_ci k < sce->ics.swb_offset[sfb + 1]; 2078cabdff1aSopenharmony_ci k++) { 2079cabdff1aSopenharmony_ci predict(&sce->predictor_state[k], &sce->coeffs[k], 2080cabdff1aSopenharmony_ci sce->ics.predictor_present && 2081cabdff1aSopenharmony_ci sce->ics.prediction_used[sfb]); 2082cabdff1aSopenharmony_ci } 2083cabdff1aSopenharmony_ci } 2084cabdff1aSopenharmony_ci if (sce->ics.predictor_reset_group) 2085cabdff1aSopenharmony_ci reset_predictor_group(sce->predictor_state, 2086cabdff1aSopenharmony_ci sce->ics.predictor_reset_group); 2087cabdff1aSopenharmony_ci } else 2088cabdff1aSopenharmony_ci reset_all_predictors(sce->predictor_state); 2089cabdff1aSopenharmony_ci} 2090cabdff1aSopenharmony_ci 2091cabdff1aSopenharmony_cistatic void decode_gain_control(SingleChannelElement * sce, GetBitContext * gb) 2092cabdff1aSopenharmony_ci{ 2093cabdff1aSopenharmony_ci // wd_num, wd_test, aloc_size 2094cabdff1aSopenharmony_ci static const uint8_t gain_mode[4][3] = { 2095cabdff1aSopenharmony_ci {1, 0, 5}, // ONLY_LONG_SEQUENCE = 0, 2096cabdff1aSopenharmony_ci {2, 1, 2}, // LONG_START_SEQUENCE, 2097cabdff1aSopenharmony_ci {8, 0, 2}, // EIGHT_SHORT_SEQUENCE, 2098cabdff1aSopenharmony_ci {2, 1, 5}, // LONG_STOP_SEQUENCE 2099cabdff1aSopenharmony_ci }; 2100cabdff1aSopenharmony_ci 2101cabdff1aSopenharmony_ci const int mode = sce->ics.window_sequence[0]; 2102cabdff1aSopenharmony_ci uint8_t bd, wd, ad; 2103cabdff1aSopenharmony_ci 2104cabdff1aSopenharmony_ci // FIXME: Store the gain control data on |sce| and do something with it. 2105cabdff1aSopenharmony_ci uint8_t max_band = get_bits(gb, 2); 2106cabdff1aSopenharmony_ci for (bd = 0; bd < max_band; bd++) { 2107cabdff1aSopenharmony_ci for (wd = 0; wd < gain_mode[mode][0]; wd++) { 2108cabdff1aSopenharmony_ci uint8_t adjust_num = get_bits(gb, 3); 2109cabdff1aSopenharmony_ci for (ad = 0; ad < adjust_num; ad++) { 2110cabdff1aSopenharmony_ci skip_bits(gb, 4 + ((wd == 0 && gain_mode[mode][1]) 2111cabdff1aSopenharmony_ci ? 4 2112cabdff1aSopenharmony_ci : gain_mode[mode][2])); 2113cabdff1aSopenharmony_ci } 2114cabdff1aSopenharmony_ci } 2115cabdff1aSopenharmony_ci } 2116cabdff1aSopenharmony_ci} 2117cabdff1aSopenharmony_ci 2118cabdff1aSopenharmony_ci/** 2119cabdff1aSopenharmony_ci * Decode an individual_channel_stream payload; reference: table 4.44. 2120cabdff1aSopenharmony_ci * 2121cabdff1aSopenharmony_ci * @param common_window Channels have independent [0], or shared [1], Individual Channel Stream information. 2122cabdff1aSopenharmony_ci * @param scale_flag scalable [1] or non-scalable [0] AAC (Unused until scalable AAC is implemented.) 2123cabdff1aSopenharmony_ci * 2124cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 2125cabdff1aSopenharmony_ci */ 2126cabdff1aSopenharmony_cistatic int decode_ics(AACContext *ac, SingleChannelElement *sce, 2127cabdff1aSopenharmony_ci GetBitContext *gb, int common_window, int scale_flag) 2128cabdff1aSopenharmony_ci{ 2129cabdff1aSopenharmony_ci Pulse pulse; 2130cabdff1aSopenharmony_ci TemporalNoiseShaping *tns = &sce->tns; 2131cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 2132cabdff1aSopenharmony_ci INTFLOAT *out = sce->coeffs; 2133cabdff1aSopenharmony_ci int global_gain, eld_syntax, er_syntax, pulse_present = 0; 2134cabdff1aSopenharmony_ci int ret; 2135cabdff1aSopenharmony_ci 2136cabdff1aSopenharmony_ci eld_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD; 2137cabdff1aSopenharmony_ci er_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_LC || 2138cabdff1aSopenharmony_ci ac->oc[1].m4ac.object_type == AOT_ER_AAC_LTP || 2139cabdff1aSopenharmony_ci ac->oc[1].m4ac.object_type == AOT_ER_AAC_LD || 2140cabdff1aSopenharmony_ci ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD; 2141cabdff1aSopenharmony_ci 2142cabdff1aSopenharmony_ci /* This assignment is to silence a GCC warning about the variable being used 2143cabdff1aSopenharmony_ci * uninitialized when in fact it always is. 2144cabdff1aSopenharmony_ci */ 2145cabdff1aSopenharmony_ci pulse.num_pulse = 0; 2146cabdff1aSopenharmony_ci 2147cabdff1aSopenharmony_ci global_gain = get_bits(gb, 8); 2148cabdff1aSopenharmony_ci 2149cabdff1aSopenharmony_ci if (!common_window && !scale_flag) { 2150cabdff1aSopenharmony_ci ret = decode_ics_info(ac, ics, gb); 2151cabdff1aSopenharmony_ci if (ret < 0) 2152cabdff1aSopenharmony_ci goto fail; 2153cabdff1aSopenharmony_ci } 2154cabdff1aSopenharmony_ci 2155cabdff1aSopenharmony_ci if ((ret = decode_band_types(ac, sce->band_type, 2156cabdff1aSopenharmony_ci sce->band_type_run_end, gb, ics)) < 0) 2157cabdff1aSopenharmony_ci goto fail; 2158cabdff1aSopenharmony_ci if ((ret = decode_scalefactors(ac, sce->sf, gb, global_gain, ics, 2159cabdff1aSopenharmony_ci sce->band_type, sce->band_type_run_end)) < 0) 2160cabdff1aSopenharmony_ci goto fail; 2161cabdff1aSopenharmony_ci 2162cabdff1aSopenharmony_ci pulse_present = 0; 2163cabdff1aSopenharmony_ci if (!scale_flag) { 2164cabdff1aSopenharmony_ci if (!eld_syntax && (pulse_present = get_bits1(gb))) { 2165cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2166cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 2167cabdff1aSopenharmony_ci "Pulse tool not allowed in eight short sequence.\n"); 2168cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 2169cabdff1aSopenharmony_ci goto fail; 2170cabdff1aSopenharmony_ci } 2171cabdff1aSopenharmony_ci if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) { 2172cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 2173cabdff1aSopenharmony_ci "Pulse data corrupt or invalid.\n"); 2174cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 2175cabdff1aSopenharmony_ci goto fail; 2176cabdff1aSopenharmony_ci } 2177cabdff1aSopenharmony_ci } 2178cabdff1aSopenharmony_ci tns->present = get_bits1(gb); 2179cabdff1aSopenharmony_ci if (tns->present && !er_syntax) { 2180cabdff1aSopenharmony_ci ret = decode_tns(ac, tns, gb, ics); 2181cabdff1aSopenharmony_ci if (ret < 0) 2182cabdff1aSopenharmony_ci goto fail; 2183cabdff1aSopenharmony_ci } 2184cabdff1aSopenharmony_ci if (!eld_syntax && get_bits1(gb)) { 2185cabdff1aSopenharmony_ci decode_gain_control(sce, gb); 2186cabdff1aSopenharmony_ci if (!ac->warned_gain_control) { 2187cabdff1aSopenharmony_ci avpriv_report_missing_feature(ac->avctx, "Gain control"); 2188cabdff1aSopenharmony_ci ac->warned_gain_control = 1; 2189cabdff1aSopenharmony_ci } 2190cabdff1aSopenharmony_ci } 2191cabdff1aSopenharmony_ci // I see no textual basis in the spec for this occurring after SSR gain 2192cabdff1aSopenharmony_ci // control, but this is what both reference and real implmentations do 2193cabdff1aSopenharmony_ci if (tns->present && er_syntax) { 2194cabdff1aSopenharmony_ci ret = decode_tns(ac, tns, gb, ics); 2195cabdff1aSopenharmony_ci if (ret < 0) 2196cabdff1aSopenharmony_ci goto fail; 2197cabdff1aSopenharmony_ci } 2198cabdff1aSopenharmony_ci } 2199cabdff1aSopenharmony_ci 2200cabdff1aSopenharmony_ci ret = decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present, 2201cabdff1aSopenharmony_ci &pulse, ics, sce->band_type); 2202cabdff1aSopenharmony_ci if (ret < 0) 2203cabdff1aSopenharmony_ci goto fail; 2204cabdff1aSopenharmony_ci 2205cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN && !common_window) 2206cabdff1aSopenharmony_ci apply_prediction(ac, sce); 2207cabdff1aSopenharmony_ci 2208cabdff1aSopenharmony_ci return 0; 2209cabdff1aSopenharmony_cifail: 2210cabdff1aSopenharmony_ci tns->present = 0; 2211cabdff1aSopenharmony_ci return ret; 2212cabdff1aSopenharmony_ci} 2213cabdff1aSopenharmony_ci 2214cabdff1aSopenharmony_ci/** 2215cabdff1aSopenharmony_ci * Mid/Side stereo decoding; reference: 4.6.8.1.3. 2216cabdff1aSopenharmony_ci */ 2217cabdff1aSopenharmony_cistatic void apply_mid_side_stereo(AACContext *ac, ChannelElement *cpe) 2218cabdff1aSopenharmony_ci{ 2219cabdff1aSopenharmony_ci const IndividualChannelStream *ics = &cpe->ch[0].ics; 2220cabdff1aSopenharmony_ci INTFLOAT *ch0 = cpe->ch[0].coeffs; 2221cabdff1aSopenharmony_ci INTFLOAT *ch1 = cpe->ch[1].coeffs; 2222cabdff1aSopenharmony_ci int g, i, group, idx = 0; 2223cabdff1aSopenharmony_ci const uint16_t *offsets = ics->swb_offset; 2224cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 2225cabdff1aSopenharmony_ci for (i = 0; i < ics->max_sfb; i++, idx++) { 2226cabdff1aSopenharmony_ci if (cpe->ms_mask[idx] && 2227cabdff1aSopenharmony_ci cpe->ch[0].band_type[idx] < NOISE_BT && 2228cabdff1aSopenharmony_ci cpe->ch[1].band_type[idx] < NOISE_BT) { 2229cabdff1aSopenharmony_ci#if USE_FIXED 2230cabdff1aSopenharmony_ci for (group = 0; group < ics->group_len[g]; group++) { 2231cabdff1aSopenharmony_ci ac->fdsp->butterflies_fixed(ch0 + group * 128 + offsets[i], 2232cabdff1aSopenharmony_ci ch1 + group * 128 + offsets[i], 2233cabdff1aSopenharmony_ci offsets[i+1] - offsets[i]); 2234cabdff1aSopenharmony_ci#else 2235cabdff1aSopenharmony_ci for (group = 0; group < ics->group_len[g]; group++) { 2236cabdff1aSopenharmony_ci ac->fdsp->butterflies_float(ch0 + group * 128 + offsets[i], 2237cabdff1aSopenharmony_ci ch1 + group * 128 + offsets[i], 2238cabdff1aSopenharmony_ci offsets[i+1] - offsets[i]); 2239cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2240cabdff1aSopenharmony_ci } 2241cabdff1aSopenharmony_ci } 2242cabdff1aSopenharmony_ci } 2243cabdff1aSopenharmony_ci ch0 += ics->group_len[g] * 128; 2244cabdff1aSopenharmony_ci ch1 += ics->group_len[g] * 128; 2245cabdff1aSopenharmony_ci } 2246cabdff1aSopenharmony_ci} 2247cabdff1aSopenharmony_ci 2248cabdff1aSopenharmony_ci/** 2249cabdff1aSopenharmony_ci * intensity stereo decoding; reference: 4.6.8.2.3 2250cabdff1aSopenharmony_ci * 2251cabdff1aSopenharmony_ci * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; 2252cabdff1aSopenharmony_ci * [1] mask is decoded from bitstream; [2] mask is all 1s; 2253cabdff1aSopenharmony_ci * [3] reserved for scalable AAC 2254cabdff1aSopenharmony_ci */ 2255cabdff1aSopenharmony_cistatic void apply_intensity_stereo(AACContext *ac, 2256cabdff1aSopenharmony_ci ChannelElement *cpe, int ms_present) 2257cabdff1aSopenharmony_ci{ 2258cabdff1aSopenharmony_ci const IndividualChannelStream *ics = &cpe->ch[1].ics; 2259cabdff1aSopenharmony_ci SingleChannelElement *sce1 = &cpe->ch[1]; 2260cabdff1aSopenharmony_ci INTFLOAT *coef0 = cpe->ch[0].coeffs, *coef1 = cpe->ch[1].coeffs; 2261cabdff1aSopenharmony_ci const uint16_t *offsets = ics->swb_offset; 2262cabdff1aSopenharmony_ci int g, group, i, idx = 0; 2263cabdff1aSopenharmony_ci int c; 2264cabdff1aSopenharmony_ci INTFLOAT scale; 2265cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 2266cabdff1aSopenharmony_ci for (i = 0; i < ics->max_sfb;) { 2267cabdff1aSopenharmony_ci if (sce1->band_type[idx] == INTENSITY_BT || 2268cabdff1aSopenharmony_ci sce1->band_type[idx] == INTENSITY_BT2) { 2269cabdff1aSopenharmony_ci const int bt_run_end = sce1->band_type_run_end[idx]; 2270cabdff1aSopenharmony_ci for (; i < bt_run_end; i++, idx++) { 2271cabdff1aSopenharmony_ci c = -1 + 2 * (sce1->band_type[idx] - 14); 2272cabdff1aSopenharmony_ci if (ms_present) 2273cabdff1aSopenharmony_ci c *= 1 - 2 * cpe->ms_mask[idx]; 2274cabdff1aSopenharmony_ci scale = c * sce1->sf[idx]; 2275cabdff1aSopenharmony_ci for (group = 0; group < ics->group_len[g]; group++) 2276cabdff1aSopenharmony_ci#if USE_FIXED 2277cabdff1aSopenharmony_ci ac->subband_scale(coef1 + group * 128 + offsets[i], 2278cabdff1aSopenharmony_ci coef0 + group * 128 + offsets[i], 2279cabdff1aSopenharmony_ci scale, 2280cabdff1aSopenharmony_ci 23, 2281cabdff1aSopenharmony_ci offsets[i + 1] - offsets[i] ,ac->avctx); 2282cabdff1aSopenharmony_ci#else 2283cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_scalar(coef1 + group * 128 + offsets[i], 2284cabdff1aSopenharmony_ci coef0 + group * 128 + offsets[i], 2285cabdff1aSopenharmony_ci scale, 2286cabdff1aSopenharmony_ci offsets[i + 1] - offsets[i]); 2287cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2288cabdff1aSopenharmony_ci } 2289cabdff1aSopenharmony_ci } else { 2290cabdff1aSopenharmony_ci int bt_run_end = sce1->band_type_run_end[idx]; 2291cabdff1aSopenharmony_ci idx += bt_run_end - i; 2292cabdff1aSopenharmony_ci i = bt_run_end; 2293cabdff1aSopenharmony_ci } 2294cabdff1aSopenharmony_ci } 2295cabdff1aSopenharmony_ci coef0 += ics->group_len[g] * 128; 2296cabdff1aSopenharmony_ci coef1 += ics->group_len[g] * 128; 2297cabdff1aSopenharmony_ci } 2298cabdff1aSopenharmony_ci} 2299cabdff1aSopenharmony_ci 2300cabdff1aSopenharmony_ci/** 2301cabdff1aSopenharmony_ci * Decode a channel_pair_element; reference: table 4.4. 2302cabdff1aSopenharmony_ci * 2303cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 2304cabdff1aSopenharmony_ci */ 2305cabdff1aSopenharmony_cistatic int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe) 2306cabdff1aSopenharmony_ci{ 2307cabdff1aSopenharmony_ci int i, ret, common_window, ms_present = 0; 2308cabdff1aSopenharmony_ci int eld_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD; 2309cabdff1aSopenharmony_ci 2310cabdff1aSopenharmony_ci common_window = eld_syntax || get_bits1(gb); 2311cabdff1aSopenharmony_ci if (common_window) { 2312cabdff1aSopenharmony_ci if (decode_ics_info(ac, &cpe->ch[0].ics, gb)) 2313cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2314cabdff1aSopenharmony_ci i = cpe->ch[1].ics.use_kb_window[0]; 2315cabdff1aSopenharmony_ci cpe->ch[1].ics = cpe->ch[0].ics; 2316cabdff1aSopenharmony_ci cpe->ch[1].ics.use_kb_window[1] = i; 2317cabdff1aSopenharmony_ci if (cpe->ch[1].ics.predictor_present && 2318cabdff1aSopenharmony_ci (ac->oc[1].m4ac.object_type != AOT_AAC_MAIN)) 2319cabdff1aSopenharmony_ci if ((cpe->ch[1].ics.ltp.present = get_bits(gb, 1))) 2320cabdff1aSopenharmony_ci decode_ltp(&cpe->ch[1].ics.ltp, gb, cpe->ch[1].ics.max_sfb); 2321cabdff1aSopenharmony_ci ms_present = get_bits(gb, 2); 2322cabdff1aSopenharmony_ci if (ms_present == 3) { 2323cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "ms_present = 3 is reserved.\n"); 2324cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2325cabdff1aSopenharmony_ci } else if (ms_present) 2326cabdff1aSopenharmony_ci decode_mid_side_stereo(cpe, gb, ms_present); 2327cabdff1aSopenharmony_ci } 2328cabdff1aSopenharmony_ci if ((ret = decode_ics(ac, &cpe->ch[0], gb, common_window, 0))) 2329cabdff1aSopenharmony_ci return ret; 2330cabdff1aSopenharmony_ci if ((ret = decode_ics(ac, &cpe->ch[1], gb, common_window, 0))) 2331cabdff1aSopenharmony_ci return ret; 2332cabdff1aSopenharmony_ci 2333cabdff1aSopenharmony_ci if (common_window) { 2334cabdff1aSopenharmony_ci if (ms_present) 2335cabdff1aSopenharmony_ci apply_mid_side_stereo(ac, cpe); 2336cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN) { 2337cabdff1aSopenharmony_ci apply_prediction(ac, &cpe->ch[0]); 2338cabdff1aSopenharmony_ci apply_prediction(ac, &cpe->ch[1]); 2339cabdff1aSopenharmony_ci } 2340cabdff1aSopenharmony_ci } 2341cabdff1aSopenharmony_ci 2342cabdff1aSopenharmony_ci apply_intensity_stereo(ac, cpe, ms_present); 2343cabdff1aSopenharmony_ci return 0; 2344cabdff1aSopenharmony_ci} 2345cabdff1aSopenharmony_ci 2346cabdff1aSopenharmony_cistatic const float cce_scale[] = { 2347cabdff1aSopenharmony_ci 1.09050773266525765921, //2^(1/8) 2348cabdff1aSopenharmony_ci 1.18920711500272106672, //2^(1/4) 2349cabdff1aSopenharmony_ci M_SQRT2, 2350cabdff1aSopenharmony_ci 2, 2351cabdff1aSopenharmony_ci}; 2352cabdff1aSopenharmony_ci 2353cabdff1aSopenharmony_ci/** 2354cabdff1aSopenharmony_ci * Decode coupling_channel_element; reference: table 4.8. 2355cabdff1aSopenharmony_ci * 2356cabdff1aSopenharmony_ci * @return Returns error status. 0 - OK, !0 - error 2357cabdff1aSopenharmony_ci */ 2358cabdff1aSopenharmony_cistatic int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che) 2359cabdff1aSopenharmony_ci{ 2360cabdff1aSopenharmony_ci int num_gain = 0; 2361cabdff1aSopenharmony_ci int c, g, sfb, ret; 2362cabdff1aSopenharmony_ci int sign; 2363cabdff1aSopenharmony_ci INTFLOAT scale; 2364cabdff1aSopenharmony_ci SingleChannelElement *sce = &che->ch[0]; 2365cabdff1aSopenharmony_ci ChannelCoupling *coup = &che->coup; 2366cabdff1aSopenharmony_ci 2367cabdff1aSopenharmony_ci coup->coupling_point = 2 * get_bits1(gb); 2368cabdff1aSopenharmony_ci coup->num_coupled = get_bits(gb, 3); 2369cabdff1aSopenharmony_ci for (c = 0; c <= coup->num_coupled; c++) { 2370cabdff1aSopenharmony_ci num_gain++; 2371cabdff1aSopenharmony_ci coup->type[c] = get_bits1(gb) ? TYPE_CPE : TYPE_SCE; 2372cabdff1aSopenharmony_ci coup->id_select[c] = get_bits(gb, 4); 2373cabdff1aSopenharmony_ci if (coup->type[c] == TYPE_CPE) { 2374cabdff1aSopenharmony_ci coup->ch_select[c] = get_bits(gb, 2); 2375cabdff1aSopenharmony_ci if (coup->ch_select[c] == 3) 2376cabdff1aSopenharmony_ci num_gain++; 2377cabdff1aSopenharmony_ci } else 2378cabdff1aSopenharmony_ci coup->ch_select[c] = 2; 2379cabdff1aSopenharmony_ci } 2380cabdff1aSopenharmony_ci coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1); 2381cabdff1aSopenharmony_ci 2382cabdff1aSopenharmony_ci sign = get_bits(gb, 1); 2383cabdff1aSopenharmony_ci#if USE_FIXED 2384cabdff1aSopenharmony_ci scale = get_bits(gb, 2); 2385cabdff1aSopenharmony_ci#else 2386cabdff1aSopenharmony_ci scale = cce_scale[get_bits(gb, 2)]; 2387cabdff1aSopenharmony_ci#endif 2388cabdff1aSopenharmony_ci 2389cabdff1aSopenharmony_ci if ((ret = decode_ics(ac, sce, gb, 0, 0))) 2390cabdff1aSopenharmony_ci return ret; 2391cabdff1aSopenharmony_ci 2392cabdff1aSopenharmony_ci for (c = 0; c < num_gain; c++) { 2393cabdff1aSopenharmony_ci int idx = 0; 2394cabdff1aSopenharmony_ci int cge = 1; 2395cabdff1aSopenharmony_ci int gain = 0; 2396cabdff1aSopenharmony_ci INTFLOAT gain_cache = FIXR10(1.); 2397cabdff1aSopenharmony_ci if (c) { 2398cabdff1aSopenharmony_ci cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb); 2399cabdff1aSopenharmony_ci gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0; 2400cabdff1aSopenharmony_ci gain_cache = GET_GAIN(scale, gain); 2401cabdff1aSopenharmony_ci#if USE_FIXED 2402cabdff1aSopenharmony_ci if ((abs(gain_cache)-1024) >> 3 > 30) 2403cabdff1aSopenharmony_ci return AVERROR(ERANGE); 2404cabdff1aSopenharmony_ci#endif 2405cabdff1aSopenharmony_ci } 2406cabdff1aSopenharmony_ci if (coup->coupling_point == AFTER_IMDCT) { 2407cabdff1aSopenharmony_ci coup->gain[c][0] = gain_cache; 2408cabdff1aSopenharmony_ci } else { 2409cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_window_groups; g++) { 2410cabdff1aSopenharmony_ci for (sfb = 0; sfb < sce->ics.max_sfb; sfb++, idx++) { 2411cabdff1aSopenharmony_ci if (sce->band_type[idx] != ZERO_BT) { 2412cabdff1aSopenharmony_ci if (!cge) { 2413cabdff1aSopenharmony_ci int t = get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; 2414cabdff1aSopenharmony_ci if (t) { 2415cabdff1aSopenharmony_ci int s = 1; 2416cabdff1aSopenharmony_ci t = gain += t; 2417cabdff1aSopenharmony_ci if (sign) { 2418cabdff1aSopenharmony_ci s -= 2 * (t & 0x1); 2419cabdff1aSopenharmony_ci t >>= 1; 2420cabdff1aSopenharmony_ci } 2421cabdff1aSopenharmony_ci gain_cache = GET_GAIN(scale, t) * s; 2422cabdff1aSopenharmony_ci#if USE_FIXED 2423cabdff1aSopenharmony_ci if ((abs(gain_cache)-1024) >> 3 > 30) 2424cabdff1aSopenharmony_ci return AVERROR(ERANGE); 2425cabdff1aSopenharmony_ci#endif 2426cabdff1aSopenharmony_ci } 2427cabdff1aSopenharmony_ci } 2428cabdff1aSopenharmony_ci coup->gain[c][idx] = gain_cache; 2429cabdff1aSopenharmony_ci } 2430cabdff1aSopenharmony_ci } 2431cabdff1aSopenharmony_ci } 2432cabdff1aSopenharmony_ci } 2433cabdff1aSopenharmony_ci } 2434cabdff1aSopenharmony_ci return 0; 2435cabdff1aSopenharmony_ci} 2436cabdff1aSopenharmony_ci 2437cabdff1aSopenharmony_ci/** 2438cabdff1aSopenharmony_ci * Parse whether channels are to be excluded from Dynamic Range Compression; reference: table 4.53. 2439cabdff1aSopenharmony_ci * 2440cabdff1aSopenharmony_ci * @return Returns number of bytes consumed. 2441cabdff1aSopenharmony_ci */ 2442cabdff1aSopenharmony_cistatic int decode_drc_channel_exclusions(DynamicRangeControl *che_drc, 2443cabdff1aSopenharmony_ci GetBitContext *gb) 2444cabdff1aSopenharmony_ci{ 2445cabdff1aSopenharmony_ci int i; 2446cabdff1aSopenharmony_ci int num_excl_chan = 0; 2447cabdff1aSopenharmony_ci 2448cabdff1aSopenharmony_ci do { 2449cabdff1aSopenharmony_ci for (i = 0; i < 7; i++) 2450cabdff1aSopenharmony_ci che_drc->exclude_mask[num_excl_chan++] = get_bits1(gb); 2451cabdff1aSopenharmony_ci } while (num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb)); 2452cabdff1aSopenharmony_ci 2453cabdff1aSopenharmony_ci return num_excl_chan / 7; 2454cabdff1aSopenharmony_ci} 2455cabdff1aSopenharmony_ci 2456cabdff1aSopenharmony_ci/** 2457cabdff1aSopenharmony_ci * Decode dynamic range information; reference: table 4.52. 2458cabdff1aSopenharmony_ci * 2459cabdff1aSopenharmony_ci * @return Returns number of bytes consumed. 2460cabdff1aSopenharmony_ci */ 2461cabdff1aSopenharmony_cistatic int decode_dynamic_range(DynamicRangeControl *che_drc, 2462cabdff1aSopenharmony_ci GetBitContext *gb) 2463cabdff1aSopenharmony_ci{ 2464cabdff1aSopenharmony_ci int n = 1; 2465cabdff1aSopenharmony_ci int drc_num_bands = 1; 2466cabdff1aSopenharmony_ci int i; 2467cabdff1aSopenharmony_ci 2468cabdff1aSopenharmony_ci /* pce_tag_present? */ 2469cabdff1aSopenharmony_ci if (get_bits1(gb)) { 2470cabdff1aSopenharmony_ci che_drc->pce_instance_tag = get_bits(gb, 4); 2471cabdff1aSopenharmony_ci skip_bits(gb, 4); // tag_reserved_bits 2472cabdff1aSopenharmony_ci n++; 2473cabdff1aSopenharmony_ci } 2474cabdff1aSopenharmony_ci 2475cabdff1aSopenharmony_ci /* excluded_chns_present? */ 2476cabdff1aSopenharmony_ci if (get_bits1(gb)) { 2477cabdff1aSopenharmony_ci n += decode_drc_channel_exclusions(che_drc, gb); 2478cabdff1aSopenharmony_ci } 2479cabdff1aSopenharmony_ci 2480cabdff1aSopenharmony_ci /* drc_bands_present? */ 2481cabdff1aSopenharmony_ci if (get_bits1(gb)) { 2482cabdff1aSopenharmony_ci che_drc->band_incr = get_bits(gb, 4); 2483cabdff1aSopenharmony_ci che_drc->interpolation_scheme = get_bits(gb, 4); 2484cabdff1aSopenharmony_ci n++; 2485cabdff1aSopenharmony_ci drc_num_bands += che_drc->band_incr; 2486cabdff1aSopenharmony_ci for (i = 0; i < drc_num_bands; i++) { 2487cabdff1aSopenharmony_ci che_drc->band_top[i] = get_bits(gb, 8); 2488cabdff1aSopenharmony_ci n++; 2489cabdff1aSopenharmony_ci } 2490cabdff1aSopenharmony_ci } 2491cabdff1aSopenharmony_ci 2492cabdff1aSopenharmony_ci /* prog_ref_level_present? */ 2493cabdff1aSopenharmony_ci if (get_bits1(gb)) { 2494cabdff1aSopenharmony_ci che_drc->prog_ref_level = get_bits(gb, 7); 2495cabdff1aSopenharmony_ci skip_bits1(gb); // prog_ref_level_reserved_bits 2496cabdff1aSopenharmony_ci n++; 2497cabdff1aSopenharmony_ci } 2498cabdff1aSopenharmony_ci 2499cabdff1aSopenharmony_ci for (i = 0; i < drc_num_bands; i++) { 2500cabdff1aSopenharmony_ci che_drc->dyn_rng_sgn[i] = get_bits1(gb); 2501cabdff1aSopenharmony_ci che_drc->dyn_rng_ctl[i] = get_bits(gb, 7); 2502cabdff1aSopenharmony_ci n++; 2503cabdff1aSopenharmony_ci } 2504cabdff1aSopenharmony_ci 2505cabdff1aSopenharmony_ci return n; 2506cabdff1aSopenharmony_ci} 2507cabdff1aSopenharmony_ci 2508cabdff1aSopenharmony_cistatic int decode_fill(AACContext *ac, GetBitContext *gb, int len) { 2509cabdff1aSopenharmony_ci uint8_t buf[256]; 2510cabdff1aSopenharmony_ci int i, major, minor; 2511cabdff1aSopenharmony_ci 2512cabdff1aSopenharmony_ci if (len < 13+7*8) 2513cabdff1aSopenharmony_ci goto unknown; 2514cabdff1aSopenharmony_ci 2515cabdff1aSopenharmony_ci get_bits(gb, 13); len -= 13; 2516cabdff1aSopenharmony_ci 2517cabdff1aSopenharmony_ci for(i=0; i+1<sizeof(buf) && len>=8; i++, len-=8) 2518cabdff1aSopenharmony_ci buf[i] = get_bits(gb, 8); 2519cabdff1aSopenharmony_ci 2520cabdff1aSopenharmony_ci buf[i] = 0; 2521cabdff1aSopenharmony_ci if (ac->avctx->debug & FF_DEBUG_PICT_INFO) 2522cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_DEBUG, "FILL:%s\n", buf); 2523cabdff1aSopenharmony_ci 2524cabdff1aSopenharmony_ci if (sscanf(buf, "libfaac %d.%d", &major, &minor) == 2){ 2525cabdff1aSopenharmony_ci ac->avctx->internal->skip_samples = 1024; 2526cabdff1aSopenharmony_ci } 2527cabdff1aSopenharmony_ci 2528cabdff1aSopenharmony_ciunknown: 2529cabdff1aSopenharmony_ci skip_bits_long(gb, len); 2530cabdff1aSopenharmony_ci 2531cabdff1aSopenharmony_ci return 0; 2532cabdff1aSopenharmony_ci} 2533cabdff1aSopenharmony_ci 2534cabdff1aSopenharmony_ci/** 2535cabdff1aSopenharmony_ci * Decode extension data (incomplete); reference: table 4.51. 2536cabdff1aSopenharmony_ci * 2537cabdff1aSopenharmony_ci * @param cnt length of TYPE_FIL syntactic element in bytes 2538cabdff1aSopenharmony_ci * 2539cabdff1aSopenharmony_ci * @return Returns number of bytes consumed 2540cabdff1aSopenharmony_ci */ 2541cabdff1aSopenharmony_cistatic int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt, 2542cabdff1aSopenharmony_ci ChannelElement *che, enum RawDataBlockType elem_type) 2543cabdff1aSopenharmony_ci{ 2544cabdff1aSopenharmony_ci int crc_flag = 0; 2545cabdff1aSopenharmony_ci int res = cnt; 2546cabdff1aSopenharmony_ci int type = get_bits(gb, 4); 2547cabdff1aSopenharmony_ci 2548cabdff1aSopenharmony_ci if (ac->avctx->debug & FF_DEBUG_STARTCODE) 2549cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_DEBUG, "extension type: %d len:%d\n", type, cnt); 2550cabdff1aSopenharmony_ci 2551cabdff1aSopenharmony_ci switch (type) { // extension type 2552cabdff1aSopenharmony_ci case EXT_SBR_DATA_CRC: 2553cabdff1aSopenharmony_ci crc_flag++; 2554cabdff1aSopenharmony_ci case EXT_SBR_DATA: 2555cabdff1aSopenharmony_ci if (!che) { 2556cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "SBR was found before the first channel element.\n"); 2557cabdff1aSopenharmony_ci return res; 2558cabdff1aSopenharmony_ci } else if (ac->oc[1].m4ac.frame_length_short) { 2559cabdff1aSopenharmony_ci if (!ac->warned_960_sbr) 2560cabdff1aSopenharmony_ci avpriv_report_missing_feature(ac->avctx, 2561cabdff1aSopenharmony_ci "SBR with 960 frame length"); 2562cabdff1aSopenharmony_ci ac->warned_960_sbr = 1; 2563cabdff1aSopenharmony_ci skip_bits_long(gb, 8 * cnt - 4); 2564cabdff1aSopenharmony_ci return res; 2565cabdff1aSopenharmony_ci } else if (!ac->oc[1].m4ac.sbr) { 2566cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "SBR signaled to be not-present but was found in the bitstream.\n"); 2567cabdff1aSopenharmony_ci skip_bits_long(gb, 8 * cnt - 4); 2568cabdff1aSopenharmony_ci return res; 2569cabdff1aSopenharmony_ci } else if (ac->oc[1].m4ac.sbr == -1 && ac->oc[1].status == OC_LOCKED) { 2570cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Implicit SBR was found with a first occurrence after the first frame.\n"); 2571cabdff1aSopenharmony_ci skip_bits_long(gb, 8 * cnt - 4); 2572cabdff1aSopenharmony_ci return res; 2573cabdff1aSopenharmony_ci } else if (ac->oc[1].m4ac.ps == -1 && ac->oc[1].status < OC_LOCKED && 2574cabdff1aSopenharmony_ci ac->avctx->ch_layout.nb_channels == 1) { 2575cabdff1aSopenharmony_ci ac->oc[1].m4ac.sbr = 1; 2576cabdff1aSopenharmony_ci ac->oc[1].m4ac.ps = 1; 2577cabdff1aSopenharmony_ci ac->avctx->profile = FF_PROFILE_AAC_HE_V2; 2578cabdff1aSopenharmony_ci output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags, 2579cabdff1aSopenharmony_ci ac->oc[1].status, 1); 2580cabdff1aSopenharmony_ci } else { 2581cabdff1aSopenharmony_ci ac->oc[1].m4ac.sbr = 1; 2582cabdff1aSopenharmony_ci ac->avctx->profile = FF_PROFILE_AAC_HE; 2583cabdff1aSopenharmony_ci } 2584cabdff1aSopenharmony_ci res = AAC_RENAME(ff_decode_sbr_extension)(ac, &che->sbr, gb, crc_flag, cnt, elem_type); 2585cabdff1aSopenharmony_ci break; 2586cabdff1aSopenharmony_ci case EXT_DYNAMIC_RANGE: 2587cabdff1aSopenharmony_ci res = decode_dynamic_range(&ac->che_drc, gb); 2588cabdff1aSopenharmony_ci break; 2589cabdff1aSopenharmony_ci case EXT_FILL: 2590cabdff1aSopenharmony_ci decode_fill(ac, gb, 8 * cnt - 4); 2591cabdff1aSopenharmony_ci break; 2592cabdff1aSopenharmony_ci case EXT_FILL_DATA: 2593cabdff1aSopenharmony_ci case EXT_DATA_ELEMENT: 2594cabdff1aSopenharmony_ci default: 2595cabdff1aSopenharmony_ci skip_bits_long(gb, 8 * cnt - 4); 2596cabdff1aSopenharmony_ci break; 2597cabdff1aSopenharmony_ci }; 2598cabdff1aSopenharmony_ci return res; 2599cabdff1aSopenharmony_ci} 2600cabdff1aSopenharmony_ci 2601cabdff1aSopenharmony_ci/** 2602cabdff1aSopenharmony_ci * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3. 2603cabdff1aSopenharmony_ci * 2604cabdff1aSopenharmony_ci * @param decode 1 if tool is used normally, 0 if tool is used in LTP. 2605cabdff1aSopenharmony_ci * @param coef spectral coefficients 2606cabdff1aSopenharmony_ci */ 2607cabdff1aSopenharmony_cistatic void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns, 2608cabdff1aSopenharmony_ci IndividualChannelStream *ics, int decode) 2609cabdff1aSopenharmony_ci{ 2610cabdff1aSopenharmony_ci const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb); 2611cabdff1aSopenharmony_ci int w, filt, m, i; 2612cabdff1aSopenharmony_ci int bottom, top, order, start, end, size, inc; 2613cabdff1aSopenharmony_ci INTFLOAT lpc[TNS_MAX_ORDER]; 2614cabdff1aSopenharmony_ci INTFLOAT tmp[TNS_MAX_ORDER+1]; 2615cabdff1aSopenharmony_ci UINTFLOAT *coef = coef_param; 2616cabdff1aSopenharmony_ci 2617cabdff1aSopenharmony_ci if(!mmm) 2618cabdff1aSopenharmony_ci return; 2619cabdff1aSopenharmony_ci 2620cabdff1aSopenharmony_ci for (w = 0; w < ics->num_windows; w++) { 2621cabdff1aSopenharmony_ci bottom = ics->num_swb; 2622cabdff1aSopenharmony_ci for (filt = 0; filt < tns->n_filt[w]; filt++) { 2623cabdff1aSopenharmony_ci top = bottom; 2624cabdff1aSopenharmony_ci bottom = FFMAX(0, top - tns->length[w][filt]); 2625cabdff1aSopenharmony_ci order = tns->order[w][filt]; 2626cabdff1aSopenharmony_ci if (order == 0) 2627cabdff1aSopenharmony_ci continue; 2628cabdff1aSopenharmony_ci 2629cabdff1aSopenharmony_ci // tns_decode_coef 2630cabdff1aSopenharmony_ci AAC_RENAME(compute_lpc_coefs)(tns->coef[w][filt], order, lpc, 0, 0, 0); 2631cabdff1aSopenharmony_ci 2632cabdff1aSopenharmony_ci start = ics->swb_offset[FFMIN(bottom, mmm)]; 2633cabdff1aSopenharmony_ci end = ics->swb_offset[FFMIN( top, mmm)]; 2634cabdff1aSopenharmony_ci if ((size = end - start) <= 0) 2635cabdff1aSopenharmony_ci continue; 2636cabdff1aSopenharmony_ci if (tns->direction[w][filt]) { 2637cabdff1aSopenharmony_ci inc = -1; 2638cabdff1aSopenharmony_ci start = end - 1; 2639cabdff1aSopenharmony_ci } else { 2640cabdff1aSopenharmony_ci inc = 1; 2641cabdff1aSopenharmony_ci } 2642cabdff1aSopenharmony_ci start += w * 128; 2643cabdff1aSopenharmony_ci 2644cabdff1aSopenharmony_ci if (decode) { 2645cabdff1aSopenharmony_ci // ar filter 2646cabdff1aSopenharmony_ci for (m = 0; m < size; m++, start += inc) 2647cabdff1aSopenharmony_ci for (i = 1; i <= FFMIN(m, order); i++) 2648cabdff1aSopenharmony_ci coef[start] -= AAC_MUL26((INTFLOAT)coef[start - i * inc], lpc[i - 1]); 2649cabdff1aSopenharmony_ci } else { 2650cabdff1aSopenharmony_ci // ma filter 2651cabdff1aSopenharmony_ci for (m = 0; m < size; m++, start += inc) { 2652cabdff1aSopenharmony_ci tmp[0] = coef[start]; 2653cabdff1aSopenharmony_ci for (i = 1; i <= FFMIN(m, order); i++) 2654cabdff1aSopenharmony_ci coef[start] += AAC_MUL26(tmp[i], lpc[i - 1]); 2655cabdff1aSopenharmony_ci for (i = order; i > 0; i--) 2656cabdff1aSopenharmony_ci tmp[i] = tmp[i - 1]; 2657cabdff1aSopenharmony_ci } 2658cabdff1aSopenharmony_ci } 2659cabdff1aSopenharmony_ci } 2660cabdff1aSopenharmony_ci } 2661cabdff1aSopenharmony_ci} 2662cabdff1aSopenharmony_ci 2663cabdff1aSopenharmony_ci/** 2664cabdff1aSopenharmony_ci * Apply windowing and MDCT to obtain the spectral 2665cabdff1aSopenharmony_ci * coefficient from the predicted sample by LTP. 2666cabdff1aSopenharmony_ci */ 2667cabdff1aSopenharmony_cistatic void windowing_and_mdct_ltp(AACContext *ac, INTFLOAT *out, 2668cabdff1aSopenharmony_ci INTFLOAT *in, IndividualChannelStream *ics) 2669cabdff1aSopenharmony_ci{ 2670cabdff1aSopenharmony_ci const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); 2671cabdff1aSopenharmony_ci const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); 2672cabdff1aSopenharmony_ci const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); 2673cabdff1aSopenharmony_ci const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); 2674cabdff1aSopenharmony_ci 2675cabdff1aSopenharmony_ci if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) { 2676cabdff1aSopenharmony_ci ac->fdsp->vector_fmul(in, in, lwindow_prev, 1024); 2677cabdff1aSopenharmony_ci } else { 2678cabdff1aSopenharmony_ci memset(in, 0, 448 * sizeof(*in)); 2679cabdff1aSopenharmony_ci ac->fdsp->vector_fmul(in + 448, in + 448, swindow_prev, 128); 2680cabdff1aSopenharmony_ci } 2681cabdff1aSopenharmony_ci if (ics->window_sequence[0] != LONG_START_SEQUENCE) { 2682cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024); 2683cabdff1aSopenharmony_ci } else { 2684cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128); 2685cabdff1aSopenharmony_ci memset(in + 1024 + 576, 0, 448 * sizeof(*in)); 2686cabdff1aSopenharmony_ci } 2687cabdff1aSopenharmony_ci ac->mdct_ltp.mdct_calc(&ac->mdct_ltp, out, in); 2688cabdff1aSopenharmony_ci} 2689cabdff1aSopenharmony_ci 2690cabdff1aSopenharmony_ci/** 2691cabdff1aSopenharmony_ci * Apply the long term prediction 2692cabdff1aSopenharmony_ci */ 2693cabdff1aSopenharmony_cistatic void apply_ltp(AACContext *ac, SingleChannelElement *sce) 2694cabdff1aSopenharmony_ci{ 2695cabdff1aSopenharmony_ci const LongTermPrediction *ltp = &sce->ics.ltp; 2696cabdff1aSopenharmony_ci const uint16_t *offsets = sce->ics.swb_offset; 2697cabdff1aSopenharmony_ci int i, sfb; 2698cabdff1aSopenharmony_ci 2699cabdff1aSopenharmony_ci if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { 2700cabdff1aSopenharmony_ci INTFLOAT *predTime = sce->ret; 2701cabdff1aSopenharmony_ci INTFLOAT *predFreq = ac->buf_mdct; 2702cabdff1aSopenharmony_ci int16_t num_samples = 2048; 2703cabdff1aSopenharmony_ci 2704cabdff1aSopenharmony_ci if (ltp->lag < 1024) 2705cabdff1aSopenharmony_ci num_samples = ltp->lag + 1024; 2706cabdff1aSopenharmony_ci for (i = 0; i < num_samples; i++) 2707cabdff1aSopenharmony_ci predTime[i] = AAC_MUL30(sce->ltp_state[i + 2048 - ltp->lag], ltp->coef); 2708cabdff1aSopenharmony_ci memset(&predTime[i], 0, (2048 - i) * sizeof(*predTime)); 2709cabdff1aSopenharmony_ci 2710cabdff1aSopenharmony_ci ac->windowing_and_mdct_ltp(ac, predFreq, predTime, &sce->ics); 2711cabdff1aSopenharmony_ci 2712cabdff1aSopenharmony_ci if (sce->tns.present) 2713cabdff1aSopenharmony_ci ac->apply_tns(predFreq, &sce->tns, &sce->ics, 0); 2714cabdff1aSopenharmony_ci 2715cabdff1aSopenharmony_ci for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++) 2716cabdff1aSopenharmony_ci if (ltp->used[sfb]) 2717cabdff1aSopenharmony_ci for (i = offsets[sfb]; i < offsets[sfb + 1]; i++) 2718cabdff1aSopenharmony_ci sce->coeffs[i] += (UINTFLOAT)predFreq[i]; 2719cabdff1aSopenharmony_ci } 2720cabdff1aSopenharmony_ci} 2721cabdff1aSopenharmony_ci 2722cabdff1aSopenharmony_ci/** 2723cabdff1aSopenharmony_ci * Update the LTP buffer for next frame 2724cabdff1aSopenharmony_ci */ 2725cabdff1aSopenharmony_cistatic void update_ltp(AACContext *ac, SingleChannelElement *sce) 2726cabdff1aSopenharmony_ci{ 2727cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 2728cabdff1aSopenharmony_ci INTFLOAT *saved = sce->saved; 2729cabdff1aSopenharmony_ci INTFLOAT *saved_ltp = sce->coeffs; 2730cabdff1aSopenharmony_ci const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); 2731cabdff1aSopenharmony_ci const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); 2732cabdff1aSopenharmony_ci int i; 2733cabdff1aSopenharmony_ci 2734cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2735cabdff1aSopenharmony_ci memcpy(saved_ltp, saved, 512 * sizeof(*saved_ltp)); 2736cabdff1aSopenharmony_ci memset(saved_ltp + 576, 0, 448 * sizeof(*saved_ltp)); 2737cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64); 2738cabdff1aSopenharmony_ci 2739cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 2740cabdff1aSopenharmony_ci saved_ltp[i + 512] = AAC_MUL31(ac->buf_mdct[1023 - i], swindow[63 - i]); 2741cabdff1aSopenharmony_ci } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { 2742cabdff1aSopenharmony_ci memcpy(saved_ltp, ac->buf_mdct + 512, 448 * sizeof(*saved_ltp)); 2743cabdff1aSopenharmony_ci memset(saved_ltp + 576, 0, 448 * sizeof(*saved_ltp)); 2744cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64); 2745cabdff1aSopenharmony_ci 2746cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 2747cabdff1aSopenharmony_ci saved_ltp[i + 512] = AAC_MUL31(ac->buf_mdct[1023 - i], swindow[63 - i]); 2748cabdff1aSopenharmony_ci } else { // LONG_STOP or ONLY_LONG 2749cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_reverse(saved_ltp, ac->buf_mdct + 512, &lwindow[512], 512); 2750cabdff1aSopenharmony_ci 2751cabdff1aSopenharmony_ci for (i = 0; i < 512; i++) 2752cabdff1aSopenharmony_ci saved_ltp[i + 512] = AAC_MUL31(ac->buf_mdct[1023 - i], lwindow[511 - i]); 2753cabdff1aSopenharmony_ci } 2754cabdff1aSopenharmony_ci 2755cabdff1aSopenharmony_ci memcpy(sce->ltp_state, sce->ltp_state+1024, 1024 * sizeof(*sce->ltp_state)); 2756cabdff1aSopenharmony_ci memcpy(sce->ltp_state+1024, sce->ret, 1024 * sizeof(*sce->ltp_state)); 2757cabdff1aSopenharmony_ci memcpy(sce->ltp_state+2048, saved_ltp, 1024 * sizeof(*sce->ltp_state)); 2758cabdff1aSopenharmony_ci} 2759cabdff1aSopenharmony_ci 2760cabdff1aSopenharmony_ci/** 2761cabdff1aSopenharmony_ci * Conduct IMDCT and windowing. 2762cabdff1aSopenharmony_ci */ 2763cabdff1aSopenharmony_cistatic void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce) 2764cabdff1aSopenharmony_ci{ 2765cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 2766cabdff1aSopenharmony_ci INTFLOAT *in = sce->coeffs; 2767cabdff1aSopenharmony_ci INTFLOAT *out = sce->ret; 2768cabdff1aSopenharmony_ci INTFLOAT *saved = sce->saved; 2769cabdff1aSopenharmony_ci const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); 2770cabdff1aSopenharmony_ci const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024); 2771cabdff1aSopenharmony_ci const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128); 2772cabdff1aSopenharmony_ci INTFLOAT *buf = ac->buf_mdct; 2773cabdff1aSopenharmony_ci INTFLOAT *temp = ac->temp; 2774cabdff1aSopenharmony_ci int i; 2775cabdff1aSopenharmony_ci 2776cabdff1aSopenharmony_ci // imdct 2777cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2778cabdff1aSopenharmony_ci for (i = 0; i < 1024; i += 128) 2779cabdff1aSopenharmony_ci ac->mdct_small.imdct_half(&ac->mdct_small, buf + i, in + i); 2780cabdff1aSopenharmony_ci } else { 2781cabdff1aSopenharmony_ci ac->mdct.imdct_half(&ac->mdct, buf, in); 2782cabdff1aSopenharmony_ci#if USE_FIXED 2783cabdff1aSopenharmony_ci for (i=0; i<1024; i++) 2784cabdff1aSopenharmony_ci buf[i] = (buf[i] + 4LL) >> 3; 2785cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2786cabdff1aSopenharmony_ci } 2787cabdff1aSopenharmony_ci 2788cabdff1aSopenharmony_ci /* window overlapping 2789cabdff1aSopenharmony_ci * NOTE: To simplify the overlapping code, all 'meaningless' short to long 2790cabdff1aSopenharmony_ci * and long to short transitions are considered to be short to short 2791cabdff1aSopenharmony_ci * transitions. This leaves just two cases (long to long and short to short) 2792cabdff1aSopenharmony_ci * with a little special sauce for EIGHT_SHORT_SEQUENCE. 2793cabdff1aSopenharmony_ci */ 2794cabdff1aSopenharmony_ci if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && 2795cabdff1aSopenharmony_ci (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) { 2796cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 512); 2797cabdff1aSopenharmony_ci } else { 2798cabdff1aSopenharmony_ci memcpy( out, saved, 448 * sizeof(*out)); 2799cabdff1aSopenharmony_ci 2800cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2801cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, 64); 2802cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, 64); 2803cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, 64); 2804cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, 64); 2805cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, 64); 2806cabdff1aSopenharmony_ci memcpy( out + 448 + 4*128, temp, 64 * sizeof(*out)); 2807cabdff1aSopenharmony_ci } else { 2808cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, 64); 2809cabdff1aSopenharmony_ci memcpy( out + 576, buf + 64, 448 * sizeof(*out)); 2810cabdff1aSopenharmony_ci } 2811cabdff1aSopenharmony_ci } 2812cabdff1aSopenharmony_ci 2813cabdff1aSopenharmony_ci // buffer update 2814cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2815cabdff1aSopenharmony_ci memcpy( saved, temp + 64, 64 * sizeof(*saved)); 2816cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 64); 2817cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64); 2818cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64); 2819cabdff1aSopenharmony_ci memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(*saved)); 2820cabdff1aSopenharmony_ci } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { 2821cabdff1aSopenharmony_ci memcpy( saved, buf + 512, 448 * sizeof(*saved)); 2822cabdff1aSopenharmony_ci memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(*saved)); 2823cabdff1aSopenharmony_ci } else { // LONG_STOP or ONLY_LONG 2824cabdff1aSopenharmony_ci memcpy( saved, buf + 512, 512 * sizeof(*saved)); 2825cabdff1aSopenharmony_ci } 2826cabdff1aSopenharmony_ci} 2827cabdff1aSopenharmony_ci 2828cabdff1aSopenharmony_ci/** 2829cabdff1aSopenharmony_ci * Conduct IMDCT and windowing. 2830cabdff1aSopenharmony_ci */ 2831cabdff1aSopenharmony_cistatic void imdct_and_windowing_960(AACContext *ac, SingleChannelElement *sce) 2832cabdff1aSopenharmony_ci{ 2833cabdff1aSopenharmony_ci#if !USE_FIXED 2834cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 2835cabdff1aSopenharmony_ci INTFLOAT *in = sce->coeffs; 2836cabdff1aSopenharmony_ci INTFLOAT *out = sce->ret; 2837cabdff1aSopenharmony_ci INTFLOAT *saved = sce->saved; 2838cabdff1aSopenharmony_ci const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120); 2839cabdff1aSopenharmony_ci const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_long_960) : AAC_RENAME(sine_960); 2840cabdff1aSopenharmony_ci const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120); 2841cabdff1aSopenharmony_ci INTFLOAT *buf = ac->buf_mdct; 2842cabdff1aSopenharmony_ci INTFLOAT *temp = ac->temp; 2843cabdff1aSopenharmony_ci int i; 2844cabdff1aSopenharmony_ci 2845cabdff1aSopenharmony_ci // imdct 2846cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2847cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) 2848cabdff1aSopenharmony_ci ac->mdct120->imdct_half(ac->mdct120, buf + i * 120, in + i * 128, 1); 2849cabdff1aSopenharmony_ci } else { 2850cabdff1aSopenharmony_ci ac->mdct960->imdct_half(ac->mdct960, buf, in, 1); 2851cabdff1aSopenharmony_ci } 2852cabdff1aSopenharmony_ci 2853cabdff1aSopenharmony_ci /* window overlapping 2854cabdff1aSopenharmony_ci * NOTE: To simplify the overlapping code, all 'meaningless' short to long 2855cabdff1aSopenharmony_ci * and long to short transitions are considered to be short to short 2856cabdff1aSopenharmony_ci * transitions. This leaves just two cases (long to long and short to short) 2857cabdff1aSopenharmony_ci * with a little special sauce for EIGHT_SHORT_SEQUENCE. 2858cabdff1aSopenharmony_ci */ 2859cabdff1aSopenharmony_ci 2860cabdff1aSopenharmony_ci if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && 2861cabdff1aSopenharmony_ci (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) { 2862cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 480); 2863cabdff1aSopenharmony_ci } else { 2864cabdff1aSopenharmony_ci memcpy( out, saved, 420 * sizeof(*out)); 2865cabdff1aSopenharmony_ci 2866cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2867cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 420 + 0*120, saved + 420, buf + 0*120, swindow_prev, 60); 2868cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 420 + 1*120, buf + 0*120 + 60, buf + 1*120, swindow, 60); 2869cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 420 + 2*120, buf + 1*120 + 60, buf + 2*120, swindow, 60); 2870cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 420 + 3*120, buf + 2*120 + 60, buf + 3*120, swindow, 60); 2871cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(temp, buf + 3*120 + 60, buf + 4*120, swindow, 60); 2872cabdff1aSopenharmony_ci memcpy( out + 420 + 4*120, temp, 60 * sizeof(*out)); 2873cabdff1aSopenharmony_ci } else { 2874cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 420, saved + 420, buf, swindow_prev, 60); 2875cabdff1aSopenharmony_ci memcpy( out + 540, buf + 60, 420 * sizeof(*out)); 2876cabdff1aSopenharmony_ci } 2877cabdff1aSopenharmony_ci } 2878cabdff1aSopenharmony_ci 2879cabdff1aSopenharmony_ci // buffer update 2880cabdff1aSopenharmony_ci if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 2881cabdff1aSopenharmony_ci memcpy( saved, temp + 60, 60 * sizeof(*saved)); 2882cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(saved + 60, buf + 4*120 + 60, buf + 5*120, swindow, 60); 2883cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(saved + 180, buf + 5*120 + 60, buf + 6*120, swindow, 60); 2884cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(saved + 300, buf + 6*120 + 60, buf + 7*120, swindow, 60); 2885cabdff1aSopenharmony_ci memcpy( saved + 420, buf + 7*120 + 60, 60 * sizeof(*saved)); 2886cabdff1aSopenharmony_ci } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { 2887cabdff1aSopenharmony_ci memcpy( saved, buf + 480, 420 * sizeof(*saved)); 2888cabdff1aSopenharmony_ci memcpy( saved + 420, buf + 7*120 + 60, 60 * sizeof(*saved)); 2889cabdff1aSopenharmony_ci } else { // LONG_STOP or ONLY_LONG 2890cabdff1aSopenharmony_ci memcpy( saved, buf + 480, 480 * sizeof(*saved)); 2891cabdff1aSopenharmony_ci } 2892cabdff1aSopenharmony_ci#endif 2893cabdff1aSopenharmony_ci} 2894cabdff1aSopenharmony_cistatic void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce) 2895cabdff1aSopenharmony_ci{ 2896cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 2897cabdff1aSopenharmony_ci INTFLOAT *in = sce->coeffs; 2898cabdff1aSopenharmony_ci INTFLOAT *out = sce->ret; 2899cabdff1aSopenharmony_ci INTFLOAT *saved = sce->saved; 2900cabdff1aSopenharmony_ci INTFLOAT *buf = ac->buf_mdct; 2901cabdff1aSopenharmony_ci#if USE_FIXED 2902cabdff1aSopenharmony_ci int i; 2903cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2904cabdff1aSopenharmony_ci 2905cabdff1aSopenharmony_ci // imdct 2906cabdff1aSopenharmony_ci ac->mdct.imdct_half(&ac->mdct_ld, buf, in); 2907cabdff1aSopenharmony_ci 2908cabdff1aSopenharmony_ci#if USE_FIXED 2909cabdff1aSopenharmony_ci for (i = 0; i < 1024; i++) 2910cabdff1aSopenharmony_ci buf[i] = (buf[i] + 2) >> 2; 2911cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2912cabdff1aSopenharmony_ci 2913cabdff1aSopenharmony_ci // window overlapping 2914cabdff1aSopenharmony_ci if (ics->use_kb_window[1]) { 2915cabdff1aSopenharmony_ci // AAC LD uses a low overlap sine window instead of a KBD window 2916cabdff1aSopenharmony_ci memcpy(out, saved, 192 * sizeof(*out)); 2917cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, AAC_RENAME2(sine_128), 64); 2918cabdff1aSopenharmony_ci memcpy( out + 320, buf + 64, 192 * sizeof(*out)); 2919cabdff1aSopenharmony_ci } else { 2920cabdff1aSopenharmony_ci ac->fdsp->vector_fmul_window(out, saved, buf, AAC_RENAME2(sine_512), 256); 2921cabdff1aSopenharmony_ci } 2922cabdff1aSopenharmony_ci 2923cabdff1aSopenharmony_ci // buffer update 2924cabdff1aSopenharmony_ci memcpy(saved, buf + 256, 256 * sizeof(*saved)); 2925cabdff1aSopenharmony_ci} 2926cabdff1aSopenharmony_ci 2927cabdff1aSopenharmony_cistatic void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce) 2928cabdff1aSopenharmony_ci{ 2929cabdff1aSopenharmony_ci UINTFLOAT *in = sce->coeffs; 2930cabdff1aSopenharmony_ci INTFLOAT *out = sce->ret; 2931cabdff1aSopenharmony_ci INTFLOAT *saved = sce->saved; 2932cabdff1aSopenharmony_ci INTFLOAT *buf = ac->buf_mdct; 2933cabdff1aSopenharmony_ci int i; 2934cabdff1aSopenharmony_ci const int n = ac->oc[1].m4ac.frame_length_short ? 480 : 512; 2935cabdff1aSopenharmony_ci const int n2 = n >> 1; 2936cabdff1aSopenharmony_ci const int n4 = n >> 2; 2937cabdff1aSopenharmony_ci const INTFLOAT *const window = n == 480 ? AAC_RENAME(ff_aac_eld_window_480) : 2938cabdff1aSopenharmony_ci AAC_RENAME(ff_aac_eld_window_512); 2939cabdff1aSopenharmony_ci 2940cabdff1aSopenharmony_ci // Inverse transform, mapped to the conventional IMDCT by 2941cabdff1aSopenharmony_ci // Chivukula, R.K.; Reznik, Y.A.; Devarajan, V., 2942cabdff1aSopenharmony_ci // "Efficient algorithms for MPEG-4 AAC-ELD, AAC-LD and AAC-LC filterbanks," 2943cabdff1aSopenharmony_ci // International Conference on Audio, Language and Image Processing, ICALIP 2008. 2944cabdff1aSopenharmony_ci // URL: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4590245&isnumber=4589950 2945cabdff1aSopenharmony_ci for (i = 0; i < n2; i+=2) { 2946cabdff1aSopenharmony_ci INTFLOAT temp; 2947cabdff1aSopenharmony_ci temp = in[i ]; in[i ] = -in[n - 1 - i]; in[n - 1 - i] = temp; 2948cabdff1aSopenharmony_ci temp = -in[i + 1]; in[i + 1] = in[n - 2 - i]; in[n - 2 - i] = temp; 2949cabdff1aSopenharmony_ci } 2950cabdff1aSopenharmony_ci#if !USE_FIXED 2951cabdff1aSopenharmony_ci if (n == 480) 2952cabdff1aSopenharmony_ci ac->mdct480->imdct_half(ac->mdct480, buf, in, 1); 2953cabdff1aSopenharmony_ci else 2954cabdff1aSopenharmony_ci#endif 2955cabdff1aSopenharmony_ci ac->mdct.imdct_half(&ac->mdct_ld, buf, in); 2956cabdff1aSopenharmony_ci 2957cabdff1aSopenharmony_ci#if USE_FIXED 2958cabdff1aSopenharmony_ci for (i = 0; i < 1024; i++) 2959cabdff1aSopenharmony_ci buf[i] = (buf[i] + 1) >> 1; 2960cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 2961cabdff1aSopenharmony_ci 2962cabdff1aSopenharmony_ci for (i = 0; i < n; i+=2) { 2963cabdff1aSopenharmony_ci buf[i] = -buf[i]; 2964cabdff1aSopenharmony_ci } 2965cabdff1aSopenharmony_ci // Like with the regular IMDCT at this point we still have the middle half 2966cabdff1aSopenharmony_ci // of a transform but with even symmetry on the left and odd symmetry on 2967cabdff1aSopenharmony_ci // the right 2968cabdff1aSopenharmony_ci 2969cabdff1aSopenharmony_ci // window overlapping 2970cabdff1aSopenharmony_ci // The spec says to use samples [0..511] but the reference decoder uses 2971cabdff1aSopenharmony_ci // samples [128..639]. 2972cabdff1aSopenharmony_ci for (i = n4; i < n2; i ++) { 2973cabdff1aSopenharmony_ci out[i - n4] = AAC_MUL31( buf[ n2 - 1 - i] , window[i - n4]) + 2974cabdff1aSopenharmony_ci AAC_MUL31( saved[ i + n2] , window[i + n - n4]) + 2975cabdff1aSopenharmony_ci AAC_MUL31(-saved[n + n2 - 1 - i] , window[i + 2*n - n4]) + 2976cabdff1aSopenharmony_ci AAC_MUL31(-saved[ 2*n + n2 + i] , window[i + 3*n - n4]); 2977cabdff1aSopenharmony_ci } 2978cabdff1aSopenharmony_ci for (i = 0; i < n2; i ++) { 2979cabdff1aSopenharmony_ci out[n4 + i] = AAC_MUL31( buf[ i] , window[i + n2 - n4]) + 2980cabdff1aSopenharmony_ci AAC_MUL31(-saved[ n - 1 - i] , window[i + n2 + n - n4]) + 2981cabdff1aSopenharmony_ci AAC_MUL31(-saved[ n + i] , window[i + n2 + 2*n - n4]) + 2982cabdff1aSopenharmony_ci AAC_MUL31( saved[2*n + n - 1 - i] , window[i + n2 + 3*n - n4]); 2983cabdff1aSopenharmony_ci } 2984cabdff1aSopenharmony_ci for (i = 0; i < n4; i ++) { 2985cabdff1aSopenharmony_ci out[n2 + n4 + i] = AAC_MUL31( buf[ i + n2] , window[i + n - n4]) + 2986cabdff1aSopenharmony_ci AAC_MUL31(-saved[n2 - 1 - i] , window[i + 2*n - n4]) + 2987cabdff1aSopenharmony_ci AAC_MUL31(-saved[n + n2 + i] , window[i + 3*n - n4]); 2988cabdff1aSopenharmony_ci } 2989cabdff1aSopenharmony_ci 2990cabdff1aSopenharmony_ci // buffer update 2991cabdff1aSopenharmony_ci memmove(saved + n, saved, 2 * n * sizeof(*saved)); 2992cabdff1aSopenharmony_ci memcpy( saved, buf, n * sizeof(*saved)); 2993cabdff1aSopenharmony_ci} 2994cabdff1aSopenharmony_ci 2995cabdff1aSopenharmony_ci/** 2996cabdff1aSopenharmony_ci * channel coupling transformation interface 2997cabdff1aSopenharmony_ci * 2998cabdff1aSopenharmony_ci * @param apply_coupling_method pointer to (in)dependent coupling function 2999cabdff1aSopenharmony_ci */ 3000cabdff1aSopenharmony_cistatic void apply_channel_coupling(AACContext *ac, ChannelElement *cc, 3001cabdff1aSopenharmony_ci enum RawDataBlockType type, int elem_id, 3002cabdff1aSopenharmony_ci enum CouplingPoint coupling_point, 3003cabdff1aSopenharmony_ci void (*apply_coupling_method)(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index)) 3004cabdff1aSopenharmony_ci{ 3005cabdff1aSopenharmony_ci int i, c; 3006cabdff1aSopenharmony_ci 3007cabdff1aSopenharmony_ci for (i = 0; i < MAX_ELEM_ID; i++) { 3008cabdff1aSopenharmony_ci ChannelElement *cce = ac->che[TYPE_CCE][i]; 3009cabdff1aSopenharmony_ci int index = 0; 3010cabdff1aSopenharmony_ci 3011cabdff1aSopenharmony_ci if (cce && cce->coup.coupling_point == coupling_point) { 3012cabdff1aSopenharmony_ci ChannelCoupling *coup = &cce->coup; 3013cabdff1aSopenharmony_ci 3014cabdff1aSopenharmony_ci for (c = 0; c <= coup->num_coupled; c++) { 3015cabdff1aSopenharmony_ci if (coup->type[c] == type && coup->id_select[c] == elem_id) { 3016cabdff1aSopenharmony_ci if (coup->ch_select[c] != 1) { 3017cabdff1aSopenharmony_ci apply_coupling_method(ac, &cc->ch[0], cce, index); 3018cabdff1aSopenharmony_ci if (coup->ch_select[c] != 0) 3019cabdff1aSopenharmony_ci index++; 3020cabdff1aSopenharmony_ci } 3021cabdff1aSopenharmony_ci if (coup->ch_select[c] != 2) 3022cabdff1aSopenharmony_ci apply_coupling_method(ac, &cc->ch[1], cce, index++); 3023cabdff1aSopenharmony_ci } else 3024cabdff1aSopenharmony_ci index += 1 + (coup->ch_select[c] == 3); 3025cabdff1aSopenharmony_ci } 3026cabdff1aSopenharmony_ci } 3027cabdff1aSopenharmony_ci } 3028cabdff1aSopenharmony_ci} 3029cabdff1aSopenharmony_ci 3030cabdff1aSopenharmony_ci/** 3031cabdff1aSopenharmony_ci * Convert spectral data to samples, applying all supported tools as appropriate. 3032cabdff1aSopenharmony_ci */ 3033cabdff1aSopenharmony_cistatic void spectral_to_sample(AACContext *ac, int samples) 3034cabdff1aSopenharmony_ci{ 3035cabdff1aSopenharmony_ci int i, type; 3036cabdff1aSopenharmony_ci void (*imdct_and_window)(AACContext *ac, SingleChannelElement *sce); 3037cabdff1aSopenharmony_ci switch (ac->oc[1].m4ac.object_type) { 3038cabdff1aSopenharmony_ci case AOT_ER_AAC_LD: 3039cabdff1aSopenharmony_ci imdct_and_window = imdct_and_windowing_ld; 3040cabdff1aSopenharmony_ci break; 3041cabdff1aSopenharmony_ci case AOT_ER_AAC_ELD: 3042cabdff1aSopenharmony_ci imdct_and_window = imdct_and_windowing_eld; 3043cabdff1aSopenharmony_ci break; 3044cabdff1aSopenharmony_ci default: 3045cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.frame_length_short) 3046cabdff1aSopenharmony_ci imdct_and_window = imdct_and_windowing_960; 3047cabdff1aSopenharmony_ci else 3048cabdff1aSopenharmony_ci imdct_and_window = ac->imdct_and_windowing; 3049cabdff1aSopenharmony_ci } 3050cabdff1aSopenharmony_ci for (type = 3; type >= 0; type--) { 3051cabdff1aSopenharmony_ci for (i = 0; i < MAX_ELEM_ID; i++) { 3052cabdff1aSopenharmony_ci ChannelElement *che = ac->che[type][i]; 3053cabdff1aSopenharmony_ci if (che && che->present) { 3054cabdff1aSopenharmony_ci if (type <= TYPE_CPE) 3055cabdff1aSopenharmony_ci apply_channel_coupling(ac, che, type, i, BEFORE_TNS, AAC_RENAME(apply_dependent_coupling)); 3056cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) { 3057cabdff1aSopenharmony_ci if (che->ch[0].ics.predictor_present) { 3058cabdff1aSopenharmony_ci if (che->ch[0].ics.ltp.present) 3059cabdff1aSopenharmony_ci ac->apply_ltp(ac, &che->ch[0]); 3060cabdff1aSopenharmony_ci if (che->ch[1].ics.ltp.present && type == TYPE_CPE) 3061cabdff1aSopenharmony_ci ac->apply_ltp(ac, &che->ch[1]); 3062cabdff1aSopenharmony_ci } 3063cabdff1aSopenharmony_ci } 3064cabdff1aSopenharmony_ci if (che->ch[0].tns.present) 3065cabdff1aSopenharmony_ci ac->apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1); 3066cabdff1aSopenharmony_ci if (che->ch[1].tns.present) 3067cabdff1aSopenharmony_ci ac->apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1); 3068cabdff1aSopenharmony_ci if (type <= TYPE_CPE) 3069cabdff1aSopenharmony_ci apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, AAC_RENAME(apply_dependent_coupling)); 3070cabdff1aSopenharmony_ci if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) { 3071cabdff1aSopenharmony_ci imdct_and_window(ac, &che->ch[0]); 3072cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) 3073cabdff1aSopenharmony_ci ac->update_ltp(ac, &che->ch[0]); 3074cabdff1aSopenharmony_ci if (type == TYPE_CPE) { 3075cabdff1aSopenharmony_ci imdct_and_window(ac, &che->ch[1]); 3076cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) 3077cabdff1aSopenharmony_ci ac->update_ltp(ac, &che->ch[1]); 3078cabdff1aSopenharmony_ci } 3079cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.sbr > 0) { 3080cabdff1aSopenharmony_ci AAC_RENAME(ff_sbr_apply)(ac, &che->sbr, type, che->ch[0].ret, che->ch[1].ret); 3081cabdff1aSopenharmony_ci } 3082cabdff1aSopenharmony_ci } 3083cabdff1aSopenharmony_ci if (type <= TYPE_CCE) 3084cabdff1aSopenharmony_ci apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, AAC_RENAME(apply_independent_coupling)); 3085cabdff1aSopenharmony_ci 3086cabdff1aSopenharmony_ci#if USE_FIXED 3087cabdff1aSopenharmony_ci { 3088cabdff1aSopenharmony_ci int j; 3089cabdff1aSopenharmony_ci /* preparation for resampler */ 3090cabdff1aSopenharmony_ci for(j = 0; j<samples; j++){ 3091cabdff1aSopenharmony_ci che->ch[0].ret[j] = (int32_t)av_clip64((int64_t)che->ch[0].ret[j]*128, INT32_MIN, INT32_MAX-0x8000)+0x8000; 3092cabdff1aSopenharmony_ci if(type == TYPE_CPE) 3093cabdff1aSopenharmony_ci che->ch[1].ret[j] = (int32_t)av_clip64((int64_t)che->ch[1].ret[j]*128, INT32_MIN, INT32_MAX-0x8000)+0x8000; 3094cabdff1aSopenharmony_ci } 3095cabdff1aSopenharmony_ci } 3096cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 3097cabdff1aSopenharmony_ci che->present = 0; 3098cabdff1aSopenharmony_ci } else if (che) { 3099cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_VERBOSE, "ChannelElement %d.%d missing \n", type, i); 3100cabdff1aSopenharmony_ci } 3101cabdff1aSopenharmony_ci } 3102cabdff1aSopenharmony_ci } 3103cabdff1aSopenharmony_ci} 3104cabdff1aSopenharmony_ci 3105cabdff1aSopenharmony_cistatic int parse_adts_frame_header(AACContext *ac, GetBitContext *gb) 3106cabdff1aSopenharmony_ci{ 3107cabdff1aSopenharmony_ci int size; 3108cabdff1aSopenharmony_ci AACADTSHeaderInfo hdr_info; 3109cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3]; 3110cabdff1aSopenharmony_ci int layout_map_tags, ret; 3111cabdff1aSopenharmony_ci 3112cabdff1aSopenharmony_ci size = ff_adts_header_parse(gb, &hdr_info); 3113cabdff1aSopenharmony_ci if (size > 0) { 3114cabdff1aSopenharmony_ci if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) { 3115cabdff1aSopenharmony_ci // This is 2 for "VLB " audio in NSV files. 3116cabdff1aSopenharmony_ci // See samples/nsv/vlb_audio. 3117cabdff1aSopenharmony_ci avpriv_report_missing_feature(ac->avctx, 3118cabdff1aSopenharmony_ci "More than one AAC RDB per ADTS frame"); 3119cabdff1aSopenharmony_ci ac->warned_num_aac_frames = 1; 3120cabdff1aSopenharmony_ci } 3121cabdff1aSopenharmony_ci push_output_configuration(ac); 3122cabdff1aSopenharmony_ci if (hdr_info.chan_config) { 3123cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config = hdr_info.chan_config; 3124cabdff1aSopenharmony_ci if ((ret = set_default_channel_config(ac, ac->avctx, 3125cabdff1aSopenharmony_ci layout_map, 3126cabdff1aSopenharmony_ci &layout_map_tags, 3127cabdff1aSopenharmony_ci hdr_info.chan_config)) < 0) 3128cabdff1aSopenharmony_ci return ret; 3129cabdff1aSopenharmony_ci if ((ret = output_configure(ac, layout_map, layout_map_tags, 3130cabdff1aSopenharmony_ci FFMAX(ac->oc[1].status, 3131cabdff1aSopenharmony_ci OC_TRIAL_FRAME), 0)) < 0) 3132cabdff1aSopenharmony_ci return ret; 3133cabdff1aSopenharmony_ci } else { 3134cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config = 0; 3135cabdff1aSopenharmony_ci /** 3136cabdff1aSopenharmony_ci * dual mono frames in Japanese DTV can have chan_config 0 3137cabdff1aSopenharmony_ci * WITHOUT specifying PCE. 3138cabdff1aSopenharmony_ci * thus, set dual mono as default. 3139cabdff1aSopenharmony_ci */ 3140cabdff1aSopenharmony_ci if (ac->dmono_mode && ac->oc[0].status == OC_NONE) { 3141cabdff1aSopenharmony_ci layout_map_tags = 2; 3142cabdff1aSopenharmony_ci layout_map[0][0] = layout_map[1][0] = TYPE_SCE; 3143cabdff1aSopenharmony_ci layout_map[0][2] = layout_map[1][2] = AAC_CHANNEL_FRONT; 3144cabdff1aSopenharmony_ci layout_map[0][1] = 0; 3145cabdff1aSopenharmony_ci layout_map[1][1] = 1; 3146cabdff1aSopenharmony_ci if (output_configure(ac, layout_map, layout_map_tags, 3147cabdff1aSopenharmony_ci OC_TRIAL_FRAME, 0)) 3148cabdff1aSopenharmony_ci return -7; 3149cabdff1aSopenharmony_ci } 3150cabdff1aSopenharmony_ci } 3151cabdff1aSopenharmony_ci ac->oc[1].m4ac.sample_rate = hdr_info.sample_rate; 3152cabdff1aSopenharmony_ci ac->oc[1].m4ac.sampling_index = hdr_info.sampling_index; 3153cabdff1aSopenharmony_ci ac->oc[1].m4ac.object_type = hdr_info.object_type; 3154cabdff1aSopenharmony_ci ac->oc[1].m4ac.frame_length_short = 0; 3155cabdff1aSopenharmony_ci if (ac->oc[0].status != OC_LOCKED || 3156cabdff1aSopenharmony_ci ac->oc[0].m4ac.chan_config != hdr_info.chan_config || 3157cabdff1aSopenharmony_ci ac->oc[0].m4ac.sample_rate != hdr_info.sample_rate) { 3158cabdff1aSopenharmony_ci ac->oc[1].m4ac.sbr = -1; 3159cabdff1aSopenharmony_ci ac->oc[1].m4ac.ps = -1; 3160cabdff1aSopenharmony_ci } 3161cabdff1aSopenharmony_ci if (!hdr_info.crc_absent) 3162cabdff1aSopenharmony_ci skip_bits(gb, 16); 3163cabdff1aSopenharmony_ci } 3164cabdff1aSopenharmony_ci return size; 3165cabdff1aSopenharmony_ci} 3166cabdff1aSopenharmony_ci 3167cabdff1aSopenharmony_cistatic int aac_decode_er_frame(AVCodecContext *avctx, void *data, 3168cabdff1aSopenharmony_ci int *got_frame_ptr, GetBitContext *gb) 3169cabdff1aSopenharmony_ci{ 3170cabdff1aSopenharmony_ci AACContext *ac = avctx->priv_data; 3171cabdff1aSopenharmony_ci const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac; 3172cabdff1aSopenharmony_ci ChannelElement *che; 3173cabdff1aSopenharmony_ci int err, i; 3174cabdff1aSopenharmony_ci int samples = m4ac->frame_length_short ? 960 : 1024; 3175cabdff1aSopenharmony_ci int chan_config = m4ac->chan_config; 3176cabdff1aSopenharmony_ci int aot = m4ac->object_type; 3177cabdff1aSopenharmony_ci 3178cabdff1aSopenharmony_ci if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) 3179cabdff1aSopenharmony_ci samples >>= 1; 3180cabdff1aSopenharmony_ci 3181cabdff1aSopenharmony_ci ac->frame = data; 3182cabdff1aSopenharmony_ci 3183cabdff1aSopenharmony_ci if ((err = frame_configure_elements(avctx)) < 0) 3184cabdff1aSopenharmony_ci return err; 3185cabdff1aSopenharmony_ci 3186cabdff1aSopenharmony_ci // The FF_PROFILE_AAC_* defines are all object_type - 1 3187cabdff1aSopenharmony_ci // This may lead to an undefined profile being signaled 3188cabdff1aSopenharmony_ci ac->avctx->profile = aot - 1; 3189cabdff1aSopenharmony_ci 3190cabdff1aSopenharmony_ci ac->tags_mapped = 0; 3191cabdff1aSopenharmony_ci 3192cabdff1aSopenharmony_ci if (chan_config < 0 || (chan_config >= 8 && chan_config < 11) || chan_config >= 13) { 3193cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Unknown ER channel configuration %d", 3194cabdff1aSopenharmony_ci chan_config); 3195cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 3196cabdff1aSopenharmony_ci } 3197cabdff1aSopenharmony_ci for (i = 0; i < tags_per_config[chan_config]; i++) { 3198cabdff1aSopenharmony_ci const int elem_type = aac_channel_layout_map[chan_config-1][i][0]; 3199cabdff1aSopenharmony_ci const int elem_id = aac_channel_layout_map[chan_config-1][i][1]; 3200cabdff1aSopenharmony_ci if (!(che=get_che(ac, elem_type, elem_id))) { 3201cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 3202cabdff1aSopenharmony_ci "channel element %d.%d is not allocated\n", 3203cabdff1aSopenharmony_ci elem_type, elem_id); 3204cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 3205cabdff1aSopenharmony_ci } 3206cabdff1aSopenharmony_ci che->present = 1; 3207cabdff1aSopenharmony_ci if (aot != AOT_ER_AAC_ELD) 3208cabdff1aSopenharmony_ci skip_bits(gb, 4); 3209cabdff1aSopenharmony_ci switch (elem_type) { 3210cabdff1aSopenharmony_ci case TYPE_SCE: 3211cabdff1aSopenharmony_ci err = decode_ics(ac, &che->ch[0], gb, 0, 0); 3212cabdff1aSopenharmony_ci break; 3213cabdff1aSopenharmony_ci case TYPE_CPE: 3214cabdff1aSopenharmony_ci err = decode_cpe(ac, gb, che); 3215cabdff1aSopenharmony_ci break; 3216cabdff1aSopenharmony_ci case TYPE_LFE: 3217cabdff1aSopenharmony_ci err = decode_ics(ac, &che->ch[0], gb, 0, 0); 3218cabdff1aSopenharmony_ci break; 3219cabdff1aSopenharmony_ci } 3220cabdff1aSopenharmony_ci if (err < 0) 3221cabdff1aSopenharmony_ci return err; 3222cabdff1aSopenharmony_ci } 3223cabdff1aSopenharmony_ci 3224cabdff1aSopenharmony_ci spectral_to_sample(ac, samples); 3225cabdff1aSopenharmony_ci 3226cabdff1aSopenharmony_ci if (!ac->frame->data[0] && samples) { 3227cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "no frame data found\n"); 3228cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 3229cabdff1aSopenharmony_ci } 3230cabdff1aSopenharmony_ci 3231cabdff1aSopenharmony_ci ac->frame->nb_samples = samples; 3232cabdff1aSopenharmony_ci ac->frame->sample_rate = avctx->sample_rate; 3233cabdff1aSopenharmony_ci *got_frame_ptr = 1; 3234cabdff1aSopenharmony_ci 3235cabdff1aSopenharmony_ci skip_bits_long(gb, get_bits_left(gb)); 3236cabdff1aSopenharmony_ci return 0; 3237cabdff1aSopenharmony_ci} 3238cabdff1aSopenharmony_ci 3239cabdff1aSopenharmony_cistatic int aac_decode_frame_int(AVCodecContext *avctx, AVFrame *frame, 3240cabdff1aSopenharmony_ci int *got_frame_ptr, GetBitContext *gb, 3241cabdff1aSopenharmony_ci const AVPacket *avpkt) 3242cabdff1aSopenharmony_ci{ 3243cabdff1aSopenharmony_ci AACContext *ac = avctx->priv_data; 3244cabdff1aSopenharmony_ci ChannelElement *che = NULL, *che_prev = NULL; 3245cabdff1aSopenharmony_ci enum RawDataBlockType elem_type, che_prev_type = TYPE_END; 3246cabdff1aSopenharmony_ci int err, elem_id; 3247cabdff1aSopenharmony_ci int samples = 0, multiplier, audio_found = 0, pce_found = 0; 3248cabdff1aSopenharmony_ci int is_dmono, sce_count = 0; 3249cabdff1aSopenharmony_ci int payload_alignment; 3250cabdff1aSopenharmony_ci uint8_t che_presence[4][MAX_ELEM_ID] = {{0}}; 3251cabdff1aSopenharmony_ci 3252cabdff1aSopenharmony_ci ac->frame = frame; 3253cabdff1aSopenharmony_ci 3254cabdff1aSopenharmony_ci if (show_bits(gb, 12) == 0xfff) { 3255cabdff1aSopenharmony_ci if ((err = parse_adts_frame_header(ac, gb)) < 0) { 3256cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error decoding AAC frame header.\n"); 3257cabdff1aSopenharmony_ci goto fail; 3258cabdff1aSopenharmony_ci } 3259cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.sampling_index > 12) { 3260cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->oc[1].m4ac.sampling_index); 3261cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3262cabdff1aSopenharmony_ci goto fail; 3263cabdff1aSopenharmony_ci } 3264cabdff1aSopenharmony_ci } 3265cabdff1aSopenharmony_ci 3266cabdff1aSopenharmony_ci if ((err = frame_configure_elements(avctx)) < 0) 3267cabdff1aSopenharmony_ci goto fail; 3268cabdff1aSopenharmony_ci 3269cabdff1aSopenharmony_ci // The FF_PROFILE_AAC_* defines are all object_type - 1 3270cabdff1aSopenharmony_ci // This may lead to an undefined profile being signaled 3271cabdff1aSopenharmony_ci ac->avctx->profile = ac->oc[1].m4ac.object_type - 1; 3272cabdff1aSopenharmony_ci 3273cabdff1aSopenharmony_ci payload_alignment = get_bits_count(gb); 3274cabdff1aSopenharmony_ci ac->tags_mapped = 0; 3275cabdff1aSopenharmony_ci // parse 3276cabdff1aSopenharmony_ci while ((elem_type = get_bits(gb, 3)) != TYPE_END) { 3277cabdff1aSopenharmony_ci elem_id = get_bits(gb, 4); 3278cabdff1aSopenharmony_ci 3279cabdff1aSopenharmony_ci if (avctx->debug & FF_DEBUG_STARTCODE) 3280cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Elem type:%x id:%x\n", elem_type, elem_id); 3281cabdff1aSopenharmony_ci 3282cabdff1aSopenharmony_ci if (!avctx->ch_layout.nb_channels && elem_type != TYPE_PCE) { 3283cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3284cabdff1aSopenharmony_ci goto fail; 3285cabdff1aSopenharmony_ci } 3286cabdff1aSopenharmony_ci 3287cabdff1aSopenharmony_ci if (elem_type < TYPE_DSE) { 3288cabdff1aSopenharmony_ci if (che_presence[elem_type][elem_id]) { 3289cabdff1aSopenharmony_ci int error = che_presence[elem_type][elem_id] > 1; 3290cabdff1aSopenharmony_ci av_log(ac->avctx, error ? AV_LOG_ERROR : AV_LOG_DEBUG, "channel element %d.%d duplicate\n", 3291cabdff1aSopenharmony_ci elem_type, elem_id); 3292cabdff1aSopenharmony_ci if (error) { 3293cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3294cabdff1aSopenharmony_ci goto fail; 3295cabdff1aSopenharmony_ci } 3296cabdff1aSopenharmony_ci } 3297cabdff1aSopenharmony_ci che_presence[elem_type][elem_id]++; 3298cabdff1aSopenharmony_ci 3299cabdff1aSopenharmony_ci if (!(che=get_che(ac, elem_type, elem_id))) { 3300cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", 3301cabdff1aSopenharmony_ci elem_type, elem_id); 3302cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3303cabdff1aSopenharmony_ci goto fail; 3304cabdff1aSopenharmony_ci } 3305cabdff1aSopenharmony_ci samples = ac->oc[1].m4ac.frame_length_short ? 960 : 1024; 3306cabdff1aSopenharmony_ci che->present = 1; 3307cabdff1aSopenharmony_ci } 3308cabdff1aSopenharmony_ci 3309cabdff1aSopenharmony_ci switch (elem_type) { 3310cabdff1aSopenharmony_ci 3311cabdff1aSopenharmony_ci case TYPE_SCE: 3312cabdff1aSopenharmony_ci err = decode_ics(ac, &che->ch[0], gb, 0, 0); 3313cabdff1aSopenharmony_ci audio_found = 1; 3314cabdff1aSopenharmony_ci sce_count++; 3315cabdff1aSopenharmony_ci break; 3316cabdff1aSopenharmony_ci 3317cabdff1aSopenharmony_ci case TYPE_CPE: 3318cabdff1aSopenharmony_ci err = decode_cpe(ac, gb, che); 3319cabdff1aSopenharmony_ci audio_found = 1; 3320cabdff1aSopenharmony_ci break; 3321cabdff1aSopenharmony_ci 3322cabdff1aSopenharmony_ci case TYPE_CCE: 3323cabdff1aSopenharmony_ci err = decode_cce(ac, gb, che); 3324cabdff1aSopenharmony_ci break; 3325cabdff1aSopenharmony_ci 3326cabdff1aSopenharmony_ci case TYPE_LFE: 3327cabdff1aSopenharmony_ci err = decode_ics(ac, &che->ch[0], gb, 0, 0); 3328cabdff1aSopenharmony_ci audio_found = 1; 3329cabdff1aSopenharmony_ci break; 3330cabdff1aSopenharmony_ci 3331cabdff1aSopenharmony_ci case TYPE_DSE: 3332cabdff1aSopenharmony_ci err = skip_data_stream_element(ac, gb); 3333cabdff1aSopenharmony_ci break; 3334cabdff1aSopenharmony_ci 3335cabdff1aSopenharmony_ci case TYPE_PCE: { 3336cabdff1aSopenharmony_ci uint8_t layout_map[MAX_ELEM_ID*4][3] = {{0}}; 3337cabdff1aSopenharmony_ci int tags; 3338cabdff1aSopenharmony_ci 3339cabdff1aSopenharmony_ci int pushed = push_output_configuration(ac); 3340cabdff1aSopenharmony_ci if (pce_found && !pushed) { 3341cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3342cabdff1aSopenharmony_ci goto fail; 3343cabdff1aSopenharmony_ci } 3344cabdff1aSopenharmony_ci 3345cabdff1aSopenharmony_ci tags = decode_pce(avctx, &ac->oc[1].m4ac, layout_map, gb, 3346cabdff1aSopenharmony_ci payload_alignment); 3347cabdff1aSopenharmony_ci if (tags < 0) { 3348cabdff1aSopenharmony_ci err = tags; 3349cabdff1aSopenharmony_ci break; 3350cabdff1aSopenharmony_ci } 3351cabdff1aSopenharmony_ci if (pce_found) { 3352cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 3353cabdff1aSopenharmony_ci "Not evaluating a further program_config_element as this construct is dubious at best.\n"); 3354cabdff1aSopenharmony_ci pop_output_configuration(ac); 3355cabdff1aSopenharmony_ci } else { 3356cabdff1aSopenharmony_ci err = output_configure(ac, layout_map, tags, OC_TRIAL_PCE, 1); 3357cabdff1aSopenharmony_ci if (!err) 3358cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config = 0; 3359cabdff1aSopenharmony_ci pce_found = 1; 3360cabdff1aSopenharmony_ci } 3361cabdff1aSopenharmony_ci break; 3362cabdff1aSopenharmony_ci } 3363cabdff1aSopenharmony_ci 3364cabdff1aSopenharmony_ci case TYPE_FIL: 3365cabdff1aSopenharmony_ci if (elem_id == 15) 3366cabdff1aSopenharmony_ci elem_id += get_bits(gb, 8) - 1; 3367cabdff1aSopenharmony_ci if (get_bits_left(gb) < 8 * elem_id) { 3368cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "TYPE_FIL: "overread_err); 3369cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3370cabdff1aSopenharmony_ci goto fail; 3371cabdff1aSopenharmony_ci } 3372cabdff1aSopenharmony_ci err = 0; 3373cabdff1aSopenharmony_ci while (elem_id > 0) { 3374cabdff1aSopenharmony_ci int ret = decode_extension_payload(ac, gb, elem_id, che_prev, che_prev_type); 3375cabdff1aSopenharmony_ci if (ret < 0) { 3376cabdff1aSopenharmony_ci err = ret; 3377cabdff1aSopenharmony_ci break; 3378cabdff1aSopenharmony_ci } 3379cabdff1aSopenharmony_ci elem_id -= ret; 3380cabdff1aSopenharmony_ci } 3381cabdff1aSopenharmony_ci break; 3382cabdff1aSopenharmony_ci 3383cabdff1aSopenharmony_ci default: 3384cabdff1aSopenharmony_ci err = AVERROR_BUG; /* should not happen, but keeps compiler happy */ 3385cabdff1aSopenharmony_ci break; 3386cabdff1aSopenharmony_ci } 3387cabdff1aSopenharmony_ci 3388cabdff1aSopenharmony_ci if (elem_type < TYPE_DSE) { 3389cabdff1aSopenharmony_ci che_prev = che; 3390cabdff1aSopenharmony_ci che_prev_type = elem_type; 3391cabdff1aSopenharmony_ci } 3392cabdff1aSopenharmony_ci 3393cabdff1aSopenharmony_ci if (err) 3394cabdff1aSopenharmony_ci goto fail; 3395cabdff1aSopenharmony_ci 3396cabdff1aSopenharmony_ci if (get_bits_left(gb) < 3) { 3397cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, overread_err); 3398cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3399cabdff1aSopenharmony_ci goto fail; 3400cabdff1aSopenharmony_ci } 3401cabdff1aSopenharmony_ci } 3402cabdff1aSopenharmony_ci 3403cabdff1aSopenharmony_ci if (!avctx->ch_layout.nb_channels) { 3404cabdff1aSopenharmony_ci *got_frame_ptr = 0; 3405cabdff1aSopenharmony_ci return 0; 3406cabdff1aSopenharmony_ci } 3407cabdff1aSopenharmony_ci 3408cabdff1aSopenharmony_ci multiplier = (ac->oc[1].m4ac.sbr == 1) ? ac->oc[1].m4ac.ext_sample_rate > ac->oc[1].m4ac.sample_rate : 0; 3409cabdff1aSopenharmony_ci samples <<= multiplier; 3410cabdff1aSopenharmony_ci 3411cabdff1aSopenharmony_ci spectral_to_sample(ac, samples); 3412cabdff1aSopenharmony_ci 3413cabdff1aSopenharmony_ci if (ac->oc[1].status && audio_found) { 3414cabdff1aSopenharmony_ci avctx->sample_rate = ac->oc[1].m4ac.sample_rate << multiplier; 3415cabdff1aSopenharmony_ci avctx->frame_size = samples; 3416cabdff1aSopenharmony_ci ac->oc[1].status = OC_LOCKED; 3417cabdff1aSopenharmony_ci } 3418cabdff1aSopenharmony_ci 3419cabdff1aSopenharmony_ci if (multiplier) 3420cabdff1aSopenharmony_ci avctx->internal->skip_samples_multiplier = 2; 3421cabdff1aSopenharmony_ci 3422cabdff1aSopenharmony_ci if (!ac->frame->data[0] && samples) { 3423cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "no frame data found\n"); 3424cabdff1aSopenharmony_ci err = AVERROR_INVALIDDATA; 3425cabdff1aSopenharmony_ci goto fail; 3426cabdff1aSopenharmony_ci } 3427cabdff1aSopenharmony_ci 3428cabdff1aSopenharmony_ci if (samples) { 3429cabdff1aSopenharmony_ci ac->frame->nb_samples = samples; 3430cabdff1aSopenharmony_ci ac->frame->sample_rate = avctx->sample_rate; 3431cabdff1aSopenharmony_ci } else 3432cabdff1aSopenharmony_ci av_frame_unref(ac->frame); 3433cabdff1aSopenharmony_ci *got_frame_ptr = !!samples; 3434cabdff1aSopenharmony_ci 3435cabdff1aSopenharmony_ci /* for dual-mono audio (SCE + SCE) */ 3436cabdff1aSopenharmony_ci is_dmono = ac->dmono_mode && sce_count == 2 && 3437cabdff1aSopenharmony_ci !av_channel_layout_compare(&ac->oc[1].ch_layout, 3438cabdff1aSopenharmony_ci &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO); 3439cabdff1aSopenharmony_ci if (is_dmono) { 3440cabdff1aSopenharmony_ci if (ac->dmono_mode == 1) 3441cabdff1aSopenharmony_ci frame->data[1] = frame->data[0]; 3442cabdff1aSopenharmony_ci else if (ac->dmono_mode == 2) 3443cabdff1aSopenharmony_ci frame->data[0] = frame->data[1]; 3444cabdff1aSopenharmony_ci } 3445cabdff1aSopenharmony_ci 3446cabdff1aSopenharmony_ci return 0; 3447cabdff1aSopenharmony_cifail: 3448cabdff1aSopenharmony_ci pop_output_configuration(ac); 3449cabdff1aSopenharmony_ci return err; 3450cabdff1aSopenharmony_ci} 3451cabdff1aSopenharmony_ci 3452cabdff1aSopenharmony_cistatic int aac_decode_frame(AVCodecContext *avctx, AVFrame *frame, 3453cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 3454cabdff1aSopenharmony_ci{ 3455cabdff1aSopenharmony_ci AACContext *ac = avctx->priv_data; 3456cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 3457cabdff1aSopenharmony_ci int buf_size = avpkt->size; 3458cabdff1aSopenharmony_ci GetBitContext gb; 3459cabdff1aSopenharmony_ci int buf_consumed; 3460cabdff1aSopenharmony_ci int buf_offset; 3461cabdff1aSopenharmony_ci int err; 3462cabdff1aSopenharmony_ci size_t new_extradata_size; 3463cabdff1aSopenharmony_ci const uint8_t *new_extradata = av_packet_get_side_data(avpkt, 3464cabdff1aSopenharmony_ci AV_PKT_DATA_NEW_EXTRADATA, 3465cabdff1aSopenharmony_ci &new_extradata_size); 3466cabdff1aSopenharmony_ci size_t jp_dualmono_size; 3467cabdff1aSopenharmony_ci const uint8_t *jp_dualmono = av_packet_get_side_data(avpkt, 3468cabdff1aSopenharmony_ci AV_PKT_DATA_JP_DUALMONO, 3469cabdff1aSopenharmony_ci &jp_dualmono_size); 3470cabdff1aSopenharmony_ci 3471cabdff1aSopenharmony_ci if (new_extradata) { 3472cabdff1aSopenharmony_ci /* discard previous configuration */ 3473cabdff1aSopenharmony_ci ac->oc[1].status = OC_NONE; 3474cabdff1aSopenharmony_ci err = decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac, 3475cabdff1aSopenharmony_ci new_extradata, 3476cabdff1aSopenharmony_ci new_extradata_size * 8LL, 1); 3477cabdff1aSopenharmony_ci if (err < 0) { 3478cabdff1aSopenharmony_ci return err; 3479cabdff1aSopenharmony_ci } 3480cabdff1aSopenharmony_ci } 3481cabdff1aSopenharmony_ci 3482cabdff1aSopenharmony_ci ac->dmono_mode = 0; 3483cabdff1aSopenharmony_ci if (jp_dualmono && jp_dualmono_size > 0) 3484cabdff1aSopenharmony_ci ac->dmono_mode = 1 + *jp_dualmono; 3485cabdff1aSopenharmony_ci if (ac->force_dmono_mode >= 0) 3486cabdff1aSopenharmony_ci ac->dmono_mode = ac->force_dmono_mode; 3487cabdff1aSopenharmony_ci 3488cabdff1aSopenharmony_ci if (INT_MAX / 8 <= buf_size) 3489cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 3490cabdff1aSopenharmony_ci 3491cabdff1aSopenharmony_ci if ((err = init_get_bits8(&gb, buf, buf_size)) < 0) 3492cabdff1aSopenharmony_ci return err; 3493cabdff1aSopenharmony_ci 3494cabdff1aSopenharmony_ci switch (ac->oc[1].m4ac.object_type) { 3495cabdff1aSopenharmony_ci case AOT_ER_AAC_LC: 3496cabdff1aSopenharmony_ci case AOT_ER_AAC_LTP: 3497cabdff1aSopenharmony_ci case AOT_ER_AAC_LD: 3498cabdff1aSopenharmony_ci case AOT_ER_AAC_ELD: 3499cabdff1aSopenharmony_ci err = aac_decode_er_frame(avctx, frame, got_frame_ptr, &gb); 3500cabdff1aSopenharmony_ci break; 3501cabdff1aSopenharmony_ci default: 3502cabdff1aSopenharmony_ci err = aac_decode_frame_int(avctx, frame, got_frame_ptr, &gb, avpkt); 3503cabdff1aSopenharmony_ci } 3504cabdff1aSopenharmony_ci if (err < 0) 3505cabdff1aSopenharmony_ci return err; 3506cabdff1aSopenharmony_ci 3507cabdff1aSopenharmony_ci buf_consumed = (get_bits_count(&gb) + 7) >> 3; 3508cabdff1aSopenharmony_ci for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++) 3509cabdff1aSopenharmony_ci if (buf[buf_offset]) 3510cabdff1aSopenharmony_ci break; 3511cabdff1aSopenharmony_ci 3512cabdff1aSopenharmony_ci return buf_size > buf_offset ? buf_consumed : buf_size; 3513cabdff1aSopenharmony_ci} 3514cabdff1aSopenharmony_ci 3515cabdff1aSopenharmony_cistatic av_cold int aac_decode_close(AVCodecContext *avctx) 3516cabdff1aSopenharmony_ci{ 3517cabdff1aSopenharmony_ci AACContext *ac = avctx->priv_data; 3518cabdff1aSopenharmony_ci int i, type; 3519cabdff1aSopenharmony_ci 3520cabdff1aSopenharmony_ci for (i = 0; i < MAX_ELEM_ID; i++) { 3521cabdff1aSopenharmony_ci for (type = 0; type < 4; type++) { 3522cabdff1aSopenharmony_ci if (ac->che[type][i]) 3523cabdff1aSopenharmony_ci AAC_RENAME(ff_aac_sbr_ctx_close)(&ac->che[type][i]->sbr); 3524cabdff1aSopenharmony_ci av_freep(&ac->che[type][i]); 3525cabdff1aSopenharmony_ci } 3526cabdff1aSopenharmony_ci } 3527cabdff1aSopenharmony_ci 3528cabdff1aSopenharmony_ci ff_mdct_end(&ac->mdct); 3529cabdff1aSopenharmony_ci ff_mdct_end(&ac->mdct_small); 3530cabdff1aSopenharmony_ci ff_mdct_end(&ac->mdct_ld); 3531cabdff1aSopenharmony_ci ff_mdct_end(&ac->mdct_ltp); 3532cabdff1aSopenharmony_ci#if !USE_FIXED 3533cabdff1aSopenharmony_ci ff_mdct15_uninit(&ac->mdct120); 3534cabdff1aSopenharmony_ci ff_mdct15_uninit(&ac->mdct480); 3535cabdff1aSopenharmony_ci ff_mdct15_uninit(&ac->mdct960); 3536cabdff1aSopenharmony_ci#endif 3537cabdff1aSopenharmony_ci av_freep(&ac->fdsp); 3538cabdff1aSopenharmony_ci return 0; 3539cabdff1aSopenharmony_ci} 3540cabdff1aSopenharmony_ci 3541cabdff1aSopenharmony_cistatic void aacdec_init(AACContext *c) 3542cabdff1aSopenharmony_ci{ 3543cabdff1aSopenharmony_ci c->imdct_and_windowing = imdct_and_windowing; 3544cabdff1aSopenharmony_ci c->apply_ltp = apply_ltp; 3545cabdff1aSopenharmony_ci c->apply_tns = apply_tns; 3546cabdff1aSopenharmony_ci c->windowing_and_mdct_ltp = windowing_and_mdct_ltp; 3547cabdff1aSopenharmony_ci c->update_ltp = update_ltp; 3548cabdff1aSopenharmony_ci#if USE_FIXED 3549cabdff1aSopenharmony_ci c->vector_pow43 = vector_pow43; 3550cabdff1aSopenharmony_ci c->subband_scale = subband_scale; 3551cabdff1aSopenharmony_ci#endif 3552cabdff1aSopenharmony_ci 3553cabdff1aSopenharmony_ci#if !USE_FIXED 3554cabdff1aSopenharmony_ci#if ARCH_MIPS 3555cabdff1aSopenharmony_ci ff_aacdec_init_mips(c); 3556cabdff1aSopenharmony_ci#endif 3557cabdff1aSopenharmony_ci#endif /* !USE_FIXED */ 3558cabdff1aSopenharmony_ci} 3559cabdff1aSopenharmony_ci/** 3560cabdff1aSopenharmony_ci * AVOptions for Japanese DTV specific extensions (ADTS only) 3561cabdff1aSopenharmony_ci */ 3562cabdff1aSopenharmony_ci#define AACDEC_FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM 3563cabdff1aSopenharmony_cistatic const AVOption options[] = { 3564cabdff1aSopenharmony_ci {"dual_mono_mode", "Select the channel to decode for dual mono", 3565cabdff1aSopenharmony_ci offsetof(AACContext, force_dmono_mode), AV_OPT_TYPE_INT, {.i64=-1}, -1, 2, 3566cabdff1aSopenharmony_ci AACDEC_FLAGS, "dual_mono_mode"}, 3567cabdff1aSopenharmony_ci 3568cabdff1aSopenharmony_ci {"auto", "autoselection", 0, AV_OPT_TYPE_CONST, {.i64=-1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"}, 3569cabdff1aSopenharmony_ci {"main", "Select Main/Left channel", 0, AV_OPT_TYPE_CONST, {.i64= 1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"}, 3570cabdff1aSopenharmony_ci {"sub" , "Select Sub/Right channel", 0, AV_OPT_TYPE_CONST, {.i64= 2}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"}, 3571cabdff1aSopenharmony_ci {"both", "Select both channels", 0, AV_OPT_TYPE_CONST, {.i64= 0}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"}, 3572cabdff1aSopenharmony_ci 3573cabdff1aSopenharmony_ci { "channel_order", "Order in which the channels are to be exported", 3574cabdff1aSopenharmony_ci offsetof(AACContext, output_channel_order), AV_OPT_TYPE_INT, 3575cabdff1aSopenharmony_ci { .i64 = CHANNEL_ORDER_DEFAULT }, 0, 1, AACDEC_FLAGS, "channel_order" }, 3576cabdff1aSopenharmony_ci { "default", "normal libavcodec channel order", 0, AV_OPT_TYPE_CONST, 3577cabdff1aSopenharmony_ci { .i64 = CHANNEL_ORDER_DEFAULT }, .flags = AACDEC_FLAGS, "channel_order" }, 3578cabdff1aSopenharmony_ci { "coded", "order in which the channels are coded in the bitstream", 3579cabdff1aSopenharmony_ci 0, AV_OPT_TYPE_CONST, { .i64 = CHANNEL_ORDER_CODED }, .flags = AACDEC_FLAGS, "channel_order" }, 3580cabdff1aSopenharmony_ci 3581cabdff1aSopenharmony_ci {NULL}, 3582cabdff1aSopenharmony_ci}; 3583cabdff1aSopenharmony_ci 3584cabdff1aSopenharmony_cistatic const AVClass aac_decoder_class = { 3585cabdff1aSopenharmony_ci .class_name = "AAC decoder", 3586cabdff1aSopenharmony_ci .item_name = av_default_item_name, 3587cabdff1aSopenharmony_ci .option = options, 3588cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 3589cabdff1aSopenharmony_ci}; 3590