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