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 154035 : 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 154035 : dirac_bs_md_write_idx = 0;
111 154035 : ism_imp = 0;
112 :
113 154035 : error = IVAS_ERR_OK;
114 154035 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
115 :
116 154035 : low_bitrate_mode = -1; /* This means that LBR mode is not used. */
117 :
118 154035 : 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 23121 : masa_brate = st_ivas->hCPE[0]->element_brate;
121 : }
122 : else
123 : {
124 130914 : masa_brate = ivas_total_brate;
125 : }
126 :
127 154035 : hMasa = st_ivas->hMasa;
128 154035 : hQMetaData = st_ivas->hQMetaData;
129 154035 : ivas_format = st_ivas->ivas_format;
130 :
131 154035 : hMasa->data.dir_decode_quality = 1.0f; /* Set to default of max quality */
132 154035 : hQMetaData->is_masa_ivas_format = 1;
133 :
134 154035 : *nb_bits_read = 0;
135 154035 : next_bit_pos_orig = st->next_bit_pos;
136 154035 : if ( masa_brate == IVAS_SID_5k2 )
137 : {
138 615 : st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
139 : }
140 : else
141 : {
142 153420 : st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 );
143 : }
144 :
145 154035 : if ( ivas_format == MASA_FORMAT && ( masa_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
146 : {
147 4353 : hMasa->config.numberOfDirections = 1;
148 : }
149 :
150 154035 : if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 )
151 : {
152 147468 : if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
153 : {
154 112725 : if ( ivas_format == MASA_FORMAT )
155 : {
156 : /* re-read the number of objects, needed in case of bad frame */
157 91893 : 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 91893 : if ( ch == 5 )
160 : {
161 86229 : ch = 0;
162 : }
163 91893 : st_ivas->nchan_ism = ch;
164 : }
165 :
166 112725 : if ( ivas_format == MASA_FORMAT && st_ivas->nchan_ism > 0 )
167 : {
168 : /* there was OMASA in the input */
169 5664 : hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
170 5664 : if ( st_ivas->nchan_ism < 3 )
171 : {
172 : /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */
173 1404 : if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] == 0 )
174 : {
175 663 : st_ivas->nchan_ism = 1;
176 : }
177 1404 : st->next_bit_pos -= MASA_TRANSP_BITS;
178 1404 : *nb_bits_read += MASA_TRANSP_BITS;
179 :
180 : /* the two reserved bits were already read in ivas_init_dec()*/
181 1404 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
182 1404 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
183 1404 : *nb_bits_read += MASA_HEADER_BITS;
184 : /* read number of directions */
185 1404 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
186 1404 : ( *nb_bits_read )++;
187 1404 : 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 4260 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
194 4260 : ( *nb_bits_read )++;
195 4260 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
196 :
197 : /* the two reserved bits were already read in ivas_init_dec()*/
198 4260 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
199 4260 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
200 4260 : *nb_bits_read += MASA_HEADER_BITS;
201 : }
202 : }
203 : else
204 : {
205 107061 : 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 86229 : st->next_bit_pos -= MASA_TRANSP_BITS;
210 86229 : *nb_bits_read += MASA_TRANSP_BITS;
211 : }
212 :
213 107061 : if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE )
214 : {
215 : /* the number of objects was read */
216 20832 : st->next_bit_pos -= NO_BITS_MASA_ISM_NO_OBJ;
217 20832 : *nb_bits_read += NO_BITS_MASA_ISM_NO_OBJ;
218 :
219 20832 : 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 5502 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
224 5502 : ( *nb_bits_read )++;
225 5502 : st_ivas->hMasaIsmData->idx_separated_ism = 2 * byteBuffer + st->bit_stream[( st->next_bit_pos )--];
226 5502 : ( *nb_bits_read )++;
227 : }
228 : else
229 : {
230 15330 : st_ivas->hMasaIsmData->idx_separated_ism = -1;
231 : }
232 :
233 : /* read ISM importance flag (one per object) */
234 20832 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
235 : {
236 5502 : ism_imp = 0;
237 16506 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
238 : {
239 11004 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
240 11004 : ( *nb_bits_read )++;
241 11004 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
242 : }
243 5502 : st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
244 : }
245 :
246 20832 : if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
247 : {
248 6051 : ism_imp = 0;
249 18153 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
250 : {
251 12102 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
252 12102 : ( *nb_bits_read )++;
253 12102 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
254 : }
255 6051 : st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
256 :
257 : /* reset */
258 6051 : st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0;
259 6051 : st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0;
260 6051 : if ( st_ivas->hIsmMetaData[0]->ism_imp == ISM_NO_META )
261 : {
262 : /* read flags */
263 0 : st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
264 0 : ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
265 0 : st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
266 0 : ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
267 : }
268 : }
269 14781 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
270 : {
271 34278 : for ( ch = 0; ch < st_ivas->nchan_ism; ch++ )
272 : {
273 24999 : ism_imp = 0;
274 74997 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
275 : {
276 49998 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
277 49998 : ( *nb_bits_read )++;
278 49998 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
279 : }
280 24999 : st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp;
281 :
282 : /* reset */
283 24999 : st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0;
284 24999 : st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0;
285 24999 : if ( st_ivas->hIsmMetaData[ch]->ism_imp == ISM_NO_META )
286 : {
287 : /* read flags */
288 0 : st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
289 0 : ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
290 0 : st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
291 0 : ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
292 : }
293 : }
294 9279 : st_ivas->flag_omasa_brate = 0;
295 9279 : if ( st_ivas->nchan_ism >= 3 && ivas_total_brate == IVAS_128k )
296 : {
297 366 : st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--];
298 366 : ( *nb_bits_read ) += 1;
299 : }
300 : }
301 : }
302 :
303 107061 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
304 107061 : byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--];
305 :
306 107061 : if ( byteBuffer == 0 && ivas_format == MASA_FORMAT )
307 : {
308 86229 : hMasa->config.input_ivas_format = MASA_FORMAT;
309 : }
310 : else
311 : {
312 20832 : hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
313 : }
314 107061 : *nb_bits_read += MASA_HEADER_BITS;
315 :
316 : /* read number of directions */
317 107061 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
318 107061 : ( *nb_bits_read )++;
319 107061 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
320 : }
321 : }
322 : else
323 : {
324 34743 : hMasa->config.numberOfDirections = 1;
325 : }
326 :
327 147468 : if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
328 : {
329 : /* read subframe mode */
330 112725 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
331 112725 : ( *nb_bits_read )++;
332 112725 : hMasa->config.joinedSubframes = (uint8_t) byteBuffer;
333 : }
334 : else
335 : {
336 34743 : hMasa->config.joinedSubframes = FALSE;
337 : }
338 :
339 147468 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
340 : {
341 34743 : *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 147468 : 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 147468 : if ( hMasa->config.max_metadata_bits < MINIMUM_BIT_BUDGET_NORMAL_META && hMasa->config.joinedSubframes == FALSE )
352 : {
353 : /* read low bitrate mode */
354 69870 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
355 69870 : ( *nb_bits_read )++;
356 69870 : low_bitrate_mode = byteBuffer;
357 :
358 69870 : if ( low_bitrate_mode == 1 )
359 : {
360 58137 : hQMetaData->q_direction[0].cfg.nblocks = 1;
361 : }
362 : else
363 : {
364 11733 : hQMetaData->q_direction[0].cfg.nbands = 1;
365 : }
366 : }
367 :
368 : /* Remove already read bits from the bit budget */
369 147468 : hQMetaData->metadata_max_bits -= *nb_bits_read;
370 :
371 147468 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
372 : {
373 20832 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
374 : {
375 5502 : if ( st_ivas->hDirAC != NULL )
376 : {
377 8532 : *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 4266 : 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 22398 : for ( obj = 0; obj <= st_ivas->nchan_ism; obj++ )
381 : {
382 18132 : if ( st_ivas->hMasaIsmData->idx_separated_ism == obj )
383 : {
384 : int16_t sf;
385 : int16_t meta_write_index;
386 :
387 21330 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
388 : {
389 17064 : meta_write_index = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + sf ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
390 17064 : st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism[obj][meta_write_index];
391 17064 : st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism[obj][meta_write_index];
392 : }
393 : }
394 : }
395 : }
396 1236 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
397 : {
398 120 : *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 120 : 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 1116 : *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 1116 : st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
405 : }
406 : }
407 : }
408 :
409 147468 : masa_total_brate = ivas_total_brate;
410 147468 : if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
411 : {
412 9279 : masa_total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
413 : }
414 :
415 147468 : if ( masa_total_brate >= IVAS_384k )
416 : {
417 6717 : if ( masa_total_brate >= IVAS_512k )
418 : {
419 2370 : *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 4347 : *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 140751 : *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, 0 );
429 : }
430 :
431 147468 : 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 5502 : 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 147468 : if ( hQMetaData->ec_flag == 2 )
439 : {
440 14208 : hMasa->data.dir_decode_quality = hQMetaData->dir_comp_ratio;
441 : }
442 :
443 147468 : hMasa->config.coherencePresent = !hQMetaData->all_coherence_zero;
444 :
445 147468 : 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 15861 : 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 147468 : if ( low_bitrate_mode != -1 )
452 : {
453 69870 : restore_lowbitrate_masa( hQMetaData, low_bitrate_mode, hMasa->config.numCodingBands );
454 : }
455 77598 : else if ( hMasa->config.joinedSubframes == TRUE )
456 : {
457 16290 : replicate_subframes( hQMetaData );
458 : }
459 : }
460 6567 : else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 )
461 : {
462 615 : 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 615 : tmp_elem_mode = -1;
496 615 : *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 615 : if ( st_ivas->nchan_transport == 2 )
498 : {
499 222 : assert( st_ivas->nCPE > 0 );
500 222 : st_ivas->hCPE[0]->element_mode = tmp_elem_mode;
501 : }
502 615 : *nb_bits_read += SID_FORMAT_NBITS;
503 : }
504 5952 : else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == FRAME_NO_DATA )
505 : {
506 3738 : 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 154035 : if ( st_ivas->hDirAC != NULL )
516 : {
517 123759 : dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */
518 123759 : ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 );
519 : }
520 30276 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
521 : {
522 120 : 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 154035 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
526 : {
527 21252 : 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 21252 : if ( st_ivas->hDirAC != NULL )
536 : {
537 : int16_t b;
538 : int16_t block;
539 : int16_t meta_write_index;
540 :
541 30303 : for ( i = 0; i < st_ivas->hSpatParamRendCom->numIsmDirections; i++ )
542 : {
543 70605 : for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
544 : {
545 56484 : meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
546 :
547 2945124 : for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
548 : {
549 2888640 : 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 80910 : for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
555 : {
556 64728 : meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
557 :
558 3390168 : for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
559 : {
560 3325440 : 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 154035 : st->next_bit_pos = next_bit_pos_orig;
567 :
568 154035 : if ( ivas_format == MASA_ISM_FORMAT )
569 : {
570 : int32_t cpe_brate;
571 21252 : cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
572 :
573 21252 : if ( st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
574 : {
575 9192 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = cpe_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
576 :
577 9192 : 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 132783 : if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
586 : {
587 26703 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ivas_total_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
588 :
589 26703 : if ( ivas_total_brate <= IVAS_SID_5k2 )
590 : {
591 1590 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0;
592 : }
593 : }
594 : }
595 :
596 154035 : if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 )
597 : {
598 55464 : st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 0;
599 :
600 55464 : if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 )
601 : {
602 1590 : st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 1;
603 :
604 1590 : if ( ivas_total_brate >= IVAS_SID_5k2 )
605 : {
606 222 : st_ivas->hCPE[0]->element_brate = ivas_total_brate;
607 : }
608 : }
609 : }
610 :
611 154035 : 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 16839 : create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport );
614 : }
615 :
616 154035 : return error /* *nb_bits_read*/;
617 : }
618 :
619 :
620 : /*-------------------------------------------------------------------*
621 : * ivas_masa_dec_open()
622 : *
623 : *
624 : *-------------------------------------------------------------------*/
625 :
626 1248 : 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 1248 : error = IVAS_ERR_OK;
636 :
637 1248 : 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 1248 : ism_total_brate = 0;
643 : /* ISM metadata */
644 1248 : 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 1248 : 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 312 : for ( i = 0; i < st_ivas->nSCE; i++ )
652 : {
653 201 : ism_total_brate += st_ivas->hSCE[i]->element_brate;
654 : }
655 : }
656 :
657 1248 : 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 1248 : mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
660 1248 : mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 );
661 1248 : hMasa->config.numberOfDirections = 1;
662 1248 : hMasa->config.joinedSubframes = FALSE;
663 :
664 : /* Create spherical grid only for external output */
665 1248 : 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 63 : 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 63 : generate_gridEq( hMasa->data.sph_grid16 );
673 63 : 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 1185 : hMasa->data.sph_grid16 = NULL;
681 1185 : hMasa->data.extOutMeta = NULL;
682 : }
683 :
684 1248 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
685 : {
686 891 : error = init_lfe_synth_data( st_ivas, hMasa );
687 : }
688 : else
689 : {
690 357 : hMasa->hMasaLfeSynth = NULL;
691 : }
692 :
693 1248 : st_ivas->hMasa = hMasa;
694 :
695 : /* allocate transport channels*/
696 1248 : 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 159 : buffer_mode = TC_BUFFER_MODE_RENDERER;
703 159 : 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 9 : buffer_mode = TC_BUFFER_MODE_BUFFER;
706 : }
707 150 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
708 : {
709 15 : buffer_mode = TC_BUFFER_MODE_BUFFER;
710 : }
711 :
712 159 : nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
713 159 : nchan_to_allocate = nchan_transport;
714 :
715 159 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
716 : {
717 15 : nchan_transport = 1;
718 15 : nchan_to_allocate = 1;
719 : }
720 144 : 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 3 : nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
723 3 : nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
724 : }
725 141 : else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) )
726 : {
727 : /* addtl channel for CNG */
728 39 : nchan_to_allocate++;
729 : }
730 :
731 159 : granularity = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
732 :
733 159 : 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 1248 : return error;
740 : }
741 :
742 :
743 : /*-----------------------------------------------------------------------*
744 : * ivas_masa_dec_close()
745 : *
746 : * close MASA decoder
747 : *-----------------------------------------------------------------------*/
748 :
749 4635 : 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 4635 : if ( hMasa_out == NULL || *hMasa_out == NULL )
756 : {
757 3387 : return;
758 : }
759 :
760 1248 : hMasa = *hMasa_out;
761 :
762 : /* Free spherical grid memory if in use */
763 1248 : if ( hMasa->data.sph_grid16 != NULL )
764 : {
765 141 : free( hMasa->data.sph_grid16 );
766 141 : hMasa->data.sph_grid16 = NULL;
767 : }
768 :
769 1248 : if ( hMasa->data.extOutMeta != NULL )
770 : {
771 63 : free( hMasa->data.extOutMeta );
772 63 : hMasa->data.extOutMeta = NULL;
773 : }
774 :
775 1248 : if ( hMasa->hMasaLfeSynth != NULL )
776 : {
777 891 : if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer != NULL )
778 : {
779 39 : free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer );
780 39 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
781 : }
782 891 : if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 != NULL )
783 : {
784 39 : free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 );
785 39 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
786 : }
787 891 : if ( hMasa->hMasaLfeSynth->delayBuffer_syncLp != NULL )
788 : {
789 39 : free( hMasa->hMasaLfeSynth->delayBuffer_syncLp );
790 39 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
791 : }
792 891 : if ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC != NULL )
793 : {
794 39 : free( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC );
795 39 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
796 : }
797 891 : free( hMasa->hMasaLfeSynth );
798 891 : hMasa->hMasaLfeSynth = NULL;
799 : }
800 :
801 1248 : free( *hMasa_out );
802 1248 : *hMasa_out = NULL;
803 :
804 1248 : return;
805 : }
806 :
807 :
808 : /*-------------------------------------------------------------------*
809 : * ivas_masa_dec_config()
810 : *
811 : * Frame-by-frame configuration of MASA decoder
812 : *-------------------------------------------------------------------*/
813 :
814 147468 : 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 147468 : error = IVAS_ERR_OK;
826 147468 : hMasa = st_ivas->hMasa;
827 :
828 147468 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
829 147468 : ism_total_brate = 0;
830 147468 : 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 57384 : for ( i = 0; i < st_ivas->nSCE; i++ )
833 : {
834 36552 : ism_total_brate += st_ivas->hSCE[i]->element_brate;
835 : }
836 : }
837 :
838 147468 : 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 147468 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
841 : {
842 20832 : 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 126636 : 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 147468 : if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k )
850 : {
851 3522 : hMasa->config.mergeRatiosOverSubframes = 0;
852 :
853 : /* initialize spherical grid */
854 3522 : if ( hMasa->data.sph_grid16 == NULL )
855 : {
856 78 : 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 78 : generate_gridEq( hMasa->data.sph_grid16 );
861 : }
862 : }
863 147468 : st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits;
864 147468 : st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping;
865 147468 : st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport;
866 :
867 147468 : 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 147468 : st_ivas->hQMetaData->numTwoDirBands = st_ivas->hMasa->config.numTwoDirBands;
873 147468 : st_ivas->hQMetaData->useLowerRes = 0;
874 :
875 312228 : for ( i = 0; i < st_ivas->hQMetaData->no_directions; i++ )
876 : {
877 164760 : st_ivas->hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands;
878 164760 : st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES;
879 :
880 164760 : if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
881 : {
882 34743 : 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 130017 : st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = MC_LS_SETUP_INVALID;
887 : }
888 : }
889 :
890 147468 : ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format );
891 :
892 : /* Find maximum band usable */
893 147468 : maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH );
894 147468 : maxBand = 0;
895 3790269 : while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin )
896 : {
897 3642801 : maxBand++;
898 : }
899 147468 : maxBand--;
900 :
901 147468 : 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 16581 : masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta );
905 : }
906 : else
907 : {
908 130887 : masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL );
909 : }
910 :
911 147468 : return error;
912 : }
913 :
914 :
915 : /*-------------------------------------------------------------------*
916 : * ivas_masa_prerender()
917 : *
918 : * Apply gaining and copying of transport signals when needed
919 : *-------------------------------------------------------------------*/
920 :
921 97758 : 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 97758 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && nchan_remapped == 1 )
929 : {
930 13605 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
931 : {
932 1098 : mvr2r( output[0], output[1], output_frame ); /* Copy mono signal to stereo output channels */
933 : }
934 : else
935 : {
936 12507 : if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_DISABLE )
937 : {
938 8781 : 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 97758 : return;
944 : }
945 :
946 :
947 : /*-------------------------------------------------------------------*
948 : * Local functions
949 : *-------------------------------------------------------------------*/
950 :
951 15861 : static void index_16bits(
952 : IVAS_QMETADATA_HANDLE hQMetaData,
953 : SPHERICAL_GRID_DATA *Sph_Grid16 )
954 : {
955 : int16_t d, band, block;
956 :
957 37044 : 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 216612 : for ( band = 0; band < hQMetaData->q_direction[0].cfg.nbands; band++ )
961 : {
962 836565 : for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ )
963 : {
964 641136 : hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ),
965 641136 : &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 );
966 : }
967 : }
968 : }
969 :
970 15861 : return;
971 : }
972 :
973 :
974 : /* Replicate subframe data when there is only one subframe sent */
975 16290 : static void replicate_subframes(
976 : IVAS_QMETADATA_HANDLE hQMetaData )
977 : {
978 : int16_t sf, band, dir, nbands, ndirs;
979 :
980 16290 : nbands = hQMetaData->q_direction->cfg.nbands;
981 16290 : ndirs = hQMetaData->no_directions;
982 :
983 65160 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
984 : {
985 605439 : for ( band = 0; band < nbands; band++ )
986 : {
987 1265958 : for ( dir = 0; dir < ndirs; dir++ )
988 : {
989 709389 : hQMetaData->q_direction[dir].band_data[band].azimuth[sf] = hQMetaData->q_direction[dir].band_data[band].azimuth[0];
990 709389 : hQMetaData->q_direction[dir].band_data[band].elevation[sf] = hQMetaData->q_direction[dir].band_data[band].elevation[0];
991 709389 : hQMetaData->q_direction[dir].band_data[band].spherical_index[sf] = hQMetaData->q_direction[dir].band_data[band].spherical_index[0];
992 709389 : hQMetaData->q_direction[dir].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[dir].band_data[band].energy_ratio[0];
993 :
994 709389 : if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
995 : {
996 560682 : 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 556569 : if ( hQMetaData->surcoh_band_data != NULL )
1001 : {
1002 407862 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
1003 : }
1004 : }
1005 : }
1006 :
1007 16290 : return;
1008 : }
1009 :
1010 :
1011 69870 : 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 69870 : 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 232548 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1023 : {
1024 1046466 : for ( band = 0; band < numCodingBands; band++ )
1025 : {
1026 872055 : hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[band].azimuth[0];
1027 872055 : hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[band].elevation[0];
1028 872055 : hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[band].spherical_index[0];
1029 872055 : hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[band].energy_ratio[0];
1030 872055 : if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
1031 : {
1032 242775 : hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[0];
1033 : }
1034 872055 : if ( hQMetaData->surcoh_band_data != NULL )
1035 : {
1036 242775 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
1037 : }
1038 : }
1039 : }
1040 58137 : 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 58665 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1047 : {
1048 234660 : for ( band = 1; band < numCodingBands; band++ )
1049 : {
1050 187728 : hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[0].azimuth[sf];
1051 187728 : hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[0].elevation[sf];
1052 187728 : hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[0].spherical_index[sf];
1053 187728 : hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[0].energy_ratio[sf];
1054 187728 : if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
1055 : {
1056 64176 : hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[0].spread_coherence[sf];
1057 : }
1058 187728 : if ( hQMetaData->surcoh_band_data != NULL )
1059 : {
1060 64176 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[0].surround_coherence[sf];
1061 : }
1062 : }
1063 : }
1064 11733 : hQMetaData->q_direction->cfg.nbands = numCodingBands;
1065 : }
1066 :
1067 69870 : return;
1068 : }
1069 :
1070 :
1071 891 : 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 891 : output_Fs = st_ivas->hDecoderConfig->output_Fs;
1080 891 : output_config = st_ivas->hDecoderConfig->output_config;
1081 :
1082 891 : 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 891 : hMasa->hMasaLfeSynth->transportEneSmooth = 0.0f;
1088 891 : hMasa->hMasaLfeSynth->protoLfeEneSmooth = 0.0f;
1089 891 : hMasa->hMasaLfeSynth->targetEneLfeSmooth = 0.0f;
1090 891 : hMasa->hMasaLfeSynth->targetEneTransSmooth = 0.0f;
1091 :
1092 891 : set_zero( hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES );
1093 891 : hMasa->hMasaLfeSynth->lfeGainPrevIndex = 0;
1094 :
1095 891 : if ( st_ivas->hOutSetup.separateChannelEnabled &&
1096 81 : ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
1097 81 : output_config == IVAS_AUDIO_CONFIG_5_1_2 ||
1098 81 : output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
1099 60 : output_config == IVAS_AUDIO_CONFIG_EXTERNAL ||
1100 60 : output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 ||
1101 45 : output_config == IVAS_AUDIO_CONFIG_HOA3 ||
1102 0 : ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) )
1103 39 : {
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 39 : bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES );
1111 39 : 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 39 : set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer, bufferSize );
1116 39 : hMasa->hMasaLfeSynth->ringBufferLoPointer = 0;
1117 39 : hMasa->hMasaLfeSynth->ringBufferHiPointer = bufferSize / 2;
1118 39 : hMasa->hMasaLfeSynth->lowpassSum = 0.0f;
1119 39 : 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 39 : bufferSize /= 2;
1124 39 : 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 39 : set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2, bufferSize );
1129 39 : hMasa->hMasaLfeSynth->ringBufferLoPointer2 = 0;
1130 39 : hMasa->hMasaLfeSynth->lowpassSum2 = 0.0f;
1131 39 : hMasa->hMasaLfeSynth->ringBufferSize2 = bufferSize;
1132 :
1133 : /* Delay buffer for matching the delay of the lowpass filter */
1134 39 : bufferSize /= 2; /* The delay of the moving average lowpass filter is bufferSize / 2 */
1135 39 : 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 39 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncLp, bufferSize );
1140 39 : hMasa->hMasaLfeSynth->delayBuffer_syncLp_size = bufferSize;
1141 :
1142 : /* Delay buffer for syncing with DirAC rendering */
1143 39 : bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) - hMasa->hMasaLfeSynth->ringBufferSize / 2 - hMasa->hMasaLfeSynth->ringBufferSize2 / 2;
1144 39 : 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 39 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize );
1149 39 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize;
1150 :
1151 : /* Interpolation between slots */
1152 39 : hMasa->hMasaLfeSynth->lfeGainPrev = 0.0f;
1153 39 : hMasa->hMasaLfeSynth->transportGainPrev = 1.0f;
1154 39 : slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );
1155 2259 : for ( i = 0; i < slot_size; i++ )
1156 : {
1157 2220 : hMasa->hMasaLfeSynth->interpolator[i] = ( (float) ( i + 1 ) ) / ( (float) slot_size );
1158 : }
1159 : }
1160 852 : 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 852 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
1180 852 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
1181 852 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
1182 852 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
1183 : }
1184 :
1185 891 : return IVAS_ERR_OK;
1186 : }
1187 :
1188 :
1189 : /*! r: Number of bits read */
1190 34743 : 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 34743 : lfeBitsRead = 0;
1206 34743 : byteBuffer = bitstream[( *index )--];
1207 34743 : lfeBitsRead += 1;
1208 34743 : lfeToTotalEnergyRatioIndices[0] = byteBuffer; /* First LFE index */
1209 :
1210 34743 : if ( ivas_total_brate == IVAS_13k2 ) /* 1-bit adaptive LFE gain quantizer at 13.2 kbps */
1211 : {
1212 4080 : lfeToTotalEnergyRatioTemp = hMasaLfeSynth->lfeToTotalEnergyRatio[3]; /* Take memory from the last subframe */
1213 4080 : if ( lfeToTotalEnergyRatioIndices[0] == 1 )
1214 : {
1215 402 : if ( hMasaLfeSynth->lfeGainPrevIndex == 1 )
1216 : {
1217 273 : lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_THETA * MCMASA_LFE_BETA; /* larger "bump-up" energy */
1218 : }
1219 : else
1220 : {
1221 129 : lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_BETA; /* "bump-up" energy */
1222 : }
1223 : }
1224 : else
1225 : {
1226 3678 : lfeToTotalEnergyRatioTemp = MCMASA_LFE_ALPHA * lfeToTotalEnergyRatioTemp; /* exponential decay */
1227 : }
1228 4080 : if ( lfeToTotalEnergyRatioTemp > 1.0f )
1229 : {
1230 0 : lfeToTotalEnergyRatioTemp = 1.0f;
1231 : }
1232 4080 : hMasaLfeSynth->lfeGainPrevIndex = lfeToTotalEnergyRatioIndices[0];
1233 20400 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1234 : {
1235 16320 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = lfeToTotalEnergyRatioTemp;
1236 : }
1237 : }
1238 : else /* Bitrates >= 16.4 kbps */
1239 : {
1240 30663 : if ( lfeToTotalEnergyRatioIndices[0] == 0 )
1241 : {
1242 125310 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1243 : {
1244 100248 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = 0.0f;
1245 : }
1246 : }
1247 : else
1248 : {
1249 5601 : byteBuffer = bitstream[( *index )--] << 2;
1250 5601 : byteBuffer += bitstream[( *index )--] << 1;
1251 5601 : byteBuffer += bitstream[( *index )--];
1252 5601 : lfeBitsRead += 3;
1253 5601 : lfeToTotalEnergyRatioIndices[1] = byteBuffer; /* Scalar index */
1254 5601 : 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 5601 : if ( ivas_total_brate >= IVAS_24k4 )
1258 : {
1259 : /* Depending on average (scalar) gain more bits are sent for VQ LFE gain */
1260 5226 : switch ( lfeToTotalEnergyRatioIndices[1] )
1261 : {
1262 945 : case 0:
1263 : case 1:
1264 945 : VQBits = 0;
1265 945 : break;
1266 414 : case 2:
1267 414 : VQBits = 1;
1268 414 : break;
1269 291 : case 3:
1270 291 : VQBits = 2;
1271 291 : break;
1272 765 : case 4:
1273 765 : VQBits = 3;
1274 765 : break;
1275 2811 : default:
1276 2811 : VQBits = 4;
1277 : }
1278 5226 : byteBuffer = 0;
1279 19761 : for ( i = 0; i < VQBits; i++ )
1280 : {
1281 14535 : byteBuffer += bitstream[( *index )--] << ( VQBits - 1 - i );
1282 14535 : lfeBitsRead += 1;
1283 : }
1284 5226 : lfeToTotalEnergyRatioIndices[2] = byteBuffer; /* VQ index */
1285 : }
1286 :
1287 28005 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1288 : {
1289 22404 : if ( ivas_total_brate == IVAS_16k4 )
1290 : {
1291 1500 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage );
1292 : }
1293 : else
1294 : {
1295 20904 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage + McMASA_LFEGain_vectors[4 * lfeToTotalEnergyRatioIndices[2] + i] );
1296 : }
1297 22404 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = min( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 1.0f );
1298 22404 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = max( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 0.0f );
1299 : }
1300 : }
1301 : }
1302 :
1303 34743 : return lfeBitsRead;
1304 : }
1305 :
1306 :
1307 : /*-------------------------------------------------------------------*
1308 : * ivas_masa_dec_reconfigure()
1309 : *
1310 : * Reconfigure IVAS MASA decoder
1311 : *-------------------------------------------------------------------*/
1312 :
1313 8772 : 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 8772 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
1329 8772 : 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 8772 : 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 7704 : mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1335 7704 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
1336 7704 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
1337 : }
1338 :
1339 8772 : ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
1340 :
1341 : /* renderer might have changed, reselect */
1342 8772 : ivas_renderer_select( st_ivas );
1343 :
1344 8772 : if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend == NULL ) ||
1345 8610 : ( ( 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 162 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
1349 : {
1350 0 : return error;
1351 : }
1352 : }
1353 8610 : 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 768 : ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
1357 768 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
1358 768 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
1359 768 : 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 8772 : 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 8772 : num_bits = 0;
1370 :
1371 17052 : for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ )
1372 : {
1373 8280 : st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport;
1374 8280 : 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 8280 : sts = st_ivas->hSCE[sce_id]->hCoreCoder;
1376 8280 : sts[0]->bit_stream = bit_stream + num_bits;
1377 8280 : num_bits += (int16_t) ( st_ivas->hSCE[sce_id]->element_brate / FRAMES_PER_SEC );
1378 :
1379 8280 : 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 3606 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1382 : {
1383 0 : return error;
1384 : }
1385 : }
1386 : }
1387 :
1388 15453 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
1389 : {
1390 6681 : st_ivas->hCPE[cpe_id]->element_brate = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
1391 :
1392 : /* prepare bitstream buffers */
1393 20043 : for ( n = 0; n < CPE_CHANNELS; n++ )
1394 : {
1395 13362 : 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 6681 : sts = st_ivas->hCPE[cpe_id]->hCoreCoder;
1398 6681 : sts[0]->bit_stream = bit_stream + num_bits;
1399 6681 : num_bits += (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
1400 6681 : if ( ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate >= MASA_STEREO_MIN_BITRATE ) ||
1401 5355 : ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == FRAME_NO_DATA ) ||
1402 24 : ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == IVAS_SID_5k2 ) )
1403 : {
1404 1350 : st_ivas->hCPE[cpe_id]->nchan_out = 1;
1405 1350 : 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 1104 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1408 : {
1409 0 : return error;
1410 : }
1411 : }
1412 : }
1413 5331 : else if ( ivas_total_brate >= MASA_STEREO_MIN_BITRATE && last_ivas_total_brate < MASA_STEREO_MIN_BITRATE )
1414 : {
1415 1386 : st_ivas->hCPE[cpe_id]->nchan_out = CPE_CHANNELS;
1416 :
1417 1386 : 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 1257 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1420 : {
1421 0 : return error;
1422 : }
1423 : }
1424 : }
1425 : }
1426 :
1427 78948 : for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ )
1428 : {
1429 70176 : if ( st_ivas->hDiracDecBin[pos_idx] != NULL )
1430 : {
1431 : /* regularization factor is bitrate-dependent */
1432 3984 : st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
1433 : }
1434 : }
1435 :
1436 8772 : 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 3954 : if ( st_ivas->hDiracDecBin[0] != NULL )
1443 : {
1444 1794 : 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 3954 : 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 8772 : ism_total_brate = 0;
1465 8772 : 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 6081 : for ( n = 0; n < st_ivas->nSCE; n++ )
1468 : {
1469 3897 : ism_total_brate += st_ivas->hSCE[n]->element_brate;
1470 : }
1471 : }
1472 :
1473 8772 : 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 8772 : 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 8772 : buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
1487 8772 : tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
1488 :
1489 8772 : tc_nchan_to_allocate = tc_nchan_transport;
1490 8772 : 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 3984 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
1493 : {
1494 1557 : tc_nchan_to_allocate = BINAURAL_CHANNELS + st_ivas->nchan_ism;
1495 : }
1496 : else
1497 : {
1498 2427 : tc_nchan_to_allocate = BINAURAL_CHANNELS;
1499 2427 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
1500 : {
1501 1083 : tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS;
1502 : }
1503 : }
1504 : #ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING
1505 3984 : 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 234 : if ( n_samples_granularity > st_ivas->hTcBuffer->n_samples_granularity )
1508 : {
1509 234 : if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
1510 : {
1511 0 : return error;
1512 : }
1513 : }
1514 : }
1515 405 : else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode != ISM_MASA_MODE_DISC )
1516 : {
1517 405 : 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 4788 : 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 570 : tc_nchan_to_allocate++;
1528 : }
1529 4218 : 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 111 : tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
1532 111 : tc_nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
1533 : }
1534 :
1535 8772 : 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 5223 : 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 8772 : if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity )
1544 : {
1545 7713 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1546 7713 : st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1547 7713 : st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1548 : }
1549 :
1550 8772 : 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 234 : int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size;
1553 :
1554 2106 : for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ )
1555 : {
1556 1872 : 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 8772 : 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 3954 : nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
1568 3954 : 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 8772 : 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 458604 : 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 458604 : hDirAC = st_ivas->hDirAC;
1614 458604 : hSpatParamRendCom = st_ivas->hSpatParamRendCom;
1615 458604 : hSpatParamRendCom->numParametricDirections = 1;
1616 458604 : hSpatParamRendCom->numSimultaneousDirections = 1;
1617 458604 : hDiffuseDist = st_ivas->hDiracDecBin[0]->hDiffuseDist;
1618 458604 : nchan_transport = st_ivas->nchan_transport;
1619 458604 : band_grouping = hDirAC->band_grouping;
1620 458604 : hSpar = st_ivas->hSpar;
1621 458604 : dirac_write_idx = hSpatParamRendCom->render_to_md_map[subframe];
1622 :
1623 : /* Init arrays */
1624 2293020 : for ( i = 0; i < FOA_CHANNELS; i++ )
1625 : {
1626 1834416 : set_zero( inCovarianceMtx[i], FOA_CHANNELS );
1627 : }
1628 :
1629 : /* Delay the SPAR mixing matrices to have them synced with the audio */
1630 458604 : slot_idx_start = hSpar->slots_rendered;
1631 458604 : slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe];
1632 :
1633 2287713 : for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ )
1634 : {
1635 1829109 : sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME;
1636 :
1637 1829109 : if ( ( sf < SPAR_META_DELAY_SUBFRAMES ) )
1638 : {
1639 914589 : mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1;
1640 8231301 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1641 : {
1642 36583560 : for ( i = 0; i < FOA_CHANNELS; i++ )
1643 : {
1644 146334240 : for ( j = 0; j < FOA_CHANNELS; j++ )
1645 : {
1646 117067392 : 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 914520 : 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 8230680 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1655 : {
1656 36580800 : for ( i = 0; i < FOA_CHANNELS; i++ )
1657 : {
1658 146323200 : for ( j = 0; j < FOA_CHANNELS; j++ )
1659 : {
1660 117058560 : 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 458604 : bin = 0;
1669 4127436 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1670 : {
1671 3668832 : band_start = band_grouping[band];
1672 3668832 : band_end = band_grouping[band + 1];
1673 8713476 : for ( bin = band_start; bin < band_end; bin++ )
1674 : {
1675 25223220 : for ( i = 0; i < FOA_CHANNELS; i++ )
1676 : {
1677 100892880 : for ( j = 0; j < FOA_CHANNELS; j++ )
1678 : {
1679 80714304 : mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j];
1680 : }
1681 : }
1682 : }
1683 : }
1684 458604 : nBins = bin;
1685 :
1686 : /* Determine MASA metadata */
1687 : /* Determine transport signal energies and cross correlations when more than 1 TC */
1688 458604 : if ( nchan_transport == 2 )
1689 : {
1690 259806 : set_zero( transportSignalEnergies[0], nBins );
1691 259806 : set_zero( transportSignalEnergies[1], nBins );
1692 259806 : set_zero( transportSignalCrossCorrelation, nBins );
1693 :
1694 1296045 : for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ )
1695 : {
1696 12434868 : for ( bin = 0; bin < nBins; bin++ )
1697 : {
1698 34195887 : for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
1699 : {
1700 22797258 : instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] );
1701 22797258 : instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
1702 22797258 : transportSignalEnergies[ch][bin] += instEne;
1703 : }
1704 11398629 : transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin];
1705 11398629 : transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin];
1706 : }
1707 : }
1708 : }
1709 :
1710 458604 : if ( hDiffuseDist != NULL )
1711 : {
1712 458604 : set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX );
1713 458604 : set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX );
1714 458604 : set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX );
1715 : }
1716 :
1717 5503248 : for ( bin = 0; bin < nBins; bin++ )
1718 : {
1719 : /* Set the energy of the first transport signal */
1720 5044644 : if ( nchan_transport == 1 )
1721 : {
1722 2186778 : inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */
1723 : }
1724 : else
1725 : {
1726 2857866 : 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 5044644 : inCovarianceMtx[1][1] = inCovarianceMtx[0][0];
1731 5044644 : inCovarianceMtx[2][2] = inCovarianceMtx[0][0];
1732 5044644 : inCovarianceMtx[3][3] = inCovarianceMtx[0][0];
1733 :
1734 : /* In case residuals were transmitted, use their actual energies and cross correlations */
1735 5044644 : if ( nchan_transport == 2 )
1736 : {
1737 2857866 : inCovarianceMtx[1][1] = transportSignalEnergies[1][bin];
1738 2857866 : inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin];
1739 2857866 : inCovarianceMtx[1][0] = inCovarianceMtx[0][1];
1740 : }
1741 :
1742 5044644 : compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] );
1743 :
1744 : /* Estimate MASA metadata */
1745 5044644 : Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */
1746 5044644 : Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */
1747 5044644 : Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */
1748 5044644 : I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */
1749 5044644 : E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */
1750 5044644 : azi = atan2f( Iy, Ix ); /* Azimuth */
1751 5044644 : ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */
1752 5044644 : ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */
1753 5044644 : ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) );
1754 :
1755 5044644 : hSpatParamRendCom->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 );
1756 5044644 : hSpatParamRendCom->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 );
1757 5044644 : hSpatParamRendCom->energy_ratio1[dirac_write_idx][bin] = ratio;
1758 5044644 : hSpatParamRendCom->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio;
1759 :
1760 5044644 : hSpatParamRendCom->spreadCoherence[dirac_write_idx][bin] = 0.0f;
1761 5044644 : 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 5044644 : if ( hDiffuseDist != NULL )
1765 : {
1766 5044644 : if ( nchan_transport == 1 )
1767 : {
1768 2186778 : diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] );
1769 2186778 : diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] );
1770 2186778 : diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] );
1771 : }
1772 2857866 : else if ( nchan_transport == 2 )
1773 : {
1774 2857866 : diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] );
1775 2857866 : 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 2857866 : 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 5044644 : diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ;
1786 :
1787 5044644 : if ( diffuseGainSum == 0.0f )
1788 : {
1789 97665 : hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f;
1790 97665 : hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f;
1791 97665 : hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f;
1792 : }
1793 : else
1794 : {
1795 4946979 : hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
1796 4946979 : hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
1797 4946979 : hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
1798 : }
1799 : }
1800 : }
1801 :
1802 458604 : return;
1803 : }
1804 :
1805 :
1806 : /* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */
1807 5044644 : 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 25223220 : for ( i = 0; i < FOA_CHANNELS; i++ )
1818 : {
1819 100892880 : for ( j = 0; j < FOA_CHANNELS; j++ )
1820 : {
1821 80714304 : tmpMtx[i][j] = 0.0f;
1822 403571520 : for ( k = 0; k < FOA_CHANNELS; k++ )
1823 : {
1824 322857216 : tmpMtx[i][j] += mixMtx[i][k] * inCov[k][j];
1825 : }
1826 : }
1827 : }
1828 :
1829 : /* foaCov = inCov * mixMtx' */
1830 25223220 : for ( i = 0; i < FOA_CHANNELS; i++ )
1831 : {
1832 100892880 : for ( j = 0; j < FOA_CHANNELS; j++ )
1833 : {
1834 80714304 : foaCov[i][j] = 0.0f;
1835 403571520 : for ( k = 0; k < FOA_CHANNELS; k++ )
1836 : {
1837 322857216 : foaCov[i][j] += tmpMtx[i][k] * mixMtx[j][k];
1838 : }
1839 : }
1840 : }
1841 :
1842 5044644 : return;
1843 : }
1844 :
1845 16839 : 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 16839 : numDirections = hMasa->config.numberOfDirections;
1858 16839 : numCodingBands = hMasa->config.numCodingBands;
1859 16839 : bandMap = hMasa->data.band_mapping;
1860 16839 : extOutMeta = hMasa->data.extOutMeta;
1861 16839 : descMeta = &hMasa->data.extOutMeta->descriptiveMeta;
1862 :
1863 : /* Construct descriptive meta */
1864 151551 : for ( i = 0; i < 8; i++ )
1865 : {
1866 134712 : descMeta->formatDescriptor[i] = ivasmasaFormatDescriptor[i];
1867 : }
1868 16839 : descMeta->numberOfDirections = numDirections - 1;
1869 16839 : descMeta->numberOfChannels = (uint8_t) ( nchan_transport - 1 );
1870 : /* Following correspond to "unknown" values until transmission is implemented */
1871 16839 : descMeta->sourceFormat = 0x0u;
1872 16839 : descMeta->transportDefinition = 0x0u;
1873 16839 : descMeta->channelAngle = 0x0u;
1874 16839 : descMeta->channelDistance = 0x0u;
1875 16839 : descMeta->channelLayout = 0x0u;
1876 :
1877 : /* Construct spatial metadata from qmetadata */
1878 84195 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1879 : {
1880 156180 : for ( dir = 0; dir < numDirections; dir++ )
1881 : {
1882 : /* Spherical index */
1883 903816 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1884 : {
1885 2931120 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1886 : {
1887 2116128 : 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 903816 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1893 : {
1894 2931120 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1895 : {
1896 2116128 : 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 88824 : if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
1902 : {
1903 756648 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1904 : {
1905 2235456 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1906 : {
1907 1543104 : 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 613200 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1914 : {
1915 588672 : extOutMeta->spreadCoherence[dir][sf][i] = 0;
1916 : }
1917 : }
1918 : }
1919 :
1920 : /* Fill second direction with zero energy data for EXT output */
1921 67356 : if ( numDirections == 1 )
1922 : {
1923 1147200 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1924 : {
1925 1101312 : extOutMeta->directionIndex[1][sf][i] = SPH_IDX_FRONT;
1926 : }
1927 :
1928 1147200 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1929 : {
1930 1101312 : extOutMeta->directToTotalRatio[1][sf][i] = 0;
1931 : }
1932 :
1933 1147200 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1934 : {
1935 1101312 : 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 625644 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1942 : {
1943 2159184 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1944 : {
1945 1600896 : extOutMeta->diffuseToTotalRatio[sf][b_new] = UINT8_MAX;
1946 3717024 : for ( dir = 0; dir < numDirections; dir++ )
1947 : {
1948 2116128 : 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 67356 : if ( hQMetaData->surcoh_band_data != NULL )
1955 : {
1956 478476 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1957 : {
1958 1463520 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1959 : {
1960 1027872 : extOutMeta->surroundCoherence[sf][b_new] = hQMetaData->surcoh_band_data[b_old].surround_coherence[sf];
1961 : }
1962 : }
1963 : }
1964 : else
1965 : {
1966 613200 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1967 : {
1968 588672 : extOutMeta->surroundCoherence[sf][i] = 0;
1969 : }
1970 : }
1971 : }
1972 :
1973 16839 : return;
1974 : }
1975 :
1976 19809 : 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 19809 : switch ( nchan_ism )
1987 : {
1988 912 : case 2:
1989 912 : ratio_idx_ism[0] = index;
1990 912 : ratio_idx_ism[1] = K - ratio_idx_ism[0];
1991 912 : break;
1992 18897 : case 3:
1993 : case 4:
1994 : {
1995 18897 : j = 0;
1996 2753976 : while ( index >= 0 )
1997 : {
1998 2735079 : if ( valid_ratio_index( j, K, nchan_ism - 1 ) )
1999 : {
2000 750948 : index--;
2001 : }
2002 2735079 : j++;
2003 : }
2004 18897 : j--;
2005 18897 : base[0] = 1;
2006 51324 : for ( i = 1; i < nchan_ism - 1; i++ )
2007 : {
2008 32427 : base[i] = base[i - 1] * 10;
2009 : }
2010 18897 : sum = 0;
2011 70221 : for ( i = nchan_ism - 2; i >= 0; i-- )
2012 : {
2013 51324 : elem = j / base[i];
2014 51324 : ratio_idx_ism[nchan_ism - i - 2] = elem;
2015 51324 : sum += elem;
2016 51324 : j -= elem * base[i];
2017 : }
2018 18897 : ratio_idx_ism[nchan_ism - 1] = K - sum;
2019 : }
2020 :
2021 18897 : default:
2022 18897 : break;
2023 : }
2024 :
2025 19809 : return;
2026 : }
2027 :
2028 :
2029 16779 : 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 16779 : idx_sep_obj_local = idx_sep_obj;
2052 16779 : if ( idx_sep_obj > -1 )
2053 : {
2054 16779 : if ( idx_sep_obj == nchan_ism - 1 && nchan_ism > 2 )
2055 : {
2056 2286 : idx_sep_obj_local = 0;
2057 : }
2058 : }
2059 :
2060 16779 : b_signif = 0;
2061 16779 : no_levels_ratio_ism = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 );
2062 18498 : while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) )
2063 : {
2064 : /* distribute evenly the objects */
2065 1719 : distribute_evenly_ism( ratio_ism_idx[b_signif], no_levels_ratio_ism, nchan_ism );
2066 1719 : b_signif++;
2067 : }
2068 :
2069 16779 : if ( b_signif == numCodingBands )
2070 : {
2071 252 : return;
2072 : }
2073 : else
2074 : {
2075 :
2076 16527 : if ( sf == 0 )
2077 : {
2078 5340 : bits_index = bits_index_ism_ratio( nchan_ism );
2079 :
2080 : /* read coding type */
2081 5340 : if ( bit_stream[( *next_bit_pos )--] == 1 )
2082 : {
2083 : /* independent coding*/
2084 23379 : for ( b = 0; b < numCodingBands; b++ )
2085 : {
2086 19974 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2087 : {
2088 17874 : index = 0;
2089 136779 : for ( i = 0; i < bits_index; i++ )
2090 : {
2091 118905 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2092 : }
2093 17874 : decode_index_slice( index, ratio_ism_idx[b], nchan_ism, no_levels_ratio_ism );
2094 17874 : if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
2095 : {
2096 16251 : ( *num_zeros )++;
2097 : }
2098 : }
2099 : else
2100 : {
2101 : /* distribute evenly the objects */
2102 2100 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2103 : }
2104 : }
2105 : }
2106 : else
2107 : {
2108 : /* differential coding */
2109 1935 : index = 0;
2110 12678 : for ( i = 0; i < bits_index; i++ )
2111 : {
2112 10743 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2113 : }
2114 1935 : decode_index_slice( index, ratio_ism_idx[b_signif], nchan_ism, no_levels_ratio_ism );
2115 1935 : if ( idx_sep_obj > -1 && ratio_ism_idx[b_signif][idx_sep_obj_local] == 0 )
2116 : {
2117 1758 : ( *num_zeros )++;
2118 : }
2119 1935 : mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
2120 14046 : for ( b = b_signif + 1; b < numCodingBands; b++ )
2121 : {
2122 12111 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2123 : {
2124 10776 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2125 34587 : for ( i = 0; i < nchan_ism - 1; i++ )
2126 : {
2127 23811 : buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, 0 );
2128 23811 : if ( ( buf % 2 ) == 0 )
2129 : {
2130 20145 : ratio_ism_idx[b][i] = -( buf >> 1 );
2131 : }
2132 : else
2133 : {
2134 3666 : ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
2135 : }
2136 23811 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
2137 23811 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2138 : }
2139 10776 : mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
2140 10776 : if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
2141 : {
2142 9606 : ( *num_zeros )++;
2143 : }
2144 : }
2145 : else
2146 : {
2147 : /* distribute evenly the objects */
2148 1335 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2149 : }
2150 : }
2151 : }
2152 : }
2153 : else
2154 : {
2155 11187 : if ( numCodingBands > 1 )
2156 : {
2157 : /* read prediction type */
2158 11034 : differential_subframe = bit_stream[( *next_bit_pos )--];
2159 : }
2160 : else
2161 : {
2162 153 : differential_subframe = 1;
2163 : }
2164 :
2165 11187 : if ( *num_zeros == numCodingBands )
2166 : {
2167 6183 : shift_one = 1;
2168 : }
2169 : else
2170 : {
2171 5004 : shift_one = 0;
2172 : }
2173 :
2174 11187 : if ( shift_one == 1 && nchan_ism == 2 )
2175 : {
2176 : /* nothing has been sent ; values can be inferred */
2177 216 : for ( b = b_signif; b < numCodingBands; b++ )
2178 : {
2179 108 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2180 : {
2181 108 : if ( idx_sep_obj_local == 0 )
2182 : {
2183 90 : ratio_ism_idx[b][0] = 0;
2184 90 : ratio_ism_idx[b][1] = 7;
2185 : }
2186 : else
2187 : {
2188 18 : ratio_ism_idx[b][0] = 7;
2189 18 : ratio_ism_idx[b][1] = 0;
2190 : }
2191 : }
2192 : }
2193 : }
2194 : else
2195 : {
2196 : /* read GR order */
2197 11079 : GR_order = bit_stream[( *next_bit_pos )--];
2198 65691 : for ( b = b_signif; b < numCodingBands; b++ )
2199 : {
2200 54612 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2201 : {
2202 146541 : for ( i = 0; i < nchan_ism - 1 - shift_one; i++ )
2203 : {
2204 97590 : buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, GR_order );
2205 97590 : if ( ( buf % 2 ) == 0 )
2206 : {
2207 78279 : ratio_ism_idx[b][i] = -( buf >> 1 );
2208 : }
2209 : else
2210 : {
2211 19311 : ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
2212 : }
2213 : }
2214 :
2215 : /* insert separated obj */
2216 48951 : if ( shift_one )
2217 : {
2218 87756 : for ( i = nchan_ism - 1; i > idx_sep_obj_local; i-- )
2219 : {
2220 58809 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i - 1];
2221 : }
2222 28947 : ratio_ism_idx[b][idx_sep_obj_local] = 0; /* this is only difference; need to pdate later as well */
2223 : }
2224 : }
2225 : }
2226 11079 : if ( differential_subframe )
2227 : {
2228 : /* differential to previous subframe */
2229 59445 : for ( b = b_signif; b < numCodingBands; b++ )
2230 : {
2231 49410 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2232 : {
2233 44361 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2234 159588 : for ( i = 0; i < nchan_ism - 1; i++ )
2235 : {
2236 115227 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_prev_sf[b][i];
2237 115227 : if ( shift_one && i == idx_sep_obj_local )
2238 : {
2239 27705 : ratio_ism_idx[b][i] = 0;
2240 : }
2241 115227 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2242 : }
2243 : }
2244 : else
2245 : {
2246 : /* distribute evenly the objects */
2247 5049 : 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 1044 : ratio_ism_idx[b_signif][nchan_ism - 1] = no_levels_ratio_ism;
2255 :
2256 : /* first significant subband - differential to previous subframe */
2257 3609 : for ( i = 0; i < nchan_ism - 1; i++ )
2258 : {
2259 2565 : ratio_ism_idx[b_signif][i] = ratio_ism_idx[b_signif][i] + ratio_ism_idx_prev_sf[b_signif][i];
2260 2565 : if ( shift_one && i == idx_sep_obj_local )
2261 : {
2262 258 : ratio_ism_idx[b_signif][i] = 0;
2263 : }
2264 2565 : 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 1044 : mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
2269 5202 : for ( b = b_signif + 1; b < numCodingBands; b++ )
2270 : {
2271 4158 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2272 : {
2273 3546 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2274 12291 : for ( i = 0; i < nchan_ism - 1; i++ )
2275 : {
2276 8745 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
2277 8745 : if ( shift_one && i == idx_sep_obj_local )
2278 : {
2279 984 : ratio_ism_idx[b][i] = 0;
2280 : }
2281 8745 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2282 : }
2283 3546 : mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
2284 : }
2285 : else
2286 : {
2287 : /* distribute evenly the objects */
2288 612 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2289 : }
2290 : }
2291 : }
2292 : }
2293 : }
2294 :
2295 16527 : return;
2296 : }
2297 : }
2298 :
2299 :
2300 5502 : 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 5502 : num_zeros = 0;
2317 :
2318 : /* hQMetaData->q_direction->cfg.nblocks; */
2319 22281 : for ( sf = 0; sf < numSf; sf++ )
2320 : {
2321 : /* read ism ratio indexes */
2322 16779 : 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 16779 : if ( sf < numSf - 1 )
2325 : {
2326 66834 : for ( band = 0; band < nbands; band++ )
2327 : {
2328 55557 : mvs2s( ratio_ism_idx[band], ratio_ism_idx_prev_sf[band], n_ism );
2329 : }
2330 : }
2331 :
2332 : /* reconstructed values */
2333 107130 : for ( band = 0; band < nbands; band++ )
2334 : {
2335 90351 : 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 16779 : if ( ( n_ism > 2 ) && ( idx_separated_object == n_ism - 1 ) )
2339 : {
2340 : /* rotate */
2341 13758 : for ( band = 0; band < nbands; band++ )
2342 : {
2343 11472 : if ( masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR )
2344 : {
2345 10005 : tmp = ratio_ism[sf][band][n_ism - 1];
2346 10005 : ratio_ism[sf][band][n_ism - 1] = ratio_ism[sf][band][0];
2347 10005 : ratio_ism[sf][band][0] = tmp;
2348 : }
2349 : }
2350 : }
2351 :
2352 16779 : if ( nbands == 1 )
2353 : {
2354 1380 : for ( band = 1; band < 5; band++ )
2355 : {
2356 1104 : mvr2r( ratio_ism[sf][0], ratio_ism[sf][band], n_ism );
2357 : }
2358 : }
2359 : }
2360 :
2361 5502 : if ( numSf == 1 )
2362 : {
2363 6972 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2364 : {
2365 54054 : for ( band = 0; band < nbands; band++ )
2366 : {
2367 48825 : mvr2r( ratio_ism[0][band], ratio_ism[sf][band], n_ism );
2368 : }
2369 : }
2370 : }
2371 :
2372 5502 : return;
2373 : }
2374 :
2375 :
2376 5502 : 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 5502 : nb_bits_read = *next_bit_pos;
2400 5502 : nbands = hQMetaData->q_direction->cfg.nbands;
2401 5502 : nblocks = hQMetaData->q_direction->cfg.nblocks;
2402 :
2403 : /* Read MASA-to-total energy ratios */
2404 5502 : ivas_omasa_decode_masa_to_total( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, nbands, nblocks );
2405 5502 : if ( nchan_ism > 1 )
2406 : {
2407 : /* read ISM ratios */
2408 5502 : 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 5502 : 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 24096 : for ( obj = 0; obj < nchan_ism; obj++ )
2425 : {
2426 18594 : hMasaIsmData->bits_ism[obj] = bits_ism[obj];
2427 18594 : index = 0;
2428 18594 : if ( bits_ism[obj] < 8 ) /* if low resolution, can look to the past */
2429 : {
2430 : /* read if same as previous */
2431 5955 : if ( bit_stream[( *next_bit_pos )--] )
2432 : {
2433 597 : azimuth = hMasaIsmData->q_azimuth_old[obj];
2434 597 : elevation = hMasaIsmData->q_elevation_old[obj];
2435 : }
2436 : else
2437 : {
2438 39375 : for ( i = 0; i < bits_ism[obj]; i++ )
2439 : {
2440 34017 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2441 : }
2442 5358 : deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
2443 :
2444 5358 : if ( azimuth * hMasaIsmData->q_azimuth_old[obj] > 0 )
2445 : {
2446 2370 : 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 2370 : if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( azimuth - hMasaIsmData->q_azimuth_old[obj] ) ) / 100.0f > 180.0f )
2449 : {
2450 213 : 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 2157 : if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( hMasaIsmData->q_azimuth_old[obj] - azimuth ) ) / 100.0f > 180.0f )
2456 : {
2457 204 : azimuth += delta_phi;
2458 : }
2459 : }
2460 : }
2461 :
2462 5358 : hMasaIsmData->q_azimuth_old[obj] = azimuth;
2463 5358 : hMasaIsmData->q_elevation_old[obj] = elevation;
2464 : }
2465 : }
2466 : else
2467 : {
2468 138954 : for ( i = 0; i < bits_ism[obj]; i++ )
2469 : {
2470 126315 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2471 : }
2472 12639 : deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
2473 12639 : hMasaIsmData->q_azimuth_old[obj] = azimuth;
2474 12639 : hMasaIsmData->q_elevation_old[obj] = elevation;
2475 : }
2476 :
2477 92970 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2478 : {
2479 74376 : meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
2480 74376 : hMasaIsmData->azimuth_ism[obj][meta_write_index] = (int16_t) rint( azimuth );
2481 74376 : 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 22281 : for ( sf = 0; sf < nblocks; sf++ )
2487 : {
2488 107130 : for ( band = 0; band < nbands; band++ )
2489 : {
2490 408885 : for ( dir = 0; dir < nchan_ism; dir++ )
2491 : {
2492 318534 : 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 5502 : band_mapping = hMasa->data.band_mapping;
2499 40572 : for ( band = 0; band < hMasa->config.numCodingBands; ++band )
2500 : {
2501 325830 : for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b )
2502 : {
2503 1453800 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; ++sf )
2504 : {
2505 1163040 : if ( nblocks == 1 )
2506 : {
2507 402480 : i = 0;
2508 : }
2509 : else
2510 : {
2511 760560 : i = sf;
2512 : }
2513 :
2514 1163040 : meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
2515 :
2516 5136000 : for ( dir = 0; dir < nchan_ism; dir++ )
2517 : {
2518 3972960 : hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir];
2519 : }
2520 :
2521 1163040 : if ( hMasaIsmData->hExtData != NULL )
2522 : {
2523 28800 : 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 5502 : return ( nb_bits_read - *next_bit_pos );
2530 : }
|