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 4181235 : 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 4181235 : dirac_bs_md_write_idx = 0;
111 4181235 : ism_imp = 0;
112 :
113 4181235 : error = IVAS_ERR_OK;
114 4181235 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
115 :
116 4181235 : low_bitrate_mode = -1; /* This means that LBR mode is not used. */
117 :
118 4181235 : 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 1258863 : masa_brate = st_ivas->hCPE[0]->element_brate;
121 : }
122 : else
123 : {
124 2922372 : masa_brate = ivas_total_brate;
125 : }
126 :
127 4181235 : hMasa = st_ivas->hMasa;
128 4181235 : hQMetaData = st_ivas->hQMetaData;
129 4181235 : ivas_format = st_ivas->ivas_format;
130 :
131 4181235 : hMasa->data.dir_decode_quality = 1.0f; /* Set to default of max quality */
132 4181235 : hQMetaData->is_masa_ivas_format = 1;
133 :
134 4181235 : *nb_bits_read = 0;
135 4181235 : next_bit_pos_orig = st->next_bit_pos;
136 4181235 : if ( masa_brate == IVAS_SID_5k2 )
137 : {
138 3010 : st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
139 : }
140 : else
141 : {
142 4178225 : st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 );
143 : }
144 :
145 4181235 : if ( ivas_format == MASA_FORMAT && ( masa_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
146 : {
147 20588 : hMasa->config.numberOfDirections = 1;
148 : }
149 :
150 4181235 : if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 )
151 : {
152 4021261 : if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
153 : {
154 3376145 : if ( ivas_format == MASA_FORMAT )
155 : {
156 : /* re-read the number of objects, needed in case of bad frame */
157 2306549 : 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 2306549 : if ( ch == 5 )
160 : {
161 2004635 : ch = 0;
162 : }
163 2306549 : st_ivas->nchan_ism = ch;
164 : }
165 :
166 3376145 : if ( ivas_format == MASA_FORMAT && st_ivas->nchan_ism > 0 )
167 : {
168 : /* there was OMASA in the input */
169 301914 : hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
170 301914 : if ( st_ivas->nchan_ism < 3 )
171 : {
172 : /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */
173 118704 : if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] == 0 )
174 : {
175 59363 : st_ivas->nchan_ism = 1;
176 : }
177 118704 : st->next_bit_pos -= MASA_TRANSP_BITS;
178 118704 : *nb_bits_read += MASA_TRANSP_BITS;
179 :
180 : /* the two reserved bits were already read in ivas_init_dec()*/
181 118704 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
182 118704 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
183 118704 : *nb_bits_read += MASA_HEADER_BITS;
184 : /* read number of directions */
185 118704 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
186 118704 : ( *nb_bits_read )++;
187 118704 : 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 183210 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
194 183210 : ( *nb_bits_read )++;
195 183210 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
196 :
197 : /* the two reserved bits were already read in ivas_init_dec()*/
198 183210 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
199 183210 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
200 183210 : *nb_bits_read += MASA_HEADER_BITS;
201 : }
202 : }
203 : else
204 : {
205 3074231 : 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 2004635 : st->next_bit_pos -= MASA_TRANSP_BITS;
210 2004635 : *nb_bits_read += MASA_TRANSP_BITS;
211 : }
212 :
213 3074231 : if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE )
214 : {
215 : /* the number of objects was read */
216 1069596 : st->next_bit_pos -= NO_BITS_MASA_ISM_NO_OBJ;
217 1069596 : *nb_bits_read += NO_BITS_MASA_ISM_NO_OBJ;
218 :
219 1069596 : 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 245050 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
224 245050 : ( *nb_bits_read )++;
225 245050 : st_ivas->hMasaIsmData->idx_separated_ism = 2 * byteBuffer + st->bit_stream[( st->next_bit_pos )--];
226 245050 : ( *nb_bits_read )++;
227 : }
228 : else
229 : {
230 824546 : st_ivas->hMasaIsmData->idx_separated_ism = -1;
231 : }
232 :
233 : /* read ISM importance flag (one per object) */
234 1069596 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
235 : {
236 245050 : ism_imp = 0;
237 735150 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
238 : {
239 490100 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
240 490100 : ( *nb_bits_read )++;
241 490100 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
242 : }
243 245050 : st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
244 : }
245 :
246 1069596 : if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
247 : {
248 234895 : ism_imp = 0;
249 704685 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
250 : {
251 469790 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
252 469790 : ( *nb_bits_read )++;
253 469790 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
254 : }
255 234895 : st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
256 :
257 : /* reset */
258 234895 : st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0;
259 234895 : st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0;
260 234895 : if ( st_ivas->hIsmMetaData[0]->ism_imp == ISM_NO_META )
261 : {
262 : /* read flags */
263 6867 : st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
264 6867 : ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
265 6867 : st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
266 6867 : ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
267 : }
268 : }
269 834701 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
270 : {
271 2036736 : for ( ch = 0; ch < st_ivas->nchan_ism; ch++ )
272 : {
273 1447085 : ism_imp = 0;
274 4341255 : for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
275 : {
276 2894170 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
277 2894170 : ( *nb_bits_read )++;
278 2894170 : ism_imp = ( ism_imp << 1 ) + byteBuffer;
279 : }
280 1447085 : st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp;
281 :
282 : /* reset */
283 1447085 : st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0;
284 1447085 : st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0;
285 1447085 : if ( st_ivas->hIsmMetaData[ch]->ism_imp == ISM_NO_META )
286 : {
287 : /* read flags */
288 33678 : st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
289 33678 : ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
290 33678 : st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
291 33678 : ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
292 : }
293 : }
294 589651 : st_ivas->flag_omasa_brate = 0;
295 589651 : if ( st_ivas->nchan_ism >= 3 && ivas_total_brate == IVAS_128k )
296 : {
297 25985 : st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--];
298 25985 : ( *nb_bits_read ) += 1;
299 : }
300 : }
301 : }
302 :
303 3074231 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
304 3074231 : byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--];
305 :
306 3074231 : if ( byteBuffer == 0 && ivas_format == MASA_FORMAT )
307 : {
308 2004635 : hMasa->config.input_ivas_format = MASA_FORMAT;
309 : }
310 : else
311 : {
312 1069596 : hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
313 : }
314 3074231 : *nb_bits_read += MASA_HEADER_BITS;
315 :
316 : /* read number of directions */
317 3074231 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
318 3074231 : ( *nb_bits_read )++;
319 3074231 : hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
320 : }
321 : }
322 : else
323 : {
324 645116 : hMasa->config.numberOfDirections = 1;
325 : }
326 :
327 4021261 : if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
328 : {
329 : /* read subframe mode */
330 3376145 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
331 3376145 : ( *nb_bits_read )++;
332 3376145 : hMasa->config.joinedSubframes = (uint8_t) byteBuffer;
333 : }
334 : else
335 : {
336 645116 : hMasa->config.joinedSubframes = FALSE;
337 : }
338 :
339 4021261 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
340 : {
341 645116 : *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 4021261 : 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 4021261 : if ( hMasa->config.max_metadata_bits < MINIMUM_BIT_BUDGET_NORMAL_META && hMasa->config.joinedSubframes == FALSE )
352 : {
353 : /* read low bitrate mode */
354 1338471 : byteBuffer = st->bit_stream[( st->next_bit_pos )--];
355 1338471 : ( *nb_bits_read )++;
356 1338471 : low_bitrate_mode = byteBuffer;
357 :
358 1338471 : if ( low_bitrate_mode == 1 )
359 : {
360 1125756 : hQMetaData->q_direction[0].cfg.nblocks = 1;
361 : }
362 : else
363 : {
364 212715 : hQMetaData->q_direction[0].cfg.nbands = 1;
365 : }
366 : }
367 :
368 : /* Remove already read bits from the bit budget */
369 4021261 : hQMetaData->metadata_max_bits -= *nb_bits_read;
370 :
371 4021261 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
372 : {
373 1069596 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
374 : {
375 245050 : if ( st_ivas->hDirAC != NULL )
376 : {
377 411108 : *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 205554 : 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 1089422 : for ( obj = 0; obj <= st_ivas->nchan_ism; obj++ )
381 : {
382 883868 : if ( st_ivas->hMasaIsmData->idx_separated_ism == obj )
383 : {
384 : int16_t sf;
385 : int16_t meta_write_index;
386 :
387 1027770 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
388 : {
389 822216 : meta_write_index = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + sf ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
390 822216 : st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism[obj][meta_write_index];
391 822216 : st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism[obj][meta_write_index];
392 : }
393 : }
394 : }
395 : }
396 39496 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
397 : {
398 8128 : *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 8128 : 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 31368 : *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 31368 : st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
405 : }
406 : }
407 : }
408 :
409 4021261 : masa_total_brate = ivas_total_brate;
410 4021261 : if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
411 : {
412 589651 : masa_total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
413 : }
414 :
415 4021261 : if ( masa_total_brate >= IVAS_384k )
416 : {
417 241572 : if ( masa_total_brate >= IVAS_512k )
418 : {
419 93807 : *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 147765 : *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 3779689 : *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, 0 );
429 : }
430 :
431 4021261 : 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 245050 : 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 4021261 : if ( hQMetaData->ec_flag == 2 )
439 : {
440 432155 : hMasa->data.dir_decode_quality = hQMetaData->dir_comp_ratio;
441 : }
442 :
443 4021261 : hMasa->config.coherencePresent = !hQMetaData->all_coherence_zero;
444 :
445 4021261 : 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 527956 : 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 4021261 : if ( low_bitrate_mode != -1 )
452 : {
453 1338471 : restore_lowbitrate_masa( hQMetaData, low_bitrate_mode, hMasa->config.numCodingBands );
454 : }
455 2682790 : else if ( hMasa->config.joinedSubframes == TRUE )
456 : {
457 895929 : replicate_subframes( hQMetaData );
458 : }
459 : }
460 159974 : else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 )
461 : {
462 3010 : 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 3010 : tmp_elem_mode = -1;
496 3010 : *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 3010 : if ( st_ivas->nchan_transport == 2 )
498 : {
499 1097 : assert( st_ivas->nCPE > 0 );
500 1097 : st_ivas->hCPE[0]->element_mode = tmp_elem_mode;
501 : }
502 3010 : *nb_bits_read += SID_FORMAT_NBITS;
503 : }
504 156964 : else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == FRAME_NO_DATA )
505 : {
506 17578 : 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 4181235 : if ( st_ivas->hDirAC != NULL )
516 : {
517 3275643 : dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */
518 3275643 : ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 );
519 : }
520 905592 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
521 : {
522 8524 : 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 4181235 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
526 : {
527 1128296 : 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 1128296 : if ( st_ivas->hDirAC != NULL )
536 : {
537 : int16_t b;
538 : int16_t block;
539 : int16_t meta_write_index;
540 :
541 1625996 : for ( i = 0; i < st_ivas->hSpatParamRendCom->numIsmDirections; i++ )
542 : {
543 3524840 : for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
544 : {
545 2819872 : meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
546 :
547 140529712 : for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
548 : {
549 137709840 : 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 4605140 : for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
555 : {
556 3684112 : meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
557 :
558 181673792 : for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
559 : {
560 177989680 : 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 4181235 : st->next_bit_pos = next_bit_pos_orig;
567 :
568 4181235 : if ( ivas_format == MASA_ISM_FORMAT )
569 : {
570 : int32_t cpe_brate;
571 1128296 : cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
572 :
573 1128296 : if ( st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
574 : {
575 415402 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = cpe_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
576 :
577 415402 : 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 3052939 : if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
586 : {
587 688383 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ivas_total_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
588 :
589 688383 : if ( ivas_total_brate <= IVAS_SID_5k2 )
590 : {
591 6320 : st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0;
592 : }
593 : }
594 : }
595 :
596 4181235 : if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 )
597 : {
598 1619495 : st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 0;
599 :
600 1619495 : if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 )
601 : {
602 7637 : st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 1;
603 :
604 7637 : if ( ivas_total_brate >= IVAS_SID_5k2 )
605 : {
606 1097 : st_ivas->hCPE[0]->element_brate = ivas_total_brate;
607 : }
608 : }
609 : }
610 :
611 4181235 : 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 542703 : create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport );
614 : }
615 :
616 4181235 : return error /* *nb_bits_read*/;
617 : }
618 :
619 :
620 : /*-------------------------------------------------------------------*
621 : * ivas_masa_dec_open()
622 : *
623 : *
624 : *-------------------------------------------------------------------*/
625 :
626 40859 : 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 40859 : error = IVAS_ERR_OK;
636 :
637 40859 : 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 40859 : ism_total_brate = 0;
643 : /* ISM metadata */
644 40859 : 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 40859 : 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 24274 : for ( i = 0; i < st_ivas->nSCE; i++ )
652 : {
653 15757 : ism_total_brate += st_ivas->hSCE[i]->element_brate;
654 : }
655 : }
656 :
657 40859 : 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 40859 : mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
660 40859 : mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 );
661 40859 : hMasa->config.numberOfDirections = 1;
662 40859 : hMasa->config.joinedSubframes = FALSE;
663 :
664 : /* Create spherical grid only for external output */
665 40859 : 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 1125 : 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 1125 : generate_gridEq( hMasa->data.sph_grid16 );
673 1125 : 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 39734 : hMasa->data.sph_grid16 = NULL;
681 39734 : hMasa->data.extOutMeta = NULL;
682 : }
683 :
684 40859 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
685 : {
686 23680 : error = init_lfe_synth_data( st_ivas, hMasa );
687 : }
688 : else
689 : {
690 17179 : hMasa->hMasaLfeSynth = NULL;
691 : }
692 :
693 40859 : st_ivas->hMasa = hMasa;
694 :
695 : /* allocate transport channels*/
696 40859 : 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 10527 : buffer_mode = TC_BUFFER_MODE_RENDERER;
703 10527 : 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 95 : buffer_mode = TC_BUFFER_MODE_BUFFER;
706 : }
707 10432 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
708 : {
709 527 : buffer_mode = TC_BUFFER_MODE_BUFFER;
710 : }
711 :
712 10527 : nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
713 10527 : nchan_to_allocate = nchan_transport;
714 :
715 10527 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
716 : {
717 527 : nchan_transport = 1;
718 527 : nchan_to_allocate = 1;
719 : }
720 10000 : 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 129 : nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
723 129 : nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
724 : }
725 9871 : else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) )
726 : {
727 : /* addtl channel for CNG */
728 2060 : nchan_to_allocate++;
729 : }
730 :
731 10527 : granularity = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
732 :
733 10527 : 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 40859 : return error;
740 : }
741 :
742 :
743 : /*-----------------------------------------------------------------------*
744 : * ivas_masa_dec_close()
745 : *
746 : * close MASA decoder
747 : *-----------------------------------------------------------------------*/
748 :
749 143144 : 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 143144 : if ( hMasa_out == NULL || *hMasa_out == NULL )
756 : {
757 102285 : return;
758 : }
759 :
760 40859 : hMasa = *hMasa_out;
761 :
762 : /* Free spherical grid memory if in use */
763 40859 : if ( hMasa->data.sph_grid16 != NULL )
764 : {
765 3231 : free( hMasa->data.sph_grid16 );
766 3231 : hMasa->data.sph_grid16 = NULL;
767 : }
768 :
769 40859 : if ( hMasa->data.extOutMeta != NULL )
770 : {
771 1125 : free( hMasa->data.extOutMeta );
772 1125 : hMasa->data.extOutMeta = NULL;
773 : }
774 :
775 40859 : if ( hMasa->hMasaLfeSynth != NULL )
776 : {
777 23680 : if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer != NULL )
778 : {
779 2561 : free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer );
780 2561 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
781 : }
782 23680 : if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 != NULL )
783 : {
784 2561 : free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 );
785 2561 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
786 : }
787 23680 : if ( hMasa->hMasaLfeSynth->delayBuffer_syncLp != NULL )
788 : {
789 2561 : free( hMasa->hMasaLfeSynth->delayBuffer_syncLp );
790 2561 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
791 : }
792 23680 : if ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC != NULL )
793 : {
794 2561 : free( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC );
795 2561 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
796 : }
797 23680 : free( hMasa->hMasaLfeSynth );
798 23680 : hMasa->hMasaLfeSynth = NULL;
799 : }
800 :
801 40859 : free( *hMasa_out );
802 40859 : *hMasa_out = NULL;
803 :
804 40859 : return;
805 : }
806 :
807 :
808 : /*-------------------------------------------------------------------*
809 : * ivas_masa_dec_config()
810 : *
811 : * Frame-by-frame configuration of MASA decoder
812 : *-------------------------------------------------------------------*/
813 :
814 4021261 : 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 4021261 : error = IVAS_ERR_OK;
826 4021261 : hMasa = st_ivas->hMasa;
827 :
828 4021261 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
829 4021261 : ism_total_brate = 0;
830 4021261 : 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 2996626 : for ( i = 0; i < st_ivas->nSCE; i++ )
833 : {
834 1927030 : ism_total_brate += st_ivas->hSCE[i]->element_brate;
835 : }
836 : }
837 :
838 4021261 : 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 4021261 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
841 : {
842 1069596 : 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 2951665 : 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 4021261 : if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k )
850 : {
851 161530 : hMasa->config.mergeRatiosOverSubframes = 0;
852 :
853 : /* initialize spherical grid */
854 161530 : if ( hMasa->data.sph_grid16 == NULL )
855 : {
856 2106 : 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 2106 : generate_gridEq( hMasa->data.sph_grid16 );
861 : }
862 : }
863 4021261 : st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits;
864 4021261 : st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping;
865 4021261 : st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport;
866 :
867 4021261 : 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 4021261 : st_ivas->hQMetaData->numTwoDirBands = st_ivas->hMasa->config.numTwoDirBands;
873 4021261 : st_ivas->hQMetaData->useLowerRes = 0;
874 :
875 8564450 : for ( i = 0; i < st_ivas->hQMetaData->no_directions; i++ )
876 : {
877 4543189 : st_ivas->hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands;
878 4543189 : st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES;
879 :
880 4543189 : if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
881 : {
882 645116 : 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 3898073 : st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = MC_LS_SETUP_INVALID;
887 : }
888 : }
889 :
890 4021261 : ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format );
891 :
892 : /* Find maximum band usable */
893 4021261 : maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH );
894 4021261 : maxBand = 0;
895 102345730 : while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin )
896 : {
897 98324469 : maxBand++;
898 : }
899 4021261 : maxBand--;
900 :
901 4021261 : 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 572068 : masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta );
905 : }
906 : else
907 : {
908 3449193 : masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL );
909 : }
910 :
911 4021261 : return error;
912 : }
913 :
914 :
915 : /*-------------------------------------------------------------------*
916 : * ivas_masa_prerender()
917 : *
918 : * Apply gaining and copying of transport signals when needed
919 : *-------------------------------------------------------------------*/
920 :
921 2390233 : 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 2390233 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && nchan_remapped == 1 )
929 : {
930 390982 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
931 : {
932 41016 : mvr2r( output[0], output[1], output_frame ); /* Copy mono signal to stereo output channels */
933 : }
934 : else
935 : {
936 349966 : if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_DISABLE )
937 : {
938 218822 : 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 2390233 : return;
944 : }
945 :
946 :
947 : /*-------------------------------------------------------------------*
948 : * Local functions
949 : *-------------------------------------------------------------------*/
950 :
951 527956 : static void index_16bits(
952 : IVAS_QMETADATA_HANDLE hQMetaData,
953 : SPHERICAL_GRID_DATA *Sph_Grid16 )
954 : {
955 : int16_t d, band, block;
956 :
957 1169091 : 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 7906721 : for ( band = 0; band < hQMetaData->q_direction[0].cfg.nbands; band++ )
961 : {
962 26450232 : for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ )
963 : {
964 19184646 : hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ),
965 19184646 : &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 );
966 : }
967 : }
968 : }
969 :
970 527956 : return;
971 : }
972 :
973 :
974 : /* Replicate subframe data when there is only one subframe sent */
975 895929 : static void replicate_subframes(
976 : IVAS_QMETADATA_HANDLE hQMetaData )
977 : {
978 : int16_t sf, band, dir, nbands, ndirs;
979 :
980 895929 : nbands = hQMetaData->q_direction->cfg.nbands;
981 895929 : ndirs = hQMetaData->no_directions;
982 :
983 3583716 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
984 : {
985 34781505 : for ( band = 0; band < nbands; band++ )
986 : {
987 72617232 : for ( dir = 0; dir < ndirs; dir++ )
988 : {
989 40523514 : hQMetaData->q_direction[dir].band_data[band].azimuth[sf] = hQMetaData->q_direction[dir].band_data[band].azimuth[0];
990 40523514 : hQMetaData->q_direction[dir].band_data[band].elevation[sf] = hQMetaData->q_direction[dir].band_data[band].elevation[0];
991 40523514 : hQMetaData->q_direction[dir].band_data[band].spherical_index[sf] = hQMetaData->q_direction[dir].band_data[band].spherical_index[0];
992 40523514 : hQMetaData->q_direction[dir].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[dir].band_data[band].energy_ratio[0];
993 :
994 40523514 : if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
995 : {
996 33477732 : 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 32093718 : if ( hQMetaData->surcoh_band_data != NULL )
1001 : {
1002 25047936 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
1003 : }
1004 : }
1005 : }
1006 :
1007 895929 : return;
1008 : }
1009 :
1010 :
1011 1338471 : 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 1338471 : 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 4503024 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1023 : {
1024 20263608 : for ( band = 0; band < numCodingBands; band++ )
1025 : {
1026 16886340 : hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[band].azimuth[0];
1027 16886340 : hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[band].elevation[0];
1028 16886340 : hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[band].spherical_index[0];
1029 16886340 : hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[band].energy_ratio[0];
1030 16886340 : if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
1031 : {
1032 2923785 : hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[0];
1033 : }
1034 16886340 : if ( hQMetaData->surcoh_band_data != NULL )
1035 : {
1036 2923785 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
1037 : }
1038 : }
1039 : }
1040 1125756 : 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 1063575 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1047 : {
1048 4254300 : for ( band = 1; band < numCodingBands; band++ )
1049 : {
1050 3403440 : hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[0].azimuth[sf];
1051 3403440 : hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[0].elevation[sf];
1052 3403440 : hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[0].spherical_index[sf];
1053 3403440 : hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[0].energy_ratio[sf];
1054 3403440 : if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
1055 : {
1056 853136 : hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[0].spread_coherence[sf];
1057 : }
1058 3403440 : if ( hQMetaData->surcoh_band_data != NULL )
1059 : {
1060 853136 : hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[0].surround_coherence[sf];
1061 : }
1062 : }
1063 : }
1064 212715 : hQMetaData->q_direction->cfg.nbands = numCodingBands;
1065 : }
1066 :
1067 1338471 : return;
1068 : }
1069 :
1070 :
1071 23680 : 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 23680 : output_Fs = st_ivas->hDecoderConfig->output_Fs;
1080 23680 : output_config = st_ivas->hDecoderConfig->output_config;
1081 :
1082 23680 : 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 23680 : hMasa->hMasaLfeSynth->transportEneSmooth = 0.0f;
1088 23680 : hMasa->hMasaLfeSynth->protoLfeEneSmooth = 0.0f;
1089 23680 : hMasa->hMasaLfeSynth->targetEneLfeSmooth = 0.0f;
1090 23680 : hMasa->hMasaLfeSynth->targetEneTransSmooth = 0.0f;
1091 :
1092 23680 : set_zero( hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES );
1093 23680 : hMasa->hMasaLfeSynth->lfeGainPrevIndex = 0;
1094 :
1095 23680 : if ( st_ivas->hOutSetup.separateChannelEnabled &&
1096 4959 : ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
1097 4899 : output_config == IVAS_AUDIO_CONFIG_5_1_2 ||
1098 4867 : output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
1099 3526 : output_config == IVAS_AUDIO_CONFIG_EXTERNAL ||
1100 3496 : output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 ||
1101 2435 : output_config == IVAS_AUDIO_CONFIG_HOA3 ||
1102 0 : ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) )
1103 2561 : {
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 2561 : bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES );
1111 2561 : 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 2561 : set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer, bufferSize );
1116 2561 : hMasa->hMasaLfeSynth->ringBufferLoPointer = 0;
1117 2561 : hMasa->hMasaLfeSynth->ringBufferHiPointer = bufferSize / 2;
1118 2561 : hMasa->hMasaLfeSynth->lowpassSum = 0.0f;
1119 2561 : 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 2561 : bufferSize /= 2;
1124 2561 : 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 2561 : set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2, bufferSize );
1129 2561 : hMasa->hMasaLfeSynth->ringBufferLoPointer2 = 0;
1130 2561 : hMasa->hMasaLfeSynth->lowpassSum2 = 0.0f;
1131 2561 : hMasa->hMasaLfeSynth->ringBufferSize2 = bufferSize;
1132 :
1133 : /* Delay buffer for matching the delay of the lowpass filter */
1134 2561 : bufferSize /= 2; /* The delay of the moving average lowpass filter is bufferSize / 2 */
1135 2561 : 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 2561 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncLp, bufferSize );
1140 2561 : hMasa->hMasaLfeSynth->delayBuffer_syncLp_size = bufferSize;
1141 :
1142 : /* Delay buffer for syncing with DirAC rendering */
1143 2561 : bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) - hMasa->hMasaLfeSynth->ringBufferSize / 2 - hMasa->hMasaLfeSynth->ringBufferSize2 / 2;
1144 2561 : 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 2561 : set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize );
1149 2561 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize;
1150 :
1151 : /* Interpolation between slots */
1152 2561 : hMasa->hMasaLfeSynth->lfeGainPrev = 0.0f;
1153 2561 : hMasa->hMasaLfeSynth->transportGainPrev = 1.0f;
1154 2561 : slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );
1155 145381 : for ( i = 0; i < slot_size; i++ )
1156 : {
1157 142820 : hMasa->hMasaLfeSynth->interpolator[i] = ( (float) ( i + 1 ) ) / ( (float) slot_size );
1158 : }
1159 : }
1160 21119 : 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 21119 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
1180 21119 : hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
1181 21119 : hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
1182 21119 : hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
1183 : }
1184 :
1185 23680 : return IVAS_ERR_OK;
1186 : }
1187 :
1188 :
1189 : /*! r: Number of bits read */
1190 645116 : 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 645116 : lfeBitsRead = 0;
1206 645116 : byteBuffer = bitstream[( *index )--];
1207 645116 : lfeBitsRead += 1;
1208 645116 : lfeToTotalEnergyRatioIndices[0] = byteBuffer; /* First LFE index */
1209 :
1210 645116 : if ( ivas_total_brate == IVAS_13k2 ) /* 1-bit adaptive LFE gain quantizer at 13.2 kbps */
1211 : {
1212 63302 : lfeToTotalEnergyRatioTemp = hMasaLfeSynth->lfeToTotalEnergyRatio[3]; /* Take memory from the last subframe */
1213 63302 : if ( lfeToTotalEnergyRatioIndices[0] == 1 )
1214 : {
1215 18664 : if ( hMasaLfeSynth->lfeGainPrevIndex == 1 )
1216 : {
1217 8667 : lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_THETA * MCMASA_LFE_BETA; /* larger "bump-up" energy */
1218 : }
1219 : else
1220 : {
1221 9997 : lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_BETA; /* "bump-up" energy */
1222 : }
1223 : }
1224 : else
1225 : {
1226 44638 : lfeToTotalEnergyRatioTemp = MCMASA_LFE_ALPHA * lfeToTotalEnergyRatioTemp; /* exponential decay */
1227 : }
1228 63302 : if ( lfeToTotalEnergyRatioTemp > 1.0f )
1229 : {
1230 12 : lfeToTotalEnergyRatioTemp = 1.0f;
1231 : }
1232 63302 : hMasaLfeSynth->lfeGainPrevIndex = lfeToTotalEnergyRatioIndices[0];
1233 316510 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1234 : {
1235 253208 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = lfeToTotalEnergyRatioTemp;
1236 : }
1237 : }
1238 : else /* Bitrates >= 16.4 kbps */
1239 : {
1240 581814 : if ( lfeToTotalEnergyRatioIndices[0] == 0 )
1241 : {
1242 466935 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1243 : {
1244 373548 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = 0.0f;
1245 : }
1246 : }
1247 : else
1248 : {
1249 488427 : byteBuffer = bitstream[( *index )--] << 2;
1250 488427 : byteBuffer += bitstream[( *index )--] << 1;
1251 488427 : byteBuffer += bitstream[( *index )--];
1252 488427 : lfeBitsRead += 3;
1253 488427 : lfeToTotalEnergyRatioIndices[1] = byteBuffer; /* Scalar index */
1254 488427 : 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 488427 : if ( ivas_total_brate >= IVAS_24k4 )
1258 : {
1259 : /* Depending on average (scalar) gain more bits are sent for VQ LFE gain */
1260 465949 : switch ( lfeToTotalEnergyRatioIndices[1] )
1261 : {
1262 98446 : case 0:
1263 : case 1:
1264 98446 : VQBits = 0;
1265 98446 : break;
1266 50664 : case 2:
1267 50664 : VQBits = 1;
1268 50664 : break;
1269 59282 : case 3:
1270 59282 : VQBits = 2;
1271 59282 : break;
1272 69583 : case 4:
1273 69583 : VQBits = 3;
1274 69583 : break;
1275 187974 : default:
1276 187974 : VQBits = 4;
1277 : }
1278 465949 : byteBuffer = 0;
1279 1595822 : for ( i = 0; i < VQBits; i++ )
1280 : {
1281 1129873 : byteBuffer += bitstream[( *index )--] << ( VQBits - 1 - i );
1282 1129873 : lfeBitsRead += 1;
1283 : }
1284 465949 : lfeToTotalEnergyRatioIndices[2] = byteBuffer; /* VQ index */
1285 : }
1286 :
1287 2442135 : for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
1288 : {
1289 1953708 : if ( ivas_total_brate == IVAS_16k4 )
1290 : {
1291 89912 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage );
1292 : }
1293 : else
1294 : {
1295 1863796 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage + McMASA_LFEGain_vectors[4 * lfeToTotalEnergyRatioIndices[2] + i] );
1296 : }
1297 1953708 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = min( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 1.0f );
1298 1953708 : hMasaLfeSynth->lfeToTotalEnergyRatio[i] = max( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 0.0f );
1299 : }
1300 : }
1301 : }
1302 :
1303 645116 : return lfeBitsRead;
1304 : }
1305 :
1306 :
1307 : /*-------------------------------------------------------------------*
1308 : * ivas_masa_dec_reconfigure()
1309 : *
1310 : * Reconfigure IVAS MASA decoder
1311 : *-------------------------------------------------------------------*/
1312 :
1313 188897 : 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 188897 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
1329 188897 : 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 188897 : 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 149132 : mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1335 149132 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
1336 149132 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
1337 : }
1338 :
1339 188897 : ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
1340 :
1341 : /* renderer might have changed, reselect */
1342 188897 : ivas_renderer_select( st_ivas );
1343 :
1344 188897 : if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend == NULL ) ||
1345 186527 : ( ( 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 2370 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
1349 : {
1350 0 : return error;
1351 : }
1352 : }
1353 186527 : 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 27364 : ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
1357 27364 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
1358 27364 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
1359 27364 : 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 188897 : 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 188897 : num_bits = 0;
1370 :
1371 398243 : for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ )
1372 : {
1373 209346 : st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport;
1374 209346 : 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 209346 : sts = st_ivas->hSCE[sce_id]->hCoreCoder;
1376 209346 : sts[0]->bit_stream = bit_stream + num_bits;
1377 209346 : num_bits += (int16_t) ( st_ivas->hSCE[sce_id]->element_brate / FRAMES_PER_SEC );
1378 :
1379 209346 : 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 100796 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1382 : {
1383 0 : return error;
1384 : }
1385 : }
1386 : }
1387 :
1388 359553 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
1389 : {
1390 170656 : st_ivas->hCPE[cpe_id]->element_brate = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
1391 :
1392 : /* prepare bitstream buffers */
1393 511968 : for ( n = 0; n < CPE_CHANNELS; n++ )
1394 : {
1395 341312 : 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 170656 : sts = st_ivas->hCPE[cpe_id]->hCoreCoder;
1398 170656 : sts[0]->bit_stream = bit_stream + num_bits;
1399 170656 : num_bits += (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
1400 170656 : if ( ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate >= MASA_STEREO_MIN_BITRATE ) ||
1401 138377 : ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == FRAME_NO_DATA ) ||
1402 443 : ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == IVAS_SID_5k2 ) )
1403 : {
1404 32392 : st_ivas->hCPE[cpe_id]->nchan_out = 1;
1405 32392 : 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 26496 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1408 : {
1409 0 : return error;
1410 : }
1411 : }
1412 : }
1413 138264 : else if ( ivas_total_brate >= MASA_STEREO_MIN_BITRATE && last_ivas_total_brate < MASA_STEREO_MIN_BITRATE )
1414 : {
1415 32483 : st_ivas->hCPE[cpe_id]->nchan_out = CPE_CHANNELS;
1416 :
1417 32483 : 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 27436 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1420 : {
1421 0 : return error;
1422 : }
1423 : }
1424 : }
1425 : }
1426 :
1427 1700073 : for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ )
1428 : {
1429 1511176 : if ( st_ivas->hDiracDecBin[pos_idx] != NULL )
1430 : {
1431 : /* regularization factor is bitrate-dependent */
1432 93011 : st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
1433 : }
1434 : }
1435 :
1436 188897 : 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 41021 : if ( st_ivas->hDiracDecBin[0] != NULL )
1443 : {
1444 19349 : 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 41021 : 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 188897 : ism_total_brate = 0;
1465 188897 : 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 187514 : for ( n = 0; n < st_ivas->nSCE; n++ )
1468 : {
1469 120879 : ism_total_brate += st_ivas->hSCE[n]->element_brate;
1470 : }
1471 : }
1472 :
1473 188897 : 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 188897 : 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 188897 : buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
1487 188897 : tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
1488 :
1489 188897 : tc_nchan_to_allocate = tc_nchan_transport;
1490 188897 : 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 93011 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
1493 : {
1494 52411 : tc_nchan_to_allocate = BINAURAL_CHANNELS + st_ivas->nchan_ism;
1495 : }
1496 : else
1497 : {
1498 40600 : tc_nchan_to_allocate = BINAURAL_CHANNELS;
1499 40600 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
1500 : {
1501 21110 : tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS;
1502 : }
1503 : }
1504 :
1505 93011 : 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 10066 : if ( n_samples_granularity > st_ivas->hTcBuffer->n_samples_granularity )
1508 : {
1509 9994 : if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
1510 : {
1511 0 : return error;
1512 : }
1513 : }
1514 : }
1515 16872 : else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode != ISM_MASA_MODE_DISC )
1516 : {
1517 16872 : if ( n_samples_granularity < st_ivas->hTcBuffer->n_samples_granularity )
1518 : {
1519 : /* flush already done in IVAS_DEC_ReadFormat() */
1520 : }
1521 : }
1522 : }
1523 95886 : else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) )
1524 : {
1525 : /* addtl channel for CNG */
1526 4096 : tc_nchan_to_allocate++;
1527 : }
1528 91790 : 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 ) )
1529 : {
1530 4645 : tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
1531 4645 : tc_nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
1532 : }
1533 :
1534 188897 : 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 )
1535 : {
1536 135700 : 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 )
1537 : {
1538 0 : return error;
1539 : }
1540 : }
1541 :
1542 188897 : if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity )
1543 : {
1544 149144 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1545 149144 : st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1546 149144 : st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1547 : }
1548 :
1549 188897 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
1550 : {
1551 10066 : int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size;
1552 :
1553 90594 : for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ )
1554 : {
1555 80528 : st_ivas->hSpatParamRendCom->subframe_nbslots[n] = st_ivas->hTcBuffer->subframe_nbslots[n] * granularityMultiplier;
1556 : }
1557 : }
1558 : }
1559 :
1560 : /*-----------------------------------------------------------------*
1561 : * floating-point output audio buffers
1562 : *-----------------------------------------------------------------*/
1563 :
1564 188897 : 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() */
1565 : {
1566 41021 : nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
1567 41021 : 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 )
1568 : {
1569 0 : return error;
1570 : }
1571 : }
1572 :
1573 188897 : return IVAS_ERR_OK;
1574 : }
1575 :
1576 :
1577 : /*-------------------------------------------------------------------*
1578 : * ivas_spar_param_to_masa_param_mapping()
1579 : *
1580 : * Determine MASA metadata from the SPAR metadata
1581 : *-------------------------------------------------------------------*/
1582 :
1583 6475076 : void ivas_spar_param_to_masa_param_mapping(
1584 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
1585 : float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
1586 : float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
1587 : const int16_t subframe /* i : Subframe to map */
1588 : )
1589 : {
1590 : int16_t i, j, band, bin, slot, ch, nBins, nchan_transport;
1591 : int16_t mixer_mat_index;
1592 : int16_t dirac_write_idx;
1593 : DIRAC_DEC_HANDLE hDirAC;
1594 : DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist;
1595 : float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS];
1596 : float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS];
1597 : int16_t *band_grouping;
1598 : int16_t band_start, band_end;
1599 : float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX];
1600 : float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX];
1601 : float instEne;
1602 : float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
1603 : float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
1604 : float Iy, Iz, Ix, E, azi, ele, I, ratio;
1605 : float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum;
1606 : int16_t slot_idx, slot_idx_start, sf;
1607 : SPAR_DEC_HANDLE hSpar;
1608 : float slot_fac;
1609 : SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
1610 :
1611 : /* Set values */
1612 6475076 : hDirAC = st_ivas->hDirAC;
1613 6475076 : hSpatParamRendCom = st_ivas->hSpatParamRendCom;
1614 6475076 : hSpatParamRendCom->numParametricDirections = 1;
1615 6475076 : hSpatParamRendCom->numSimultaneousDirections = 1;
1616 6475076 : hDiffuseDist = st_ivas->hDiracDecBin[0]->hDiffuseDist;
1617 6475076 : nchan_transport = st_ivas->nchan_transport;
1618 6475076 : band_grouping = hDirAC->band_grouping;
1619 6475076 : hSpar = st_ivas->hSpar;
1620 6475076 : dirac_write_idx = hSpatParamRendCom->render_to_md_map[subframe];
1621 :
1622 : /* Init arrays */
1623 32375380 : for ( i = 0; i < FOA_CHANNELS; i++ )
1624 : {
1625 25900304 : set_zero( inCovarianceMtx[i], FOA_CHANNELS );
1626 : }
1627 :
1628 : /* Delay the SPAR mixing matrices to have them synced with the audio */
1629 6475076 : slot_idx_start = hSpar->slots_rendered;
1630 6475076 : slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe];
1631 :
1632 32291062 : for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ )
1633 : {
1634 25815986 : sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME;
1635 :
1636 25815986 : if ( ( sf < SPAR_META_DELAY_SUBFRAMES ) )
1637 : {
1638 12908926 : mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1;
1639 116180334 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1640 : {
1641 516357040 : for ( i = 0; i < FOA_CHANNELS; i++ )
1642 : {
1643 2065428160 : for ( j = 0; j < FOA_CHANNELS; j++ )
1644 : {
1645 1652342528 : mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band];
1646 : }
1647 : }
1648 : }
1649 : }
1650 : else
1651 : {
1652 12907060 : 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 );
1653 116163540 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1654 : {
1655 516282400 : for ( i = 0; i < FOA_CHANNELS; i++ )
1656 : {
1657 2065129600 : for ( j = 0; j < FOA_CHANNELS; j++ )
1658 : {
1659 1652103680 : 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];
1660 : }
1661 : }
1662 : }
1663 : }
1664 : }
1665 :
1666 : /* Map the mixing matrices from the frequency bands to frequency bins */
1667 6475076 : bin = 0;
1668 58275684 : for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
1669 : {
1670 51800608 : band_start = band_grouping[band];
1671 51800608 : band_end = band_grouping[band + 1];
1672 123026444 : for ( bin = band_start; bin < band_end; bin++ )
1673 : {
1674 356129180 : for ( i = 0; i < FOA_CHANNELS; i++ )
1675 : {
1676 1424516720 : for ( j = 0; j < FOA_CHANNELS; j++ )
1677 : {
1678 1139613376 : mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j];
1679 : }
1680 : }
1681 : }
1682 : }
1683 6475076 : nBins = bin;
1684 :
1685 : /* Determine MASA metadata */
1686 : /* Determine transport signal energies and cross correlations when more than 1 TC */
1687 6475076 : if ( nchan_transport == 2 )
1688 : {
1689 3545961 : set_zero( transportSignalEnergies[0], nBins );
1690 3545961 : set_zero( transportSignalEnergies[1], nBins );
1691 3545961 : set_zero( transportSignalCrossCorrelation, nBins );
1692 :
1693 17710791 : for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ )
1694 : {
1695 169977960 : for ( bin = 0; bin < nBins; bin++ )
1696 : {
1697 467439390 : for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
1698 : {
1699 311626260 : instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] );
1700 311626260 : instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
1701 311626260 : transportSignalEnergies[ch][bin] += instEne;
1702 : }
1703 155813130 : transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin];
1704 155813130 : transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin];
1705 : }
1706 : }
1707 : }
1708 :
1709 6475076 : if ( hDiffuseDist != NULL )
1710 : {
1711 6475076 : set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX );
1712 6475076 : set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX );
1713 6475076 : set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX );
1714 : }
1715 :
1716 77700912 : for ( bin = 0; bin < nBins; bin++ )
1717 : {
1718 : /* Set the energy of the first transport signal */
1719 71225836 : if ( nchan_transport == 1 )
1720 : {
1721 32220265 : inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */
1722 : }
1723 : else
1724 : {
1725 39005571 : inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */
1726 : }
1727 :
1728 : /* Decorrelated channels assumed to have the same energy as the source channel */
1729 71225836 : inCovarianceMtx[1][1] = inCovarianceMtx[0][0];
1730 71225836 : inCovarianceMtx[2][2] = inCovarianceMtx[0][0];
1731 71225836 : inCovarianceMtx[3][3] = inCovarianceMtx[0][0];
1732 :
1733 : /* In case residuals were transmitted, use their actual energies and cross correlations */
1734 71225836 : if ( nchan_transport == 2 )
1735 : {
1736 39005571 : inCovarianceMtx[1][1] = transportSignalEnergies[1][bin];
1737 39005571 : inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin];
1738 39005571 : inCovarianceMtx[1][0] = inCovarianceMtx[0][1];
1739 : }
1740 :
1741 71225836 : compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] );
1742 :
1743 : /* Estimate MASA metadata */
1744 71225836 : Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */
1745 71225836 : Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */
1746 71225836 : Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */
1747 71225836 : I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */
1748 71225836 : E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */
1749 71225836 : azi = atan2f( Iy, Ix ); /* Azimuth */
1750 71225836 : ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */
1751 71225836 : ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */
1752 71225836 : ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) );
1753 :
1754 71225836 : hSpatParamRendCom->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 );
1755 71225836 : hSpatParamRendCom->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 );
1756 71225836 : hSpatParamRendCom->energy_ratio1[dirac_write_idx][bin] = ratio;
1757 71225836 : hSpatParamRendCom->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio;
1758 :
1759 71225836 : hSpatParamRendCom->spreadCoherence[dirac_write_idx][bin] = 0.0f;
1760 71225836 : hSpatParamRendCom->surroundingCoherence[dirac_write_idx][bin] = 0.0f;
1761 :
1762 : /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */
1763 71225836 : if ( hDiffuseDist != NULL )
1764 : {
1765 71225836 : if ( nchan_transport == 1 )
1766 : {
1767 32220265 : diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] );
1768 32220265 : diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] );
1769 32220265 : diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] );
1770 : }
1771 39005571 : else if ( nchan_transport == 2 )
1772 : {
1773 39005571 : diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] );
1774 39005571 : 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] );
1775 39005571 : 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] );
1776 : }
1777 : else
1778 : {
1779 0 : diffuseGainY = 1.0f;
1780 0 : diffuseGainX = 1.0f;
1781 0 : diffuseGainZ = 1.0f;
1782 : }
1783 :
1784 71225836 : diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ;
1785 :
1786 71225836 : if ( diffuseGainSum == 0.0f )
1787 : {
1788 2235865 : hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f;
1789 2235865 : hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f;
1790 2235865 : hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f;
1791 : }
1792 : else
1793 : {
1794 68989971 : hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
1795 68989971 : hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
1796 68989971 : hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
1797 : }
1798 : }
1799 : }
1800 :
1801 6475076 : return;
1802 : }
1803 :
1804 :
1805 : /* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */
1806 71225836 : static void compute_foa_cov_matrix(
1807 : float foaCov[FOA_CHANNELS][FOA_CHANNELS], /* o : Estimated FOA covariance matrix */
1808 : float inCov[FOA_CHANNELS][FOA_CHANNELS], /* i : Input covariance matrix */
1809 : float mixMtx[FOA_CHANNELS][FOA_CHANNELS] /* i : Mixing matrix */
1810 : )
1811 : {
1812 : float tmpMtx[FOA_CHANNELS][FOA_CHANNELS];
1813 : int16_t i, j, k;
1814 :
1815 : /* tmpMtx = mixMtx * inCov */
1816 356129180 : for ( i = 0; i < FOA_CHANNELS; i++ )
1817 : {
1818 1424516720 : for ( j = 0; j < FOA_CHANNELS; j++ )
1819 : {
1820 1139613376 : tmpMtx[i][j] = 0.0f;
1821 5698066880 : for ( k = 0; k < FOA_CHANNELS; k++ )
1822 : {
1823 4558453504 : tmpMtx[i][j] += mixMtx[i][k] * inCov[k][j];
1824 : }
1825 : }
1826 : }
1827 :
1828 : /* foaCov = inCov * mixMtx' */
1829 356129180 : for ( i = 0; i < FOA_CHANNELS; i++ )
1830 : {
1831 1424516720 : for ( j = 0; j < FOA_CHANNELS; j++ )
1832 : {
1833 1139613376 : foaCov[i][j] = 0.0f;
1834 5698066880 : for ( k = 0; k < FOA_CHANNELS; k++ )
1835 : {
1836 4558453504 : foaCov[i][j] += tmpMtx[i][k] * mixMtx[j][k];
1837 : }
1838 : }
1839 : }
1840 :
1841 71225836 : return;
1842 : }
1843 :
1844 542703 : static void create_masa_ext_out_meta(
1845 : MASA_DECODER *hMasa,
1846 : IVAS_QMETADATA_HANDLE hQMetaData,
1847 : const int16_t nchan_transport )
1848 : {
1849 : int16_t i, sf, b_old, b_new, dir;
1850 : MASA_DECRIPTIVE_META *descMeta;
1851 : int16_t *bandMap;
1852 : uint8_t numCodingBands;
1853 : uint8_t numDirections;
1854 : MASA_DECODER_EXT_OUT_META *extOutMeta;
1855 :
1856 542703 : numDirections = hMasa->config.numberOfDirections;
1857 542703 : numCodingBands = hMasa->config.numCodingBands;
1858 542703 : bandMap = hMasa->data.band_mapping;
1859 542703 : extOutMeta = hMasa->data.extOutMeta;
1860 542703 : descMeta = &hMasa->data.extOutMeta->descriptiveMeta;
1861 :
1862 : /* Construct descriptive meta */
1863 4884327 : for ( i = 0; i < 8; i++ )
1864 : {
1865 4341624 : descMeta->formatDescriptor[i] = ivasmasaFormatDescriptor[i];
1866 : }
1867 542703 : descMeta->numberOfDirections = numDirections - 1;
1868 542703 : descMeta->numberOfChannels = (uint8_t) ( nchan_transport - 1 );
1869 : /* Following correspond to "unknown" values until transmission is implemented */
1870 542703 : descMeta->sourceFormat = 0x0u;
1871 542703 : descMeta->transportDefinition = 0x0u;
1872 542703 : descMeta->channelAngle = 0x0u;
1873 542703 : descMeta->channelDistance = 0x0u;
1874 542703 : descMeta->channelLayout = 0x0u;
1875 :
1876 : /* Construct spatial metadata from qmetadata */
1877 2713515 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
1878 : {
1879 4799572 : for ( dir = 0; dir < numDirections; dir++ )
1880 : {
1881 : /* Spherical index */
1882 32407360 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1883 : {
1884 92380972 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1885 : {
1886 62602372 : extOutMeta->directionIndex[dir][sf][b_new] = hQMetaData->q_direction[dir].band_data[b_old].spherical_index[sf];
1887 : }
1888 : }
1889 :
1890 : /* Direct-to-total ratio */
1891 32407360 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1892 : {
1893 92380972 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1894 : {
1895 62602372 : extOutMeta->directToTotalRatio[dir][sf][b_new] = (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
1896 : }
1897 : }
1898 :
1899 : /* Spread coherence */
1900 2628760 : if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
1901 : {
1902 28740808 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1903 : {
1904 75381896 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1905 : {
1906 48677584 : extOutMeta->spreadCoherence[dir][sf][b_new] = hQMetaData->q_direction[dir].coherence_band_data[b_old].spread_coherence[sf];
1907 : }
1908 : }
1909 : }
1910 : else
1911 : {
1912 14806600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1913 : {
1914 14214336 : extOutMeta->spreadCoherence[dir][sf][i] = 0;
1915 : }
1916 : }
1917 : }
1918 :
1919 : /* Fill second direction with zero energy data for EXT output */
1920 2170812 : if ( numDirections == 1 )
1921 : {
1922 42821600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1923 : {
1924 41108736 : extOutMeta->directionIndex[1][sf][i] = SPH_IDX_FRONT;
1925 : }
1926 :
1927 42821600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1928 : {
1929 41108736 : extOutMeta->directToTotalRatio[1][sf][i] = 0;
1930 : }
1931 :
1932 42821600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1933 : {
1934 41108736 : extOutMeta->spreadCoherence[1][sf][i] = 0;
1935 : }
1936 : }
1937 :
1938 : /* Common spatial meta */
1939 : /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */
1940 26289208 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1941 : {
1942 75730016 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1943 : {
1944 51611620 : extOutMeta->diffuseToTotalRatio[sf][b_new] = UINT8_MAX;
1945 114213992 : for ( dir = 0; dir < numDirections; dir++ )
1946 : {
1947 62602372 : extOutMeta->diffuseToTotalRatio[sf][b_new] -= (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
1948 : }
1949 : }
1950 : }
1951 :
1952 : /* Surround coherence */
1953 2170812 : if ( hQMetaData->surcoh_band_data != NULL )
1954 : {
1955 22622656 : for ( b_old = 0; b_old < numCodingBands; b_old++ )
1956 : {
1957 58730940 : for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
1958 : {
1959 37686832 : extOutMeta->surroundCoherence[sf][b_new] = hQMetaData->surcoh_band_data[b_old].surround_coherence[sf];
1960 : }
1961 : }
1962 : }
1963 : else
1964 : {
1965 14806600 : for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
1966 : {
1967 14214336 : extOutMeta->surroundCoherence[sf][i] = 0;
1968 : }
1969 : }
1970 : }
1971 :
1972 542703 : return;
1973 : }
1974 :
1975 422497 : static void decode_index_slice(
1976 : int16_t index, /* i : index to decode */
1977 : int16_t *ratio_idx_ism, /* o : decodec array of integers */
1978 : const int16_t nchan_ism, /* i : number of elements in array (objects) */
1979 : const int16_t K /* i : sum of array elements */
1980 : )
1981 : {
1982 : int16_t i, j, sum, elem;
1983 : int16_t base[MAX_NUM_OBJECTS];
1984 :
1985 422497 : switch ( nchan_ism )
1986 : {
1987 23563 : case 2:
1988 23563 : ratio_idx_ism[0] = index;
1989 23563 : ratio_idx_ism[1] = K - ratio_idx_ism[0];
1990 23563 : break;
1991 398934 : case 3:
1992 : case 4:
1993 : {
1994 398934 : j = 0;
1995 30959209 : while ( index >= 0 )
1996 : {
1997 30560275 : if ( valid_ratio_index( j, K, nchan_ism - 1 ) )
1998 : {
1999 10370154 : index--;
2000 : }
2001 30560275 : j++;
2002 : }
2003 398934 : j--;
2004 398934 : base[0] = 1;
2005 1086161 : for ( i = 1; i < nchan_ism - 1; i++ )
2006 : {
2007 687227 : base[i] = base[i - 1] * 10;
2008 : }
2009 398934 : sum = 0;
2010 1485095 : for ( i = nchan_ism - 2; i >= 0; i-- )
2011 : {
2012 1086161 : elem = j / base[i];
2013 1086161 : ratio_idx_ism[nchan_ism - i - 2] = elem;
2014 1086161 : sum += elem;
2015 1086161 : j -= elem * base[i];
2016 : }
2017 398934 : ratio_idx_ism[nchan_ism - 1] = K - sum;
2018 : }
2019 :
2020 398934 : default:
2021 398934 : break;
2022 : }
2023 :
2024 422497 : return;
2025 : }
2026 :
2027 :
2028 676276 : static void read_ism_ratio_index(
2029 : int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o : ISM read ratio indexes */
2030 : const int16_t nchan_ism, /* i : number of objects */
2031 : const int16_t numCodingBands, /* i : number of subbands */
2032 : const int16_t sf, /* i : index of subframe */
2033 : int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* i : previous subframe ISM ratio indexes */
2034 : uint16_t *bit_stream, /* i : bitstream */
2035 : int16_t *next_bit_pos, /* i/o: position in bitstream */
2036 : float *masa_to_total_energy_ratio, /* i : masa to total ratios */
2037 : const int16_t idx_sep_obj, /* i : index of separated index, -1 if none */
2038 : int16_t *num_zeros /* i/o: number of zero values in first subframe for separated object */
2039 : )
2040 : {
2041 : int16_t b, i, b_signif;
2042 : int16_t index;
2043 : int16_t GR_order, differential_subframe;
2044 : int16_t buf;
2045 : int16_t no_levels_ratio_ism;
2046 : int16_t bits_index;
2047 : int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS];
2048 : int16_t idx_sep_obj_local, shift_one;
2049 :
2050 676276 : idx_sep_obj_local = idx_sep_obj;
2051 676276 : if ( idx_sep_obj > -1 )
2052 : {
2053 676276 : if ( idx_sep_obj == nchan_ism - 1 && nchan_ism > 2 )
2054 : {
2055 175947 : idx_sep_obj_local = 0;
2056 : }
2057 : }
2058 :
2059 676276 : b_signif = 0;
2060 676276 : no_levels_ratio_ism = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 );
2061 1756554 : while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) )
2062 : {
2063 : /* distribute evenly the objects */
2064 1080278 : distribute_evenly_ism( ratio_ism_idx[b_signif], no_levels_ratio_ism, nchan_ism );
2065 1080278 : b_signif++;
2066 : }
2067 :
2068 676276 : if ( b_signif == numCodingBands )
2069 : {
2070 173972 : return;
2071 : }
2072 : else
2073 : {
2074 :
2075 502304 : if ( sf == 0 )
2076 : {
2077 171523 : bits_index = bits_index_ism_ratio( nchan_ism );
2078 :
2079 : /* read coding type */
2080 171523 : if ( bit_stream[( *next_bit_pos )--] == 1 )
2081 : {
2082 : /* independent coding*/
2083 409592 : for ( b = 0; b < numCodingBands; b++ )
2084 : {
2085 345334 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2086 : {
2087 315232 : index = 0;
2088 2428651 : for ( i = 0; i < bits_index; i++ )
2089 : {
2090 2113419 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2091 : }
2092 315232 : decode_index_slice( index, ratio_ism_idx[b], nchan_ism, no_levels_ratio_ism );
2093 315232 : if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
2094 : {
2095 287521 : ( *num_zeros )++;
2096 : }
2097 : }
2098 : else
2099 : {
2100 : /* distribute evenly the objects */
2101 30102 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2102 : }
2103 : }
2104 : }
2105 : else
2106 : {
2107 : /* differential coding */
2108 107265 : index = 0;
2109 746432 : for ( i = 0; i < bits_index; i++ )
2110 : {
2111 639167 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2112 : }
2113 107265 : decode_index_slice( index, ratio_ism_idx[b_signif], nchan_ism, no_levels_ratio_ism );
2114 107265 : if ( idx_sep_obj > -1 && ratio_ism_idx[b_signif][idx_sep_obj_local] == 0 )
2115 : {
2116 94795 : ( *num_zeros )++;
2117 : }
2118 107265 : mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
2119 781192 : for ( b = b_signif + 1; b < numCodingBands; b++ )
2120 : {
2121 673927 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2122 : {
2123 591529 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2124 2009740 : for ( i = 0; i < nchan_ism - 1; i++ )
2125 : {
2126 1418211 : buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, 0 );
2127 1418211 : if ( ( buf % 2 ) == 0 )
2128 : {
2129 1357013 : ratio_ism_idx[b][i] = -( buf >> 1 );
2130 : }
2131 : else
2132 : {
2133 61198 : ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
2134 : }
2135 1418211 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
2136 1418211 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2137 : }
2138 591529 : mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
2139 591529 : if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
2140 : {
2141 519834 : ( *num_zeros )++;
2142 : }
2143 : }
2144 : else
2145 : {
2146 : /* distribute evenly the objects */
2147 82398 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2148 : }
2149 : }
2150 : }
2151 : }
2152 : else
2153 : {
2154 330781 : if ( numCodingBands > 1 )
2155 : {
2156 : /* read prediction type */
2157 327477 : differential_subframe = bit_stream[( *next_bit_pos )--];
2158 : }
2159 : else
2160 : {
2161 3304 : differential_subframe = 1;
2162 : }
2163 :
2164 330781 : if ( *num_zeros == numCodingBands )
2165 : {
2166 228624 : shift_one = 1;
2167 : }
2168 : else
2169 : {
2170 102157 : shift_one = 0;
2171 : }
2172 :
2173 330781 : if ( shift_one == 1 && nchan_ism == 2 )
2174 : {
2175 : /* nothing has been sent ; values can be inferred */
2176 6360 : for ( b = b_signif; b < numCodingBands; b++ )
2177 : {
2178 3180 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2179 : {
2180 3180 : if ( idx_sep_obj_local == 0 )
2181 : {
2182 2931 : ratio_ism_idx[b][0] = 0;
2183 2931 : ratio_ism_idx[b][1] = 7;
2184 : }
2185 : else
2186 : {
2187 249 : ratio_ism_idx[b][0] = 7;
2188 249 : ratio_ism_idx[b][1] = 0;
2189 : }
2190 : }
2191 : }
2192 : }
2193 : else
2194 : {
2195 : /* read GR order */
2196 327601 : GR_order = bit_stream[( *next_bit_pos )--];
2197 1930426 : for ( b = b_signif; b < numCodingBands; b++ )
2198 : {
2199 1602825 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2200 : {
2201 4344487 : for ( i = 0; i < nchan_ism - 1 - shift_one; i++ )
2202 : {
2203 2854156 : buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, GR_order );
2204 2854156 : if ( ( buf % 2 ) == 0 )
2205 : {
2206 2439365 : ratio_ism_idx[b][i] = -( buf >> 1 );
2207 : }
2208 : else
2209 : {
2210 414791 : ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
2211 : }
2212 : }
2213 :
2214 : /* insert separated obj */
2215 1490331 : if ( shift_one )
2216 : {
2217 3722546 : for ( i = nchan_ism - 1; i > idx_sep_obj_local; i-- )
2218 : {
2219 2620024 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i - 1];
2220 : }
2221 1102522 : ratio_ism_idx[b][idx_sep_obj_local] = 0; /* this is only difference; need to pdate later as well */
2222 : }
2223 : }
2224 : }
2225 327601 : if ( differential_subframe )
2226 : {
2227 : /* differential to previous subframe */
2228 1752690 : for ( b = b_signif; b < numCodingBands; b++ )
2229 : {
2230 1455171 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2231 : {
2232 1362932 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2233 4985234 : for ( i = 0; i < nchan_ism - 1; i++ )
2234 : {
2235 3622302 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_prev_sf[b][i];
2236 3622302 : if ( shift_one && i == idx_sep_obj_local )
2237 : {
2238 1059352 : ratio_ism_idx[b][i] = 0;
2239 : }
2240 3622302 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2241 : }
2242 : }
2243 : else
2244 : {
2245 : /* distribute evenly the objects */
2246 92239 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2247 : }
2248 : }
2249 : }
2250 : else
2251 : {
2252 : /* difference to previous subband */
2253 30082 : ratio_ism_idx[b_signif][nchan_ism - 1] = no_levels_ratio_ism;
2254 :
2255 : /* first significant subband - differential to previous subframe */
2256 109252 : for ( i = 0; i < nchan_ism - 1; i++ )
2257 : {
2258 79170 : ratio_ism_idx[b_signif][i] = ratio_ism_idx[b_signif][i] + ratio_ism_idx_prev_sf[b_signif][i];
2259 79170 : if ( shift_one && i == idx_sep_obj_local )
2260 : {
2261 8993 : ratio_ism_idx[b_signif][i] = 0;
2262 : }
2263 79170 : ratio_ism_idx[b_signif][nchan_ism - 1] -= ratio_ism_idx[b_signif][i];
2264 : }
2265 :
2266 : /* rest of subbands differential to previous subband */
2267 30082 : mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
2268 147654 : for ( b = b_signif + 1; b < numCodingBands; b++ )
2269 : {
2270 117572 : if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
2271 : {
2272 97317 : ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
2273 352523 : for ( i = 0; i < nchan_ism - 1; i++ )
2274 : {
2275 255206 : ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
2276 255206 : if ( shift_one && i == idx_sep_obj_local )
2277 : {
2278 34177 : ratio_ism_idx[b][i] = 0;
2279 : }
2280 255206 : ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
2281 : }
2282 97317 : mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
2283 : }
2284 : else
2285 : {
2286 : /* distribute evenly the objects */
2287 20255 : distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
2288 : }
2289 : }
2290 : }
2291 : }
2292 : }
2293 :
2294 502304 : return;
2295 : }
2296 : }
2297 :
2298 :
2299 245050 : static void decode_ism_ratios(
2300 : uint16_t *bit_stream, /* i : bitstream */
2301 : int16_t *next_bit_pos, /* i/o: position in bitstream */
2302 : float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : masa_to_total energy ratios */
2303 : float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o : ISM ratios */
2304 : const int16_t n_ism, /* i : number of objects */
2305 : const int16_t nbands, /* i : number of subbands */
2306 : const int16_t numSf, /* i : number of subframes */
2307 : const int16_t idx_separated_object /* i : index of separated object */
2308 : )
2309 : {
2310 : int16_t sf, band;
2311 : int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
2312 : int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
2313 : float tmp;
2314 : int16_t num_zeros;
2315 245050 : num_zeros = 0;
2316 :
2317 : /* hQMetaData->q_direction->cfg.nblocks; */
2318 921326 : for ( sf = 0; sf < numSf; sf++ )
2319 : {
2320 : /* read ism ratio indexes */
2321 676276 : 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 );
2322 : /* save previous subframe index values */
2323 676276 : if ( sf < numSf - 1 )
2324 : {
2325 2565864 : for ( band = 0; band < nbands; band++ )
2326 : {
2327 2134638 : mvs2s( ratio_ism_idx[band], ratio_ism_idx_prev_sf[band], n_ism );
2328 : }
2329 : }
2330 :
2331 : /* reconstructed values */
2332 4482810 : for ( band = 0; band < nbands; band++ )
2333 : {
2334 3806534 : reconstruct_ism_ratios( ratio_ism_idx[band], n_ism, 1.0f / (float) ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ), ratio_ism[sf][band] );
2335 : }
2336 :
2337 676276 : if ( ( n_ism > 2 ) && ( idx_separated_object == n_ism - 1 ) )
2338 : {
2339 : /* rotate */
2340 1240559 : for ( band = 0; band < nbands; band++ )
2341 : {
2342 1064612 : if ( masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR )
2343 : {
2344 539473 : tmp = ratio_ism[sf][band][n_ism - 1];
2345 539473 : ratio_ism[sf][band][n_ism - 1] = ratio_ism[sf][band][0];
2346 539473 : ratio_ism[sf][band][0] = tmp;
2347 : }
2348 : }
2349 : }
2350 :
2351 676276 : if ( nbands == 1 )
2352 : {
2353 35820 : for ( band = 1; band < 5; band++ )
2354 : {
2355 28656 : mvr2r( ratio_ism[sf][0], ratio_ism[sf][band], n_ism );
2356 : }
2357 : }
2358 : }
2359 :
2360 245050 : if ( numSf == 1 )
2361 : {
2362 405232 : for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2363 : {
2364 3184974 : for ( band = 0; band < nbands; band++ )
2365 : {
2366 2881050 : mvr2r( ratio_ism[0][band], ratio_ism[sf][band], n_ism );
2367 : }
2368 : }
2369 : }
2370 :
2371 245050 : return;
2372 : }
2373 :
2374 :
2375 245050 : static int16_t ivas_decode_masaism_metadata(
2376 : IVAS_QMETADATA_HANDLE hQMetaData,
2377 : MASA_DECODER_HANDLE hMasa,
2378 : MASA_ISM_DATA_HANDLE hMasaIsmData,
2379 : const int16_t nchan_ism,
2380 : uint16_t *bit_stream,
2381 : int16_t *next_bit_pos,
2382 : const int16_t idx_separated_object,
2383 : const int16_t ism_imp,
2384 : const int16_t dirac_bs_md_write_idx,
2385 : const int16_t dirac_md_buffer_length )
2386 : {
2387 : int16_t sf, band, dir, nbands, nblocks, obj, i;
2388 : float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
2389 : int16_t *band_mapping;
2390 : int16_t b;
2391 : int16_t bits_ism[MAX_NUM_OBJECTS], index;
2392 : uint16_t idx_el, idx_az;
2393 : float azimuth, elevation;
2394 : int16_t nb_bits_read;
2395 : float delta_phi;
2396 : int16_t meta_write_index;
2397 :
2398 245050 : nb_bits_read = *next_bit_pos;
2399 245050 : nbands = hQMetaData->q_direction->cfg.nbands;
2400 245050 : nblocks = hQMetaData->q_direction->cfg.nblocks;
2401 :
2402 : /* Read MASA-to-total energy ratios */
2403 245050 : ivas_omasa_decode_masa_to_total( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, nbands, nblocks );
2404 245050 : if ( nchan_ism > 1 )
2405 : {
2406 : /* read ISM ratios */
2407 245050 : decode_ism_ratios( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, energy_ratio_ism, nchan_ism, nbands, nblocks, idx_separated_object );
2408 : }
2409 : else
2410 : {
2411 0 : for ( sf = 0; sf < nblocks; sf++ )
2412 : {
2413 0 : for ( band = 0; band < nbands; band++ )
2414 : {
2415 0 : energy_ratio_ism[sf][band][0] = 1.0f;
2416 : }
2417 : }
2418 : }
2419 :
2420 : /* read ISM metadata */
2421 245050 : calculate_nbits_meta( nchan_ism, energy_ratio_ism, hMasaIsmData->masa_to_total_energy_ratio, nblocks, nbands, bits_ism, idx_separated_object, ism_imp );
2422 :
2423 1067524 : for ( obj = 0; obj < nchan_ism; obj++ )
2424 : {
2425 822474 : hMasaIsmData->bits_ism[obj] = bits_ism[obj];
2426 822474 : index = 0;
2427 822474 : if ( bits_ism[obj] < 8 ) /* if low resolution, can look to the past */
2428 : {
2429 : /* read if same as previous */
2430 364371 : if ( bit_stream[( *next_bit_pos )--] )
2431 : {
2432 33010 : azimuth = hMasaIsmData->q_azimuth_old[obj];
2433 33010 : elevation = hMasaIsmData->q_elevation_old[obj];
2434 : }
2435 : else
2436 : {
2437 2148828 : for ( i = 0; i < bits_ism[obj]; i++ )
2438 : {
2439 1817467 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2440 : }
2441 331361 : deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
2442 :
2443 331361 : if ( azimuth * hMasaIsmData->q_azimuth_old[obj] > 0 )
2444 : {
2445 273099 : delta_phi = 180.0f / (float) ( no_phi_masa[bits_ism[obj] - 1][idx_el] ); /* 360/2*/
2446 : /* this is equivalent to testing if 'azimuth - hMasaIsmData->q_azimuth_old[obj] > delta_phi' with limited precision */
2447 273099 : if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( azimuth - hMasaIsmData->q_azimuth_old[obj] ) ) / 100.0f > 180.0f )
2448 : {
2449 17700 : azimuth -= delta_phi;
2450 : }
2451 : else
2452 : {
2453 : /* this is equivalent to testing if 'hMasaIsmData->q_azimuth_old[obj] - azimuth > delta_phi' with limited precision */
2454 255399 : if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( hMasaIsmData->q_azimuth_old[obj] - azimuth ) ) / 100.0f > 180.0f )
2455 : {
2456 17431 : azimuth += delta_phi;
2457 : }
2458 : }
2459 : }
2460 :
2461 331361 : hMasaIsmData->q_azimuth_old[obj] = azimuth;
2462 331361 : hMasaIsmData->q_elevation_old[obj] = elevation;
2463 : }
2464 : }
2465 : else
2466 : {
2467 5200653 : for ( i = 0; i < bits_ism[obj]; i++ )
2468 : {
2469 4742550 : index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
2470 : }
2471 458103 : deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
2472 458103 : hMasaIsmData->q_azimuth_old[obj] = azimuth;
2473 458103 : hMasaIsmData->q_elevation_old[obj] = elevation;
2474 : }
2475 :
2476 4112370 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2477 : {
2478 3289896 : meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
2479 3289896 : hMasaIsmData->azimuth_ism[obj][meta_write_index] = (int16_t) rint( azimuth );
2480 3289896 : hMasaIsmData->elevation_ism[obj][meta_write_index] = (int16_t) rint( elevation );
2481 : }
2482 : }
2483 :
2484 : /* Modify ISM metadata based on the MASA-to-total energy ratios */
2485 921326 : for ( sf = 0; sf < nblocks; sf++ )
2486 : {
2487 4482810 : for ( band = 0; band < nbands; band++ )
2488 : {
2489 17249282 : for ( dir = 0; dir < nchan_ism; dir++ )
2490 : {
2491 13442748 : energy_ratio_ism[sf][band][dir] *= ( 1.0f - hMasaIsmData->masa_to_total_energy_ratio[sf][band] );
2492 : }
2493 : }
2494 : }
2495 :
2496 : /* Set data to struct in bins */
2497 245050 : band_mapping = hMasa->data.band_mapping;
2498 1905198 : for ( band = 0; band < hMasa->config.numCodingBands; ++band )
2499 : {
2500 13892428 : for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b )
2501 : {
2502 61161400 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; ++sf )
2503 : {
2504 48929120 : if ( nblocks == 1 )
2505 : {
2506 21184320 : i = 0;
2507 : }
2508 : else
2509 : {
2510 27744800 : i = sf;
2511 : }
2512 :
2513 48929120 : meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
2514 :
2515 214604480 : for ( dir = 0; dir < nchan_ism; dir++ )
2516 : {
2517 165675360 : hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir];
2518 : }
2519 :
2520 48929120 : if ( hMasaIsmData->hExtData != NULL )
2521 : {
2522 1697280 : hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = hMasaIsmData->masa_to_total_energy_ratio[i][band];
2523 : }
2524 : }
2525 : }
2526 : }
2527 :
2528 245050 : return ( nb_bits_read - *next_bit_pos );
2529 : }
|