Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : #include <stdint.h>
34 : #include "options.h"
35 : #include <math.h>
36 : #include "ivas_cnst.h"
37 : #include "ivas_prot.h"
38 : #include "ivas_prot_rend.h"
39 : #include "ivas_rom_com.h"
40 : #include "ivas_stat_dec.h"
41 : #include "prot.h"
42 : #ifdef DEBUGGING
43 : #include "debug.h"
44 : #endif
45 : #include <assert.h>
46 : #include "wmc_auto.h"
47 :
48 : /*-----------------------------------------------------------------------*
49 : * Local constants
50 : *-----------------------------------------------------------------------*/
51 :
52 : #define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */
53 : #define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */
54 :
55 :
56 : /*-----------------------------------------------------------------------*
57 : * Local function prototypes
58 : *-----------------------------------------------------------------------*/
59 :
60 : static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 );
61 :
62 : static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport );
63 :
64 : static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData );
65 :
66 : static void restore_lowbitrate_masa( IVAS_QMETADATA_HANDLE hQMetaData, const int16_t low_bitrate_mode, const int16_t numCodingBands );
67 :
68 : static ivas_error init_lfe_synth_data( Decoder_Struct *st_ivas, MASA_DECODER_HANDLE hMasa );
69 :
70 : static void compute_foa_cov_matrix( float foaCov[FOA_CHANNELS][FOA_CHANNELS], float inCov[FOA_CHANNELS][FOA_CHANNELS], float mixMtx[FOA_CHANNELS][FOA_CHANNELS] );
71 :
72 : static int16_t decode_lfe_to_total_energy_ratio( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, uint16_t *bitstream, int16_t *index, const int32_t ivas_total_brate );
73 :
74 : static ivas_error ivas_masa_dec_config( Decoder_Struct *st_ivas );
75 :
76 : static int16_t ivas_decode_masaism_metadata( IVAS_QMETADATA_HANDLE hQMetaData, MASA_DECODER_HANDLE hMasa, MASA_ISM_DATA_HANDLE hMasaIsmData, const int16_t nchan_ism, uint16_t *bit_stream, int16_t *next_bit_pos, const int16_t idx_separated_object, const int16_t ism_imp, const int16_t dirac_bs_md_write_idx, const int16_t dirac_md_buffer_length );
77 :
78 : static void decode_index_slice( int16_t index, int16_t *ratio_idx_ism, const int16_t nchan_ism, const int16_t K );
79 :
80 : static void decode_ism_ratios( uint16_t *bit_stream, int16_t *next_bit_pos, float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const int16_t nchan_ism, const int16_t nbands, const int16_t nblocks, const int16_t idx_separated_object );
81 :
82 : static void read_ism_ratio_index( int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const int16_t nchan_ism, const int16_t numCodingBands, const int16_t sf, int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], uint16_t *bit_stream, int16_t *next_bit_pos, float *masa_to_total_energy_ratio, const int16_t idx_sep_obj, int16_t *num_zeros );
83 :
84 :
85 : /*-----------------------------------------------------------------------*
86 : * ivas_masa_decode()
87 : *
88 : * MASA metadata decoder
89 : *-----------------------------------------------------------------------*/
90 :
91 2004736 : ivas_error ivas_masa_decode(
92 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
93 : Decoder_State *st, /* i/o: decoder state structure with bitstream */
94 : int16_t *nb_bits_read /* o : number of bits read */
95 : )
96 : {
97 : uint16_t byteBuffer;
98 : int16_t next_bit_pos_orig;
99 : int32_t masa_brate, ivas_total_brate;
100 : MASA_DECODER_HANDLE hMasa;
101 : IVAS_QMETADATA_HANDLE hQMetaData;
102 : IVAS_FORMAT ivas_format;
103 : int16_t low_bitrate_mode, tmp_elem_mode;
104 : ivas_error error;
105 : int16_t obj;
106 : int16_t i, ch, ism_imp;
107 : int16_t dirac_bs_md_write_idx;
108 : int32_t masa_total_brate;
109 :
110 2004736 : dirac_bs_md_write_idx = 0;
111 2004736 : ism_imp = 0;
112 :
113 2004736 : error = IVAS_ERR_OK;
114 2004736 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
115 :
116 2004736 : low_bitrate_mode = -1; /* This means that LBR mode is not used. */
117 :
118 2004736 : if ( st_ivas->hOutSetup.separateChannelEnabled || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC )
119 : {
120 690515 : masa_brate = st_ivas->hCPE[0]->element_brate;
121 : }
122 : else
123 : {
124 1314221 : masa_brate = ivas_total_brate;
125 : }
126 :
127 2004736 : hMasa = st_ivas->hMasa;
128 2004736 : hQMetaData = st_ivas->hQMetaData;
129 2004736 : ivas_format = st_ivas->ivas_format;
130 :
131 2004736 : hMasa->data.dir_decode_quality = 1.0f; /* Set to default of max quality */
132 2004736 : hQMetaData->is_masa_ivas_format = 1;
133 :
134 2004736 : *nb_bits_read = 0;
135 2004736 : next_bit_pos_orig = st->next_bit_pos;
136 2004736 : if ( masa_brate == IVAS_SID_5k2 )
137 : {
138 1345 : st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
139 : }
140 : else
141 : {
142 2003391 : st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 );
143 : }
144 :
145 2004736 : if ( ivas_format == MASA_FORMAT && ( masa_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
146 : {
147 9281 : hMasa->config.numberOfDirections = 1;
148 : }
149 :
150 2004736 : if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 )
151 : {
152 1892711 : if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
153 : {
154 1591076 : if ( ivas_format == MASA_FORMAT )
155 : {
156 : /* re-read the number of objects, needed in case of bad frame */
157 1007234 : ch = 5 - ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2] );
158 :
159 1007234 : if ( ch == 5 )
160 : {
161 840976 : ch = 0;
162 : }
163 1007234 : st_ivas->nchan_ism = ch;
164 : }
165 :
166 1591076 : if ( ivas_format == MASA_FORMAT && st_ivas->nchan_ism > 0 )
167 : {
168 : /* there was OMASA in the input */
169 166258 : hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
170 166258 : if ( st_ivas->nchan_ism < 3 )
171 : {
172 : /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */
173 68946 : if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] == 0 )
174 : {
175 29602 : st_ivas->nchan_ism = 1;
176 : }
177 68946 : st->next_bit_pos -= MASA_TRANSP_BITS;
178 68946 : *nb_bits_read += MASA_TRANSP_BITS;
179 :
180 : /* the two reserved bits were already read in ivas_init_dec()*/
181 68946 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
182 68946 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
183 68946 : *nb_bits_read += MASA_HEADER_BITS;
184 : /* read number of directions */
185 68946 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
186 68946 : ( *nb_bits_read )++;
187 68946 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
188 : }
189 : else
190 : {
191 : /* if there are 3 or 4 objects the number of transport channels bit is given to MASA format
192 : and used to read number of directions*/
193 97312 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
194 97312 : ( *nb_bits_read )++;
195 97312 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
196 :
197 : /* the two reserved bits were already read in ivas_init_dec()*/
198 97312 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
199 97312 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
200 97312 : *nb_bits_read += MASA_HEADER_BITS;
201 : }
202 : }
203 : else
204 : {
205 1424818 : if ( ivas_format != MASA_ISM_FORMAT )
206 : {
207 : /* number of transport channels is always 2 for MASA_ISM format */
208 : /* the number of MASA transport channels was read in ivas_dec_setup() */
209 840976 : st->next_bit_pos -= MASA_TRANSP_BITS;
210 840976 : *nb_bits_read += MASA_TRANSP_BITS;
211 : }
212 :
213 1424818 : if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE )
214 : {
215 : /* the number of objects was read */
216 583842 : st->next_bit_pos -= NO_BITS_MASA_ISM_NO_OBJ;
217 583842 : *nb_bits_read += NO_BITS_MASA_ISM_NO_OBJ;
218 :
219 583842 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
220 : {
221 : /* read index of separated object */
222 : /* nchan_ism should be > 1*/
223 114482 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
224 114482 : ( *nb_bits_read )++;
225 114482 : st_ivas->hMasaIsmData->idx_separated_ism = 2 * byteBuffer + st->bit_stream[( st->next_bit_pos )--];
226 114482 : ( *nb_bits_read )++;
227 : }
228 : else
229 : {
230 469360 : st_ivas->hMasaIsmData->idx_separated_ism = -1;
231 : }
232 :
233 : /* read ISM importance flag (one per object) */
234 583842 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
235 : {
236 114482 : ism_imp = 0;
237 343446 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
238 : {
239 228964 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
240 228964 : ( *nb_bits_read )++;
241 228964 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
242 : }
243 114482 : st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
244 : }
245 :
246 583842 : if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
247 : {
248 99746 : ism_imp = 0;
249 299238 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
250 : {
251 199492 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
252 199492 : ( *nb_bits_read )++;
253 199492 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
254 : }
255 99746 : st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
256 :
257 : /* reset */
258 99746 : st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0;
259 99746 : st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0;
260 99746 : if ( st_ivas->hIsmMetaData[0]->ism_imp == ISM_NO_META )
261 : {
262 : /* read flags */
263 2289 : st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
264 2289 : ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
265 2289 : st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
266 2289 : ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
267 : }
268 : }
269 484096 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
270 : {
271 1238898 : for ( ch = 0; ch < st_ivas->nchan_ism; ch++ )
272 : {
273 869284 : ism_imp = 0;
274 2607852 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
275 : {
276 1738568 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
277 1738568 : ( *nb_bits_read )++;
278 1738568 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
279 : }
280 869284 : st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp;
281 :
282 : /* reset */
283 869284 : st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0;
284 869284 : st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0;
285 869284 : if ( st_ivas->hIsmMetaData[ch]->ism_imp == ISM_NO_META )
286 : {
287 : /* read flags */
288 11226 : st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
289 11226 : ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
290 11226 : st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
291 11226 : ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
292 : }
293 : }
294 369614 : st_ivas->flag_omasa_brate = 0;
295 369614 : if ( st_ivas->nchan_ism >= 3 && ivas_total_brate == IVAS_128k )
296 : {
297 19913 : st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--];
298 19913 : ( *nb_bits_read ) += 1;
299 : }
300 : }
301 : }
302 :
303 1424818 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
304 1424818 : byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--];
305 :
306 1424818 : if ( byteBuffer == 0 && ivas_format == MASA_FORMAT )
307 : {
308 840976 : hMasa->config.input_ivas_format = MASA_FORMAT;
309 : }
310 : else
311 : {
312 583842 : hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
313 : }
314 1424818 : *nb_bits_read += MASA_HEADER_BITS;
315 :
316 : /* read number of directions */
317 1424818 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
318 1424818 : ( *nb_bits_read )++;
319 1424818 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
320 : }
321 : }
322 : else
323 : {
324 301635 : hMasa->config.numberOfDirections = 1;
325 : }
326 :
327 1892711 : if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
328 : {
329 : /* read subframe mode */
330 1591076 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
331 1591076 : ( *nb_bits_read )++;
332 1591076 : hMasa->config.joinedSubframes = (uint8_t) byteBuffer;
333 : }
334 : else
335 : {
336 301635 : hMasa->config.joinedSubframes = FALSE;
337 : }
338 :
339 1892711 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
340 : {
341 301635 : *nb_bits_read += decode_lfe_to_total_energy_ratio( hMasa->hMasaLfeSynth, st->bit_stream, &st->next_bit_pos, ivas_total_brate );
342 : }
343 :
344 : /* Once we know incoming configuration, we can config decoder further based on bitrate etc. */
345 1892711 : if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
346 : {
347 0 : return error;
348 : }
349 :
350 : /* If we are under metadata bit budget limit and joined subframes is not signalled, then read LBR mode. */
351 1892711 : if ( hMasa->config.max_metadata_bits < MINIMUM_BIT_BUDGET_NORMAL_META && hMasa->config.joinedSubframes == FALSE )
352 : {
353 : /* read low bitrate mode */
354 668651 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
355 668651 : ( *nb_bits_read )++;
356 668651 : low_bitrate_mode = byteBuffer;
357 :
358 668651 : if ( low_bitrate_mode == 1 )
359 : {
360 560417 : hQMetaData->q_direction[0].cfg.nblocks = 1;
361 : }
362 : else
363 : {
364 108234 : hQMetaData->q_direction[0].cfg.nbands = 1;
365 : }
366 : }
367 :
368 : /* Remove already read bits from the bit budget */
369 1892711 : hQMetaData->metadata_max_bits -= *nb_bits_read;
370 :
371 1892711 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
372 : {
373 583842 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
374 : {
375 114482 : if ( st_ivas->hDirAC != NULL )
376 : {
377 192412 : *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos,
378 96206 : st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length );
379 :
380 508044 : for ( obj = 0; obj <= st_ivas->nchan_ism; obj++ )
381 : {
382 411838 : if ( st_ivas->hMasaIsmData->idx_separated_ism == obj )
383 : {
384 : int16_t sf;
385 : int16_t meta_write_index;
386 :
387 481030 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
388 : {
389 384824 : meta_write_index = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + sf ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
390 384824 : st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism[obj][meta_write_index];
391 384824 : st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism[obj][meta_write_index];
392 : }
393 : }
394 : }
395 : }
396 18276 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
397 : {
398 5088 : *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos,
399 5088 : st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length );
400 : }
401 : else
402 : {
403 13188 : *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos,
404 13188 : st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
405 : }
406 : }
407 : }
408 :
409 1892711 : masa_total_brate = ivas_total_brate;
410 1892711 : if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
411 : {
412 369614 : masa_total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
413 : }
414 :
415 1892711 : if ( masa_total_brate >= IVAS_384k )
416 : {
417 116037 : if ( masa_total_brate >= IVAS_512k )
418 : {
419 44463 : *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4, hMasa->config.numCodingBands );
420 : }
421 : else
422 : {
423 71574 : *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3, hMasa->config.numCodingBands );
424 : }
425 : }
426 : else
427 : {
428 1776674 : *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, 0 );
429 : }
430 :
431 1892711 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ )
432 : {
433 : /* Modify spatial metadata based on the MASA-to-total energy ratios */
434 114482 : ivas_omasa_modify_masa_energy_ratios( hQMetaData, st_ivas->hMasaIsmData->masa_to_total_energy_ratio );
435 : }
436 :
437 : /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */
438 1892711 : if ( hQMetaData->ec_flag == 2 )
439 : {
440 222071 : hMasa->data.dir_decode_quality = hQMetaData->dir_comp_ratio;
441 : }
442 :
443 1892711 : hMasa->config.coherencePresent = !hQMetaData->all_coherence_zero;
444 :
445 1892711 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) )
446 : {
447 214309 : index_16bits( hQMetaData, hMasa->data.sph_grid16 );
448 : }
449 :
450 : /* If LBR mode is not disabled, then we restore metadata to 5 bands and 4 subframes based on the LBR mode. */
451 1892711 : if ( low_bitrate_mode != -1 )
452 : {
453 668651 : restore_lowbitrate_masa( hQMetaData, low_bitrate_mode, hMasa->config.numCodingBands );
454 : }
455 1224060 : else if ( hMasa->config.joinedSubframes == TRUE )
456 : {
457 308893 : replicate_subframes( hQMetaData );
458 : }
459 : }
460 112025 : else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 )
461 : {
462 1345 : if ( hQMetaData->q_direction == NULL )
463 : {
464 : /* replicate ivas_masa_dec_config() in case that first good received frame is SID frame */
465 0 : if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
466 : {
467 0 : return error;
468 : }
469 :
470 0 : ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, 0 );
471 :
472 0 : hQMetaData->metadata_max_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
473 :
474 0 : if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 5, 1, 0 ) ) != IVAS_ERR_OK )
475 : {
476 0 : return error;
477 : }
478 :
479 0 : hQMetaData->numTwoDirBands = hMasa->config.numTwoDirBands;
480 0 : hQMetaData->useLowerRes = 0;
481 :
482 0 : hQMetaData->q_direction->cfg.nbands = 5;
483 0 : hQMetaData->q_direction->cfg.nblocks = 4;
484 :
485 0 : if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
486 : {
487 0 : hQMetaData->q_direction->cfg.mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config );
488 : }
489 : else
490 : {
491 0 : hQMetaData->q_direction->cfg.mc_ls_setup = MC_LS_SETUP_INVALID;
492 : }
493 : }
494 :
495 1345 : tmp_elem_mode = -1;
496 1345 : *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format );
497 1345 : if ( st_ivas->nchan_transport == 2 )
498 : {
499 489 : assert( st_ivas->nCPE > 0 );
500 489 : st_ivas->hCPE[0]->element_mode = tmp_elem_mode;
501 : }
502 1345 : *nb_bits_read += SID_FORMAT_NBITS;
503 : }
504 110680 : else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == FRAME_NO_DATA )
505 : {
506 7936 : if ( hQMetaData->q_direction == NULL )
507 : {
508 0 : if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
509 : {
510 0 : return error;
511 : }
512 : }
513 : }
514 :
515 2004736 : if ( st_ivas->hDirAC != NULL )
516 : {
517 1616762 : dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */
518 1616762 : ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 );
519 : }
520 387974 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
521 : {
522 5484 : st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
523 : }
524 :
525 2004736 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
526 : {
527 630561 : if ( hQMetaData->q_direction == NULL )
528 : {
529 0 : if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
530 : {
531 0 : return error;
532 : }
533 : }
534 :
535 630561 : if ( st_ivas->hDirAC != NULL )
536 : {
537 : int16_t b;
538 : int16_t block;
539 : int16_t meta_write_index;
540 :
541 858728 : for ( i = 0; i < st_ivas->hSpatParamRendCom->numIsmDirections; i++ )
542 : {
543 1673485 : for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
544 : {
545 1338788 : meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
546 :
547 62330708 : for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
548 : {
549 60991920 : st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] -= st_ivas->hMasaIsmData->energy_ratio_ism[i][meta_write_index][b];
550 : }
551 : }
552 : }
553 :
554 2620155 : for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
555 : {
556 2096124 : meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
557 :
558 94594364 : for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
559 : {
560 92498240 : st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] = max( 0.0f, st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] );
561 : }
562 : }
563 : }
564 : }
565 :
566 2004736 : st->next_bit_pos = next_bit_pos_orig;
567 :
568 2004736 : if ( ivas_format == MASA_ISM_FORMAT )
569 : {
570 : int32_t cpe_brate;
571 630561 : cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
572 :
573 630561 : if ( st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
574 : {
575 209708 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = cpe_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
576 :
577 209708 : if ( ivas_total_brate <= IVAS_SID_5k2 )
578 : {
579 0 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0;
580 : }
581 : }
582 : }
583 : else
584 : {
585 1374175 : if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
586 : {
587 326371 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ivas_total_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
588 :
589 326371 : if ( ivas_total_brate <= IVAS_SID_5k2 )
590 : {
591 2990 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0;
592 : }
593 : }
594 : }
595 :
596 2004736 : if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 )
597 : {
598 708374 : st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 0;
599 :
600 708374 : if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 )
601 : {
602 3429 : st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 1;
603 :
604 3429 : if ( ivas_total_brate >= IVAS_SID_5k2 )
605 : {
606 489 : st_ivas->hCPE[0]->element_brate = ivas_total_brate;
607 : }
608 : }
609 : }
610 :
611 2004736 : if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
612 : {
613 223332 : create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport );
614 : }
615 :
616 2004736 : return error /* *nb_bits_read*/;
617 : }
618 :
619 :
620 : /*-------------------------------------------------------------------*
621 : * ivas_masa_dec_open()
622 : *
623 : *
624 : *-------------------------------------------------------------------*/
625 :
626 25877 : ivas_error ivas_masa_dec_open(
627 : Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */
628 : )
629 : {
630 : MASA_DECODER_HANDLE hMasa;
631 : ivas_error error;
632 : int16_t i;
633 : int32_t ism_total_brate;
634 :
635 25877 : error = IVAS_ERR_OK;
636 :
637 25877 : if ( ( hMasa = (MASA_DECODER_HANDLE) malloc( sizeof( MASA_DECODER ) ) ) == NULL )
638 : {
639 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
640 : }
641 :
642 25877 : ism_total_brate = 0;
643 : /* ISM metadata */
644 25877 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hIsmMetaData[0] != NULL )
645 : {
646 : /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */
647 0 : ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 );
648 : }
649 25877 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) )
650 : {
651 22380 : for ( i = 0; i < st_ivas->nSCE; i++ )
652 : {
653 14598 : ism_total_brate += st_ivas->hSCE[i]->element_brate;
654 : }
655 : }
656 :
657 25877 : ivas_masa_set_elements( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate );
658 :
659 25877 : mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
660 25877 : mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 );
661 25877 : hMasa->config.numberOfDirections = 1;
662 25877 : hMasa->config.joinedSubframes = FALSE;
663 :
664 : /* Create spherical grid only for external output */
665 25877 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) )
666 : {
667 1062 : if ( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL )
668 : {
669 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
670 : }
671 :
672 1062 : generate_gridEq( hMasa->data.sph_grid16 );
673 1062 : if ( ( hMasa->data.extOutMeta = (MASA_DECODER_EXT_OUT_META *) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL )
674 : {
675 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
676 : }
677 : }
678 : else
679 : {
680 24815 : hMasa->data.sph_grid16 = NULL;
681 24815 : hMasa->data.extOutMeta = NULL;
682 : }
683 :
684 25877 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
685 : {
686 10305 : error = init_lfe_synth_data( st_ivas, hMasa );
687 : }
688 : else
689 : {
690 15572 : hMasa->hMasaLfeSynth = NULL;
691 : }
692 :
693 25877 : st_ivas->hMasa = hMasa;
694 :
695 : /* allocate transport channels*/
696 25877 : if ( st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC )
697 : {
698 : int16_t nchan_to_allocate, nchan_transport;
699 : int16_t granularity;
700 : TC_BUFFER_MODE buffer_mode;
701 :
702 10314 : buffer_mode = TC_BUFFER_MODE_RENDERER;
703 10314 : if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) )
704 : {
705 86 : buffer_mode = TC_BUFFER_MODE_BUFFER;
706 : }
707 10228 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
708 : {
709 512 : buffer_mode = TC_BUFFER_MODE_BUFFER;
710 : }
711 :
712 10314 : nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
713 10314 : nchan_to_allocate = nchan_transport;
714 :
715 10314 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
716 : {
717 512 : nchan_transport = 1;
718 512 : nchan_to_allocate = 1;
719 : }
720 9802 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) )
721 : {
722 126 : nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
723 126 : nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
724 : }
725 9676 : else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) )
726 : {
727 : /* addtl channel for CNG */
728 1979 : nchan_to_allocate++;
729 : }
730 :
731 10314 : granularity = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
732 :
733 10314 : if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_transport, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK )
734 : {
735 0 : return error;
736 : }
737 : }
738 :
739 25877 : return error;
740 : }
741 :
742 :
743 : /*-----------------------------------------------------------------------*
744 : * ivas_masa_dec_close()
745 : *
746 : * close MASA decoder
747 : *-----------------------------------------------------------------------*/
748 :
749 104403 : void ivas_masa_dec_close(
750 : MASA_DECODER_HANDLE *hMasa_out /* i/o: MASA metadata structure */
751 : )
752 : {
753 : MASA_DECODER_HANDLE hMasa;
754 :
755 104403 : if ( hMasa_out == NULL || *hMasa_out == NULL )
756 : {
757 78526 : return;
758 : }
759 :
760 25877 : hMasa = *hMasa_out;
761 :
762 : /* Free spherical grid memory if in use */
763 25877 : if ( hMasa->data.sph_grid16 != NULL )
764 : {
765 3082 : free( hMasa->data.sph_grid16 );
766 3082 : hMasa->data.sph_grid16 = NULL;
767 : }
768 :
769 25877 : if ( hMasa->data.extOutMeta != NULL )
770 : {
771 1062 : free( hMasa->data.extOutMeta );
772 1062 : hMasa->data.extOutMeta = NULL;
773 : }
774 :
775 25877 : if ( hMasa->hMasaLfeSynth != NULL )
776 : {
777 10305 : if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer != NULL )
778 : {
779 1052 : free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer );
780 1052 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
781 : }
782 10305 : if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 != NULL )
783 : {
784 1052 : free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 );
785 1052 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
786 : }
787 10305 : if ( hMasa->hMasaLfeSynth->delayBuffer_syncLp != NULL )
788 : {
789 1052 : free( hMasa->hMasaLfeSynth->delayBuffer_syncLp );
790 1052 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
791 : }
792 10305 : if ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC != NULL )
793 : {
794 1052 : free( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC );
795 1052 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
796 : }
797 10305 : free( hMasa->hMasaLfeSynth );
798 10305 : hMasa->hMasaLfeSynth = NULL;
799 : }
800 :
801 25877 : free( *hMasa_out );
802 25877 : *hMasa_out = NULL;
803 :
804 25877 : return;
805 : }
806 :
807 :
808 : /*-------------------------------------------------------------------*
809 : * ivas_masa_dec_config()
810 : *
811 : * Frame-by-frame configuration of MASA decoder
812 : *-------------------------------------------------------------------*/
813 :
814 1892711 : static ivas_error ivas_masa_dec_config(
815 : Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */
816 : )
817 : {
818 : int16_t i;
819 : MASA_DECODER_HANDLE hMasa;
820 : uint8_t maxBand;
821 : int16_t maxBin;
822 : ivas_error error;
823 : int32_t ivas_total_brate;
824 : int32_t ism_total_brate;
825 1892711 : error = IVAS_ERR_OK;
826 1892711 : hMasa = st_ivas->hMasa;
827 :
828 1892711 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
829 1892711 : ism_total_brate = 0;
830 1892711 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) )
831 : {
832 1667354 : for ( i = 0; i < st_ivas->nSCE; i++ )
833 : {
834 1083512 : ism_total_brate += st_ivas->hSCE[i]->element_brate;
835 : }
836 : }
837 :
838 1892711 : ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate );
839 :
840 1892711 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
841 : {
842 583842 : ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hCPE[0]->element_brate, st_ivas->nchan_transport, MC_MODE_NONE );
843 : }
844 : else
845 : {
846 1308869 : ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) );
847 : }
848 :
849 1892711 : if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k )
850 : {
851 93376 : hMasa->config.mergeRatiosOverSubframes = 0;
852 :
853 : /* initialize spherical grid */
854 93376 : if ( hMasa->data.sph_grid16 == NULL )
855 : {
856 2020 : if ( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL )
857 : {
858 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA data handle\n" ) );
859 : }
860 2020 : generate_gridEq( hMasa->data.sph_grid16 );
861 : }
862 : }
863 1892711 : st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits;
864 1892711 : st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping;
865 1892711 : st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport;
866 :
867 1892711 : if ( ( error = ivas_qmetadata_allocate_memory( st_ivas->hQMetaData, hMasa->config.numCodingBands, hMasa->config.numberOfDirections, hMasa->config.useCoherence ) ) != IVAS_ERR_OK )
868 : {
869 0 : return error;
870 : }
871 :
872 1892711 : st_ivas->hQMetaData->numTwoDirBands = st_ivas->hMasa->config.numTwoDirBands;
873 1892711 : st_ivas->hQMetaData->useLowerRes = 0;
874 :
875 3957832 : for ( i = 0; i < st_ivas->hQMetaData->no_directions; i++ )
876 : {
877 2065121 : st_ivas->hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands;
878 2065121 : st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES;
879 :
880 2065121 : if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
881 : {
882 301635 : st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config );
883 : }
884 : else
885 : {
886 1763486 : st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = MC_LS_SETUP_INVALID;
887 : }
888 : }
889 :
890 1892711 : ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format );
891 :
892 : /* Find maximum band usable */
893 1892711 : maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH );
894 1892711 : maxBand = 0;
895 47551459 : while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin )
896 : {
897 45658748 : maxBand++;
898 : }
899 1892711 : maxBand--;
900 :
901 1892711 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
902 : {
903 : /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */
904 233415 : masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta );
905 : }
906 : else
907 : {
908 1659296 : masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL );
909 : }
910 :
911 1892711 : return error;
912 : }
913 :
914 :
915 : /*-------------------------------------------------------------------*
916 : * ivas_masa_prerender()
917 : *
918 : * Apply gaining and copying of transport signals when needed
919 : *-------------------------------------------------------------------*/
920 :
921 1059744 : void ivas_masa_prerender(
922 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
923 : float *output[], /* i/o: synthesized core-coder transport channels */
924 : const int16_t output_frame, /* i : output frame length per channel */
925 : const int16_t nchan_remapped /* i : number of transports used in core */
926 : )
927 : {
928 1059744 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && nchan_remapped == 1 )
929 : {
930 197581 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
931 : {
932 18662 : mvr2r( output[0], output[1], output_frame ); /* Copy mono signal to stereo output channels */
933 : }
934 : else
935 : {
936 178919 : if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_DISABLE )
937 : {
938 117239 : v_multc( output[0], SQRT2, output[0], output_frame ); /* Gain transport signal when transmitting mono with cpe in order to match loudness */
939 : }
940 : }
941 : }
942 :
943 1059744 : return;
944 : }
945 :
946 :
947 : /*-------------------------------------------------------------------*
948 : * Local functions
949 : *-------------------------------------------------------------------*/
950 :
951 214309 : static void index_16bits(
952 : IVAS_QMETADATA_HANDLE hQMetaData,
953 : SPHERICAL_GRID_DATA *Sph_Grid16 )
954 : {
955 : int16_t d, band, block;
956 :
957 470101 : for ( d = 0; d < hQMetaData->no_directions; d++ )
958 : {
959 : /* Note: The band information is read from the first direction as it contains the full information. */
960 3065447 : for ( band = 0; band < hQMetaData->q_direction[0].cfg.nbands; band++ )
961 : {
962 10494349 : for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ )
963 : {
964 7684694 : hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ),
965 7684694 : &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 );
966 : }
967 : }
968 : }
969 :
970 214309 : return;
971 : }
972 :
973 :
974 : /* Replicate subframe data when there is only one subframe sent */
975 308893 : static void replicate_subframes(
976 : IVAS_QMETADATA_HANDLE hQMetaData )
977 : {
978 : int16_t sf, band, dir, nbands, ndirs;
979 :
980 308893 : nbands = hQMetaData->q_direction->cfg.nbands;
981 308893 : ndirs = hQMetaData->no_directions;
982 :
983 1235572 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
984 : {
985 11967390 : for ( band = 0; band < nbands; band++ )
986 : {
987 24997854 : for ( dir = 0; dir < ndirs; dir++ )
988 : {
989 13957143 : hQMetaData->q_direction[dir].band_data[band].azimuth[sf] = hQMetaData->q_direction[dir].band_data[band].azimuth[0];
990 13957143 : hQMetaData->q_direction[dir].band_data[band].elevation[sf] = hQMetaData->q_direction[dir].band_data[band].elevation[0];
991 13957143 : hQMetaData->q_direction[dir].band_data[band].spherical_index[sf] = hQMetaData->q_direction[dir].band_data[band].spherical_index[0];
992 13957143 : hQMetaData->q_direction[dir].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[dir].band_data[band].energy_ratio[0];
993 :
994 13957143 : if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
995 : {
996 11513934 : hQMetaData->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[dir].coherence_band_data[band].spread_coherence[0];
997 : }
998 : }
999 :
1000 11040711 : if ( hQMetaData->surcoh_band_data != NULL )
1001 : {
1002 8597502 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
1003 : }
1004 : }
1005 : }
1006 :
1007 308893 : return;
1008 : }
1009 :
1010 :
1011 668651 : static void restore_lowbitrate_masa(
1012 : IVAS_QMETADATA_HANDLE hQMetaData,
1013 : const int16_t low_bitrate_mode,
1014 : const int16_t numCodingBands )
1015 : {
1016 : int16_t sf, band;
1017 :
1018 668651 : if ( low_bitrate_mode == 1 )
1019 : {
1020 : /* With signal 1, we are in 5 frequency bands, 1 subframe mode. */
1021 : /* Replicate data to all subframes */
1022 2241668 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1023 : {
1024 10087506 : for ( band = 0; band < numCodingBands; band++ )
1025 : {
1026 8406255 : hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[band].azimuth[0];
1027 8406255 : hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[band].elevation[0];
1028 8406255 : hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[band].spherical_index[0];
1029 8406255 : hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[band].energy_ratio[0];
1030 8406255 : if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
1031 : {
1032 1394820 : hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[0];
1033 : }
1034 8406255 : if ( hQMetaData->surcoh_band_data != NULL )
1035 : {
1036 1394820 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
1037 : }
1038 : }
1039 : }
1040 560417 : hQMetaData->q_direction->cfg.nblocks = 4;
1041 : }
1042 : else
1043 : {
1044 : /* With signal 0, we are in 1 frequency bands, 4 subframes mode. */
1045 : /* Replicate data to all bands */
1046 541170 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1047 : {
1048 2164680 : for ( band = 1; band < numCodingBands; band++ )
1049 : {
1050 1731744 : hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[0].azimuth[sf];
1051 1731744 : hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[0].elevation[sf];
1052 1731744 : hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[0].spherical_index[sf];
1053 1731744 : hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[0].energy_ratio[sf];
1054 1731744 : if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
1055 : {
1056 377152 : hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[0].spread_coherence[sf];
1057 : }
1058 1731744 : if ( hQMetaData->surcoh_band_data != NULL )
1059 : {
1060 377152 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[0].surround_coherence[sf];
1061 : }
1062 : }
1063 : }
1064 108234 : hQMetaData->q_direction->cfg.nbands = numCodingBands;
1065 : }
1066 :
1067 668651 : return;
1068 : }
1069 :
1070 :
1071 10305 : static ivas_error init_lfe_synth_data(
1072 : Decoder_Struct *st_ivas, /* i : IVAS decoder struct */
1073 : MASA_DECODER_HANDLE hMasa /* i/o: MASA decoder structure */
1074 : )
1075 : {
1076 : int32_t output_Fs;
1077 : AUDIO_CONFIG output_config;
1078 :
1079 10305 : output_Fs = st_ivas->hDecoderConfig->output_Fs;
1080 10305 : output_config = st_ivas->hDecoderConfig->output_config;
1081 :
1082 10305 : if ( ( hMasa->hMasaLfeSynth = (MCMASA_LFE_SYNTH_DATA_HANDLE) malloc( sizeof( MCMASA_LFE_SYNTH_DATA ) ) ) == NULL )
1083 : {
1084 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
1085 : }
1086 :
1087 10305 : hMasa->hMasaLfeSynth->transportEneSmooth = 0.0f;
1088 10305 : hMasa->hMasaLfeSynth->protoLfeEneSmooth = 0.0f;
1089 10305 : hMasa->hMasaLfeSynth->targetEneLfeSmooth = 0.0f;
1090 10305 : hMasa->hMasaLfeSynth->targetEneTransSmooth = 0.0f;
1091 :
1092 10305 : set_zero( hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES );
1093 10305 : hMasa->hMasaLfeSynth->lfeGainPrevIndex = 0;
1094 :
1095 10305 : if ( st_ivas->hOutSetup.separateChannelEnabled &&
1096 1986 : ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
1097 1926 : output_config == IVAS_AUDIO_CONFIG_5_1_2 ||
1098 1896 : output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
1099 1400 : output_config == IVAS_AUDIO_CONFIG_EXTERNAL ||
1100 1370 : output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 ||
1101 968 : output_config == IVAS_AUDIO_CONFIG_HOA3 ||
1102 0 : ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) )
1103 1052 : {
1104 : int16_t bufferSize;
1105 : int16_t i;
1106 : int16_t slot_size;
1107 :
1108 : /* Ring buffer for the filterbank of the LFE synthesis.
1109 : * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */
1110 1052 : bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES );
1111 1052 : if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
1112 : {
1113 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
1114 : }
1115 1052 : set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer, bufferSize );
1116 1052 : hMasa->hMasaLfeSynth->ringBufferLoPointer = 0;
1117 1052 : hMasa->hMasaLfeSynth->ringBufferHiPointer = bufferSize / 2;
1118 1052 : hMasa->hMasaLfeSynth->lowpassSum = 0.0f;
1119 1052 : hMasa->hMasaLfeSynth->ringBufferSize = bufferSize;
1120 :
1121 : /* Ring buffer for additional lowpass filter for the LFE signal.
1122 : * Moving average lowpass filter with the crossover of 240 Hz. */
1123 1052 : bufferSize /= 2;
1124 1052 : if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
1125 : {
1126 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
1127 : }
1128 1052 : set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2, bufferSize );
1129 1052 : hMasa->hMasaLfeSynth->ringBufferLoPointer2 = 0;
1130 1052 : hMasa->hMasaLfeSynth->lowpassSum2 = 0.0f;
1131 1052 : hMasa->hMasaLfeSynth->ringBufferSize2 = bufferSize;
1132 :
1133 : /* Delay buffer for matching the delay of the lowpass filter */
1134 1052 : bufferSize /= 2; /* The delay of the moving average lowpass filter is bufferSize / 2 */
1135 1052 : if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncLp = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
1136 : {
1137 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
1138 : }
1139 1052 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncLp, bufferSize );
1140 1052 : hMasa->hMasaLfeSynth->delayBuffer_syncLp_size = bufferSize;
1141 :
1142 : /* Delay buffer for syncing with DirAC rendering */
1143 1052 : bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) - hMasa->hMasaLfeSynth->ringBufferSize / 2 - hMasa->hMasaLfeSynth->ringBufferSize2 / 2;
1144 1052 : if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
1145 : {
1146 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
1147 : }
1148 1052 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize );
1149 1052 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize;
1150 :
1151 : /* Interpolation between slots */
1152 1052 : hMasa->hMasaLfeSynth->lfeGainPrev = 0.0f;
1153 1052 : hMasa->hMasaLfeSynth->transportGainPrev = 1.0f;
1154 1052 : slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );
1155 56892 : for ( i = 0; i < slot_size; i++ )
1156 : {
1157 55840 : hMasa->hMasaLfeSynth->interpolator[i] = ( (float) ( i + 1 ) ) / ( (float) slot_size );
1158 : }
1159 : }
1160 9253 : else if ( st_ivas->hOutSetup.separateChannelEnabled && output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 )
1161 0 : {
1162 : int16_t bufferSize;
1163 :
1164 : /* Delay buffer for syncing with DirAC rendering */
1165 0 : bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS );
1166 0 : if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
1167 : {
1168 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
1169 : }
1170 0 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize );
1171 0 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize;
1172 :
1173 0 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
1174 0 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
1175 0 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
1176 : }
1177 : else
1178 : {
1179 9253 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
1180 9253 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
1181 9253 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
1182 9253 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
1183 : }
1184 :
1185 10305 : return IVAS_ERR_OK;
1186 : }
1187 :
1188 :
1189 : /*! r: Number of bits read */
1190 301635 : static int16_t decode_lfe_to_total_energy_ratio(
1191 : MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: McMASA LFE structure */
1192 : uint16_t *bitstream, /* i : bitstream */
1193 : int16_t *index, /* i/o: bitstream position */
1194 : const int32_t ivas_total_brate /* i : total bitrate */
1195 : )
1196 : {
1197 : int16_t i;
1198 : int16_t lfeToTotalEnergyRatioIndices[3];
1199 : int16_t VQBits;
1200 : float log2LFEaverage;
1201 : float lfeToTotalEnergyRatioTemp;
1202 : uint16_t byteBuffer;
1203 : int16_t lfeBitsRead;
1204 :
1205 301635 : lfeBitsRead = 0;
1206 301635 : byteBuffer = bitstream[( *index )--];
1207 301635 : lfeBitsRead += 1;
1208 301635 : lfeToTotalEnergyRatioIndices[0] = byteBuffer; /* First LFE index */
1209 :
1210 301635 : if ( ivas_total_brate == IVAS_13k2 ) /* 1-bit adaptive LFE gain quantizer at 13.2 kbps */
1211 : {
1212 35154 : lfeToTotalEnergyRatioTemp = hMasaLfeSynth->lfeToTotalEnergyRatio[3]; /* Take memory from the last subframe */
1213 35154 : if ( lfeToTotalEnergyRatioIndices[0] == 1 )
1214 : {
1215 9148 : if ( hMasaLfeSynth->lfeGainPrevIndex == 1 )
1216 : {
1217 4676 : lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_THETA * MCMASA_LFE_BETA; /* larger "bump-up" energy */
1218 : }
1219 : else
1220 : {
1221 4472 : lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_BETA; /* "bump-up" energy */
1222 : }
1223 : }
1224 : else
1225 : {
1226 26006 : lfeToTotalEnergyRatioTemp = MCMASA_LFE_ALPHA * lfeToTotalEnergyRatioTemp; /* exponential decay */
1227 : }
1228 35154 : if ( lfeToTotalEnergyRatioTemp > 1.0f )
1229 : {
1230 4 : lfeToTotalEnergyRatioTemp = 1.0f;
1231 : }
1232 35154 : hMasaLfeSynth->lfeGainPrevIndex = lfeToTotalEnergyRatioIndices[0];
1233 175770 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1234 : {
1235 140616 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = lfeToTotalEnergyRatioTemp;
1236 : }
1237 : }
1238 : else /* Bitrates >= 16.4 kbps */
1239 : {
1240 266481 : if ( lfeToTotalEnergyRatioIndices[0] == 0 )
1241 : {
1242 336805 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1243 : {
1244 269444 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = 0.0f;
1245 : }
1246 : }
1247 : else
1248 : {
1249 199120 : byteBuffer = bitstream[( *index )--] << 2;
1250 199120 : byteBuffer += bitstream[( *index )--] << 1;
1251 199120 : byteBuffer += bitstream[( *index )--];
1252 199120 : lfeBitsRead += 3;
1253 199120 : lfeToTotalEnergyRatioIndices[1] = byteBuffer; /* Scalar index */
1254 199120 : log2LFEaverage = usdequant( lfeToTotalEnergyRatioIndices[1], MCMASA_LFE_QLOW, MCMASA_LFE_DELTA );
1255 :
1256 : /* 16.4 kbps sends only scalar gain, above it VQ is used */
1257 199120 : if ( ivas_total_brate >= IVAS_24k4 )
1258 : {
1259 : /* Depending on average (scalar) gain more bits are sent for VQ LFE gain */
1260 185081 : switch ( lfeToTotalEnergyRatioIndices[1] )
1261 : {
1262 38905 : case 0:
1263 : case 1:
1264 38905 : VQBits = 0;
1265 38905 : break;
1266 21232 : case 2:
1267 21232 : VQBits = 1;
1268 21232 : break;
1269 22169 : case 3:
1270 22169 : VQBits = 2;
1271 22169 : break;
1272 26034 : case 4:
1273 26034 : VQBits = 3;
1274 26034 : break;
1275 76741 : default:
1276 76741 : VQBits = 4;
1277 : }
1278 185081 : byteBuffer = 0;
1279 635717 : for ( i = 0; i < VQBits; i++ )
1280 : {
1281 450636 : byteBuffer += bitstream[( *index )--] << ( VQBits - 1 - i );
1282 450636 : lfeBitsRead += 1;
1283 : }
1284 185081 : lfeToTotalEnergyRatioIndices[2] = byteBuffer; /* VQ index */
1285 : }
1286 :
1287 995600 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1288 : {
1289 796480 : if ( ivas_total_brate == IVAS_16k4 )
1290 : {
1291 56156 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage );
1292 : }
1293 : else
1294 : {
1295 740324 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage + McMASA_LFEGain_vectors[4 * lfeToTotalEnergyRatioIndices[2] + i] );
1296 : }
1297 796480 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = min( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 1.0f );
1298 796480 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = max( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 0.0f );
1299 : }
1300 : }
1301 : }
1302 :
1303 301635 : return lfeBitsRead;
1304 : }
1305 :
1306 :
1307 : /*-------------------------------------------------------------------*
1308 : * ivas_masa_dec_reconfigure()
1309 : *
1310 : * Reconfigure IVAS MASA decoder
1311 : *-------------------------------------------------------------------*/
1312 :
1313 69583 : ivas_error ivas_masa_dec_reconfigure(
1314 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
1315 : )
1316 : {
1317 : int16_t n, tmp, num_bits;
1318 : int16_t sce_id, cpe_id;
1319 : uint16_t *bit_stream;
1320 : Decoder_State **sts;
1321 : int32_t ivas_total_brate, last_ivas_total_brate;
1322 : int16_t numCldfbAnalyses_old, numCldfbSyntheses_old;
1323 : int16_t nchan_out_buff;
1324 : ivas_error error;
1325 : int16_t pos_idx;
1326 : int32_t ism_total_brate;
1327 :
1328 69583 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
1329 69583 : last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate;
1330 :
1331 : /* Copy state to TC buffer if granularity matches and we are not in OMASA EXT rendering mode */
1332 69583 : if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL )
1333 : {
1334 55432 : mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1335 55432 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
1336 55432 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
1337 : }
1338 :
1339 69583 : ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
1340 :
1341 : /* renderer might have changed, reselect */
1342 69583 : ivas_renderer_select( st_ivas );
1343 :
1344 69583 : if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend == NULL ) ||
1345 68699 : ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] == NULL ) )
1346 : {
1347 : /* init a new DirAC dec */
1348 884 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
1349 : {
1350 0 : return error;
1351 : }
1352 : }
1353 68699 : else if ( st_ivas->renderer_type == RENDERER_DISABLE || st_ivas->renderer_type == RENDERER_MONO_DOWNMIX || st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT )
1354 : {
1355 : /* close all unnecessary parametric decoding and rendering */
1356 9780 : ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
1357 9780 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
1358 9780 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
1359 9780 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
1360 : }
1361 : /* possible reconfigure is done later */
1362 :
1363 : /*-----------------------------------------------------------------*
1364 : * Allocate and initialize SCE/CPE and other handles
1365 : *-----------------------------------------------------------------*/
1366 :
1367 69583 : bit_stream = st_ivas->hSCE[0] != NULL ? st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream : st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream;
1368 :
1369 69583 : num_bits = 0;
1370 :
1371 146507 : for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ )
1372 : {
1373 76924 : st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport;
1374 76924 : st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
1375 76924 : sts = st_ivas->hSCE[sce_id]->hCoreCoder;
1376 76924 : sts[0]->bit_stream = bit_stream + num_bits;
1377 76924 : num_bits += (int16_t) ( st_ivas->hSCE[sce_id]->element_brate / FRAMES_PER_SEC );
1378 :
1379 76924 : if ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] != NULL )
1380 : {
1381 36424 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1382 : {
1383 0 : return error;
1384 : }
1385 : }
1386 : }
1387 :
1388 131738 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
1389 : {
1390 62155 : st_ivas->hCPE[cpe_id]->element_brate = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
1391 :
1392 : /* prepare bitstream buffers */
1393 186465 : for ( n = 0; n < CPE_CHANNELS; n++ )
1394 : {
1395 124310 : st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
1396 : }
1397 62155 : sts = st_ivas->hCPE[cpe_id]->hCoreCoder;
1398 62155 : sts[0]->bit_stream = bit_stream + num_bits;
1399 62155 : num_bits += (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
1400 62155 : if ( ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate >= MASA_STEREO_MIN_BITRATE ) ||
1401 50122 : ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == FRAME_NO_DATA ) ||
1402 161 : ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == IVAS_SID_5k2 ) )
1403 : {
1404 12084 : st_ivas->hCPE[cpe_id]->nchan_out = 1;
1405 12084 : if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] != NULL ) )
1406 : {
1407 9910 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1408 : {
1409 0 : return error;
1410 : }
1411 : }
1412 : }
1413 50071 : else if ( ivas_total_brate >= MASA_STEREO_MIN_BITRATE && last_ivas_total_brate < MASA_STEREO_MIN_BITRATE )
1414 : {
1415 12133 : st_ivas->hCPE[cpe_id]->nchan_out = CPE_CHANNELS;
1416 :
1417 12133 : if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] != NULL ) )
1418 : {
1419 10311 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1420 : {
1421 0 : return error;
1422 : }
1423 : }
1424 : }
1425 : }
1426 :
1427 626247 : for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ )
1428 : {
1429 556664 : if ( st_ivas->hDiracDecBin[pos_idx] != NULL )
1430 : {
1431 : /* regularization factor is bitrate-dependent */
1432 33761 : st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
1433 : }
1434 : }
1435 :
1436 69583 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format == MASA_FORMAT ) /* note: switching within OMASA is handled in ivas_omasa_dec_config() */
1437 : {
1438 : /*-----------------------------------------------------------------*
1439 : * TD Decorrelator
1440 : *-----------------------------------------------------------------*/
1441 :
1442 16225 : if ( st_ivas->hDiracDecBin[0] != NULL )
1443 : {
1444 7561 : if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ) != IVAS_ERR_OK )
1445 : {
1446 0 : return error;
1447 : }
1448 : }
1449 :
1450 : /*-----------------------------------------------------------------*
1451 : * CLDFB instances
1452 : *-----------------------------------------------------------------*/
1453 :
1454 16225 : if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
1455 : {
1456 0 : return error;
1457 : }
1458 : }
1459 :
1460 : /*-----------------------------------------------------------------*
1461 : * Set-up MASA coding elements and bitrates
1462 : *-----------------------------------------------------------------*/
1463 :
1464 69583 : ism_total_brate = 0;
1465 69583 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) )
1466 : {
1467 67491 : for ( n = 0; n < st_ivas->nSCE; n++ )
1468 : {
1469 43618 : ism_total_brate += st_ivas->hSCE[n]->element_brate;
1470 : }
1471 : }
1472 :
1473 69583 : ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate );
1474 :
1475 : /*-----------------------------------------------------------------*
1476 : * JBM TC buffers
1477 : *-----------------------------------------------------------------*/
1478 :
1479 : {
1480 : int16_t tc_nchan_to_allocate;
1481 : int16_t tc_nchan_transport;
1482 : TC_BUFFER_MODE buffer_mode_new;
1483 : int16_t n_samples_granularity;
1484 :
1485 69583 : n_samples_granularity = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, ivas_renderer_secondary_select( st_ivas ), st_ivas->hDecoderConfig->output_Fs );
1486 69583 : buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
1487 69583 : tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
1488 :
1489 69583 : tc_nchan_to_allocate = tc_nchan_transport;
1490 69583 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1491 : {
1492 33761 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
1493 : {
1494 18614 : tc_nchan_to_allocate = BINAURAL_CHANNELS + st_ivas->nchan_ism;
1495 : }
1496 : else
1497 : {
1498 15147 : tc_nchan_to_allocate = BINAURAL_CHANNELS;
1499 15147 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
1500 : {
1501 7837 : tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS;
1502 : }
1503 : }
1504 : #ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING
1505 33761 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
1506 : {
1507 3556 : if ( n_samples_granularity > st_ivas->hTcBuffer->n_samples_granularity )
1508 : {
1509 3484 : if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
1510 : {
1511 0 : return error;
1512 : }
1513 : }
1514 : }
1515 5801 : else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode != ISM_MASA_MODE_DISC )
1516 : {
1517 5801 : if ( n_samples_granularity < st_ivas->hTcBuffer->n_samples_granularity )
1518 : {
1519 : /* flush already done in IVAS_DEC_ReadFormat() */
1520 : }
1521 : }
1522 : #endif
1523 : }
1524 35822 : else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) )
1525 : {
1526 : /* addtl channel for CNG */
1527 1718 : tc_nchan_to_allocate++;
1528 : }
1529 34104 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) )
1530 : {
1531 1610 : tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
1532 1610 : tc_nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
1533 : }
1534 :
1535 69583 : if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode )
1536 : {
1537 49215 : if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, n_samples_granularity ) ) != IVAS_ERR_OK )
1538 : {
1539 0 : return error;
1540 : }
1541 : }
1542 :
1543 69583 : if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity )
1544 : {
1545 55441 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1546 55441 : st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1547 55441 : st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1548 : }
1549 :
1550 69583 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
1551 : {
1552 3556 : int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size;
1553 :
1554 32004 : for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ )
1555 : {
1556 28448 : st_ivas->hSpatParamRendCom->subframe_nbslots[n] = st_ivas->hTcBuffer->subframe_nbslots[n] * granularityMultiplier;
1557 : }
1558 : }
1559 : }
1560 :
1561 : /*-----------------------------------------------------------------*
1562 : * floating-point output audio buffers
1563 : *-----------------------------------------------------------------*/
1564 :
1565 69583 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format == MASA_FORMAT ) /* note: switching with OMASA is addressed in ivas_omasa_dec_config() */
1566 : {
1567 16225 : nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
1568 16225 : if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK )
1569 : {
1570 0 : return error;
1571 : }
1572 : }
1573 :
1574 69583 : return IVAS_ERR_OK;
1575 : }
1576 :
1577 :
1578 : /*-------------------------------------------------------------------*
1579 : * ivas_spar_param_to_masa_param_mapping()
1580 : *
1581 : * Determine MASA metadata from the SPAR metadata
1582 : *-------------------------------------------------------------------*/
1583 :
1584 3266942 : void ivas_spar_param_to_masa_param_mapping(
1585 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
1586 : float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
1587 : float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
1588 : const int16_t subframe /* i : Subframe to map */
1589 : )
1590 : {
1591 : int16_t i, j, band, bin, slot, ch, nBins, nchan_transport;
1592 : int16_t mixer_mat_index;
1593 : int16_t dirac_write_idx;
1594 : DIRAC_DEC_HANDLE hDirAC;
1595 : DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist;
1596 : float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS];
1597 : float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS];
1598 : int16_t *band_grouping;
1599 : int16_t band_start, band_end;
1600 : float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX];
1601 : float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX];
1602 : float instEne;
1603 : float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
1604 : float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
1605 : float Iy, Iz, Ix, E, azi, ele, I, ratio;
1606 : float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum;
1607 : int16_t slot_idx, slot_idx_start, sf;
1608 : SPAR_DEC_HANDLE hSpar;
1609 : float slot_fac;
1610 : SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
1611 :
1612 : /* Set values */
1613 3266942 : hDirAC = st_ivas->hDirAC;
1614 3266942 : hSpatParamRendCom = st_ivas->hSpatParamRendCom;
1615 3266942 : hSpatParamRendCom->numParametricDirections = 1;
1616 3266942 : hSpatParamRendCom->numSimultaneousDirections = 1;
1617 3266942 : hDiffuseDist = st_ivas->hDiracDecBin[0]->hDiffuseDist;
1618 3266942 : nchan_transport = st_ivas->nchan_transport;
1619 3266942 : band_grouping = hDirAC->band_grouping;
1620 3266942 : hSpar = st_ivas->hSpar;
1621 3266942 : dirac_write_idx = hSpatParamRendCom->render_to_md_map[subframe];
1622 :
1623 : /* Init arrays */
1624 16334710 : for ( i = 0; i < FOA_CHANNELS; i++ )
1625 : {
1626 13067768 : set_zero( inCovarianceMtx[i], FOA_CHANNELS );
1627 : }
1628 :
1629 : /* Delay the SPAR mixing matrices to have them synced with the audio */
1630 3266942 : slot_idx_start = hSpar->slots_rendered;
1631 3266942 : slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe];
1632 :
1633 16304636 : for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ )
1634 : {
1635 13037694 : sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME;
1636 :
1637 13037694 : if ( ( sf < SPAR_META_DELAY_SUBFRAMES ) )
1638 : {
1639 6518874 : mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1;
1640 58669866 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1641 : {
1642 260754960 : for ( i = 0; i < FOA_CHANNELS; i++ )
1643 : {
1644 1043019840 : for ( j = 0; j < FOA_CHANNELS; j++ )
1645 : {
1646 834415872 : mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band];
1647 : }
1648 : }
1649 : }
1650 : }
1651 : else
1652 : {
1653 6518820 : mixer_mat_index = ( ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) == 1 ) ? 0 : ( sf - SPAR_META_DELAY_SUBFRAMES );
1654 58669380 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1655 : {
1656 260752800 : for ( i = 0; i < FOA_CHANNELS; i++ )
1657 : {
1658 1043011200 : for ( j = 0; j < FOA_CHANNELS; j++ )
1659 : {
1660 834408960 : mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS];
1661 : }
1662 : }
1663 : }
1664 : }
1665 : }
1666 :
1667 : /* Map the mixing matrices from the frequency bands to frequency bins */
1668 3266942 : bin = 0;
1669 29402478 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1670 : {
1671 26135536 : band_start = band_grouping[band];
1672 26135536 : band_end = band_grouping[band + 1];
1673 62071898 : for ( bin = band_start; bin < band_end; bin++ )
1674 : {
1675 179681810 : for ( i = 0; i < FOA_CHANNELS; i++ )
1676 : {
1677 718727240 : for ( j = 0; j < FOA_CHANNELS; j++ )
1678 : {
1679 574981792 : mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j];
1680 : }
1681 : }
1682 : }
1683 : }
1684 3266942 : nBins = bin;
1685 :
1686 : /* Determine MASA metadata */
1687 : /* Determine transport signal energies and cross correlations when more than 1 TC */
1688 3266942 : if ( nchan_transport == 2 )
1689 : {
1690 1668255 : set_zero( transportSignalEnergies[0], nBins );
1691 1668255 : set_zero( transportSignalEnergies[1], nBins );
1692 1668255 : set_zero( transportSignalCrossCorrelation, nBins );
1693 :
1694 8334259 : for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ )
1695 : {
1696 79992048 : for ( bin = 0; bin < nBins; bin++ )
1697 : {
1698 219978132 : for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
1699 : {
1700 146652088 : instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] );
1701 146652088 : instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
1702 146652088 : transportSignalEnergies[ch][bin] += instEne;
1703 : }
1704 73326044 : transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin];
1705 73326044 : transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin];
1706 : }
1707 : }
1708 : }
1709 :
1710 3266942 : if ( hDiffuseDist != NULL )
1711 : {
1712 3266942 : set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX );
1713 3266942 : set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX );
1714 3266942 : set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX );
1715 : }
1716 :
1717 39203304 : for ( bin = 0; bin < nBins; bin++ )
1718 : {
1719 : /* Set the energy of the first transport signal */
1720 35936362 : if ( nchan_transport == 1 )
1721 : {
1722 17585557 : inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */
1723 : }
1724 : else
1725 : {
1726 18350805 : inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */
1727 : }
1728 :
1729 : /* Decorrelated channels assumed to have the same energy as the source channel */
1730 35936362 : inCovarianceMtx[1][1] = inCovarianceMtx[0][0];
1731 35936362 : inCovarianceMtx[2][2] = inCovarianceMtx[0][0];
1732 35936362 : inCovarianceMtx[3][3] = inCovarianceMtx[0][0];
1733 :
1734 : /* In case residuals were transmitted, use their actual energies and cross correlations */
1735 35936362 : if ( nchan_transport == 2 )
1736 : {
1737 18350805 : inCovarianceMtx[1][1] = transportSignalEnergies[1][bin];
1738 18350805 : inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin];
1739 18350805 : inCovarianceMtx[1][0] = inCovarianceMtx[0][1];
1740 : }
1741 :
1742 35936362 : compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] );
1743 :
1744 : /* Estimate MASA metadata */
1745 35936362 : Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */
1746 35936362 : Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */
1747 35936362 : Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */
1748 35936362 : I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */
1749 35936362 : E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */
1750 35936362 : azi = atan2f( Iy, Ix ); /* Azimuth */
1751 35936362 : ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */
1752 35936362 : ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */
1753 35936362 : ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) );
1754 :
1755 35936362 : hSpatParamRendCom->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 );
1756 35936362 : hSpatParamRendCom->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 );
1757 35936362 : hSpatParamRendCom->energy_ratio1[dirac_write_idx][bin] = ratio;
1758 35936362 : hSpatParamRendCom->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio;
1759 :
1760 35936362 : hSpatParamRendCom->spreadCoherence[dirac_write_idx][bin] = 0.0f;
1761 35936362 : hSpatParamRendCom->surroundingCoherence[dirac_write_idx][bin] = 0.0f;
1762 :
1763 : /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */
1764 35936362 : if ( hDiffuseDist != NULL )
1765 : {
1766 35936362 : if ( nchan_transport == 1 )
1767 : {
1768 17585557 : diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] );
1769 17585557 : diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] );
1770 17585557 : diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] );
1771 : }
1772 18350805 : else if ( nchan_transport == 2 )
1773 : {
1774 18350805 : diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] );
1775 18350805 : diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] );
1776 18350805 : diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] );
1777 : }
1778 : else
1779 : {
1780 0 : diffuseGainY = 1.0f;
1781 0 : diffuseGainX = 1.0f;
1782 0 : diffuseGainZ = 1.0f;
1783 : }
1784 :
1785 35936362 : diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ;
1786 :
1787 35936362 : if ( diffuseGainSum == 0.0f )
1788 : {
1789 865127 : hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f;
1790 865127 : hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f;
1791 865127 : hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f;
1792 : }
1793 : else
1794 : {
1795 35071235 : hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
1796 35071235 : hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
1797 35071235 : hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
1798 : }
1799 : }
1800 : }
1801 :
1802 3266942 : return;
1803 : }
1804 :
1805 :
1806 : /* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */
1807 35936362 : static void compute_foa_cov_matrix(
1808 : float foaCov[FOA_CHANNELS][FOA_CHANNELS], /* o : Estimated FOA covariance matrix */
1809 : float inCov[FOA_CHANNELS][FOA_CHANNELS], /* i : Input covariance matrix */
1810 : float mixMtx[FOA_CHANNELS][FOA_CHANNELS] /* i : Mixing matrix */
1811 : )
1812 : {
1813 : float tmpMtx[FOA_CHANNELS][FOA_CHANNELS];
1814 : int16_t i, j, k;
1815 :
1816 : /* tmpMtx = mixMtx * inCov */
1817 179681810 : for ( i = 0; i < FOA_CHANNELS; i++ )
1818 : {
1819 718727240 : for ( j = 0; j < FOA_CHANNELS; j++ )
1820 : {
1821 574981792 : tmpMtx[i][j] = 0.0f;
1822 2874908960 : for ( k = 0; k < FOA_CHANNELS; k++ )
1823 : {
1824 2299927168 : tmpMtx[i][j] += mixMtx[i][k] * inCov[k][j];
1825 : }
1826 : }
1827 : }
1828 :
1829 : /* foaCov = inCov * mixMtx' */
1830 179681810 : for ( i = 0; i < FOA_CHANNELS; i++ )
1831 : {
1832 718727240 : for ( j = 0; j < FOA_CHANNELS; j++ )
1833 : {
1834 574981792 : foaCov[i][j] = 0.0f;
1835 2874908960 : for ( k = 0; k < FOA_CHANNELS; k++ )
1836 : {
1837 2299927168 : foaCov[i][j] += tmpMtx[i][k] * mixMtx[j][k];
1838 : }
1839 : }
1840 : }
1841 :
1842 35936362 : return;
1843 : }
1844 :
1845 223332 : static void create_masa_ext_out_meta(
1846 : MASA_DECODER *hMasa,
1847 : IVAS_QMETADATA_HANDLE hQMetaData,
1848 : const int16_t nchan_transport )
1849 : {
1850 : int16_t i, sf, b_old, b_new, dir;
1851 : MASA_DECRIPTIVE_META *descMeta;
1852 : int16_t *bandMap;
1853 : uint8_t numCodingBands;
1854 : uint8_t numDirections;
1855 : MASA_DECODER_EXT_OUT_META *extOutMeta;
1856 :
1857 223332 : numDirections = hMasa->config.numberOfDirections;
1858 223332 : numCodingBands = hMasa->config.numCodingBands;
1859 223332 : bandMap = hMasa->data.band_mapping;
1860 223332 : extOutMeta = hMasa->data.extOutMeta;
1861 223332 : descMeta = &hMasa->data.extOutMeta->descriptiveMeta;
1862 :
1863 : /* Construct descriptive meta */
1864 2009988 : for ( i = 0; i < 8; i++ )
1865 : {
1866 1786656 : descMeta->formatDescriptor[i] = ivasmasaFormatDescriptor[i];
1867 : }
1868 223332 : descMeta->numberOfDirections = numDirections - 1;
1869 223332 : descMeta->numberOfChannels = (uint8_t) ( nchan_transport - 1 );
1870 : /* Following correspond to "unknown" values until transmission is implemented */
1871 223332 : descMeta->sourceFormat = 0x0u;
1872 223332 : descMeta->transportDefinition = 0x0u;
1873 223332 : descMeta->channelAngle = 0x0u;
1874 223332 : descMeta->channelDistance = 0x0u;
1875 223332 : descMeta->channelLayout = 0x0u;
1876 :
1877 : /* Construct spatial metadata from qmetadata */
1878 1116660 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1879 : {
1880 1954432 : for ( dir = 0; dir < numDirections; dir++ )
1881 : {
1882 : /* Spherical index */
1883 12672760 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1884 : {
1885 36687716 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1886 : {
1887 25076060 : extOutMeta->directionIndex[dir][sf][b_new] = hQMetaData->q_direction[dir].band_data[b_old].spherical_index[sf];
1888 : }
1889 : }
1890 :
1891 : /* Direct-to-total ratio */
1892 12672760 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1893 : {
1894 36687716 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1895 : {
1896 25076060 : extOutMeta->directToTotalRatio[dir][sf][b_new] = (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
1897 : }
1898 : }
1899 :
1900 : /* Spread coherence */
1901 1061104 : if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
1902 : {
1903 11070160 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1904 : {
1905 29278280 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1906 : {
1907 19008400 : extOutMeta->spreadCoherence[dir][sf][b_new] = hQMetaData->q_direction[dir].coherence_band_data[b_old].spread_coherence[sf];
1908 : }
1909 : }
1910 : }
1911 : else
1912 : {
1913 6520600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1914 : {
1915 6259776 : extOutMeta->spreadCoherence[dir][sf][i] = 0;
1916 : }
1917 : }
1918 : }
1919 :
1920 : /* Fill second direction with zero energy data for EXT output */
1921 893328 : if ( numDirections == 1 )
1922 : {
1923 18138800 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1924 : {
1925 17413248 : extOutMeta->directionIndex[1][sf][i] = SPH_IDX_FRONT;
1926 : }
1927 :
1928 18138800 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1929 : {
1930 17413248 : extOutMeta->directToTotalRatio[1][sf][i] = 0;
1931 : }
1932 :
1933 18138800 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1934 : {
1935 17413248 : extOutMeta->spreadCoherence[1][sf][i] = 0;
1936 : }
1937 : }
1938 :
1939 : /* Common spatial meta */
1940 : /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */
1941 10438836 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1942 : {
1943 30594944 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1944 : {
1945 21049436 : extOutMeta->diffuseToTotalRatio[sf][b_new] = UINT8_MAX;
1946 46125496 : for ( dir = 0; dir < numDirections; dir++ )
1947 : {
1948 25076060 : extOutMeta->diffuseToTotalRatio[sf][b_new] -= (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
1949 : }
1950 : }
1951 : }
1952 :
1953 : /* Surround coherence */
1954 893328 : if ( hQMetaData->surcoh_band_data != NULL )
1955 : {
1956 8836236 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1957 : {
1958 23185508 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1959 : {
1960 14981776 : extOutMeta->surroundCoherence[sf][b_new] = hQMetaData->surcoh_band_data[b_old].surround_coherence[sf];
1961 : }
1962 : }
1963 : }
1964 : else
1965 : {
1966 6520600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1967 : {
1968 6259776 : extOutMeta->surroundCoherence[sf][i] = 0;
1969 : }
1970 : }
1971 : }
1972 :
1973 223332 : return;
1974 : }
1975 :
1976 259601 : static void decode_index_slice(
1977 : int16_t index, /* i : index to decode */
1978 : int16_t *ratio_idx_ism, /* o : decodec array of integers */
1979 : const int16_t nchan_ism, /* i : number of elements in array (objects) */
1980 : const int16_t K /* i : sum of array elements */
1981 : )
1982 : {
1983 : int16_t i, j, sum, elem;
1984 : int16_t base[MAX_NUM_OBJECTS];
1985 :
1986 259601 : switch ( nchan_ism )
1987 : {
1988 13945 : case 2:
1989 13945 : ratio_idx_ism[0] = index;
1990 13945 : ratio_idx_ism[1] = K - ratio_idx_ism[0];
1991 13945 : break;
1992 245656 : case 3:
1993 : case 4:
1994 : {
1995 245656 : j = 0;
1996 12932089 : while ( index >= 0 )
1997 : {
1998 12686433 : if ( valid_ratio_index( j, K, nchan_ism - 1 ) )
1999 : {
2000 5349460 : index--;
2001 : }
2002 12686433 : j++;
2003 : }
2004 245656 : j--;
2005 245656 : base[0] = 1;
2006 659586 : for ( i = 1; i < nchan_ism - 1; i++ )
2007 : {
2008 413930 : base[i] = base[i - 1] * 10;
2009 : }
2010 245656 : sum = 0;
2011 905242 : for ( i = nchan_ism - 2; i >= 0; i-- )
2012 : {
2013 659586 : elem = j / base[i];
2014 659586 : ratio_idx_ism[nchan_ism - i - 2] = elem;
2015 659586 : sum += elem;
2016 659586 : j -= elem * base[i];
2017 : }
2018 245656 : ratio_idx_ism[nchan_ism - 1] = K - sum;
2019 : }
2020 :
2021 245656 : default:
2022 245656 : break;
2023 : }
2024 :
2025 259601 : return;
2026 : }
2027 :
2028 :
2029 338285 : static void read_ism_ratio_index(
2030 : int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o : ISM read ratio indexes */
2031 : const int16_t nchan_ism, /* i : number of objects */
2032 : const int16_t numCodingBands, /* i : number of subbands */
2033 : const int16_t sf, /* i : index of subframe */
2034 : int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* i : previous subframe ISM ratio indexes */
2035 : uint16_t *bit_stream, /* i : bitstream */
2036 : int16_t *next_bit_pos, /* i/o: position in bitstream */
2037 : float *masa_to_total_energy_ratio, /* i : masa to total ratios */
2038 : const int16_t idx_sep_obj, /* i : index of separated index, -1 if none */
2039 : int16_t *num_zeros /* i/o: number of zero values in first subframe for separated object */
2040 : )
2041 : {
2042 : int16_t b, i, b_signif;
2043 : int16_t index;
2044 : int16_t GR_order, differential_subframe;
2045 : int16_t buf;
2046 : int16_t no_levels_ratio_ism;
2047 : int16_t bits_index;
2048 : int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS];
2049 : int16_t idx_sep_obj_local, shift_one;
2050 :
2051 338285 : idx_sep_obj_local = idx_sep_obj;
2052 338285 : if ( idx_sep_obj > -1 )
2053 : {
2054 338285 : if ( idx_sep_obj == nchan_ism - 1 && nchan_ism > 2 )
2055 : {
2056 61759 : idx_sep_obj_local = 0;
2057 : }
2058 : }
2059 :
2060 338285 : b_signif = 0;
2061 338285 : no_levels_ratio_ism = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 );
2062 697106 : while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) )
2063 : {
2064 : /* distribute evenly the objects */
2065 358821 : distribute_evenly_ism( ratio_ism_idx[b_signif], no_levels_ratio_ism, nchan_ism );
2066 358821 : b_signif++;
2067 : }
2068 :
2069 338285 : if ( b_signif == numCodingBands )
2070 : {
2071 57860 : return;
2072 : }
2073 : else
2074 : {
2075 :
2076 280425 : if ( sf == 0 )
2077 : {
2078 89834 : bits_index = bits_index_ism_ratio( nchan_ism );
2079 :
2080 : /* read coding type */
2081 89834 : if ( bit_stream[( *next_bit_pos )--] == 1 )
2082 : {
2083 : /* independent coding*/
2084 267559 : for ( b = 0; b < numCodingBands; b++ )
2085 : {
2086 224192 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2087 : {
2088 213134 : index = 0;
2089 1635076 : for ( i = 0; i < bits_index; i++ )
2090 : {
2091 1421942 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2092 : }
2093 213134 : decode_index_slice( index, ratio_ism_idx[b], nchan_ism, no_levels_ratio_ism );
2094 213134 : if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
2095 : {
2096 200720 : ( *num_zeros )++;
2097 : }
2098 : }
2099 : else
2100 : {
2101 : /* distribute evenly the objects */
2102 11058 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2103 : }
2104 : }
2105 : }
2106 : else
2107 : {
2108 : /* differential coding */
2109 46467 : index = 0;
2110 308570 : for ( i = 0; i < bits_index; i++ )
2111 : {
2112 262103 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2113 : }
2114 46467 : decode_index_slice( index, ratio_ism_idx[b_signif], nchan_ism, no_levels_ratio_ism );
2115 46467 : if ( idx_sep_obj > -1 && ratio_ism_idx[b_signif][idx_sep_obj_local] == 0 )
2116 : {
2117 42152 : ( *num_zeros )++;
2118 : }
2119 46467 : mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
2120 316419 : for ( b = b_signif + 1; b < numCodingBands; b++ )
2121 : {
2122 269952 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2123 : {
2124 237783 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2125 777251 : for ( i = 0; i < nchan_ism - 1; i++ )
2126 : {
2127 539468 : buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, 0 );
2128 539468 : if ( ( buf % 2 ) == 0 )
2129 : {
2130 510822 : ratio_ism_idx[b][i] = -( buf >> 1 );
2131 : }
2132 : else
2133 : {
2134 28646 : ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
2135 : }
2136 539468 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
2137 539468 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2138 : }
2139 237783 : mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
2140 237783 : if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
2141 : {
2142 212976 : ( *num_zeros )++;
2143 : }
2144 : }
2145 : else
2146 : {
2147 : /* distribute evenly the objects */
2148 32169 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2149 : }
2150 : }
2151 : }
2152 : }
2153 : else
2154 : {
2155 190591 : if ( numCodingBands > 1 )
2156 : {
2157 : /* read prediction type */
2158 187680 : differential_subframe = bit_stream[( *next_bit_pos )--];
2159 : }
2160 : else
2161 : {
2162 2911 : differential_subframe = 1;
2163 : }
2164 :
2165 190591 : if ( *num_zeros == numCodingBands )
2166 : {
2167 148882 : shift_one = 1;
2168 : }
2169 : else
2170 : {
2171 41709 : shift_one = 0;
2172 : }
2173 :
2174 190591 : if ( shift_one == 1 && nchan_ism == 2 )
2175 : {
2176 : /* nothing has been sent ; values can be inferred */
2177 5676 : for ( b = b_signif; b < numCodingBands; b++ )
2178 : {
2179 2838 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2180 : {
2181 2838 : if ( idx_sep_obj_local == 0 )
2182 : {
2183 2737 : ratio_ism_idx[b][0] = 0;
2184 2737 : ratio_ism_idx[b][1] = 7;
2185 : }
2186 : else
2187 : {
2188 101 : ratio_ism_idx[b][0] = 7;
2189 101 : ratio_ism_idx[b][1] = 0;
2190 : }
2191 : }
2192 : }
2193 : }
2194 : else
2195 : {
2196 : /* read GR order */
2197 187753 : GR_order = bit_stream[( *next_bit_pos )--];
2198 1114975 : for ( b = b_signif; b < numCodingBands; b++ )
2199 : {
2200 927222 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2201 : {
2202 2473323 : for ( i = 0; i < nchan_ism - 1 - shift_one; i++ )
2203 : {
2204 1589580 : buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, GR_order );
2205 1589580 : if ( ( buf % 2 ) == 0 )
2206 : {
2207 1287332 : ratio_ism_idx[b][i] = -( buf >> 1 );
2208 : }
2209 : else
2210 : {
2211 302248 : ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
2212 : }
2213 : }
2214 :
2215 : /* insert separated obj */
2216 883743 : if ( shift_one )
2217 : {
2218 2508883 : for ( i = nchan_ism - 1; i > idx_sep_obj_local; i-- )
2219 : {
2220 1793147 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i - 1];
2221 : }
2222 715736 : ratio_ism_idx[b][idx_sep_obj_local] = 0; /* this is only difference; need to pdate later as well */
2223 : }
2224 : }
2225 : }
2226 187753 : if ( differential_subframe )
2227 : {
2228 : /* differential to previous subframe */
2229 1032211 : for ( b = b_signif; b < numCodingBands; b++ )
2230 : {
2231 858386 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2232 : {
2233 822546 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2234 2972166 : for ( i = 0; i < nchan_ism - 1; i++ )
2235 : {
2236 2149620 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_prev_sf[b][i];
2237 2149620 : if ( shift_one && i == idx_sep_obj_local )
2238 : {
2239 688846 : ratio_ism_idx[b][i] = 0;
2240 : }
2241 2149620 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2242 : }
2243 : }
2244 : else
2245 : {
2246 : /* distribute evenly the objects */
2247 35840 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2248 : }
2249 : }
2250 : }
2251 : else
2252 : {
2253 : /* difference to previous subband */
2254 13928 : ratio_ism_idx[b_signif][nchan_ism - 1] = no_levels_ratio_ism;
2255 :
2256 : /* first significant subband - differential to previous subframe */
2257 49433 : for ( i = 0; i < nchan_ism - 1; i++ )
2258 : {
2259 35505 : ratio_ism_idx[b_signif][i] = ratio_ism_idx[b_signif][i] + ratio_ism_idx_prev_sf[b_signif][i];
2260 35505 : if ( shift_one && i == idx_sep_obj_local )
2261 : {
2262 5617 : ratio_ism_idx[b_signif][i] = 0;
2263 : }
2264 35505 : ratio_ism_idx[b_signif][nchan_ism - 1] -= ratio_ism_idx[b_signif][i];
2265 : }
2266 :
2267 : /* rest of subbands differential to previous subband */
2268 13928 : mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
2269 68836 : for ( b = b_signif + 1; b < numCodingBands; b++ )
2270 : {
2271 54908 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2272 : {
2273 47269 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2274 167460 : for ( i = 0; i < nchan_ism - 1; i++ )
2275 : {
2276 120191 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
2277 120191 : if ( shift_one && i == idx_sep_obj_local )
2278 : {
2279 21273 : ratio_ism_idx[b][i] = 0;
2280 : }
2281 120191 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2282 : }
2283 47269 : mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
2284 : }
2285 : else
2286 : {
2287 : /* distribute evenly the objects */
2288 7639 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2289 : }
2290 : }
2291 : }
2292 : }
2293 : }
2294 :
2295 280425 : return;
2296 : }
2297 : }
2298 :
2299 :
2300 114482 : static void decode_ism_ratios(
2301 : uint16_t *bit_stream, /* i : bitstream */
2302 : int16_t *next_bit_pos, /* i/o: position in bitstream */
2303 : float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : masa_to_total energy ratios */
2304 : float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o : ISM ratios */
2305 : const int16_t n_ism, /* i : number of objects */
2306 : const int16_t nbands, /* i : number of subbands */
2307 : const int16_t numSf, /* i : number of subframes */
2308 : const int16_t idx_separated_object /* i : index of separated object */
2309 : )
2310 : {
2311 : int16_t sf, band;
2312 : int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
2313 : int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
2314 : float tmp;
2315 : int16_t num_zeros;
2316 114482 : num_zeros = 0;
2317 :
2318 : /* hQMetaData->q_direction->cfg.nblocks; */
2319 452767 : for ( sf = 0; sf < numSf; sf++ )
2320 : {
2321 : /* read ism ratio indexes */
2322 338285 : read_ism_ratio_index( ratio_ism_idx, n_ism, nbands, sf, ratio_ism_idx_prev_sf, bit_stream, next_bit_pos, masa_to_total_energy_ratio[sf], idx_separated_object, &num_zeros );
2323 : /* save previous subframe index values */
2324 338285 : if ( sf < numSf - 1 )
2325 : {
2326 1328178 : for ( band = 0; band < nbands; band++ )
2327 : {
2328 1104375 : mvs2s( ratio_ism_idx[band], ratio_ism_idx_prev_sf[band], n_ism );
2329 : }
2330 : }
2331 :
2332 : /* reconstructed values */
2333 2165660 : for ( band = 0; band < nbands; band++ )
2334 : {
2335 1827375 : reconstruct_ism_ratios( ratio_ism_idx[band], n_ism, 1.0f / (float) ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ), ratio_ism[sf][band] );
2336 : }
2337 :
2338 338285 : if ( ( n_ism > 2 ) && ( idx_separated_object == n_ism - 1 ) )
2339 : {
2340 : /* rotate */
2341 432203 : for ( band = 0; band < nbands; band++ )
2342 : {
2343 370444 : if ( masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR )
2344 : {
2345 193848 : tmp = ratio_ism[sf][band][n_ism - 1];
2346 193848 : ratio_ism[sf][band][n_ism - 1] = ratio_ism[sf][band][0];
2347 193848 : ratio_ism[sf][band][0] = tmp;
2348 : }
2349 : }
2350 : }
2351 :
2352 338285 : if ( nbands == 1 )
2353 : {
2354 24400 : for ( band = 1; band < 5; band++ )
2355 : {
2356 19520 : mvr2r( ratio_ism[sf][0], ratio_ism[sf][band], n_ism );
2357 : }
2358 : }
2359 : }
2360 :
2361 114482 : if ( numSf == 1 )
2362 : {
2363 159524 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2364 : {
2365 1184268 : for ( band = 0; band < nbands; band++ )
2366 : {
2367 1064625 : mvr2r( ratio_ism[0][band], ratio_ism[sf][band], n_ism );
2368 : }
2369 : }
2370 : }
2371 :
2372 114482 : return;
2373 : }
2374 :
2375 :
2376 114482 : static int16_t ivas_decode_masaism_metadata(
2377 : IVAS_QMETADATA_HANDLE hQMetaData,
2378 : MASA_DECODER_HANDLE hMasa,
2379 : MASA_ISM_DATA_HANDLE hMasaIsmData,
2380 : const int16_t nchan_ism,
2381 : uint16_t *bit_stream,
2382 : int16_t *next_bit_pos,
2383 : const int16_t idx_separated_object,
2384 : const int16_t ism_imp,
2385 : const int16_t dirac_bs_md_write_idx,
2386 : const int16_t dirac_md_buffer_length )
2387 : {
2388 : int16_t sf, band, dir, nbands, nblocks, obj, i;
2389 : float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
2390 : int16_t *band_mapping;
2391 : int16_t b;
2392 : int16_t bits_ism[MAX_NUM_OBJECTS], index;
2393 : uint16_t idx_el, idx_az;
2394 : float azimuth, elevation;
2395 : int16_t nb_bits_read;
2396 : float delta_phi;
2397 : int16_t meta_write_index;
2398 :
2399 114482 : nb_bits_read = *next_bit_pos;
2400 114482 : nbands = hQMetaData->q_direction->cfg.nbands;
2401 114482 : nblocks = hQMetaData->q_direction->cfg.nblocks;
2402 :
2403 : /* Read MASA-to-total energy ratios */
2404 114482 : ivas_omasa_decode_masa_to_total( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, nbands, nblocks );
2405 114482 : if ( nchan_ism > 1 )
2406 : {
2407 : /* read ISM ratios */
2408 114482 : decode_ism_ratios( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, energy_ratio_ism, nchan_ism, nbands, nblocks, idx_separated_object );
2409 : }
2410 : else
2411 : {
2412 0 : for ( sf = 0; sf < nblocks; sf++ )
2413 : {
2414 0 : for ( band = 0; band < nbands; band++ )
2415 : {
2416 0 : energy_ratio_ism[sf][band][0] = 1.0f;
2417 : }
2418 : }
2419 : }
2420 :
2421 : /* read ISM metadata */
2422 114482 : calculate_nbits_meta( nchan_ism, energy_ratio_ism, hMasaIsmData->masa_to_total_energy_ratio, nblocks, nbands, bits_ism, idx_separated_object, ism_imp );
2423 :
2424 495274 : for ( obj = 0; obj < nchan_ism; obj++ )
2425 : {
2426 380792 : hMasaIsmData->bits_ism[obj] = bits_ism[obj];
2427 380792 : index = 0;
2428 380792 : if ( bits_ism[obj] < 8 ) /* if low resolution, can look to the past */
2429 : {
2430 : /* read if same as previous */
2431 135281 : if ( bit_stream[( *next_bit_pos )--] )
2432 : {
2433 11951 : azimuth = hMasaIsmData->q_azimuth_old[obj];
2434 11951 : elevation = hMasaIsmData->q_elevation_old[obj];
2435 : }
2436 : else
2437 : {
2438 816503 : for ( i = 0; i < bits_ism[obj]; i++ )
2439 : {
2440 693173 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2441 : }
2442 123330 : deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
2443 :
2444 123330 : if ( azimuth * hMasaIsmData->q_azimuth_old[obj] > 0 )
2445 : {
2446 100331 : delta_phi = 180.0f / (float) ( no_phi_masa[bits_ism[obj] - 1][idx_el] ); /* 360/2*/
2447 : /* this is equivalent to testing if 'azimuth - hMasaIsmData->q_azimuth_old[obj] > delta_phi' with limited precision */
2448 100331 : if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( azimuth - hMasaIsmData->q_azimuth_old[obj] ) ) / 100.0f > 180.0f )
2449 : {
2450 6594 : azimuth -= delta_phi;
2451 : }
2452 : else
2453 : {
2454 : /* this is equivalent to testing if 'hMasaIsmData->q_azimuth_old[obj] - azimuth > delta_phi' with limited precision */
2455 93737 : if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( hMasaIsmData->q_azimuth_old[obj] - azimuth ) ) / 100.0f > 180.0f )
2456 : {
2457 6567 : azimuth += delta_phi;
2458 : }
2459 : }
2460 : }
2461 :
2462 123330 : hMasaIsmData->q_azimuth_old[obj] = azimuth;
2463 123330 : hMasaIsmData->q_elevation_old[obj] = elevation;
2464 : }
2465 : }
2466 : else
2467 : {
2468 2755333 : for ( i = 0; i < bits_ism[obj]; i++ )
2469 : {
2470 2509822 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2471 : }
2472 245511 : deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
2473 245511 : hMasaIsmData->q_azimuth_old[obj] = azimuth;
2474 245511 : hMasaIsmData->q_elevation_old[obj] = elevation;
2475 : }
2476 :
2477 1903960 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2478 : {
2479 1523168 : meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
2480 1523168 : hMasaIsmData->azimuth_ism[obj][meta_write_index] = (int16_t) rint( azimuth );
2481 1523168 : hMasaIsmData->elevation_ism[obj][meta_write_index] = (int16_t) rint( elevation );
2482 : }
2483 : }
2484 :
2485 : /* Modify ISM metadata based on the MASA-to-total energy ratios */
2486 452767 : for ( sf = 0; sf < nblocks; sf++ )
2487 : {
2488 2165660 : for ( band = 0; band < nbands; band++ )
2489 : {
2490 8238325 : for ( dir = 0; dir < nchan_ism; dir++ )
2491 : {
2492 6410950 : energy_ratio_ism[sf][band][dir] *= ( 1.0f - hMasaIsmData->masa_to_total_energy_ratio[sf][band] );
2493 : }
2494 : }
2495 : }
2496 :
2497 : /* Set data to struct in bins */
2498 114482 : band_mapping = hMasa->data.band_mapping;
2499 836058 : for ( band = 0; band < hMasa->config.numCodingBands; ++band )
2500 : {
2501 6081696 : for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b )
2502 : {
2503 26800600 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; ++sf )
2504 : {
2505 21440480 : if ( nblocks == 1 )
2506 : {
2507 8121840 : i = 0;
2508 : }
2509 : else
2510 : {
2511 13318640 : i = sf;
2512 : }
2513 :
2514 21440480 : meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
2515 :
2516 93140960 : for ( dir = 0; dir < nchan_ism; dir++ )
2517 : {
2518 71700480 : hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir];
2519 : }
2520 :
2521 21440480 : if ( hMasaIsmData->hExtData != NULL )
2522 : {
2523 967680 : hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = hMasaIsmData->masa_to_total_energy_ratio[i][band];
2524 : }
2525 : }
2526 : }
2527 : }
2528 :
2529 114482 : return ( nb_bits_read - *next_bit_pos );
2530 : }
|