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