1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (C) 2017 foo86 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 22cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 23cabdff1aSopenharmony_ci#include "libavutil/thread.h" 24cabdff1aSopenharmony_ci#include "libavutil/mem.h" 25cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 26cabdff1aSopenharmony_ci#include "libavutil/opt.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "codec_internal.h" 29cabdff1aSopenharmony_ci#include "internal.h" 30cabdff1aSopenharmony_ci#include "get_bits.h" 31cabdff1aSopenharmony_ci#include "dolby_e.h" 32cabdff1aSopenharmony_ci#include "kbdwin.h" 33cabdff1aSopenharmony_ci#include "fft.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#define MAX_SEGMENTS 2 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#define MAX_GROUPS 8 38cabdff1aSopenharmony_ci#define MAX_EXPONENTS 304 39cabdff1aSopenharmony_ci#define MAX_MANTISSAS 1024 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define MAX_MSTR_EXP 2 42cabdff1aSopenharmony_ci#define MAX_BIAS_EXP 50 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_cienum DBEOutputChannelOrder { 45cabdff1aSopenharmony_ci CHANNEL_ORDER_DEFAULT, 46cabdff1aSopenharmony_ci CHANNEL_ORDER_CODED, 47cabdff1aSopenharmony_ci}; 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_citypedef struct DBEGroup { 50cabdff1aSopenharmony_ci uint8_t nb_exponent; 51cabdff1aSopenharmony_ci uint8_t nb_bias_exp[MAX_MSTR_EXP]; 52cabdff1aSopenharmony_ci uint16_t exp_ofs; 53cabdff1aSopenharmony_ci uint16_t mnt_ofs; 54cabdff1aSopenharmony_ci const uint8_t *nb_mantissa; 55cabdff1aSopenharmony_ci uint8_t imdct_idx; 56cabdff1aSopenharmony_ci uint8_t imdct_phs; 57cabdff1aSopenharmony_ci uint16_t win_len; 58cabdff1aSopenharmony_ci uint16_t dst_ofs; 59cabdff1aSopenharmony_ci uint16_t win_ofs; 60cabdff1aSopenharmony_ci uint16_t src_ofs; 61cabdff1aSopenharmony_ci} DBEGroup; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_citypedef struct DBEChannel { 64cabdff1aSopenharmony_ci int gr_code; 65cabdff1aSopenharmony_ci int bw_code; 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci int nb_groups; 68cabdff1aSopenharmony_ci int nb_mstr_exp; 69cabdff1aSopenharmony_ci DBEGroup groups[MAX_GROUPS]; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci int exp_strategy[MAX_GROUPS]; 72cabdff1aSopenharmony_ci int exponents[MAX_EXPONENTS]; 73cabdff1aSopenharmony_ci int bap[MAX_EXPONENTS]; 74cabdff1aSopenharmony_ci int idx[MAX_EXPONENTS]; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, mantissas)[MAX_MANTISSAS]; 77cabdff1aSopenharmony_ci} DBEChannel; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_citypedef struct DBEDecodeContext { 80cabdff1aSopenharmony_ci const AVClass *class; 81cabdff1aSopenharmony_ci AVCodecContext *avctx; 82cabdff1aSopenharmony_ci DBEContext dectx; 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci DBEChannel channels[MAX_SEGMENTS][MAX_CHANNELS]; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, history)[MAX_CHANNELS][256]; 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci FFTContext imdct[3]; 89cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 90cabdff1aSopenharmony_ci} DBEDecodeContext; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_cistatic const int8_t lfe_channel_tab[MAX_PROG_CONF + 1] = { 93cabdff1aSopenharmony_ci 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 94cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5 95cabdff1aSopenharmony_ci}; 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_4[4] = { 0, 2, 1, 3 }; 98cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_6[6] = { 0, 2, 4, 1, 3, 5 }; 99cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_8[8] = { 0, 2, 6, 4, 1, 3, 7, 5 }; 100cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_n[8] = { 0, 2, 4, 6, 1, 3, 5, 7 }; 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_cistatic const uint8_t nb_groups_tab[4] = { 1, 8, 7, 1 }; 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_cistatic const uint8_t nb_mstr_exp_tab[4] = { 2, 2, 2, 1 }; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_cistatic const uint8_t nb_mantissa_38[38] = { 108cabdff1aSopenharmony_ci 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109cabdff1aSopenharmony_ci 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 110cabdff1aSopenharmony_ci 7, 8, 9, 10, 11, 12, 111cabdff1aSopenharmony_ci}; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_cistatic const uint8_t nb_mantissa_44[44] = { 114cabdff1aSopenharmony_ci 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 115cabdff1aSopenharmony_ci 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 7, 7, 116cabdff1aSopenharmony_ci 8, 9, 10, 11, 12, 13, 15, 16, 18, 20, 22, 25, 117cabdff1aSopenharmony_ci}; 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_cistatic const uint8_t nb_mantissa_50[50] = { 120cabdff1aSopenharmony_ci 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 121cabdff1aSopenharmony_ci 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 12, 13, 14, 16, 122cabdff1aSopenharmony_ci 18, 19, 22, 24, 27, 29, 32, 36, 40, 44, 49, 54, 60, 66, 74, 82, 123cabdff1aSopenharmony_ci 90, 100, 124cabdff1aSopenharmony_ci}; 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_cistatic const uint8_t imdct_bits_tab[3] = { 8, 9, 11 }; 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_0[1] = { 129cabdff1aSopenharmony_ci { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 }, 130cabdff1aSopenharmony_ci}; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_1[8] = { 133cabdff1aSopenharmony_ci { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 }, 134cabdff1aSopenharmony_ci { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 }, 135cabdff1aSopenharmony_ci { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 }, 136cabdff1aSopenharmony_ci { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 }, 137cabdff1aSopenharmony_ci { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 }, 138cabdff1aSopenharmony_ci { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 }, 139cabdff1aSopenharmony_ci { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 704, 0, 0 }, 140cabdff1aSopenharmony_ci { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 1, 256, 832, 0, 0 }, 141cabdff1aSopenharmony_ci}; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_2[7] = { 144cabdff1aSopenharmony_ci { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 }, 145cabdff1aSopenharmony_ci { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 }, 146cabdff1aSopenharmony_ci { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 }, 147cabdff1aSopenharmony_ci { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 }, 148cabdff1aSopenharmony_ci { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 }, 149cabdff1aSopenharmony_ci { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 }, 150cabdff1aSopenharmony_ci { 44, { 19, 25 }, 228, 768, nb_mantissa_44, 1, 1, 448, 704, 960, 64 }, 151cabdff1aSopenharmony_ci}; 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_3[1] = { 154cabdff1aSopenharmony_ci { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 }, 155cabdff1aSopenharmony_ci}; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_4[1] = { 158cabdff1aSopenharmony_ci { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 }, 159cabdff1aSopenharmony_ci}; 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_5[8] = { 162cabdff1aSopenharmony_ci { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 1, 256, 64, 0, 0 }, 163cabdff1aSopenharmony_ci { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 192, 0, 0 }, 164cabdff1aSopenharmony_ci { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 }, 165cabdff1aSopenharmony_ci { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 }, 166cabdff1aSopenharmony_ci { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 }, 167cabdff1aSopenharmony_ci { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 }, 168cabdff1aSopenharmony_ci { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 }, 169cabdff1aSopenharmony_ci { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 }, 170cabdff1aSopenharmony_ci}; 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_6[7] = { 173cabdff1aSopenharmony_ci { 44, { 19, 25 }, 0, 0, nb_mantissa_44, 1, 1, 448, 0, 3264, 0 }, 174cabdff1aSopenharmony_ci { 38, { 12, 26 }, 44, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 }, 175cabdff1aSopenharmony_ci { 38, { 12, 26 }, 82, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 }, 176cabdff1aSopenharmony_ci { 38, { 12, 26 }, 120, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 }, 177cabdff1aSopenharmony_ci { 38, { 12, 26 }, 158, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 }, 178cabdff1aSopenharmony_ci { 38, { 12, 26 }, 196, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 }, 179cabdff1aSopenharmony_ci { 38, { 12, 26 }, 234, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 }, 180cabdff1aSopenharmony_ci}; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_7[1] = { 183cabdff1aSopenharmony_ci { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 }, 184cabdff1aSopenharmony_ci}; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_cistatic const DBEGroup *const frm_ofs_tab[2][4] = { 187cabdff1aSopenharmony_ci { grp_tab_0, grp_tab_1, grp_tab_2, grp_tab_3 }, 188cabdff1aSopenharmony_ci { grp_tab_4, grp_tab_5, grp_tab_6, grp_tab_7 } 189cabdff1aSopenharmony_ci}; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_cistatic const uint8_t mantissa_size1[16][4] = { 192cabdff1aSopenharmony_ci { 0, 0, 0, 0 }, { 2, 1, 1, 1 }, { 3, 2, 1, 1 }, { 4, 3, 2, 1 }, 193cabdff1aSopenharmony_ci { 5, 4, 3, 2 }, { 6, 5, 4, 3 }, { 7, 6, 5, 4 }, { 8, 7, 6, 5 }, 194cabdff1aSopenharmony_ci { 9, 8, 7, 6 }, { 10, 9, 8, 7 }, { 11, 10, 9, 8 }, { 12, 11, 10, 9 }, 195cabdff1aSopenharmony_ci { 13, 12, 11, 10 }, { 14, 13, 12, 11 }, { 15, 14, 13, 12 }, { 16, 15, 14, 13 }, 196cabdff1aSopenharmony_ci}; 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_cistatic const uint8_t mantissa_size2[16][4] = { 199cabdff1aSopenharmony_ci { 0, 0, 0, 0 }, { 2, 1, 2, 2 }, { 3, 2, 3, 3 }, { 4, 3, 4, 4 }, 200cabdff1aSopenharmony_ci { 5, 4, 5, 5 }, { 6, 5, 6, 6 }, { 7, 6, 7, 7 }, { 8, 7, 8, 8 }, 201cabdff1aSopenharmony_ci { 9, 8, 9, 9 }, { 10, 9, 10, 10 }, { 11, 10, 11, 11 }, { 12, 11, 12, 12 }, 202cabdff1aSopenharmony_ci { 13, 12, 13, 13 }, { 14, 13, 14, 14 }, { 15, 14, 15, 15 }, { 16, 15, 16, 16 }, 203cabdff1aSopenharmony_ci}; 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_cistatic const float start_window[192] = { 206cabdff1aSopenharmony_ci 0.00161569379826, 0.00185748233347, 0.00198562758548, 0.00207834078104, 207cabdff1aSopenharmony_ci 0.00215717748523, 0.00223067096393, 0.00230299213147, 0.00237651215396, 208cabdff1aSopenharmony_ci 0.00245275561606, 0.00253281402069, 0.00261754673613, 0.00270768786168, 209cabdff1aSopenharmony_ci 0.00280390761895, 0.00290684998656, 0.00301715751161, 0.00313548872798, 210cabdff1aSopenharmony_ci 0.00326253122934, 0.00339901215995, 0.00354570716636, 0.00370344845023, 211cabdff1aSopenharmony_ci 0.00387313232586, 0.00405572653911, 0.00425227750970, 0.00446391759265, 212cabdff1aSopenharmony_ci 0.00469187240551, 0.00493746822816, 0.00520213944619, 0.00548743597507, 213cabdff1aSopenharmony_ci 0.00579503056737, 0.00612672586953, 0.00648446105606, 0.00687031782873, 214cabdff1aSopenharmony_ci 0.00728652552677, 0.00773546505205, 0.00821967127415, 0.00874183354619, 215cabdff1aSopenharmony_ci 0.00930479393832, 0.00991154278653, 0.01056521116692, 0.01126905994567, 216cabdff1aSopenharmony_ci 0.01202646513050, 0.01284089936559, 0.01371590957417, 0.01465509096066, 217cabdff1aSopenharmony_ci 0.01566205783408, 0.01674041199523, 0.01789370972358, 0.01912542867865, 218cabdff1aSopenharmony_ci 0.02043893626265, 0.02183746113793, 0.02332406961796, 0.02490164852364, 219cabdff1aSopenharmony_ci 0.02657289580178, 0.02834031974193, 0.03020624702903, 0.03217283918354, 220cabdff1aSopenharmony_ci 0.03424211623810, 0.03641598586180, 0.03869627565015, 0.04108476601498, 221cabdff1aSopenharmony_ci 0.04358322107390, 0.04619341515939, 0.04891715301882, 0.05175628239149, 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci 0.05471237327267, 0.05778734733755, 0.06098291402413, 0.06430101352084, 224cabdff1aSopenharmony_ci 0.06774345212186, 0.07131188644726, 0.07500780649199, 0.07883251748595, 225cabdff1aSopenharmony_ci 0.08278712056651, 0.08687249228061, 0.09108926295730, 0.09543779401074, 226cabdff1aSopenharmony_ci 0.09991815425851, 0.10453009536427, 0.10927302653894, 0.11414598865987, 227cabdff1aSopenharmony_ci 0.11914762799220, 0.12427616972097, 0.12952939152560, 0.13490459744934, 228cabdff1aSopenharmony_ci 0.14039859233595, 0.14600765712201, 0.15172752528722, 0.15755336077528, 229cabdff1aSopenharmony_ci 0.16347973770491, 0.16950062219342, 0.17560935661442, 0.18179864660619, 230cabdff1aSopenharmony_ci 0.18806055113821, 0.19438647593012, 0.20076717050010, 0.20719272909882, 231cabdff1aSopenharmony_ci 0.21365259576030, 0.22013557367283, 0.22662983904194, 0.23312295958328, 232cabdff1aSopenharmony_ci 0.23960191774666, 0.24605313873388, 0.25246252333253, 0.25881548554631, 233cabdff1aSopenharmony_ci 0.26509699495987, 0.27129162373316, 0.27738359807707, 0.28335685401987, 234cabdff1aSopenharmony_ci 0.28919509723179, 0.29488186663467, 0.30040060148455, 0.30573471157819, 235cabdff1aSopenharmony_ci 0.31086765019993, 0.31578298939317, 0.32046449711227, 0.32489621578468, 236cabdff1aSopenharmony_ci 0.32906254179156, 0.33294830535654, 0.33653885031840, 0.33982011325336, 237cabdff1aSopenharmony_ci 0.34277870140679, 0.34540196889300, 0.34767809062480, 0.34959613344194, 238cabdff1aSopenharmony_ci 0.35114612391958, 0.35231911235422, 0.35310723244504, 0.35350375621308, 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci 0.35350314372945, 0.35310108725579, 0.35229454943591, 0.35108179521634, 241cabdff1aSopenharmony_ci 0.34946241721522, 0.34743735430290, 0.34500890320420, 0.34218072298001, 242cabdff1aSopenharmony_ci 0.33895783229541, 0.33534659943168, 0.33135472505060, 0.32699121776996, 243cabdff1aSopenharmony_ci 0.32226636266000, 0.31719168282019, 0.31177989424432, 0.30604485422875, 244cabdff1aSopenharmony_ci 0.30000150362379, 0.29366580327088, 0.28705466500775, 0.28018587766131, 245cabdff1aSopenharmony_ci 0.27307802848095, 0.26575042049535, 0.25822298630189, 0.25051619882000, 246cabdff1aSopenharmony_ci 0.24265097955783, 0.23464860495522, 0.22653061137548, 0.21831869932335, 247cabdff1aSopenharmony_ci 0.21003463746705, 0.20170016703857, 0.19333690717811, 0.18496626177620, 248cabdff1aSopenharmony_ci 0.17660932835062, 0.16828680947474, 0.16001892724986, 0.15182534128597, 249cabdff1aSopenharmony_ci 0.14372507062477, 0.13573642000364, 0.12787691082233, 0.12016321713317, 250cabdff1aSopenharmony_ci 0.11261110693234, 0.10523538898282, 0.09804986534955, 0.09106728977263, 251cabdff1aSopenharmony_ci 0.08429933194438, 0.07775654768810, 0.07144835495683, 0.06538301547324, 252cabdff1aSopenharmony_ci 0.05956762170687, 0.05400808871425, 0.04870915012107, 0.04367435714993, 253cabdff1aSopenharmony_ci 0.03890607899172, 0.03440550179663, 0.03017262174627, 0.02620622428513, 254cabdff1aSopenharmony_ci 0.02250383492507, 0.01906161305732, 0.01587412848221, 0.01293388032354, 255cabdff1aSopenharmony_ci 0.01023019677288, 0.00774641320626, 0.00545109736891, 0.00325868651263, 256cabdff1aSopenharmony_ci}; 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_cistatic const float short_window2[192] = { 259cabdff1aSopenharmony_ci 0.00018861094606, 0.00033433010202, 0.00050309624485, 0.00070306161748, 260cabdff1aSopenharmony_ci 0.00093995174533, 0.00121913067128, 0.00154606505568, 0.00192647806126, 261cabdff1aSopenharmony_ci 0.00236641248692, 0.00287225985240, 0.00345077377440, 0.00410907465023, 262cabdff1aSopenharmony_ci 0.00485464855241, 0.00569534163219, 0.00663935063508, 0.00769520981249, 263cabdff1aSopenharmony_ci 0.00887177436246, 0.01017820046395, 0.01162392194150, 0.01321862359335, 264cabdff1aSopenharmony_ci 0.01497221122468, 0.01689477844427, 0.01899657030441, 0.02128794388846, 265cabdff1aSopenharmony_ci 0.02377932597692, 0.02648116795039, 0.02940389811590, 0.03255787167130, 266cabdff1aSopenharmony_ci 0.03595331854986, 0.03960028941437, 0.04350860009563, 0.04768777479454, 267cabdff1aSopenharmony_ci 0.05214698838949, 0.05689500821121, 0.06194013566525, 0.06729014809766, 268cabdff1aSopenharmony_ci 0.07295224131210, 0.07893297315602, 0.08523820859989, 0.09187306673620, 269cabdff1aSopenharmony_ci 0.09884187012422, 0.10614809690222, 0.11379433608064, 0.12178224641797, 270cabdff1aSopenharmony_ci 0.13011251926531, 0.13878484574660, 0.14779788861830, 0.15714925912610, 271cabdff1aSopenharmony_ci 0.16683549914631, 0.17685206886673, 0.18719334022589, 0.19785259629099, 272cabdff1aSopenharmony_ci 0.20882203671372, 0.22009278936030, 0.23165492816694, 0.24349749722585, 273cabdff1aSopenharmony_ci 0.25560854105961, 0.26797514099368, 0.28058345748882, 0.29341877824732, 274cabdff1aSopenharmony_ci 0.30646557185942, 0.31970754671026, 0.33312771482295, 0.34670846027024, 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci 0.36043161174692, 0.37427851885723, 0.38823013163645, 0.40226708279486, 277cabdff1aSopenharmony_ci 0.41636977214436, 0.43051845264462, 0.44469331748632, 0.45887458761470, 278cabdff1aSopenharmony_ci 0.47304259908636, 0.48717788964798, 0.50126128392546, 0.51527397661778, 279cabdff1aSopenharmony_ci 0.52919761310050, 0.54301436685998, 0.55670701320069, 0.57025899869448, 280cabdff1aSopenharmony_ci 0.58365450587230, 0.59687851269542, 0.60991684638414, 0.62275623122793, 281cabdff1aSopenharmony_ci 0.63538433005035, 0.64778977905593, 0.65996221584264, 0.67189230042379, 282cabdff1aSopenharmony_ci 0.68357172916486, 0.69499324160511, 0.70615062019861, 0.71703868307548, 283cabdff1aSopenharmony_ci 0.72765326998919, 0.73799122168099, 0.74805035295521, 0.75782941981995, 284cabdff1aSopenharmony_ci 0.76732808110520, 0.77654685502339, 0.78548707118622, 0.79415081863423, 285cabdff1aSopenharmony_ci 0.80254089047207, 0.81066072573188, 0.81851434910893, 0.82610630922734, 286cabdff1aSopenharmony_ci 0.83344161609862, 0.84052567843230, 0.84736424144524, 0.85396332579459, 287cabdff1aSopenharmony_ci 0.86032916822973, 0.86646816451999, 0.87238681516918, 0.87809167437532, 288cabdff1aSopenharmony_ci 0.88358930263537, 0.88888622333073, 0.89398888356256, 0.89890361943564, 289cabdff1aSopenharmony_ci 0.90363662591861, 0.90819393133744, 0.91258137648979, 0.91680459830070, 290cabdff1aSopenharmony_ci 0.92086901787718, 0.92477983276087, 0.92854201312583, 0.93216030163834, 291cabdff1aSopenharmony_ci 0.93563921662343, 0.93898305819384, 0.94219591693690, 0.94528168477979, 292cabdff1aSopenharmony_ci 293cabdff1aSopenharmony_ci 0.94823843319821, 0.95106834367330, 0.95377776558539, 0.95636718335775, 294cabdff1aSopenharmony_ci 0.95883679961479, 0.96118650212341, 0.96341583179195, 0.96552395212906, 295cabdff1aSopenharmony_ci 0.96750962060547, 0.96937116231768, 0.97110644638309, 0.97271286544154, 296cabdff1aSopenharmony_ci 0.97418731862798, 0.97552619834964, 0.97672538116257, 0.97778022299974, 297cabdff1aSopenharmony_ci 0.97868555895586, 0.97943570778357, 0.98002448120255, 0.98044519806866, 298cabdff1aSopenharmony_ci 0.98069070339493, 0.98075339216123, 0.98062523779637, 0.98029782516478, 299cabdff1aSopenharmony_ci 0.97976238784222, 0.97900984942031, 0.97803086854002, 0.97681588731895, 300cabdff1aSopenharmony_ci 0.97535518280755, 0.97363892108474, 0.97165721358452, 0.96940017523145, 301cabdff1aSopenharmony_ci 0.96685798395452, 0.96402094114589, 0.96087953263194, 0.95742448973047, 302cabdff1aSopenharmony_ci 0.95364684997699, 0.94953801711660, 0.94508981997396, 0.94029456983253, 303cabdff1aSopenharmony_ci 0.93514511597504, 0.92963489905951, 0.92375800202883, 0.91750919827624, 304cabdff1aSopenharmony_ci 0.91088399681406, 0.90387868421832, 0.89649036314692, 0.88871698725397, 305cabdff1aSopenharmony_ci 0.88055739234735, 0.87201132366062, 0.86307945913336, 0.85376342861693, 306cabdff1aSopenharmony_ci 0.84406582894455, 0.83399023482637, 0.82354120554757, 0.81272428745995, 307cabdff1aSopenharmony_ci 0.80154601230457, 0.79001389138101, 0.77813640562199, 0.76592299164227, 308cabdff1aSopenharmony_ci 0.75338402384395, 0.74053079267526, 0.72737547915460, 0.71393112578527, 309cabdff1aSopenharmony_ci}; 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_cistatic const float short_window3[64] = { 312cabdff1aSopenharmony_ci 0.00326887936450, 0.00550242900936, 0.00786846643791, 0.01045683453520, 313cabdff1aSopenharmony_ci 0.01330402120132, 0.01643221072863, 0.01985798040609, 0.02359509464766, 314cabdff1aSopenharmony_ci 0.02765559221954, 0.03205025893128, 0.03678884369614, 0.04188015679495, 315cabdff1aSopenharmony_ci 0.04733210987781, 0.05315172583924, 0.05934513287609, 0.06591755045290, 316cabdff1aSopenharmony_ci 0.07287327156378, 0.08021564389822, 0.08794705152307, 0.09606889811179, 317cabdff1aSopenharmony_ci 0.10458159240070, 0.11348453632940, 0.12277611617809, 0.13245369691511, 318cabdff1aSopenharmony_ci 0.14251361989876, 0.15295120402567, 0.16376075037904, 0.17493555039885, 319cabdff1aSopenharmony_ci 0.18646789757072, 0.19834910260891, 0.21056951208995, 0.22311853047787, 320cabdff1aSopenharmony_ci 0.23598464546683, 0.24915545655419, 0.26261770674500, 0.27635731727778, 321cabdff1aSopenharmony_ci 0.29035942525136, 0.30460842402318, 0.31908800624032, 0.33378120935681, 322cabdff1aSopenharmony_ci 0.34867046348260, 0.36373764140285, 0.37896411059909, 0.39433078709788, 323cabdff1aSopenharmony_ci 0.40981819096657, 0.42540650327031, 0.44107562429959, 0.45680523287270, 324cabdff1aSopenharmony_ci 0.47257484651351, 0.48836388230077, 0.50415171818214, 0.51991775454258, 325cabdff1aSopenharmony_ci 0.53564147581496, 0.55130251191887, 0.56688069931047, 0.58235614142007, 326cabdff1aSopenharmony_ci 0.59770926827271, 0.61292089506118, 0.62797227945823, 0.64284517745255, 327cabdff1aSopenharmony_ci 0.65752189749349, 0.67198535273209, 0.68621911114984, 0.70020744337099, 328cabdff1aSopenharmony_ci}; 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_cistatic const uint8_t dc_code_tab[5] = { 0, 0, 0, 1, 1 }; 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_cistatic const uint8_t ht_code_tab[5] = { 0, 0, 1, 2, 2 }; 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_cistatic const uint8_t band_ofs_tab[3][4] = { 335cabdff1aSopenharmony_ci { 12, 8, 4, 0 }, { 14, 10, 6, 0 }, { 12, 8, 4, 0 } 336cabdff1aSopenharmony_ci}; 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_cistatic const uint8_t band_low_tab[3] = { 9, 17, 24 }; 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_cistatic const uint16_t fast_gain_tab[8] = { 341cabdff1aSopenharmony_ci 128, 256, 384, 512, 640, 768, 896, 1024 342cabdff1aSopenharmony_ci}; 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_cistatic const uint16_t slow_decay_tab[2][2] = { { 27, -1 }, { 32, 21 } }; 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_cistatic const uint16_t misc_decay_tab[3][2][2] = { 347cabdff1aSopenharmony_ci { { 354, -1 }, { 425, 425 } }, 348cabdff1aSopenharmony_ci { { 266, -1 }, { 320, -1 } }, 349cabdff1aSopenharmony_ci { { 213, -1 }, { 256, -1 } } 350cabdff1aSopenharmony_ci}; 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_cistatic const uint16_t fast_decay_tab[3][2][2][50] = { 353cabdff1aSopenharmony_ci {{{ 354cabdff1aSopenharmony_ci 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 355cabdff1aSopenharmony_ci 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 356cabdff1aSopenharmony_ci 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 357cabdff1aSopenharmony_ci 142, 142, 142, 142, 142, 142, 142, 142, 358cabdff1aSopenharmony_ci }, { 359cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 360cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 361cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 362cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, 363cabdff1aSopenharmony_ci }}, {{ 364cabdff1aSopenharmony_ci 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 365cabdff1aSopenharmony_ci 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 366cabdff1aSopenharmony_ci 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 367cabdff1aSopenharmony_ci 170, 170, 170, 170, 170, 170, 170, 170, 368cabdff1aSopenharmony_ci }, { 369cabdff1aSopenharmony_ci 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 370cabdff1aSopenharmony_ci 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 371cabdff1aSopenharmony_ci 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 372cabdff1aSopenharmony_ci 64, 64, 64, 64, 64, 64, 64, 64, 373cabdff1aSopenharmony_ci }}}, {{{ 374cabdff1aSopenharmony_ci 266, 266, 106, 106, 106, 106, 106, 106, 106, 106, 375cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 376cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 377cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 378cabdff1aSopenharmony_ci 106, 106, 106, 106, 379cabdff1aSopenharmony_ci }, { 380cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 381cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 382cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 383cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384cabdff1aSopenharmony_ci -1, -1, -1, -1, 385cabdff1aSopenharmony_ci }}, {{ 386cabdff1aSopenharmony_ci 319, 319, 128, 128, 128, 128, 128, 128, 128, 128, 387cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 388cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 389cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 390cabdff1aSopenharmony_ci 128, 128, 128, 128, 391cabdff1aSopenharmony_ci }, { 392cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 393cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 394cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 395cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 396cabdff1aSopenharmony_ci -1, -1, -1, -1, 397cabdff1aSopenharmony_ci }}}, {{{ 398cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 399cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 400cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 401cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 402cabdff1aSopenharmony_ci 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 403cabdff1aSopenharmony_ci }, { 404cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 405cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 406cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 407cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 408cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 409cabdff1aSopenharmony_ci }}, {{ 410cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 411cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 412cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 413cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 414cabdff1aSopenharmony_ci 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 415cabdff1aSopenharmony_ci }, { 416cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 417cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 418cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 419cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 420cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 421cabdff1aSopenharmony_ci }}} 422cabdff1aSopenharmony_ci}; 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_cistatic const uint16_t fast_gain_adj_tab[3][2][62] = { 425cabdff1aSopenharmony_ci {{ 426cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 427cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429cabdff1aSopenharmony_ci 0, 1, 2, 4, 7, 11, 16, 29, 44, 59, 430cabdff1aSopenharmony_ci 76, 94, 116, 142, 179, 221, 252, 285, 312, 334, 431cabdff1aSopenharmony_ci }, { 432cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 434cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 435cabdff1aSopenharmony_ci 2, 5, 8, 10, 15, 28, 42, 57, 75, 93, 436cabdff1aSopenharmony_ci 115, 140, 177, 219, 247, 280, 308, 330, 427, 533, 437cabdff1aSopenharmony_ci }}, {{ 438cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 442cabdff1aSopenharmony_ci 0, 2, 5, 8, 12, 21, 35, 51, 69, 89, 443cabdff1aSopenharmony_ci 111, 138, 176, 220, 251, 284, 312, 334, 444cabdff1aSopenharmony_ci }, { 445cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 449cabdff1aSopenharmony_ci 5, 8, 11, 18, 33, 49, 65, 84, 106, 132, 450cabdff1aSopenharmony_ci 168, 214, 245, 279, 308, 329, 427, 533, 451cabdff1aSopenharmony_ci }}, {{ 452cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 1, 4, 7, 10, 17, 457cabdff1aSopenharmony_ci 31, 47, 65, 84, 107, 134, 171, 215, 250, 283, 458cabdff1aSopenharmony_ci 312, 334, 459cabdff1aSopenharmony_ci }, { 460cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464cabdff1aSopenharmony_ci 0, 0, 0, 0, 3, 6, 9, 13, 27, 43, 465cabdff1aSopenharmony_ci 60, 79, 100, 126, 160, 207, 242, 276, 307, 329, 466cabdff1aSopenharmony_ci 427, 533, 467cabdff1aSopenharmony_ci }} 468cabdff1aSopenharmony_ci}; 469cabdff1aSopenharmony_ci 470cabdff1aSopenharmony_cistatic const uint16_t slow_gain_tab[3][2][50] = { 471cabdff1aSopenharmony_ci {{ 472cabdff1aSopenharmony_ci 3072, 3072, 3072, 3072, 3072, 3072, 1063, 1063, 1063, 1063, 473cabdff1aSopenharmony_ci 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 474cabdff1aSopenharmony_ci 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 475cabdff1aSopenharmony_ci 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 476cabdff1aSopenharmony_ci }, { 477cabdff1aSopenharmony_ci 3072, 3072, 3072, 3072, 3072, 3072, 850, 850, 850, 850, 478cabdff1aSopenharmony_ci 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 479cabdff1aSopenharmony_ci 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 480cabdff1aSopenharmony_ci 850, 850, 850, 850, 850, 850, 850, 850, 481cabdff1aSopenharmony_ci }}, {{ 482cabdff1aSopenharmony_ci 3072, 1212, 1212, 1212, 999, 999, 999, 999, 999, 999, 483cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 484cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 485cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 486cabdff1aSopenharmony_ci 999, 999, 999, 999, 487cabdff1aSopenharmony_ci }, { 488cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 489cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 490cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 491cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 492cabdff1aSopenharmony_ci -1, -1, -1, -1, 493cabdff1aSopenharmony_ci }}, {{ 494cabdff1aSopenharmony_ci 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 495cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 496cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 497cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 498cabdff1aSopenharmony_ci 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 499cabdff1aSopenharmony_ci }, { 500cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 501cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 502cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 503cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 504cabdff1aSopenharmony_ci -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 505cabdff1aSopenharmony_ci }} 506cabdff1aSopenharmony_ci}; 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_cistatic const uint16_t hearing_thresh_tab[3][3][50] = { 509cabdff1aSopenharmony_ci {{ 510cabdff1aSopenharmony_ci 1403, 1141, 1000, 959, 948, 957, 946, 925, 899, 871, 511cabdff1aSopenharmony_ci 843, 815, 789, 766, 745, 727, 705, 687, 681, 686, 512cabdff1aSopenharmony_ci 701, 725, 768, 854, 940, 1018, 1075, 1103, 1111, 1106, 513cabdff1aSopenharmony_ci 1098, 1105, 1142, 1237, 1419, 1721, 2169, 2805, 514cabdff1aSopenharmony_ci }, { 515cabdff1aSopenharmony_ci 1401, 1130, 995, 957, 947, 955, 941, 918, 890, 861, 516cabdff1aSopenharmony_ci 831, 803, 777, 754, 734, 717, 698, 684, 682, 692, 517cabdff1aSopenharmony_ci 712, 743, 798, 894, 976, 1045, 1091, 1109, 1110, 1102, 518cabdff1aSopenharmony_ci 1098, 1116, 1174, 1300, 1526, 1884, 2401, 3072, 519cabdff1aSopenharmony_ci }, { 520cabdff1aSopenharmony_ci 1393, 1086, 974, 949, 957, 941, 913, 878, 843, 808, 521cabdff1aSopenharmony_ci 777, 750, 727, 708, 695, 686, 681, 689, 714, 752, 522cabdff1aSopenharmony_ci 811, 888, 971, 1044, 1087, 1108, 1110, 1102, 1098, 1115, 523cabdff1aSopenharmony_ci 1172, 1290, 1489, 1812, 2293, 2964, 3072, 3072, 524cabdff1aSopenharmony_ci }}, {{ 525cabdff1aSopenharmony_ci 1412, 1343, 1141, 1047, 1000, 974, 959, 951, 948, 947, 526cabdff1aSopenharmony_ci 957, 953, 946, 936, 925, 906, 878, 850, 822, 795, 527cabdff1aSopenharmony_ci 771, 745, 719, 700, 687, 681, 685, 701, 733, 784, 528cabdff1aSopenharmony_ci 885, 977, 1047, 1092, 1110, 1108, 1099, 1102, 1138, 1233, 529cabdff1aSopenharmony_ci 1413, 1711, 2157, 2797, 530cabdff1aSopenharmony_ci }, { 531cabdff1aSopenharmony_ci 1412, 1336, 1130, 1040, 995, 970, 957, 950, 947, 947, 532cabdff1aSopenharmony_ci 955, 950, 941, 930, 918, 897, 868, 838, 810, 783, 533cabdff1aSopenharmony_ci 759, 734, 710, 693, 684, 681, 690, 712, 752, 823, 534cabdff1aSopenharmony_ci 924, 1009, 1069, 1102, 1111, 1104, 1098, 1111, 1168, 1295, 535cabdff1aSopenharmony_ci 1518, 1873, 2388, 3072, 536cabdff1aSopenharmony_ci }, { 537cabdff1aSopenharmony_ci 1411, 1293, 1086, 1009, 974, 957, 949, 947, 957, 951, 538cabdff1aSopenharmony_ci 941, 928, 913, 896, 878, 852, 817, 785, 756, 732, 539cabdff1aSopenharmony_ci 713, 695, 683, 682, 689, 710, 746, 811, 906, 992, 540cabdff1aSopenharmony_ci 1061, 1099, 1111, 1106, 1098, 1107, 1155, 1266, 1471, 1799, 541cabdff1aSopenharmony_ci 2277, 2945, 3072, 3072, 542cabdff1aSopenharmony_ci }}, {{ 543cabdff1aSopenharmony_ci 1431, 1412, 1403, 1379, 1343, 1293, 1229, 1180, 1125, 1075, 544cabdff1aSopenharmony_ci 1040, 1014, 996, 979, 965, 957, 951, 948, 947, 957, 545cabdff1aSopenharmony_ci 951, 940, 924, 903, 877, 846, 815, 785, 753, 725, 546cabdff1aSopenharmony_ci 702, 686, 681, 689, 714, 760, 847, 947, 1028, 1083, 547cabdff1aSopenharmony_ci 1108, 1109, 1101, 1100, 1132, 1222, 1402, 1705, 2160, 2803, 548cabdff1aSopenharmony_ci }, { 549cabdff1aSopenharmony_ci 1431, 1412, 1401, 1375, 1336, 1278, 1215, 1168, 1115, 1066, 550cabdff1aSopenharmony_ci 1032, 1008, 991, 975, 962, 954, 950, 947, 947, 955, 551cabdff1aSopenharmony_ci 948, 935, 916, 894, 866, 835, 803, 772, 742, 715, 552cabdff1aSopenharmony_ci 695, 683, 683, 697, 729, 784, 887, 982, 1054, 1096, 553cabdff1aSopenharmony_ci 1111, 1106, 1098, 1107, 1159, 1281, 1505, 1865, 2391, 3072, 554cabdff1aSopenharmony_ci }, { 555cabdff1aSopenharmony_ci 1427, 1411, 1393, 1353, 1293, 1215, 1160, 1118, 1072, 1031, 556cabdff1aSopenharmony_ci 1003, 984, 971, 960, 952, 948, 947, 957, 952, 941, 557cabdff1aSopenharmony_ci 924, 902, 876, 847, 815, 781, 750, 723, 700, 685, 558cabdff1aSopenharmony_ci 681, 691, 719, 766, 858, 958, 1039, 1089, 1109, 1108, 559cabdff1aSopenharmony_ci 1099, 1102, 1141, 1245, 1442, 1766, 2250, 2930, 3072, 3072, 560cabdff1aSopenharmony_ci }} 561cabdff1aSopenharmony_ci}; 562cabdff1aSopenharmony_ci 563cabdff1aSopenharmony_cistatic const int16_t lwc_gain_tab[11][7] = { 564cabdff1aSopenharmony_ci { -21, -197, -271, -466, 32767, 32767, 32767 }, 565cabdff1aSopenharmony_ci { -197, -29, -244, -271, -540, 32767, 32767 }, 566cabdff1aSopenharmony_ci { -271, -244, -29, -249, -271, -593, 32767 }, 567cabdff1aSopenharmony_ci { -466, -271, -249, -29, -251, -271, -632 }, 568cabdff1aSopenharmony_ci { -540, -271, -251, -29, -251, -271, -664 }, 569cabdff1aSopenharmony_ci { -593, -271, -251, -29, -252, -271, -690 }, 570cabdff1aSopenharmony_ci { -632, -271, -252, -29, -252, -271, -711 }, 571cabdff1aSopenharmony_ci { -664, -271, -252, -29, -252, -271, -730 }, 572cabdff1aSopenharmony_ci { -690, -271, -252, -29, -252, -271, -745 }, 573cabdff1aSopenharmony_ci { -711, -271, -252, -29, -253, -271, -759 }, 574cabdff1aSopenharmony_ci { -730, -271, -253, -29, -253, -271, -771 }, 575cabdff1aSopenharmony_ci}; 576cabdff1aSopenharmony_ci 577cabdff1aSopenharmony_cistatic const int16_t lwc_adj_tab[7] = { 578cabdff1aSopenharmony_ci -192, -320, -448, -512, -448, -320, -192, 579cabdff1aSopenharmony_ci}; 580cabdff1aSopenharmony_ci 581cabdff1aSopenharmony_cistatic const uint8_t log_add_tab[212] = { 582cabdff1aSopenharmony_ci 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 52, 51, 50, 583cabdff1aSopenharmony_ci 49, 48, 47, 47, 46, 45, 44, 44, 43, 42, 41, 41, 40, 39, 38, 38, 584cabdff1aSopenharmony_ci 37, 36, 36, 35, 35, 34, 33, 33, 32, 32, 31, 30, 30, 29, 29, 28, 585cabdff1aSopenharmony_ci 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 21, 586cabdff1aSopenharmony_ci 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 587cabdff1aSopenharmony_ci 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 588cabdff1aSopenharmony_ci 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 589cabdff1aSopenharmony_ci 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 590cabdff1aSopenharmony_ci 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 591cabdff1aSopenharmony_ci 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 592cabdff1aSopenharmony_ci 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 593cabdff1aSopenharmony_ci 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 594cabdff1aSopenharmony_ci 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 595cabdff1aSopenharmony_ci 1, 1, 0, 0, 596cabdff1aSopenharmony_ci}; 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_cistatic const uint8_t bap_tab[64] = { 599cabdff1aSopenharmony_ci 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 600cabdff1aSopenharmony_ci 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 601cabdff1aSopenharmony_ci 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 602cabdff1aSopenharmony_ci 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 603cabdff1aSopenharmony_ci}; 604cabdff1aSopenharmony_ci 605cabdff1aSopenharmony_cistatic float mantissa_tab1[17][4]; 606cabdff1aSopenharmony_cistatic float mantissa_tab2[17][4]; 607cabdff1aSopenharmony_cistatic float mantissa_tab3[17][4]; 608cabdff1aSopenharmony_cistatic float exponent_tab[50]; 609cabdff1aSopenharmony_cistatic float gain_tab[1024]; 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ciDECLARE_ALIGNED(32, static float, window)[3712]; 612cabdff1aSopenharmony_ci 613cabdff1aSopenharmony_cistatic int skip_input(DBEContext *s, int nb_words) 614cabdff1aSopenharmony_ci{ 615cabdff1aSopenharmony_ci if (nb_words > s->input_size) { 616cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n"); 617cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 618cabdff1aSopenharmony_ci } 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ci s->input += nb_words * s->word_bytes; 621cabdff1aSopenharmony_ci s->input_size -= nb_words; 622cabdff1aSopenharmony_ci return 0; 623cabdff1aSopenharmony_ci} 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_cistatic int parse_key(DBEContext *s) 626cabdff1aSopenharmony_ci{ 627cabdff1aSopenharmony_ci if (s->key_present) { 628cabdff1aSopenharmony_ci const uint8_t *key = s->input; 629cabdff1aSopenharmony_ci int ret = skip_input(s, 1); 630cabdff1aSopenharmony_ci if (ret < 0) 631cabdff1aSopenharmony_ci return ret; 632cabdff1aSopenharmony_ci return AV_RB24(key) >> 24 - s->word_bits; 633cabdff1aSopenharmony_ci } 634cabdff1aSopenharmony_ci return 0; 635cabdff1aSopenharmony_ci} 636cabdff1aSopenharmony_ci 637cabdff1aSopenharmony_cistatic int parse_metadata_ext(DBEDecodeContext *s1) 638cabdff1aSopenharmony_ci{ 639cabdff1aSopenharmony_ci DBEContext *s = &s1->dectx; 640cabdff1aSopenharmony_ci if (s->metadata.mtd_ext_size) 641cabdff1aSopenharmony_ci return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1); 642cabdff1aSopenharmony_ci return 0; 643cabdff1aSopenharmony_ci} 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_cistatic void unbias_exponents(DBEContext *s, DBEChannel *c, DBEGroup *g) 646cabdff1aSopenharmony_ci{ 647cabdff1aSopenharmony_ci int mstr_exp[MAX_MSTR_EXP]; 648cabdff1aSopenharmony_ci int bias_exp[MAX_BIAS_EXP]; 649cabdff1aSopenharmony_ci int i, j, k; 650cabdff1aSopenharmony_ci 651cabdff1aSopenharmony_ci for (i = 0; i < c->nb_mstr_exp; i++) 652cabdff1aSopenharmony_ci mstr_exp[i] = get_bits(&s->gb, 2) * 6; 653cabdff1aSopenharmony_ci 654cabdff1aSopenharmony_ci for (i = 0; i < g->nb_exponent; i++) 655cabdff1aSopenharmony_ci bias_exp[i] = get_bits(&s->gb, 5); 656cabdff1aSopenharmony_ci 657cabdff1aSopenharmony_ci for (i = k = 0; i < c->nb_mstr_exp; i++) 658cabdff1aSopenharmony_ci for (j = 0; j < g->nb_bias_exp[i]; j++, k++) 659cabdff1aSopenharmony_ci c->exponents[g->exp_ofs + k] = mstr_exp[i] + bias_exp[k]; 660cabdff1aSopenharmony_ci} 661cabdff1aSopenharmony_ci 662cabdff1aSopenharmony_cistatic int parse_exponents(DBEContext *s, DBEChannel *c) 663cabdff1aSopenharmony_ci{ 664cabdff1aSopenharmony_ci DBEGroup *p, *g; 665cabdff1aSopenharmony_ci int i; 666cabdff1aSopenharmony_ci 667cabdff1aSopenharmony_ci for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) { 668cabdff1aSopenharmony_ci c->exp_strategy[i] = !i || g->nb_exponent != p->nb_exponent || get_bits1(&s->gb); 669cabdff1aSopenharmony_ci if (c->exp_strategy[i]) { 670cabdff1aSopenharmony_ci unbias_exponents(s, c, g); 671cabdff1aSopenharmony_ci } else { 672cabdff1aSopenharmony_ci memcpy(c->exponents + g->exp_ofs, 673cabdff1aSopenharmony_ci c->exponents + p->exp_ofs, 674cabdff1aSopenharmony_ci g->nb_exponent * sizeof(c->exponents[0])); 675cabdff1aSopenharmony_ci } 676cabdff1aSopenharmony_ci } 677cabdff1aSopenharmony_ci 678cabdff1aSopenharmony_ci return 0; 679cabdff1aSopenharmony_ci} 680cabdff1aSopenharmony_ci 681cabdff1aSopenharmony_cistatic inline int log_add(int a, int b) 682cabdff1aSopenharmony_ci{ 683cabdff1aSopenharmony_ci int c = FFABS(a - b) >> 1; 684cabdff1aSopenharmony_ci return FFMAX(a, b) + log_add_tab[FFMIN(c, 211)]; 685cabdff1aSopenharmony_ci} 686cabdff1aSopenharmony_ci 687cabdff1aSopenharmony_cistatic void calc_lowcomp(int *msk_val) 688cabdff1aSopenharmony_ci{ 689cabdff1aSopenharmony_ci int lwc_val[17] = { 0 }; 690cabdff1aSopenharmony_ci int i, j, k; 691cabdff1aSopenharmony_ci 692cabdff1aSopenharmony_ci for (i = 0; i < 11; i++) { 693cabdff1aSopenharmony_ci int max_j = 0; 694cabdff1aSopenharmony_ci int max_v = INT_MIN; 695cabdff1aSopenharmony_ci int thr = 0; 696cabdff1aSopenharmony_ci 697cabdff1aSopenharmony_ci for (j = FFMAX(i - 3, 0), k = 0; j <= i + 3; j++, k++) { 698cabdff1aSopenharmony_ci int v = msk_val[j] + lwc_gain_tab[i][k]; 699cabdff1aSopenharmony_ci if (v > max_v) { 700cabdff1aSopenharmony_ci max_j = j; 701cabdff1aSopenharmony_ci max_v = v; 702cabdff1aSopenharmony_ci } 703cabdff1aSopenharmony_ci thr = log_add(thr, v); 704cabdff1aSopenharmony_ci } 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci if (msk_val[i] < thr) { 707cabdff1aSopenharmony_ci for (j = FFMAX(max_j - 3, 0), 708cabdff1aSopenharmony_ci k = FFMAX(3 - max_j, 0); 709cabdff1aSopenharmony_ci j <= max_j + 3; j++, k++) 710cabdff1aSopenharmony_ci lwc_val[j] += lwc_adj_tab[k]; 711cabdff1aSopenharmony_ci } 712cabdff1aSopenharmony_ci } 713cabdff1aSopenharmony_ci 714cabdff1aSopenharmony_ci for (i = 0; i < 16; i++) { 715cabdff1aSopenharmony_ci int v = FFMAX(lwc_val[i], -512); 716cabdff1aSopenharmony_ci msk_val[i] = FFMAX(msk_val[i] + v, 0); 717cabdff1aSopenharmony_ci } 718cabdff1aSopenharmony_ci} 719cabdff1aSopenharmony_ci 720cabdff1aSopenharmony_cistatic void bit_allocate(int nb_exponent, int nb_code, int fr_code, 721cabdff1aSopenharmony_ci int *exp, int *bap, 722cabdff1aSopenharmony_ci int fg_spc, int fg_ofs, int msk_mod, int snr_ofs) 723cabdff1aSopenharmony_ci{ 724cabdff1aSopenharmony_ci int msk_val[MAX_BIAS_EXP]; 725cabdff1aSopenharmony_ci int psd_val[MAX_BIAS_EXP]; 726cabdff1aSopenharmony_ci int fast_leak = 0; 727cabdff1aSopenharmony_ci int slow_leak = 0; 728cabdff1aSopenharmony_ci int dc_code = dc_code_tab[fr_code - 1]; 729cabdff1aSopenharmony_ci int ht_code = ht_code_tab[fr_code - 1]; 730cabdff1aSopenharmony_ci int fast_gain = fast_gain_tab[fg_ofs]; 731cabdff1aSopenharmony_ci int slow_decay = slow_decay_tab[dc_code][msk_mod]; 732cabdff1aSopenharmony_ci int misc_decay = misc_decay_tab[nb_code][dc_code][msk_mod]; 733cabdff1aSopenharmony_ci const uint16_t *slow_gain = slow_gain_tab[nb_code][msk_mod]; 734cabdff1aSopenharmony_ci const uint16_t *fast_decay = fast_decay_tab[nb_code][dc_code][msk_mod]; 735cabdff1aSopenharmony_ci const uint16_t *fast_gain_adj = fast_gain_adj_tab[nb_code][dc_code]; 736cabdff1aSopenharmony_ci const uint16_t *hearing_thresh = hearing_thresh_tab[nb_code][ht_code]; 737cabdff1aSopenharmony_ci int i; 738cabdff1aSopenharmony_ci 739cabdff1aSopenharmony_ci for (i = 0; i < nb_exponent; i++) 740cabdff1aSopenharmony_ci psd_val[i] = (48 - exp[i]) * 64; 741cabdff1aSopenharmony_ci 742cabdff1aSopenharmony_ci fast_gain_adj += band_ofs_tab[nb_code][fg_spc]; 743cabdff1aSopenharmony_ci for (i = 0; i < nb_exponent; i++) { 744cabdff1aSopenharmony_ci fast_leak = log_add(fast_leak - fast_decay[i], 745cabdff1aSopenharmony_ci psd_val[i] - fast_gain + fast_gain_adj[i]); 746cabdff1aSopenharmony_ci slow_leak = log_add(slow_leak - slow_decay, 747cabdff1aSopenharmony_ci psd_val[i] - slow_gain[i]); 748cabdff1aSopenharmony_ci msk_val[i] = FFMAX(fast_leak, slow_leak); 749cabdff1aSopenharmony_ci } 750cabdff1aSopenharmony_ci 751cabdff1aSopenharmony_ci fast_leak = 0; 752cabdff1aSopenharmony_ci for (i = nb_exponent - 1; i > band_low_tab[nb_code]; i--) { 753cabdff1aSopenharmony_ci fast_leak = log_add(fast_leak - misc_decay, psd_val[i] - fast_gain); 754cabdff1aSopenharmony_ci msk_val[i] = FFMAX(msk_val[i], fast_leak); 755cabdff1aSopenharmony_ci } 756cabdff1aSopenharmony_ci 757cabdff1aSopenharmony_ci for (i = 0; i < nb_exponent; i++) 758cabdff1aSopenharmony_ci msk_val[i] = FFMAX(msk_val[i], hearing_thresh[i]); 759cabdff1aSopenharmony_ci 760cabdff1aSopenharmony_ci if (!nb_code) 761cabdff1aSopenharmony_ci calc_lowcomp(msk_val); 762cabdff1aSopenharmony_ci 763cabdff1aSopenharmony_ci for (i = 0; i < nb_exponent; i++) { 764cabdff1aSopenharmony_ci int v = 16 * (snr_ofs - 64) + psd_val[i] - msk_val[i] >> 5; 765cabdff1aSopenharmony_ci bap[i] = bap_tab[av_clip_uintp2(v, 6)]; 766cabdff1aSopenharmony_ci } 767cabdff1aSopenharmony_ci} 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_cistatic int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c) 770cabdff1aSopenharmony_ci{ 771cabdff1aSopenharmony_ci DBEContext *s = &s1->dectx; 772cabdff1aSopenharmony_ci DBEGroup *p, *g; 773cabdff1aSopenharmony_ci int bap_strategy[MAX_GROUPS], fg_spc[MAX_GROUPS]; 774cabdff1aSopenharmony_ci int fg_ofs[MAX_GROUPS], msk_mod[MAX_GROUPS]; 775cabdff1aSopenharmony_ci int i, snr_ofs; 776cabdff1aSopenharmony_ci 777cabdff1aSopenharmony_ci for (i = 0; i < c->nb_groups; i++) { 778cabdff1aSopenharmony_ci bap_strategy[i] = !i || get_bits1(&s->gb); 779cabdff1aSopenharmony_ci if (bap_strategy[i]) { 780cabdff1aSopenharmony_ci fg_spc[i] = get_bits(&s->gb, 2); 781cabdff1aSopenharmony_ci fg_ofs[i] = get_bits(&s->gb, 3); 782cabdff1aSopenharmony_ci msk_mod[i] = get_bits1(&s->gb); 783cabdff1aSopenharmony_ci } else { 784cabdff1aSopenharmony_ci fg_spc[i] = fg_spc[i - 1]; 785cabdff1aSopenharmony_ci fg_ofs[i] = fg_ofs[i - 1]; 786cabdff1aSopenharmony_ci msk_mod[i] = msk_mod[i - 1]; 787cabdff1aSopenharmony_ci } 788cabdff1aSopenharmony_ci } 789cabdff1aSopenharmony_ci 790cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 791cabdff1aSopenharmony_ci avpriv_report_missing_feature(s->avctx, "Delta bit allocation"); 792cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 793cabdff1aSopenharmony_ci } 794cabdff1aSopenharmony_ci 795cabdff1aSopenharmony_ci snr_ofs = get_bits(&s->gb, 8); 796cabdff1aSopenharmony_ci if (!snr_ofs) { 797cabdff1aSopenharmony_ci memset(c->bap, 0, sizeof(c->bap)); 798cabdff1aSopenharmony_ci return 0; 799cabdff1aSopenharmony_ci } 800cabdff1aSopenharmony_ci 801cabdff1aSopenharmony_ci for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) { 802cabdff1aSopenharmony_ci if (c->exp_strategy[i] || bap_strategy[i]) { 803cabdff1aSopenharmony_ci bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code, 804cabdff1aSopenharmony_ci c->exponents + g->exp_ofs, c->bap + g->exp_ofs, 805cabdff1aSopenharmony_ci fg_spc[i], fg_ofs[i], msk_mod[i], snr_ofs); 806cabdff1aSopenharmony_ci } else { 807cabdff1aSopenharmony_ci memcpy(c->bap + g->exp_ofs, 808cabdff1aSopenharmony_ci c->bap + p->exp_ofs, 809cabdff1aSopenharmony_ci g->nb_exponent * sizeof(c->bap[0])); 810cabdff1aSopenharmony_ci } 811cabdff1aSopenharmony_ci } 812cabdff1aSopenharmony_ci 813cabdff1aSopenharmony_ci return 0; 814cabdff1aSopenharmony_ci} 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_cistatic int parse_indices(DBEContext *s, DBEChannel *c) 817cabdff1aSopenharmony_ci{ 818cabdff1aSopenharmony_ci DBEGroup *p, *g; 819cabdff1aSopenharmony_ci int i, j; 820cabdff1aSopenharmony_ci 821cabdff1aSopenharmony_ci for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) { 822cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 823cabdff1aSopenharmony_ci int start = get_bits(&s->gb, 6); 824cabdff1aSopenharmony_ci 825cabdff1aSopenharmony_ci if (start > g->nb_exponent) { 826cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid start index\n"); 827cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 828cabdff1aSopenharmony_ci } 829cabdff1aSopenharmony_ci 830cabdff1aSopenharmony_ci for (j = 0; j < start; j++) 831cabdff1aSopenharmony_ci c->idx[g->exp_ofs + j] = 0; 832cabdff1aSopenharmony_ci 833cabdff1aSopenharmony_ci for (; j < g->nb_exponent; j++) 834cabdff1aSopenharmony_ci c->idx[g->exp_ofs + j] = get_bits(&s->gb, 2); 835cabdff1aSopenharmony_ci } else if (i && g->nb_exponent == p->nb_exponent) { 836cabdff1aSopenharmony_ci memcpy(c->idx + g->exp_ofs, 837cabdff1aSopenharmony_ci c->idx + p->exp_ofs, 838cabdff1aSopenharmony_ci g->nb_exponent * sizeof(c->idx[0])); 839cabdff1aSopenharmony_ci } else { 840cabdff1aSopenharmony_ci memset(c->idx + g->exp_ofs, 0, g->nb_exponent * sizeof(c->idx[0])); 841cabdff1aSopenharmony_ci } 842cabdff1aSopenharmony_ci } 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ci return 0; 845cabdff1aSopenharmony_ci} 846cabdff1aSopenharmony_ci 847cabdff1aSopenharmony_cistatic int parse_mantissas(DBEContext *s, DBEChannel *c) 848cabdff1aSopenharmony_ci{ 849cabdff1aSopenharmony_ci DBEGroup *g; 850cabdff1aSopenharmony_ci int i, j, k; 851cabdff1aSopenharmony_ci 852cabdff1aSopenharmony_ci for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) { 853cabdff1aSopenharmony_ci float *mnt = c->mantissas + g->mnt_ofs; 854cabdff1aSopenharmony_ci 855cabdff1aSopenharmony_ci for (j = 0; j < g->nb_exponent; j++) { 856cabdff1aSopenharmony_ci int bap = c->bap[g->exp_ofs + j]; 857cabdff1aSopenharmony_ci int idx = c->idx[g->exp_ofs + j]; 858cabdff1aSopenharmony_ci int size1 = mantissa_size1[bap][idx]; 859cabdff1aSopenharmony_ci int count = g->nb_mantissa[j]; 860cabdff1aSopenharmony_ci float exp = exponent_tab[c->exponents[g->exp_ofs + j]]; 861cabdff1aSopenharmony_ci float scale = mantissa_tab1[size1][idx] * exp; 862cabdff1aSopenharmony_ci 863cabdff1aSopenharmony_ci if (!size1) { 864cabdff1aSopenharmony_ci memset(mnt, 0, count * sizeof(*mnt)); 865cabdff1aSopenharmony_ci } else if (idx) { 866cabdff1aSopenharmony_ci int values[100]; 867cabdff1aSopenharmony_ci int escape = -(1 << size1 - 1); 868cabdff1aSopenharmony_ci 869cabdff1aSopenharmony_ci for (k = 0; k < count; k++) 870cabdff1aSopenharmony_ci values[k] = get_sbits(&s->gb, size1); 871cabdff1aSopenharmony_ci 872cabdff1aSopenharmony_ci for (k = 0; k < count; k++) { 873cabdff1aSopenharmony_ci if (values[k] != escape) { 874cabdff1aSopenharmony_ci mnt[k] = values[k] * scale; 875cabdff1aSopenharmony_ci } else { 876cabdff1aSopenharmony_ci int size2 = mantissa_size2[bap][idx]; 877cabdff1aSopenharmony_ci int value = get_sbits(&s->gb, size2); 878cabdff1aSopenharmony_ci float a = mantissa_tab2[size2][idx]; 879cabdff1aSopenharmony_ci float b = mantissa_tab3[size2][idx]; 880cabdff1aSopenharmony_ci if (value < 0) 881cabdff1aSopenharmony_ci mnt[k] = ((value + 1) * a - b) * exp; 882cabdff1aSopenharmony_ci else 883cabdff1aSopenharmony_ci mnt[k] = (value * a + b) * exp; 884cabdff1aSopenharmony_ci } 885cabdff1aSopenharmony_ci } 886cabdff1aSopenharmony_ci } else { 887cabdff1aSopenharmony_ci for (k = 0; k < count; k++) 888cabdff1aSopenharmony_ci mnt[k] = get_sbits(&s->gb, size1) * scale; 889cabdff1aSopenharmony_ci } 890cabdff1aSopenharmony_ci 891cabdff1aSopenharmony_ci mnt += count; 892cabdff1aSopenharmony_ci } 893cabdff1aSopenharmony_ci 894cabdff1aSopenharmony_ci for (; j < g->nb_exponent + c->bw_code; j++) { 895cabdff1aSopenharmony_ci memset(mnt, 0, g->nb_mantissa[j] * sizeof(*mnt)); 896cabdff1aSopenharmony_ci mnt += g->nb_mantissa[j]; 897cabdff1aSopenharmony_ci } 898cabdff1aSopenharmony_ci } 899cabdff1aSopenharmony_ci 900cabdff1aSopenharmony_ci return 0; 901cabdff1aSopenharmony_ci} 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_cistatic int parse_channel(DBEDecodeContext *s1, int ch, int seg_id) 904cabdff1aSopenharmony_ci{ 905cabdff1aSopenharmony_ci DBEContext *s = &s1->dectx; 906cabdff1aSopenharmony_ci DBEChannel *c = &s1->channels[seg_id][ch]; 907cabdff1aSopenharmony_ci int i, ret; 908cabdff1aSopenharmony_ci 909cabdff1aSopenharmony_ci if (s->metadata.rev_id[ch] > 1) { 910cabdff1aSopenharmony_ci avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]); 911cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 912cabdff1aSopenharmony_ci } 913cabdff1aSopenharmony_ci 914cabdff1aSopenharmony_ci if (ch == lfe_channel_tab[s->metadata.prog_conf]) { 915cabdff1aSopenharmony_ci c->gr_code = 3; 916cabdff1aSopenharmony_ci c->bw_code = 29; 917cabdff1aSopenharmony_ci } else { 918cabdff1aSopenharmony_ci c->gr_code = get_bits(&s->gb, 2); 919cabdff1aSopenharmony_ci c->bw_code = get_bits(&s->gb, 3); 920cabdff1aSopenharmony_ci if (c->gr_code == 3) { 921cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid group type code\n"); 922cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 923cabdff1aSopenharmony_ci } 924cabdff1aSopenharmony_ci } 925cabdff1aSopenharmony_ci 926cabdff1aSopenharmony_ci c->nb_groups = nb_groups_tab[c->gr_code]; 927cabdff1aSopenharmony_ci c->nb_mstr_exp = nb_mstr_exp_tab[c->gr_code]; 928cabdff1aSopenharmony_ci 929cabdff1aSopenharmony_ci for (i = 0; i < c->nb_groups; i++) { 930cabdff1aSopenharmony_ci c->groups[i] = frm_ofs_tab[seg_id][c->gr_code][i]; 931cabdff1aSopenharmony_ci if (c->nb_mstr_exp == 2) { 932cabdff1aSopenharmony_ci c->groups[i].nb_exponent -= c->bw_code; 933cabdff1aSopenharmony_ci c->groups[i].nb_bias_exp[1] -= c->bw_code; 934cabdff1aSopenharmony_ci } 935cabdff1aSopenharmony_ci } 936cabdff1aSopenharmony_ci 937cabdff1aSopenharmony_ci if ((ret = parse_exponents(s, c)) < 0) 938cabdff1aSopenharmony_ci return ret; 939cabdff1aSopenharmony_ci if ((ret = parse_bit_alloc(s1, c)) < 0) 940cabdff1aSopenharmony_ci return ret; 941cabdff1aSopenharmony_ci if ((ret = parse_indices(s, c)) < 0) 942cabdff1aSopenharmony_ci return ret; 943cabdff1aSopenharmony_ci if ((ret = parse_mantissas(s, c)) < 0) 944cabdff1aSopenharmony_ci return ret; 945cabdff1aSopenharmony_ci 946cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) { 947cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of channel %d\n", ch); 948cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 949cabdff1aSopenharmony_ci } 950cabdff1aSopenharmony_ci 951cabdff1aSopenharmony_ci return 0; 952cabdff1aSopenharmony_ci} 953cabdff1aSopenharmony_ci 954cabdff1aSopenharmony_cistatic int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id) 955cabdff1aSopenharmony_ci{ 956cabdff1aSopenharmony_ci DBEContext *s = &s1->dectx; 957cabdff1aSopenharmony_ci int ch, ret, key; 958cabdff1aSopenharmony_ci 959cabdff1aSopenharmony_ci if ((key = parse_key(s)) < 0) 960cabdff1aSopenharmony_ci return key; 961cabdff1aSopenharmony_ci 962cabdff1aSopenharmony_ci for (ch = start; ch < end; ch++) { 963cabdff1aSopenharmony_ci if (!s->metadata.ch_size[ch]) { 964cabdff1aSopenharmony_ci s1->channels[seg_id][ch].nb_groups = 0; 965cabdff1aSopenharmony_ci continue; 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key); 968cabdff1aSopenharmony_ci if (ret < 0) 969cabdff1aSopenharmony_ci return ret; 970cabdff1aSopenharmony_ci if ((ret = parse_channel(s1, ch, seg_id)) < 0) { 971cabdff1aSopenharmony_ci if (s1->avctx->err_recognition & AV_EF_EXPLODE) 972cabdff1aSopenharmony_ci return ret; 973cabdff1aSopenharmony_ci s1->channels[seg_id][ch].nb_groups = 0; 974cabdff1aSopenharmony_ci } 975cabdff1aSopenharmony_ci if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0) 976cabdff1aSopenharmony_ci return ret; 977cabdff1aSopenharmony_ci } 978cabdff1aSopenharmony_ci 979cabdff1aSopenharmony_ci return skip_input(s, 1); 980cabdff1aSopenharmony_ci} 981cabdff1aSopenharmony_ci 982cabdff1aSopenharmony_cistatic int parse_meter(DBEDecodeContext *s1) 983cabdff1aSopenharmony_ci{ 984cabdff1aSopenharmony_ci DBEContext *s = &s1->dectx; 985cabdff1aSopenharmony_ci if (s->metadata.meter_size) 986cabdff1aSopenharmony_ci return skip_input(s, s->key_present + s->metadata.meter_size + 1); 987cabdff1aSopenharmony_ci return 0; 988cabdff1aSopenharmony_ci} 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_cistatic void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values) 991cabdff1aSopenharmony_ci{ 992cabdff1aSopenharmony_ci FFTContext *imdct = &s1->imdct[g->imdct_idx]; 993cabdff1aSopenharmony_ci int n = 1 << imdct_bits_tab[g->imdct_idx]; 994cabdff1aSopenharmony_ci int n2 = n >> 1; 995cabdff1aSopenharmony_ci int i; 996cabdff1aSopenharmony_ci 997cabdff1aSopenharmony_ci switch (g->imdct_phs) { 998cabdff1aSopenharmony_ci case 0: 999cabdff1aSopenharmony_ci imdct->imdct_half(imdct, result, values); 1000cabdff1aSopenharmony_ci for (i = 0; i < n2; i++) 1001cabdff1aSopenharmony_ci result[n2 + i] = result[n2 - i - 1]; 1002cabdff1aSopenharmony_ci break; 1003cabdff1aSopenharmony_ci case 1: 1004cabdff1aSopenharmony_ci imdct->imdct_calc(imdct, result, values); 1005cabdff1aSopenharmony_ci break; 1006cabdff1aSopenharmony_ci case 2: 1007cabdff1aSopenharmony_ci imdct->imdct_half(imdct, result + n2, values); 1008cabdff1aSopenharmony_ci for (i = 0; i < n2; i++) 1009cabdff1aSopenharmony_ci result[i] = -result[n - i - 1]; 1010cabdff1aSopenharmony_ci break; 1011cabdff1aSopenharmony_ci default: 1012cabdff1aSopenharmony_ci av_assert0(0); 1013cabdff1aSopenharmony_ci } 1014cabdff1aSopenharmony_ci} 1015cabdff1aSopenharmony_ci 1016cabdff1aSopenharmony_cistatic void transform(DBEDecodeContext *s1, DBEChannel *c, float *history, float *output) 1017cabdff1aSopenharmony_ci{ 1018cabdff1aSopenharmony_ci LOCAL_ALIGNED_32(float, buffer, [2048]); 1019cabdff1aSopenharmony_ci LOCAL_ALIGNED_32(float, result, [1152]); 1020cabdff1aSopenharmony_ci DBEGroup *g; 1021cabdff1aSopenharmony_ci int i; 1022cabdff1aSopenharmony_ci 1023cabdff1aSopenharmony_ci memset(result, 0, 1152 * sizeof(float)); 1024cabdff1aSopenharmony_ci for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) { 1025cabdff1aSopenharmony_ci float *src = buffer + g->src_ofs; 1026cabdff1aSopenharmony_ci float *dst = result + g->dst_ofs; 1027cabdff1aSopenharmony_ci float *win = window + g->win_ofs; 1028cabdff1aSopenharmony_ci 1029cabdff1aSopenharmony_ci imdct_calc(s1, g, buffer, c->mantissas + g->mnt_ofs); 1030cabdff1aSopenharmony_ci s1->fdsp->vector_fmul_add(dst, src, win, dst, g->win_len); 1031cabdff1aSopenharmony_ci } 1032cabdff1aSopenharmony_ci 1033cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 1034cabdff1aSopenharmony_ci output[i] = history[i] + result[i]; 1035cabdff1aSopenharmony_ci for (i = 256; i < 896; i++) 1036cabdff1aSopenharmony_ci output[i] = result[i]; 1037cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 1038cabdff1aSopenharmony_ci history[i] = result[896 + i]; 1039cabdff1aSopenharmony_ci} 1040cabdff1aSopenharmony_ci 1041cabdff1aSopenharmony_cistatic void apply_gain(DBEDecodeContext *s, int begin, int end, float *output) 1042cabdff1aSopenharmony_ci{ 1043cabdff1aSopenharmony_ci if (begin == 960 && end == 960) 1044cabdff1aSopenharmony_ci return; 1045cabdff1aSopenharmony_ci 1046cabdff1aSopenharmony_ci if (begin == end) { 1047cabdff1aSopenharmony_ci s->fdsp->vector_fmul_scalar(output, output, gain_tab[end], FRAME_SAMPLES); 1048cabdff1aSopenharmony_ci } else { 1049cabdff1aSopenharmony_ci float a = gain_tab[begin] * (1.0f / (FRAME_SAMPLES - 1)); 1050cabdff1aSopenharmony_ci float b = gain_tab[end ] * (1.0f / (FRAME_SAMPLES - 1)); 1051cabdff1aSopenharmony_ci int i; 1052cabdff1aSopenharmony_ci 1053cabdff1aSopenharmony_ci for (i = 0; i < FRAME_SAMPLES; i++) 1054cabdff1aSopenharmony_ci output[i] *= a * (FRAME_SAMPLES - i - 1) + b * i; 1055cabdff1aSopenharmony_ci } 1056cabdff1aSopenharmony_ci} 1057cabdff1aSopenharmony_ci 1058cabdff1aSopenharmony_cistatic int filter_frame(DBEDecodeContext *s, AVFrame *frame) 1059cabdff1aSopenharmony_ci{ 1060cabdff1aSopenharmony_ci const DolbyEHeaderInfo *const metadata = &s->dectx.metadata; 1061cabdff1aSopenharmony_ci const uint8_t *reorder; 1062cabdff1aSopenharmony_ci int ch, ret; 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_ci if (metadata->nb_channels == 4) 1065cabdff1aSopenharmony_ci reorder = ch_reorder_4; 1066cabdff1aSopenharmony_ci else if (metadata->nb_channels == 6) 1067cabdff1aSopenharmony_ci reorder = ch_reorder_6; 1068cabdff1aSopenharmony_ci else if (metadata->nb_programs == 1 && metadata->output_channel_order == CHANNEL_ORDER_DEFAULT) 1069cabdff1aSopenharmony_ci reorder = ch_reorder_8; 1070cabdff1aSopenharmony_ci else 1071cabdff1aSopenharmony_ci reorder = ch_reorder_n; 1072cabdff1aSopenharmony_ci 1073cabdff1aSopenharmony_ci frame->nb_samples = FRAME_SAMPLES; 1074cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0) 1075cabdff1aSopenharmony_ci return ret; 1076cabdff1aSopenharmony_ci 1077cabdff1aSopenharmony_ci for (ch = 0; ch < metadata->nb_channels; ch++) { 1078cabdff1aSopenharmony_ci float *output = (float *)frame->extended_data[reorder[ch]]; 1079cabdff1aSopenharmony_ci transform(s, &s->channels[0][ch], s->history[ch], output); 1080cabdff1aSopenharmony_ci transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2); 1081cabdff1aSopenharmony_ci apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output); 1082cabdff1aSopenharmony_ci } 1083cabdff1aSopenharmony_ci 1084cabdff1aSopenharmony_ci return 0; 1085cabdff1aSopenharmony_ci} 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_cistatic int dolby_e_decode_frame(AVCodecContext *avctx, AVFrame *frame, 1088cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 1089cabdff1aSopenharmony_ci{ 1090cabdff1aSopenharmony_ci DBEDecodeContext *s1 = avctx->priv_data; 1091cabdff1aSopenharmony_ci DBEContext *s = &s1->dectx; 1092cabdff1aSopenharmony_ci int i, j, ret; 1093cabdff1aSopenharmony_ci 1094cabdff1aSopenharmony_ci if ((ret = ff_dolby_e_parse_header(s, avpkt->data, avpkt->size)) < 0) 1095cabdff1aSopenharmony_ci return ret; 1096cabdff1aSopenharmony_ci 1097cabdff1aSopenharmony_ci if (s->metadata.nb_programs > 1 && !s->metadata.multi_prog_warned) { 1098cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), " 1099cabdff1aSopenharmony_ci "channels will be output in native order.\n", 1100cabdff1aSopenharmony_ci s->metadata.nb_programs, s->metadata.prog_conf); 1101cabdff1aSopenharmony_ci s->metadata.multi_prog_warned = 1; 1102cabdff1aSopenharmony_ci } 1103cabdff1aSopenharmony_ci 1104cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 1105cabdff1aSopenharmony_ci switch (s->metadata.nb_channels) { 1106cabdff1aSopenharmony_ci case 4: 1107cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0; 1108cabdff1aSopenharmony_ci break; 1109cabdff1aSopenharmony_ci case 6: 1110cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1; 1111cabdff1aSopenharmony_ci break; 1112cabdff1aSopenharmony_ci case 8: 1113cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1; 1114cabdff1aSopenharmony_ci break; 1115cabdff1aSopenharmony_ci default: 1116cabdff1aSopenharmony_ci avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; 1117cabdff1aSopenharmony_ci avctx->ch_layout.nb_channels = s->metadata.nb_channels; 1118cabdff1aSopenharmony_ci break; 1119cabdff1aSopenharmony_ci } 1120cabdff1aSopenharmony_ci 1121cabdff1aSopenharmony_ci avctx->sample_rate = s->metadata.sample_rate; 1122cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 1123cabdff1aSopenharmony_ci 1124cabdff1aSopenharmony_ci i = s->metadata.nb_channels / 2; 1125cabdff1aSopenharmony_ci j = s->metadata.nb_channels; 1126cabdff1aSopenharmony_ci if ((ret = parse_audio(s1, 0, i, 0)) < 0) 1127cabdff1aSopenharmony_ci return ret; 1128cabdff1aSopenharmony_ci if ((ret = parse_audio(s1, i, j, 0)) < 0) 1129cabdff1aSopenharmony_ci return ret; 1130cabdff1aSopenharmony_ci if ((ret = parse_metadata_ext(s1)) < 0) 1131cabdff1aSopenharmony_ci return ret; 1132cabdff1aSopenharmony_ci if ((ret = parse_audio(s1, 0, i, 1)) < 0) 1133cabdff1aSopenharmony_ci return ret; 1134cabdff1aSopenharmony_ci if ((ret = parse_audio(s1, i, j, 1)) < 0) 1135cabdff1aSopenharmony_ci return ret; 1136cabdff1aSopenharmony_ci if ((ret = parse_meter(s1)) < 0) 1137cabdff1aSopenharmony_ci return ret; 1138cabdff1aSopenharmony_ci if ((ret = filter_frame(s1, frame)) < 0) 1139cabdff1aSopenharmony_ci return ret; 1140cabdff1aSopenharmony_ci 1141cabdff1aSopenharmony_ci *got_frame_ptr = 1; 1142cabdff1aSopenharmony_ci return avpkt->size; 1143cabdff1aSopenharmony_ci} 1144cabdff1aSopenharmony_ci 1145cabdff1aSopenharmony_cistatic av_cold void dolby_e_flush(AVCodecContext *avctx) 1146cabdff1aSopenharmony_ci{ 1147cabdff1aSopenharmony_ci DBEDecodeContext *s = avctx->priv_data; 1148cabdff1aSopenharmony_ci 1149cabdff1aSopenharmony_ci memset(s->history, 0, sizeof(s->history)); 1150cabdff1aSopenharmony_ci} 1151cabdff1aSopenharmony_ci 1152cabdff1aSopenharmony_cistatic av_cold int dolby_e_close(AVCodecContext *avctx) 1153cabdff1aSopenharmony_ci{ 1154cabdff1aSopenharmony_ci DBEDecodeContext *s = avctx->priv_data; 1155cabdff1aSopenharmony_ci int i; 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1158cabdff1aSopenharmony_ci ff_mdct_end(&s->imdct[i]); 1159cabdff1aSopenharmony_ci 1160cabdff1aSopenharmony_ci av_freep(&s->fdsp); 1161cabdff1aSopenharmony_ci return 0; 1162cabdff1aSopenharmony_ci} 1163cabdff1aSopenharmony_ci 1164cabdff1aSopenharmony_ci 1165cabdff1aSopenharmony_cistatic av_cold void init_tables(void) 1166cabdff1aSopenharmony_ci{ 1167cabdff1aSopenharmony_ci int i, j; 1168cabdff1aSopenharmony_ci 1169cabdff1aSopenharmony_ci for (i = 1; i < 17; i++) 1170cabdff1aSopenharmony_ci mantissa_tab1[i][0] = 1.0f / (1 << i - 1); 1171cabdff1aSopenharmony_ci 1172cabdff1aSopenharmony_ci for (i = 2; i < 16; i++) { 1173cabdff1aSopenharmony_ci mantissa_tab1[i][1] = 1.0f / ((1 << i) - 1); 1174cabdff1aSopenharmony_ci mantissa_tab1[i][2] = 0.5f / ((1 << i) - 1); 1175cabdff1aSopenharmony_ci mantissa_tab1[i][3] = 0.25f / ((1 << i) - 1); 1176cabdff1aSopenharmony_ci } 1177cabdff1aSopenharmony_ci 1178cabdff1aSopenharmony_ci mantissa_tab1[i][1] = 0.5f / (1 << 15); 1179cabdff1aSopenharmony_ci mantissa_tab1[i][2] = 0.75f / (1 << 15); 1180cabdff1aSopenharmony_ci mantissa_tab1[i][3] = 0.875f / (1 << 15); 1181cabdff1aSopenharmony_ci 1182cabdff1aSopenharmony_ci for (i = 1; i < 17; i++) { 1183cabdff1aSopenharmony_ci mantissa_tab2[i][1] = mantissa_tab1[i][0] * 0.5f; 1184cabdff1aSopenharmony_ci mantissa_tab2[i][2] = mantissa_tab1[i][0] * 0.75f; 1185cabdff1aSopenharmony_ci mantissa_tab2[i][3] = mantissa_tab1[i][0] * 0.875f; 1186cabdff1aSopenharmony_ci for (j = 1; j < 4; j++) 1187cabdff1aSopenharmony_ci mantissa_tab3[i][j] = 1.0f / (1 << i) + 1.0f / (1 << j) - 1.0f / (1 << i + j); 1188cabdff1aSopenharmony_ci } 1189cabdff1aSopenharmony_ci 1190cabdff1aSopenharmony_ci mantissa_tab3[1][3] = 0.6875f; 1191cabdff1aSopenharmony_ci 1192cabdff1aSopenharmony_ci for (i = 0; i < 25; i++) { 1193cabdff1aSopenharmony_ci exponent_tab[i * 2 ] = 1.0f / (1 << i); 1194cabdff1aSopenharmony_ci exponent_tab[i * 2 + 1] = M_SQRT1_2 / (1 << i); 1195cabdff1aSopenharmony_ci } 1196cabdff1aSopenharmony_ci 1197cabdff1aSopenharmony_ci for (i = 1; i < 1024; i++) 1198cabdff1aSopenharmony_ci gain_tab[i] = exp2f((i - 960) / 64.0f); 1199cabdff1aSopenharmony_ci 1200cabdff1aSopenharmony_ci // short 1 1201cabdff1aSopenharmony_ci ff_kbd_window_init(window, 3.0f, 128); 1202cabdff1aSopenharmony_ci for (i = 0; i < 128; i++) 1203cabdff1aSopenharmony_ci window[128 + i] = window[127 - i]; 1204cabdff1aSopenharmony_ci 1205cabdff1aSopenharmony_ci // start 1206cabdff1aSopenharmony_ci for (i = 0; i < 192; i++) 1207cabdff1aSopenharmony_ci window[256 + i] = start_window[i]; 1208cabdff1aSopenharmony_ci 1209cabdff1aSopenharmony_ci // short 2 1210cabdff1aSopenharmony_ci for (i = 0; i < 192; i++) 1211cabdff1aSopenharmony_ci window[448 + i] = short_window2[i]; 1212cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 1213cabdff1aSopenharmony_ci window[640 + i] = window[63 - i]; 1214cabdff1aSopenharmony_ci 1215cabdff1aSopenharmony_ci // short 3 1216cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 1217cabdff1aSopenharmony_ci window[704 + i] = short_window3[i]; 1218cabdff1aSopenharmony_ci for (i = 0; i < 192; i++) 1219cabdff1aSopenharmony_ci window[768 + i] = window[64 + i]; 1220cabdff1aSopenharmony_ci 1221cabdff1aSopenharmony_ci // bridge 1222cabdff1aSopenharmony_ci for (i = 0; i < 128; i++) 1223cabdff1aSopenharmony_ci window[960 + i] = window[i]; 1224cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 1225cabdff1aSopenharmony_ci window[1088 + i] = 1.0f; 1226cabdff1aSopenharmony_ci 1227cabdff1aSopenharmony_ci // long 1228cabdff1aSopenharmony_ci ff_kbd_window_init(window + 1408, 3.0f, 256); 1229cabdff1aSopenharmony_ci for (i = 0; i < 640; i++) 1230cabdff1aSopenharmony_ci window[1664 + i] = 1.0f; 1231cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 1232cabdff1aSopenharmony_ci window[2304 + i] = window[1152 + i] = window[1663 - i]; 1233cabdff1aSopenharmony_ci 1234cabdff1aSopenharmony_ci // reverse start 1235cabdff1aSopenharmony_ci for (i = 0; i < 192; i++) 1236cabdff1aSopenharmony_ci window[2560 + i] = window[447 - i]; 1237cabdff1aSopenharmony_ci 1238cabdff1aSopenharmony_ci // reverse short 2 1239cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 1240cabdff1aSopenharmony_ci window[2752 + i] = window[703 - i]; 1241cabdff1aSopenharmony_ci 1242cabdff1aSopenharmony_ci // reverse short 3 1243cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 1244cabdff1aSopenharmony_ci window[3008 + i] = window[959 - i]; 1245cabdff1aSopenharmony_ci 1246cabdff1aSopenharmony_ci // reverse bridge 1247cabdff1aSopenharmony_ci for (i = 0; i < 448; i++) 1248cabdff1aSopenharmony_ci window[3264 + i] = window[1407 - i]; 1249cabdff1aSopenharmony_ci} 1250cabdff1aSopenharmony_ci 1251cabdff1aSopenharmony_cistatic av_cold int dolby_e_init(AVCodecContext *avctx) 1252cabdff1aSopenharmony_ci{ 1253cabdff1aSopenharmony_ci static AVOnce init_once = AV_ONCE_INIT; 1254cabdff1aSopenharmony_ci DBEDecodeContext *s = avctx->priv_data; 1255cabdff1aSopenharmony_ci int i; 1256cabdff1aSopenharmony_ci 1257cabdff1aSopenharmony_ci if (ff_thread_once(&init_once, init_tables)) 1258cabdff1aSopenharmony_ci return AVERROR_UNKNOWN; 1259cabdff1aSopenharmony_ci 1260cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1261cabdff1aSopenharmony_ci if (ff_mdct_init(&s->imdct[i], imdct_bits_tab[i], 1, 2.0) < 0) 1262cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1263cabdff1aSopenharmony_ci 1264cabdff1aSopenharmony_ci if (!(s->fdsp = avpriv_float_dsp_alloc(0))) 1265cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1266cabdff1aSopenharmony_ci 1267cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 1268cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS 1269cabdff1aSopenharmony_ci if (avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE) 1270cabdff1aSopenharmony_ci s->dectx.metadata.output_channel_order = CHANNEL_ORDER_CODED; 1271cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS 1272cabdff1aSopenharmony_ci#endif 1273cabdff1aSopenharmony_ci 1274cabdff1aSopenharmony_ci s->dectx.metadata.multi_prog_warned = s->dectx.metadata.output_channel_order == CHANNEL_ORDER_CODED; 1275cabdff1aSopenharmony_ci s->dectx.avctx = s->avctx = avctx; 1276cabdff1aSopenharmony_ci return 0; 1277cabdff1aSopenharmony_ci} 1278cabdff1aSopenharmony_ci 1279cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(DBEDecodeContext, x) 1280cabdff1aSopenharmony_ci#define FLAGS (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM) 1281cabdff1aSopenharmony_cistatic const AVOption options[] = { 1282cabdff1aSopenharmony_ci { "channel_order", "Order in which the channels are to be exported", 1283cabdff1aSopenharmony_ci OFFSET(dectx.metadata.output_channel_order), AV_OPT_TYPE_INT, 1284cabdff1aSopenharmony_ci { .i64 = CHANNEL_ORDER_DEFAULT }, 0, 1, FLAGS, "channel_order" }, 1285cabdff1aSopenharmony_ci { "default", "normal libavcodec channel order", 0, AV_OPT_TYPE_CONST, 1286cabdff1aSopenharmony_ci { .i64 = CHANNEL_ORDER_DEFAULT }, .flags = FLAGS, "channel_order" }, 1287cabdff1aSopenharmony_ci { "coded", "order in which the channels are coded in the bitstream", 1288cabdff1aSopenharmony_ci 0, AV_OPT_TYPE_CONST, { .i64 = CHANNEL_ORDER_CODED }, .flags = FLAGS, "channel_order" }, 1289cabdff1aSopenharmony_ci 1290cabdff1aSopenharmony_ci { NULL }, 1291cabdff1aSopenharmony_ci}; 1292cabdff1aSopenharmony_ci 1293cabdff1aSopenharmony_cistatic const AVClass dolby_e_decoder_class = { 1294cabdff1aSopenharmony_ci .class_name = "Dolby E decoder", 1295cabdff1aSopenharmony_ci .item_name = av_default_item_name, 1296cabdff1aSopenharmony_ci .option = options, 1297cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 1298cabdff1aSopenharmony_ci}; 1299cabdff1aSopenharmony_ci 1300cabdff1aSopenharmony_ciconst FFCodec ff_dolby_e_decoder = { 1301cabdff1aSopenharmony_ci .p.name = "dolby_e", 1302cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Dolby E"), 1303cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1304cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_DOLBY_E, 1305cabdff1aSopenharmony_ci .priv_data_size = sizeof(DBEDecodeContext), 1306cabdff1aSopenharmony_ci .p.priv_class = &dolby_e_decoder_class, 1307cabdff1aSopenharmony_ci .init = dolby_e_init, 1308cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(dolby_e_decode_frame), 1309cabdff1aSopenharmony_ci .close = dolby_e_close, 1310cabdff1aSopenharmony_ci .flush = dolby_e_flush, 1311cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, 1312cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, 1313cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1314cabdff1aSopenharmony_ci}; 1315