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 "prot.h"
36 : #include "ivas_prot.h"
37 : #ifdef DEBUGGING
38 : #include "debug.h"
39 : #endif
40 : #include "math.h"
41 : #include "ivas_rom_com.h"
42 : #include <assert.h>
43 : #include "wmc_auto.h"
44 :
45 : /*------------------------------------------------------------------------------------------*
46 : * PreProcessor
47 : *------------------------------------------------------------------------------------------*/
48 :
49 : static const float pr_boost_range[2] = { 0.1f, 0.4f };
50 :
51 : typedef enum ivas_strats_t
52 : {
53 : START,
54 : BASE,
55 : BASE_DIFF,
56 : BASE_NOEC,
57 : FOUR_A,
58 : FOUR_B,
59 : FOUR_C,
60 : FOUR_D,
61 : NO_STRAT
62 : } ivas_strats_t;
63 :
64 :
65 : /*------------------------------------------------------------------------------------------*
66 : * Static functions declaration
67 : *------------------------------------------------------------------------------------------*/
68 :
69 : static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t num_ch, int16_t *num_bands, int16_t red_band_fact );
70 :
71 : static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t bands_bw );
72 :
73 : static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t strat, const int32_t ivas_total_brate );
74 :
75 : static void ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp );
76 :
77 : static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const int16_t dmx_switch, const int16_t dtx_vad );
78 :
79 : static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t strat, const int16_t dtx_vad, const int16_t qsi );
80 :
81 : static void ivas_write_spar_md_bitstream( ivas_spar_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t strat, const int16_t qsi );
82 :
83 : static void ivas_spar_quant_pred_coeffs_dtx( ivas_spar_md_t *pSpar_md, const float *pValues, const int16_t ndm, int16_t *pIndex, const int16_t dim1, float *pQuant );
84 :
85 : static void ivas_quant_p_per_band_dtx( float *pP_mat, const int16_t num_dec, const int16_t num_dmx, int16_t *ppIdx_pd, float *pP_out, const int16_t num_ch );
86 :
87 : static void ivas_write_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, BSTR_ENC_HANDLE hMetaData, int16_t *num_dmx, int16_t *num_dec, const int16_t num_bands );
88 :
89 : static void ivas_quant_p_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch );
90 :
91 : static void ivas_quant_c_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t ndec, const int16_t ndm );
92 :
93 : static void ivas_quant_pred_coeffs_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch );
94 :
95 :
96 : /*-------------------------------------------------------------------------
97 : * ivas_spar_md_enc_open()
98 : *
99 : * Allocate and initialize SPAR MD encoder handle
100 : *------------------------------------------------------------------------*/
101 :
102 1636 : ivas_error ivas_spar_md_enc_open(
103 : ivas_spar_md_enc_state_t **hMdEnc_in, /* i/o: SPAR MD encoder handle */
104 : const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */
105 : const int16_t sba_order /* i : Ambisonic (SBA) order */
106 : )
107 : {
108 : ivas_spar_md_enc_state_t *hMdEnc;
109 : ivas_error error;
110 : int16_t num_channels, i, j;
111 1636 : error = IVAS_ERR_OK;
112 :
113 1636 : if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL )
114 : {
115 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" );
116 : }
117 :
118 1636 : num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate );
119 :
120 1636 : if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
121 : {
122 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" );
123 : }
124 1636 : if ( ( hMdEnc->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL )
125 : {
126 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
127 : }
128 9355 : for ( i = 0; i < num_channels; i++ )
129 : {
130 7719 : if ( ( hMdEnc->mixer_mat[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL )
131 : {
132 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
133 : }
134 49410 : for ( j = 0; j < num_channels; j++ )
135 : {
136 41691 : if ( ( hMdEnc->mixer_mat[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
137 : {
138 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
139 : }
140 : }
141 : }
142 :
143 1636 : if ( ( hMdEnc->mixer_mat_local = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL )
144 : {
145 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
146 : }
147 9355 : for ( i = 0; i < num_channels; i++ )
148 : {
149 7719 : if ( ( hMdEnc->mixer_mat_local[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL )
150 : {
151 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
152 : }
153 49410 : for ( j = 0; j < num_channels; j++ )
154 : {
155 41691 : if ( ( hMdEnc->mixer_mat_local[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
156 : {
157 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
158 : }
159 : }
160 : }
161 :
162 1636 : if ( ( error = ivas_spar_md_enc_init( hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK )
163 : {
164 0 : return error;
165 : }
166 :
167 1636 : *hMdEnc_in = hMdEnc;
168 :
169 1636 : return error;
170 : }
171 :
172 :
173 : /*-------------------------------------------------------------------------
174 : * ivas_spar_md_enc_close()
175 : *
176 : * Deallocate SPAR MD encoder handle
177 : *------------------------------------------------------------------------*/
178 :
179 1636 : void ivas_spar_md_enc_close(
180 : ivas_spar_md_enc_state_t **hMdEnc_in /* i/o: SPAR MD encoder handle */
181 : )
182 : {
183 : int16_t num_channels, i, j;
184 : ivas_spar_md_enc_state_t *hMdEnc;
185 :
186 1636 : if ( hMdEnc_in == NULL || *hMdEnc_in == NULL )
187 : {
188 0 : return;
189 : }
190 :
191 1636 : hMdEnc = *hMdEnc_in;
192 1636 : num_channels = hMdEnc->num_umx_ch;
193 :
194 1636 : if ( hMdEnc->spar_md.band_coeffs != NULL )
195 : {
196 1636 : free( hMdEnc->spar_md.band_coeffs );
197 1636 : hMdEnc->spar_md.band_coeffs = NULL;
198 : }
199 1636 : if ( hMdEnc->mixer_mat != NULL )
200 : {
201 9355 : for ( i = 0; i < num_channels; i++ )
202 : {
203 49410 : for ( j = 0; j < num_channels; j++ )
204 : {
205 41691 : free( hMdEnc->mixer_mat[i][j] );
206 : }
207 7719 : free( hMdEnc->mixer_mat[i] );
208 : }
209 1636 : free( hMdEnc->mixer_mat );
210 : }
211 :
212 1636 : if ( hMdEnc->mixer_mat_local != NULL )
213 : {
214 9355 : for ( i = 0; i < num_channels; i++ )
215 : {
216 :
217 49410 : for ( j = 0; j < num_channels; j++ )
218 : {
219 41691 : free( hMdEnc->mixer_mat_local[i][j] );
220 : }
221 7719 : free( hMdEnc->mixer_mat_local[i] );
222 : }
223 1636 : free( hMdEnc->mixer_mat_local );
224 : }
225 :
226 1636 : free( *hMdEnc_in );
227 1636 : *hMdEnc_in = NULL;
228 :
229 1636 : return;
230 : }
231 :
232 :
233 : /*-----------------------------------------------------------------------------------------*
234 : * Function ivas_spar_md_enc_init()
235 : *
236 : * SPAR MD encoder initialization
237 : *-----------------------------------------------------------------------------------------*/
238 :
239 1954 : ivas_error ivas_spar_md_enc_init(
240 : ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */
241 : const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */
242 : const int16_t sba_order /* i : Ambisonic (SBA) order */
243 : )
244 : {
245 : float pFC[IVAS_MAX_NUM_BANDS];
246 : int16_t table_idx;
247 : float PR_minmax[2];
248 : int16_t num_channels, i, j, k;
249 :
250 1954 : ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag );
251 1954 : num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate );
252 1954 : ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind );
253 1954 : table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
254 :
255 1954 : hMdEnc->spar_md.prior_dyn_active_w_flag = 0;
256 :
257 : #ifndef DEBUG_AGC_ENCODER_CMD_OPTION
258 1954 : ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND,
259 1954 : hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) );
260 : #else
261 : ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND,
262 : hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) );
263 : #endif
264 :
265 : /* get FB coefficients */
266 25402 : for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
267 : {
268 23448 : pFC[i] = ivas_fb_fcs_12band_1ms[i] * hEncoderConfig->input_Fs * 0.5f;
269 : }
270 :
271 1954 : ivas_spar_set_enc_config( hMdEnc, hMdEnc->spar_md_cfg.max_freq_per_chan, hMdEnc->spar_md_cfg.nchan_transport, pFC, num_channels );
272 :
273 1954 : if ( hMdEnc->spar_md_cfg.nchan_transport != 2 && ( ( hMdEnc->spar_md_cfg.remix_unmix_order == 1 ) || ( hMdEnc->spar_md_cfg.remix_unmix_order == 2 ) ) )
274 : {
275 0 : return IVAS_ERR_INTERNAL;
276 : }
277 :
278 1954 : ivas_spar_arith_coeffs_com_init( &hMdEnc->arith_coeffs, &hMdEnc->spar_md_cfg, table_idx, ENC );
279 1954 : ivas_spar_huff_coeffs_com_init( &hMdEnc->huff_coeffs, NULL, table_idx, ENC );
280 :
281 1954 : if ( hEncoderConfig->Opt_DTX_ON == 1 )
282 : {
283 : /* DTX quant init */
284 143 : PR_minmax[0] = hMdEnc->spar_md_cfg.quant_strat[0].PR.min;
285 143 : PR_minmax[1] = hMdEnc->spar_md_cfg.quant_strat[0].PR.max;
286 143 : ivas_spar_quant_dtx_init( &hMdEnc->spar_md, PR_minmax );
287 : }
288 :
289 1954 : hMdEnc->spar_md_cfg.prior_strat = START;
290 1954 : hMdEnc->spar_md_cfg.prev_quant_idx = -1;
291 :
292 10945 : for ( i = 0; i < num_channels; i++ )
293 : {
294 55770 : for ( j = 0; j < num_channels; j++ )
295 : {
296 608127 : for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
297 : {
298 561348 : hMdEnc->mixer_mat[i][j][k] = 0;
299 : }
300 : }
301 : }
302 :
303 1954 : ivas_clear_band_coeffs( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS );
304 1954 : ivas_clear_band_coeff_idx( hMdEnc->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
305 1954 : ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
306 1954 : ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS );
307 :
308 1954 : return IVAS_ERR_OK;
309 : }
310 :
311 :
312 : /*-----------------------------------------------------------------------------------------*
313 : * Function ivas_spar_set_enc_config()
314 : *
315 : * Set configuration for SPAR MD encoder
316 : *-----------------------------------------------------------------------------------------*/
317 :
318 1954 : static void ivas_spar_set_enc_config(
319 : ivas_spar_md_enc_state_t *hMdEnc,
320 : int16_t *max_freq_per_chan,
321 : const int16_t nchan_transport,
322 : float *pFC,
323 : const int16_t nchan_inp )
324 : {
325 : int16_t i, j;
326 : int16_t tmp_dmx_ch;
327 :
328 6363 : for ( i = 0; i < nchan_transport; i++ )
329 : {
330 4409 : if ( max_freq_per_chan != NULL )
331 : {
332 4409 : hMdEnc->spar_md_cfg.max_freq_per_chan[i] = ( max_freq_per_chan[i] != 0 ) ? max_freq_per_chan[i] : max_freq_per_chan[0];
333 : }
334 : else
335 : {
336 0 : hMdEnc->spar_md_cfg.max_freq_per_chan[i] = IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN;
337 : }
338 : }
339 1954 : hMdEnc->num_umx_ch = nchan_inp;
340 1954 : hMdEnc->num_decorr = nchan_inp - 1;
341 :
342 25402 : for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
343 : {
344 23448 : tmp_dmx_ch = 0;
345 76356 : for ( j = 0; j < nchan_transport; j++ )
346 : {
347 52908 : if ( pFC[i] < hMdEnc->spar_md_cfg.max_freq_per_chan[j] )
348 : {
349 52908 : tmp_dmx_ch += 1;
350 : }
351 : }
352 :
353 23448 : hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i] = tmp_dmx_ch;
354 23448 : hMdEnc->spar_md_cfg.num_decorr_per_band[i] = hMdEnc->num_umx_ch - tmp_dmx_ch;
355 : }
356 :
357 1954 : return;
358 : }
359 :
360 :
361 : /*-----------------------------------------------------------------------------------------*
362 : * Function ivas_band_limit_dmx_matrix()
363 : *
364 : * Band limit downmix matrix
365 : *-----------------------------------------------------------------------------------------*/
366 :
367 160553 : static void ivas_band_limit_dmx_matrix(
368 : ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */
369 : const int16_t num_ch,
370 : const int16_t num_bands,
371 : const int16_t bands_bw )
372 : {
373 : int16_t i, j, b, ndm;
374 :
375 1457983 : for ( b = 0; b < num_bands; b++ )
376 : {
377 1297430 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
378 :
379 4317504 : for ( i = ndm; i < num_ch; i++ )
380 : {
381 21806690 : for ( j = 0; j < num_ch; j++ )
382 : {
383 18786616 : hMdEnc->mixer_mat[i][j][b] = 0;
384 : }
385 : }
386 : }
387 :
388 160553 : return;
389 : }
390 :
391 :
392 : /*-----------------------------------------------------------------------------------------*
393 : * Function ivas_band_mixing()
394 : *
395 : * Band mixing downmix matrix
396 : *-----------------------------------------------------------------------------------------*/
397 :
398 16875 : static void ivas_band_mixing(
399 : ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */
400 : const int16_t num_ch,
401 : const int16_t num_bands,
402 : const int16_t nchan_transport,
403 : const int16_t upmixed_bands )
404 : {
405 : int16_t i, j, k, b;
406 : int16_t red_band_fact;
407 :
408 16875 : red_band_fact = upmixed_bands / num_bands;
409 :
410 35434 : for ( i = 0; i < nchan_transport; i++ )
411 : {
412 92795 : for ( j = 0; j < num_ch; j++ )
413 : {
414 327092 : for ( k = num_bands - 1; k >= 0; k-- )
415 : {
416 846744 : for ( b = red_band_fact - 1; b >= 0; b-- )
417 : {
418 593888 : hMdEnc->mixer_mat[i][j][red_band_fact * k + b] = hMdEnc->mixer_mat[i][j][k];
419 : }
420 : }
421 74236 : for ( k = red_band_fact * num_bands; k < upmixed_bands; k++ )
422 : {
423 0 : hMdEnc->mixer_mat[i][j][k] = hMdEnc->mixer_mat[i][j][( red_band_fact * num_bands ) - 1];
424 : }
425 : }
426 : }
427 16875 : return;
428 : }
429 :
430 :
431 : /*-----------------------------------------------------------------------------------------*
432 : * Function write_metadata_buffer()
433 : *
434 : *
435 : *-----------------------------------------------------------------------------------------*/
436 :
437 233535 : static void write_metadata_buffer(
438 : BSTR_ENC_HANDLE hMetaData_tmp,
439 : BSTR_ENC_HANDLE hMetaData,
440 : const int16_t bit_pos_start,
441 : const int16_t next_ind_start )
442 : {
443 : int16_t i;
444 :
445 233535 : if ( hMetaData->nb_bits_tot > 0 )
446 : {
447 233535 : restore_metadata_buffer( hMetaData, next_ind_start, bit_pos_start );
448 : }
449 :
450 37894885 : for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ )
451 : {
452 37661350 : push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits );
453 : }
454 :
455 233535 : return;
456 : }
457 :
458 :
459 : /*-----------------------------------------------------------------------------------------*
460 : * Function ivas_spar_md_enc_process()
461 : *
462 : * SPAR FoA Meta Data generation process
463 : *-----------------------------------------------------------------------------------------*/
464 :
465 159500 : ivas_error ivas_spar_md_enc_process(
466 : ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */
467 : const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */
468 : float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
469 : float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
470 : BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */
471 : const int16_t dtx_vad,
472 : const int16_t nchan_inp,
473 : const int16_t sba_order, /* i : Ambisonic (SBA) order */
474 : float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i : prior mixer_matrix */
475 : const int16_t dyn_active_w_flag, /* i : flag to indicate dynamic active W */
476 : const int16_t dirac_mono_flag /* i : flag to indicate mono only mode in SBA */
477 : )
478 : {
479 : float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
480 : float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
481 : int16_t i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats;
482 : float pred_coeffs_re_local[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
483 : int16_t k, bwidth, num_bands, num_bands_full, num_bands_bw;
484 : int16_t active_w, nchan_transport, dmx_switch, strat;
485 159500 : int16_t nB, bands_bw, packed_ok = 0;
486 : ivas_strats_t cs[MAX_CODING_STRATS];
487 : int16_t code_strat;
488 : int16_t bit_pos_start, next_ind_start;
489 : BSTR_ENC_DATA hMetaData_tmp;
490 : Indice *ind_list_tmp;
491 : int16_t md_indices_allocated;
492 : int16_t max_num_indices_tmp;
493 : float Wscale[IVAS_MAX_NUM_BANDS];
494 : float P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS - 1];
495 :
496 : /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/
497 159500 : md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS;
498 159500 : if ( ( ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ) ) == NULL )
499 : {
500 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder indices" );
501 : }
502 :
503 159500 : num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats;
504 159500 : num_ch = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate );
505 159500 : active_w = ( hMdEnc->spar_md_cfg.active_w == 1 ) || ( dyn_active_w_flag == 1 );
506 159500 : nchan_transport = hMdEnc->spar_md_cfg.nchan_transport;
507 :
508 159500 : bwidth = ivas_get_bw_idx_from_sample_rate( hEncoderConfig->input_Fs );
509 159500 : bwidth = min( bwidth, hEncoderConfig->max_bwidth );
510 : int16_t active_w_vlbr;
511 159500 : active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0;
512 159500 : num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW );
513 159500 : if ( hMdEnc->spar_hoa_md_flag == 0 )
514 : {
515 137460 : num_bands = min( num_bands, SPAR_DIRAC_SPLIT_START_BAND );
516 : }
517 159500 : num_bands_full = num_bands;
518 159500 : num_bands_bw = ivas_get_num_bands_from_bw_idx( bwidth );
519 :
520 159500 : if ( dtx_vad == 0 )
521 : {
522 19135 : for ( i = 0; i < nchan_inp; i++ )
523 : {
524 76540 : for ( j = 0; j < nchan_inp; j++ )
525 : {
526 61232 : cov_real[i][j] = cov_dtx_real[i][j];
527 : }
528 : }
529 : }
530 :
531 899700 : for ( i = 0; i < nchan_inp; i++ )
532 : {
533 4668660 : for ( j = 0; j < nchan_inp; j++ )
534 : {
535 4638420 : for ( k = num_bands_bw; k < IVAS_MAX_NUM_BANDS; k++ )
536 : {
537 709960 : cov_real[i][j][k] = 0;
538 : }
539 : }
540 : }
541 :
542 159500 : if ( hEncoderConfig->ivas_total_brate == BRATE_SPAR_Q_STRAT && sba_order == SBA_FOA_ORDER )
543 : {
544 : /* make sure that qsi is always 0 (temporary bits are '00') */
545 11620 : num_quant_strats = 1;
546 : }
547 :
548 159500 : hMetaData_tmp.ind_list = ind_list_tmp;
549 159500 : hMetaData_tmp.nb_bits_tot = 0;
550 159500 : max_num_indices_tmp = MAX_BITS_METADATA;
551 159500 : hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp;
552 159500 : hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list );
553 159500 : hMetaData_tmp.st_ivas = NULL;
554 :
555 : /* Save state of metadata bitstream buffer */
556 159500 : bit_pos_start = hMetaData->nb_bits_tot;
557 159500 : next_ind_start = hMetaData->nb_ind_tot;
558 :
559 159500 : dmx_switch = 0;
560 :
561 159500 : if ( dtx_vad == 0 )
562 : {
563 3827 : nB = SPAR_DTX_BANDS;
564 3827 : bands_bw = num_bands / nB;
565 :
566 3827 : ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw );
567 : }
568 155673 : else if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
569 : {
570 12661 : bands_bw = 2;
571 12661 : nB = num_bands / bands_bw;
572 :
573 12661 : ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw );
574 : }
575 : else
576 : {
577 143012 : nB = num_bands;
578 143012 : bands_bw = 1;
579 : }
580 159500 : if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
581 : {
582 60500 : for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
583 : {
584 193600 : for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
585 : {
586 145200 : pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i];
587 : }
588 : }
589 : }
590 :
591 159500 : if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
592 : {
593 121977 : for ( b = 0; b < num_bands * bands_bw; b++ )
594 : {
595 108424 : mvr2r( hMdEnc->spar_md.band_coeffs[b].P_quant_re, P_quant_re_prior[b], FOA_CHANNELS - 1 );
596 : }
597 : }
598 :
599 159500 : ivas_compute_spar_params( cov_real, dm_fv_re, 0, hMdEnc->mixer_mat, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0, dyn_active_w_flag );
600 :
601 159500 : if ( dirac_mono_flag )
602 : {
603 : int16_t i_ts;
604 0 : int16_t num_md_sub_frames = 1;
605 :
606 0 : ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0];
607 0 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0];
608 :
609 0 : for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
610 : {
611 0 : for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ )
612 : {
613 0 : for ( j = 0; j < ndm + ndec - 1; j++ )
614 : {
615 0 : hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = 0.0f;
616 : }
617 0 : for ( j = 0; j < ndec; j++ )
618 : {
619 0 : for ( k = 0; k < ndm - 1; k++ )
620 : {
621 0 : hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j][k] = 0.0f;
622 : }
623 : }
624 :
625 0 : for ( j = 0; j < ndec; j++ )
626 : {
627 0 : hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = 0.0f;
628 : }
629 : }
630 : }
631 : }
632 :
633 899700 : for ( i = 0; i < num_ch; i++ )
634 : {
635 4668660 : for ( j = 0; j < num_ch; j++ )
636 : {
637 41094844 : for ( b = 0; b < num_bands; b++ )
638 : {
639 37166384 : hMdEnc->mixer_mat_local[i][j][b] = hMdEnc->mixer_mat[i][j][b];
640 : }
641 : }
642 : }
643 : #ifdef DEBUG_LBR_SBA
644 : float dirac_md_kbps = (float) ( hMetaData->nb_bits_tot ) * 50 / 1000;
645 : #endif
646 159500 : code_strat = 0;
647 : #ifdef DEBUG_SBA_MD_DUMP
648 : ndec = -1;
649 : #endif
650 : #ifdef DEBUG_SPAR_MD_TARGET_TUNING
651 : for ( qsi = 0; qsi < 1; qsi++ )
652 : #else
653 160553 : for ( qsi = 0; qsi < num_quant_strats; qsi++ )
654 : #endif
655 : {
656 : #ifdef SPAR_HOA_DBG
657 : fprintf( stdout, "qsi = %d\n", qsi );
658 : #endif
659 1457983 : for ( b = 0; b < num_bands; b++ )
660 : {
661 1297430 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
662 1297430 : ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw];
663 :
664 1297430 : if ( dtx_vad == 1 )
665 : {
666 1289776 : if ( ndm != num_ch )
667 : {
668 1136736 : ivas_quant_p_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
669 : }
670 1289776 : ivas_quant_pred_coeffs_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
671 1289776 : if ( active_w_vlbr )
672 : {
673 208768 : for ( i = 0; i < 3; i++ )
674 : {
675 : int16_t i2;
676 156576 : i2 = 0;
677 156576 : switch ( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */
678 : {
679 52192 : case 0:
680 52192 : i2 = 0;
681 52192 : break;
682 52192 : case 1:
683 52192 : i2 = 2;
684 52192 : break;
685 52192 : case 2:
686 52192 : i2 = 1;
687 52192 : break;
688 : }
689 156576 : if ( ( hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] == 0 ) && ( hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i2] == 0 ) && ( hMdEnc->spar_md.band_coeffs[b].pred_re[i] != 0.0f ) && ( cov_real[i + 1][i + 1][b] != 0.0f ) )
690 : {
691 : /* bump up the Pred coeff */
692 : float PR_uq, PR_step;
693 : ivas_quant_strat_t qs;
694 3094 : qs = hMdEnc->spar_md_cfg.quant_strat[qsi];
695 3094 : PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re[i];
696 3094 : PR_step = ( qs.PR.max - qs.PR.min ) / ( qs.PR.q_levels[0] - 1 );
697 :
698 : int16_t PR_sign;
699 3094 : PR_sign = ( PR_uq > 0 ) - ( PR_uq < 0 );
700 :
701 3094 : hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign;
702 :
703 : /* deindex the modified coefficient */
704 3094 : hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = PR_sign * PR_step;
705 : }
706 : }
707 : }
708 : }
709 : else
710 : {
711 7654 : if ( ndm != num_ch )
712 : {
713 7654 : ivas_quant_p_per_band_dtx( hMdEnc->spar_md.band_coeffs[b].P_re, ndec, ndm, &hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[0], hMdEnc->spar_md.band_coeffs[b].P_quant_re, num_ch );
714 : }
715 :
716 30616 : for ( i = 0; i < num_ch - 1; i++ )
717 : {
718 22962 : hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0;
719 : }
720 7654 : ivas_spar_quant_pred_coeffs_dtx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, num_ch - 1, hMdEnc->spar_md.band_coeffs[b].pred_quant_re );
721 : }
722 : }
723 :
724 744412 : for ( i = 0; i < num_ch - 1; i++ )
725 : {
726 5702549 : for ( b = 0; b < num_bands; b++ )
727 : {
728 5118690 : pred_coeffs_re[i][b] = Wscale[b] * hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i];
729 : }
730 : }
731 :
732 160553 : if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
733 : {
734 60500 : for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
735 : {
736 193600 : for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
737 : {
738 : /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */
739 145200 : pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b];
740 145200 : hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0;
741 145200 : hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = 0;
742 : }
743 : }
744 : }
745 :
746 160553 : ivas_create_fullr_dmx_mat( pred_coeffs_re, dm_fv_re, hMdEnc->mixer_mat, num_ch, 0, num_bands, active_w, &hMdEnc->spar_md_cfg );
747 :
748 1457983 : for ( b = 0; b < num_bands; b++ )
749 : {
750 1297430 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
751 1297430 : ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw];
752 :
753 7713550 : for ( i = 0; i < num_ch; i++ )
754 : {
755 6416120 : hMdEnc->mixer_mat[0][i][b] *= Wscale[b];
756 : }
757 :
758 1297430 : if ( ( ndm != num_ch ) && ( ndm != 1 ) )
759 : {
760 848624 : ivas_calc_c_p_coeffs( &hMdEnc->spar_md, cov_real, 0, hMdEnc->mixer_mat, num_ch, ndm, b, dtx_vad, 0, dyn_active_w_flag );
761 :
762 848624 : if ( dirac_mono_flag )
763 : {
764 0 : ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0];
765 0 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0];
766 0 : for ( j = 0; j < ndec; j++ )
767 : {
768 0 : for ( k = 0; k < ndm - 1; k++ )
769 : {
770 0 : hMdEnc->spar_md.band_coeffs[b].C_re[j][k] = 0.0f;
771 : }
772 : }
773 : }
774 : #ifdef SPAR_HOA_DBG
775 : /*fprintf(stderr, "\n\n C coefficients: band %d\n", b);
776 :
777 : for (i = 0; i < num_ch - ndm; i++)
778 : {
779 : for (j = 0; j < ndm - 1; j++)
780 : {
781 : fprintf(stderr, "%f, ", hMdEnc->spar_md.band_coeffs[b].C_re[i][j]);
782 : }
783 : fprintf(stderr, "\n");
784 : }
785 : fprintf(stderr, "\n\n"); */
786 : #endif
787 :
788 848624 : ivas_quant_c_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b],
789 848624 : &hMdEnc->spar_md_cfg.quant_strat[qsi], ndec, ndm );
790 : }
791 : }
792 :
793 : /* band limit downmix matrix */
794 160553 : ivas_band_limit_dmx_matrix( hMdEnc, num_ch, num_bands, bands_bw );
795 :
796 : /* band mixing */
797 160553 : if ( bands_bw > 1 )
798 : {
799 16875 : ivas_band_mixing( hMdEnc, num_ch, num_bands, nchan_transport, num_bands_full );
800 : }
801 :
802 160553 : if ( dtx_vad == 0 )
803 : {
804 3827 : ivas_write_parameter_bitstream_dtx( &hMdEnc->spar_md, hMetaData, hMdEnc->spar_md_cfg.num_dmx_chans_per_band, hMdEnc->spar_md_cfg.num_decorr_per_band, num_bands );
805 3827 : break;
806 : }
807 :
808 156726 : ivas_select_next_strat( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad );
809 :
810 391736 : for ( i = 0; i < MAX_CODING_STRATS; i++ )
811 : {
812 357419 : strat = cs[i];
813 357419 : if ( strat != NO_STRAT )
814 : {
815 355397 : reset_indices_enc( &hMetaData_tmp, md_indices_allocated );
816 :
817 355397 : ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi );
818 :
819 : /*write to main buffer if its a valid bitstream*/
820 355397 : if ( hMetaData_tmp.nb_bits_tot > 0 )
821 : {
822 285486 : if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) )
823 : {
824 233535 : write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start );
825 233535 : code_strat = strat;
826 : }
827 :
828 285486 : if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk )
829 : {
830 122409 : packed_ok = 1;
831 122409 : break;
832 : }
833 : }
834 : }
835 : }
836 :
837 156726 : if ( packed_ok == 1 )
838 : {
839 122409 : break;
840 : }
841 :
842 : /*only if valid bitstream was written to main buffer*/
843 34317 : if ( hMetaData->nb_bits_tot > bit_pos_start )
844 : {
845 33264 : if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk )
846 : {
847 33264 : packed_ok = 1;
848 33264 : break;
849 : }
850 : }
851 : }
852 :
853 : #ifdef DEBUGGING
854 : if ( dtx_vad == 1 )
855 : {
856 : assert( packed_ok == 1 );
857 : }
858 : if ( hEncoderConfig->ivas_total_brate >= IVAS_256k )
859 : {
860 : assert( qsi == 0 );
861 : }
862 : #endif
863 :
864 : /* Reuse mixer matrix values for unsent bands */
865 159500 : if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
866 : {
867 65981 : for ( k = num_bands - 1; k >= 0; k-- )
868 : {
869 160852 : for ( b = bands_bw - 1; b >= 0; b-- )
870 : {
871 108424 : mvr2r( hMdEnc->spar_md.band_coeffs[k].P_quant_re, hMdEnc->spar_md.band_coeffs[bands_bw * k + b].P_quant_re, FOA_CHANNELS - 1 );
872 : }
873 : }
874 : }
875 :
876 159500 : if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) )
877 : {
878 36729 : for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw )
879 : {
880 24486 : if ( ( b == 0 ) && ( code_strat % 2 == 0 ) )
881 : {
882 6323 : b += 2;
883 : }
884 48972 : for ( i = 0; i < 1; i++ )
885 : {
886 122430 : for ( j = 0; j < 4; j++ )
887 : {
888 97944 : hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b];
889 97944 : hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1];
890 : }
891 : }
892 :
893 24486 : mvr2r( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re, FOA_CHANNELS - 1 );
894 24486 : mvr2r( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re, FOA_CHANNELS - 1 );
895 : }
896 : }
897 : #ifdef DEBUG_LBR_SBA
898 : char f_name[100];
899 : int16_t nbands = 1;
900 : int16_t num_subframes = 1;
901 : int16_t num_elements = 6;
902 : int16_t num_block_group = 1;
903 : int16_t byte_size = sizeof( float );
904 :
905 : float sba_md_kbps = (float) hMetaData->nb_bits_tot * 50 / 1000;
906 : float spar_md_kbps = sba_md_kbps - dirac_md_kbps;
907 : float corebr_kbps = (float) hEncoderConfig->ivas_total_brate / 1000 - sba_md_kbps;
908 :
909 : sprintf( f_name, "SBA_MD_bitrate.bin" );
910 : ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
911 : ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
912 : ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
913 : ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
914 : ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
915 :
916 : for ( b = 0; b < nbands; b++ )
917 : {
918 : for ( int16_t sf = 0; sf < num_subframes; sf++ )
919 : {
920 : for ( int16_t bl = 0; bl < num_block_group; bl++ )
921 : {
922 : float fqsi = (float) qsi;
923 : float fcode = (float) code_strat;
924 :
925 : dbgwrite( &dirac_md_kbps, byte_size, 1, 1, f_name );
926 : dbgwrite( &spar_md_kbps, byte_size, 1, 1, f_name );
927 : dbgwrite( &sba_md_kbps, byte_size, 1, 1, f_name );
928 : dbgwrite( &fqsi, byte_size, 1, 1, f_name );
929 : dbgwrite( &fcode, byte_size, 1, 1, f_name );
930 : dbgwrite( &corebr_kbps, byte_size, 1, 1, f_name );
931 : // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
932 : }
933 : }
934 : }
935 : #endif
936 : #ifdef SPAR_HOA_DBG
937 : /*if ( strat >= 4 )
938 : {
939 : for ( b = 0; b < nB; b++ )
940 : {
941 : b = 0;
942 : fprintf( stdout, "\n\nMETADATA PR: band %d, qsi %d\n\n", b, qsi );
943 : for ( i = 0; i < num_ch - 1; i++ )
944 : {
945 : fprintf( stdout, "i: %d -- %f\t %d\t %d\n", i, //hMdEnc->spar_md.band_coeffs[b].pred_re[i],
946 : hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i],
947 : hMdEnc->spar_md_prior.band_coeffs_idx[b].pred_index_re[i],
948 : hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] );
949 : }
950 : fprintf( stdout, "\n\n METADATA C: band %d\n\n", b );
951 : int16_t k = 0;
952 : for ( i = 0; i < ndec; i++ )
953 : {
954 : for ( j = 0; j < ( ndm - 1 ); j++ )
955 : {
956 : fprintf( stdout, "i: %d -- %f\t %d\t %d\n", i, // hMdEnc->spar_md.band_coeffs[b].C_re[i][j],
957 : hMdEnc->spar_md.band_coeffs[b].C_quant_re[i][j],
958 : hMdEnc->spar_md_prior.band_coeffs_idx[b].drct_index_re[k],
959 : hMdEnc->spar_md.band_coeffs_idx[b].drct_index_re[k] );
960 : k++;
961 : }
962 : }
963 : fprintf( stdout, "\n\n METADATA Pd: band %d\n\n", b );
964 : for ( i = 0; i < num_ch - ndm; i++ )
965 : {
966 : fprintf( stdout, "i: %d -- %f\t %d\t %d\n", i, //hMdEnc->spar_md.band_coeffs[b].P_re[i][i],
967 : hMdEnc->spar_md.band_coeffs[b].P_quant_re[i][i],
968 : hMdEnc->spar_md_prior.band_coeffs_idx[b].decd_index_re[i],
969 : hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i] );
970 : }
971 : fprintf( stdout, "\n\n" );
972 : }
973 : }*/
974 : b = 0;
975 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
976 :
977 : fprintf( stdout, "\n\n Metadata PR (15x1), C(15x15), P(15x15): band %d\n", b );
978 : for ( i = 0; i < num_ch - 1; i++ )
979 : {
980 : fprintf( stdout, "i: %d -- %.2f\t|\t", i, hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] );
981 : if ( i < num_ch - ndm )
982 : {
983 : for ( j = 0; j < ndm - 1; j++ )
984 : {
985 : fprintf( stdout, "%.2f\t", hMdEnc->spar_md.band_coeffs[b].C_quant_re[i][j] );
986 : }
987 : fprintf( stdout, "|\t" );
988 : for ( j = 0; j < num_ch - ndm; j++ )
989 : {
990 : fprintf( stdout, "%.2f\t", hMdEnc->spar_md.band_coeffs[b].P_quant_re[j] );
991 : }
992 : }
993 : fprintf( stdout, "\n" );
994 : }
995 : fprintf( stdout, "\n" );
996 : #endif
997 : #ifdef DEBUG_SBA_MD_DUMP
998 : {
999 : char f_name[100];
1000 : int16_t n_bands = 1, num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( int16_t );
1001 : sprintf( f_name, "spar_qsi.bin" );
1002 : ( frame == 0 ) ? dbgwrite( &n_bands, sizeof( nB ), 1, 1, f_name ) : false;
1003 : ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1004 : ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1005 : ( frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1006 : ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1007 : dbgwrite( &qsi, sizeof( int16_t ), 1, 1, f_name );
1008 : sprintf( f_name, "spar_strat.bin" );
1009 : ( frame == 0 ) ? dbgwrite( &n_bands, sizeof( nB ), 1, 1, f_name ) : false;
1010 : ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1011 : ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1012 : ( frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1013 : ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1014 : dbgwrite( &strat, sizeof( int16_t ), 1, 1, f_name );
1015 : byte_size = sizeof( float );
1016 : for ( b = 0; b < nB; b++ )
1017 : {
1018 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
1019 :
1020 : sprintf( f_name, "spar_band_pred_coeffs.bin" );
1021 : ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
1022 : num_elements = num_ch - 1;
1023 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1024 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1025 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1026 : ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1027 : for ( i = 0; i < num_ch - 1; i++ )
1028 : {
1029 : dbgwrite( &hMdEnc->spar_md.band_coeffs[b].pred_re[i], sizeof( float ), 1, 1, f_name );
1030 : }
1031 : sprintf( f_name, "spar_band_C_coeffs.bin" );
1032 : ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
1033 : num_elements = ndec * ( ndm - 1 );
1034 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1035 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1036 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1037 : ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1038 : for ( i = 0; i < ndec; i++ )
1039 : {
1040 : for ( j = 0; j < ( ndm - 1 ); j++ )
1041 : {
1042 : dbgwrite( &hMdEnc->spar_md.band_coeffs[b].C_re[i][j], sizeof( float ), 1, 1, f_name );
1043 : }
1044 : }
1045 : sprintf( f_name, "spar_band_P_coeffs.bin" );
1046 : ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
1047 : num_elements = num_ch - ndm;
1048 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1049 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1050 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1051 : ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1052 : for ( i = 0; i < num_ch - ndm; i++ )
1053 : {
1054 : dbgwrite( &hMdEnc->spar_md.band_coeffs[b].P_re[i], sizeof( float ), 1, 1, f_name );
1055 : }
1056 : sprintf( f_name, "spar_band_pred_coeffs_quant.bin" );
1057 : ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
1058 : num_elements = num_ch - 1;
1059 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1060 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1061 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1062 : ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1063 : for ( i = 0; i < num_ch - 1; i++ )
1064 : {
1065 : dbgwrite( &hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i], sizeof( float ), 1, 1, f_name );
1066 : }
1067 : sprintf( f_name, "spar_band_C_coeffs_quant.bin" );
1068 : ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
1069 : num_elements = ndec * ( ndm - 1 );
1070 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1071 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1072 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1073 : ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1074 : for ( i = 0; i < ndec; i++ )
1075 : {
1076 : for ( j = 0; j < ( ndm - 1 ); j++ )
1077 : {
1078 : dbgwrite( &hMdEnc->spar_md.band_coeffs[b].C_quant_re[i][j], sizeof( float ), 1, 1, f_name );
1079 : }
1080 : }
1081 : sprintf( f_name, "spar_band_P_coeffs_quant.bin" );
1082 : ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
1083 : num_elements = num_ch - ndm;
1084 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
1085 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
1086 : ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
1087 : ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
1088 : for ( i = 0; i < num_ch - ndm; i++ )
1089 : {
1090 : dbgwrite( &hMdEnc->spar_md.band_coeffs[b].P_quant_re[i], sizeof( float ), 1, 1, f_name );
1091 : }
1092 : }
1093 : }
1094 : #endif
1095 : #ifdef DEBUG_SPAR_MD_TARGET_TUNING
1096 : int16_t md_bits = hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 );
1097 : FILE *fp = fopen( "spar_md_bitrate.txt", "a" );
1098 :
1099 : fprintf( fp, "%d\t %d \t %d\n", md_bits, qsi, code_strat );
1100 : fclose( fp );
1101 : #endif
1102 :
1103 159500 : ivas_store_prior_coeffs( hMdEnc, num_bands, code_strat, dtx_vad, qsi );
1104 :
1105 159500 : hMdEnc->spar_md.dtx_vad = dtx_vad;
1106 159500 : hMdEnc->spar_md.num_bands = num_bands;
1107 :
1108 159500 : free( ind_list_tmp );
1109 :
1110 159500 : return IVAS_ERR_OK;
1111 : }
1112 :
1113 :
1114 : /*-----------------------------------------------------------------------------------------*
1115 : * Function ivas_band_mixer()
1116 : *
1117 : * band mixer
1118 : *-----------------------------------------------------------------------------------------*/
1119 :
1120 16488 : static void ivas_band_mixer(
1121 : float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
1122 : const int16_t num_ch,
1123 : int16_t *num_bands,
1124 : int16_t red_band_fact )
1125 : {
1126 : int16_t i, j, k, b, orig_band, rem_band;
1127 : float avg_cov;
1128 :
1129 16488 : orig_band = *num_bands;
1130 16488 : *num_bands /= red_band_fact;
1131 16488 : rem_band = orig_band - ( *num_bands * red_band_fact );
1132 :
1133 82440 : for ( i = 0; i < num_ch; i++ )
1134 : {
1135 329760 : for ( j = 0; j < num_ch; j++ )
1136 : {
1137 932768 : for ( k = 0; k < *num_bands - 1; k++ )
1138 : {
1139 668960 : avg_cov = 0.0f;
1140 2129344 : for ( b = 0; b < red_band_fact; b++ )
1141 : {
1142 1460384 : avg_cov += cov_real[i][j][red_band_fact * k + b];
1143 : }
1144 668960 : cov_real[i][j][k] = avg_cov;
1145 : }
1146 :
1147 263808 : avg_cov = 0.0f;
1148 913888 : for ( b = 0; b < red_band_fact + rem_band; b++ )
1149 : {
1150 650080 : avg_cov += cov_real[i][j][red_band_fact * ( *num_bands - 1 ) + b];
1151 : }
1152 :
1153 263808 : cov_real[i][j][*num_bands - 1] = avg_cov;
1154 : }
1155 : }
1156 :
1157 16488 : return;
1158 : }
1159 :
1160 :
1161 : /*-----------------------------------------------------------------------------------------*
1162 : * Function ivas_write_spar_md_bitstream()
1163 : *
1164 : * Write MD parameters into bitstream
1165 : *-----------------------------------------------------------------------------------------*/
1166 :
1167 355397 : static void ivas_write_spar_md_bitstream(
1168 : ivas_spar_md_enc_state_t *hMdEnc,
1169 : const int16_t nB,
1170 : const int16_t bands_bw,
1171 : BSTR_ENC_HANDLE hMetaData,
1172 : const int32_t ivas_total_brate,
1173 : const int16_t strat,
1174 : const int16_t qsi )
1175 : {
1176 : int16_t no_ec, i;
1177 : int16_t do_diff[IVAS_MAX_NUM_BANDS];
1178 : int16_t entropy_coding_result;
1179 :
1180 355397 : if ( strat == NO_STRAT )
1181 : {
1182 0 : return;
1183 : }
1184 :
1185 : /* write quant strat */
1186 355397 : if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT )
1187 : {
1188 43707 : push_next_indice( hMetaData, qsi >> 1, hMdEnc->spar_md_cfg.quant_strat_bits - 1 );
1189 : }
1190 : else
1191 : {
1192 311690 : push_next_indice( hMetaData, qsi, hMdEnc->spar_md_cfg.quant_strat_bits );
1193 : }
1194 :
1195 355397 : no_ec = 0;
1196 :
1197 355397 : if ( ivas_total_brate < IVAS_24k4 )
1198 : {
1199 38339 : switch ( strat )
1200 : {
1201 13048 : case BASE:
1202 13048 : push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
1203 13048 : break;
1204 13048 : case BASE_NOEC:
1205 13048 : push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
1206 13048 : no_ec = 1;
1207 13048 : break;
1208 12243 : case FOUR_A:
1209 : case FOUR_C:
1210 : case FOUR_B:
1211 : case FOUR_D:
1212 12243 : push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS );
1213 12243 : break;
1214 : }
1215 : /* for LBR SBA 40MS MD never do time diff */
1216 191695 : for ( i = 0; i < nB; i++ )
1217 : {
1218 153356 : do_diff[i] = 0;
1219 : }
1220 : }
1221 : else
1222 : {
1223 317058 : switch ( strat )
1224 : {
1225 143678 : case BASE:
1226 143678 : push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
1227 1381262 : for ( i = 0; i < nB; i++ )
1228 : {
1229 1237584 : do_diff[i] = 0;
1230 : }
1231 143678 : break;
1232 88567 : case BASE_NOEC:
1233 88567 : push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
1234 797103 : for ( i = 0; i < nB; i++ )
1235 : {
1236 708536 : do_diff[i] = 0;
1237 : }
1238 88567 : no_ec = 1;
1239 88567 : break;
1240 23983 : case FOUR_A:
1241 23983 : push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS );
1242 215847 : for ( i = 0; i < nB; i++ )
1243 : {
1244 191864 : do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 );
1245 : }
1246 23983 : ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
1247 23983 : break;
1248 21535 : case FOUR_B:
1249 21535 : push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS );
1250 193815 : for ( i = 0; i < nB; i++ )
1251 : {
1252 172280 : do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 );
1253 : }
1254 21535 : ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
1255 21535 : break;
1256 20151 : case FOUR_C:
1257 20151 : push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS );
1258 181359 : for ( i = 0; i < nB; i++ )
1259 : {
1260 161208 : do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 );
1261 : }
1262 20151 : ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
1263 20151 : break;
1264 19144 : case FOUR_D:
1265 19144 : push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS );
1266 172296 : for ( i = 0; i < nB; i++ )
1267 : {
1268 153152 : do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 );
1269 : }
1270 19144 : ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
1271 19144 : break;
1272 : }
1273 355397 : }
1274 :
1275 : #ifdef SPAR_HOA_DBG
1276 : if ( strat < 2 )
1277 : fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat - 1 );
1278 : else
1279 : fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat );
1280 : #endif
1281 355397 : if ( no_ec == 1 )
1282 : {
1283 : entropy_coding_result =
1284 101615 : ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi,
1285 : bands_bw );
1286 : }
1287 : else
1288 : {
1289 : entropy_coding_result =
1290 253782 : ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi,
1291 : strat, ivas_total_brate );
1292 : }
1293 :
1294 355397 : if ( entropy_coding_result < 0 )
1295 : {
1296 69911 : hMetaData->nb_bits_tot = 0;
1297 : }
1298 :
1299 355397 : return;
1300 : }
1301 :
1302 :
1303 : /*-----------------------------------------------------------------------------------------*
1304 : * Function ivas_get_huffman_coded_bs()
1305 : *
1306 : * Generate huffman coded bitstream
1307 : *-----------------------------------------------------------------------------------------*/
1308 101615 : static int16_t ivas_get_huffman_coded_bs(
1309 : ivas_spar_md_enc_state_t *hMdEnc,
1310 : BSTR_ENC_HANDLE hMetaData,
1311 : const int16_t nB,
1312 : const int16_t qsi,
1313 : const int16_t bands_bw )
1314 : {
1315 : int16_t i, j;
1316 : int16_t pred_coeff_dim, pred_offset;
1317 :
1318 813402 : for ( i = 0; i < nB; i++ )
1319 : {
1320 : int16_t code, len;
1321 : int16_t ndm, ndec;
1322 754280 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw];
1323 754280 : ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw];
1324 :
1325 754280 : pred_coeff_dim = ndm + ndec - 1;
1326 754280 : pred_offset = 0;
1327 754280 : if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
1328 : {
1329 0 : if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
1330 : {
1331 0 : pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS;
1332 : }
1333 : }
1334 :
1335 2982295 : for ( j = pred_offset; j < pred_coeff_dim; j++ )
1336 : {
1337 2249035 : ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len );
1338 2249035 : if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
1339 : {
1340 42493 : return -1;
1341 : }
1342 2228015 : push_next_indice( hMetaData, code, len );
1343 : }
1344 :
1345 1628693 : for ( j = 0; j < ndec * ( ndm - 1 ); j++ )
1346 : {
1347 902449 : ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len );
1348 902449 : if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
1349 : {
1350 7016 : return -1;
1351 : }
1352 895433 : push_next_indice( hMetaData, code, len );
1353 : }
1354 :
1355 2193285 : for ( j = 0; j < ndec; j++ )
1356 : {
1357 1481498 : ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len );
1358 1481498 : if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
1359 : {
1360 14457 : return -1;
1361 : }
1362 1467041 : push_next_indice( hMetaData, code, len );
1363 : }
1364 : }
1365 :
1366 59122 : return 0;
1367 : }
1368 :
1369 :
1370 : /*-----------------------------------------------------------------------------------------*
1371 : * Function ivas_get_arith_coded_bs()
1372 : *
1373 : * Generate arithmetic coded bitstream
1374 : *-----------------------------------------------------------------------------------------*/
1375 253782 : static int16_t ivas_get_arith_coded_bs(
1376 : ivas_spar_md_enc_state_t *hMdEnc,
1377 : BSTR_ENC_HANDLE hMetaData,
1378 : const int16_t *pDo_diff,
1379 : const int16_t bands_bw,
1380 : const int16_t nB,
1381 : const int16_t qsi,
1382 : const int16_t strat,
1383 : const int32_t ivas_total_brate )
1384 : {
1385 : int16_t i, any_diff;
1386 : int16_t j;
1387 : ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS];
1388 : ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS];
1389 : ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS];
1390 : ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS];
1391 : int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN];
1392 : int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN];
1393 : int16_t arith_result;
1394 :
1395 2271034 : for ( i = 0; i < nB; i++ )
1396 : {
1397 : int16_t ndm, ndec;
1398 2017252 : ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i];
1399 2017252 : ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i];
1400 :
1401 2017252 : if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) )
1402 : {
1403 24486 : pred_cell_dims[i].dim1 = 0;
1404 24486 : pred_cell_dims[i].dim2 = 0;
1405 24486 : drct_cell_dims[i].dim1 = 0;
1406 24486 : drct_cell_dims[i].dim2 = 0;
1407 24486 : decd_cell_dims[i].dim1 = 0;
1408 24486 : decd_cell_dims[i].dim2 = 0;
1409 24486 : decx_cell_dims[i].dim1 = 0;
1410 24486 : decx_cell_dims[i].dim2 = 0;
1411 : }
1412 : else
1413 : {
1414 1992766 : pred_cell_dims[i].dim1 = ndm + ndec - 1;
1415 1992766 : if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
1416 : {
1417 145200 : if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
1418 : {
1419 48400 : pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 );
1420 : }
1421 : }
1422 1992766 : pred_cell_dims[i].dim2 = 1;
1423 1992766 : drct_cell_dims[i].dim1 = ndec;
1424 1992766 : drct_cell_dims[i].dim2 = ndm - 1;
1425 1992766 : decd_cell_dims[i].dim1 = ndec;
1426 1992766 : decd_cell_dims[i].dim2 = 1;
1427 1992766 : decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1;
1428 1992766 : decx_cell_dims[i].dim2 = 1;
1429 : }
1430 : }
1431 :
1432 253782 : any_diff = 0;
1433 1614065 : for ( i = 0; i < nB; i++ )
1434 : {
1435 1445096 : if ( pDo_diff[i] != 0 )
1436 : {
1437 84813 : any_diff = 1;
1438 84813 : break;
1439 : }
1440 : }
1441 253782 : if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
1442 : {
1443 157300 : for ( i = 0; i < nB; i++ )
1444 : {
1445 145200 : if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
1446 : {
1447 196960 : for ( j = 0; j < pred_cell_dims[i].dim1; j++ )
1448 : {
1449 148560 : hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] =
1450 148560 : hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
1451 :
1452 148560 : if ( any_diff == 1 )
1453 : {
1454 0 : hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] =
1455 0 : hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
1456 : }
1457 : }
1458 : }
1459 : }
1460 : }
1461 253782 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF );
1462 :
1463 253782 : if ( any_diff == 1 )
1464 : {
1465 84813 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF );
1466 : }
1467 :
1468 253782 : arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB,
1469 253782 : symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
1470 253782 : if ( arith_result < 0 )
1471 : {
1472 969 : return -1;
1473 : }
1474 :
1475 252813 : if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
1476 : {
1477 157300 : for ( i = 0; i < nB; i++ )
1478 : {
1479 145200 : if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
1480 : {
1481 196960 : for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- )
1482 : {
1483 148560 : hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] =
1484 148560 : hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j];
1485 : }
1486 193600 : for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ )
1487 : {
1488 145200 : hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0;
1489 : }
1490 : }
1491 : }
1492 : }
1493 :
1494 252813 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF );
1495 :
1496 252813 : if ( any_diff == 1 )
1497 : {
1498 84813 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, drct_cell_dims, DRCT_COEFF );
1499 : }
1500 :
1501 :
1502 252813 : arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB,
1503 252813 : symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
1504 252813 : if ( arith_result < 0 )
1505 : {
1506 4 : return -1;
1507 : }
1508 :
1509 252809 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF );
1510 :
1511 252809 : if ( any_diff == 1 )
1512 : {
1513 84809 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decd_cell_dims, DECD_COEFF );
1514 : }
1515 :
1516 252809 : arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB,
1517 252809 : symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
1518 252809 : if ( arith_result < 0 )
1519 : {
1520 26445 : return -1;
1521 : }
1522 :
1523 226364 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF );
1524 :
1525 226364 : if ( any_diff == 1 )
1526 : {
1527 83873 : ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF );
1528 : }
1529 :
1530 226364 : return 0;
1531 : }
1532 :
1533 :
1534 : /*-----------------------------------------------------------------------------------------*
1535 : * Function ivas_select_next_strat()
1536 : *
1537 : * Select next strategy
1538 : *-----------------------------------------------------------------------------------------*/
1539 :
1540 156726 : static void ivas_select_next_strat(
1541 : ivas_strats_t prior_strat,
1542 : ivas_strats_t cs[MAX_QUANT_STRATS],
1543 : const int16_t dmx_switch,
1544 : const int16_t dtx_vad )
1545 : {
1546 156726 : cs[0] = BASE;
1547 156726 : cs[1] = BASE_NOEC;
1548 156726 : if ( dmx_switch == 0 && dtx_vad )
1549 : {
1550 156726 : switch ( prior_strat )
1551 : {
1552 2607 : case START:
1553 2607 : cs[2] = NO_STRAT;
1554 2607 : break;
1555 58087 : case BASE:
1556 58087 : cs[2] = FOUR_A;
1557 58087 : break;
1558 0 : case BASE_DIFF:
1559 0 : cs[2] = FOUR_A;
1560 0 : break;
1561 2877 : case BASE_NOEC:
1562 2877 : cs[2] = FOUR_A;
1563 2877 : break;
1564 25276 : case FOUR_A:
1565 25276 : cs[2] = FOUR_B;
1566 25276 : break;
1567 23629 : case FOUR_B:
1568 23629 : cs[2] = FOUR_C;
1569 23629 : break;
1570 22567 : case FOUR_C:
1571 22567 : cs[2] = FOUR_D;
1572 22567 : break;
1573 21683 : case FOUR_D:
1574 21683 : cs[2] = FOUR_A;
1575 21683 : break;
1576 0 : default:
1577 0 : assert( !"bad value of prior_strat" );
1578 : }
1579 0 : }
1580 :
1581 156726 : return;
1582 : }
1583 :
1584 :
1585 : /*-----------------------------------------------------------------------------------------*
1586 : * Function ivas_store_prior_coeffs()
1587 : *
1588 : * Store prior coeffs
1589 : *-----------------------------------------------------------------------------------------*/
1590 :
1591 159500 : static void ivas_store_prior_coeffs(
1592 : ivas_spar_md_enc_state_t *hMdEnc,
1593 : const int16_t num_bands,
1594 : const int16_t strat,
1595 : const int16_t dtx_vad,
1596 : const int16_t qsi )
1597 : {
1598 : int16_t i, j, b;
1599 159500 : if ( dtx_vad == 0 )
1600 : {
1601 3827 : hMdEnc->spar_md_cfg.prior_strat = START;
1602 : }
1603 : else
1604 : {
1605 155673 : hMdEnc->spar_md_cfg.prior_strat = strat;
1606 : }
1607 :
1608 159500 : hMdEnc->spar_md_cfg.prev_quant_idx = qsi;
1609 :
1610 1450054 : for ( i = 0; i < num_bands; i++ )
1611 : {
1612 1290554 : b = i;
1613 :
1614 14196094 : for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
1615 : {
1616 12905540 : hMdEnc->spar_md_prior.band_coeffs_idx[i].pred_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[j];
1617 12905540 : hMdEnc->spar_md_prior.band_coeffs_idx[i].decd_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[j];
1618 : }
1619 28392188 : for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ )
1620 : {
1621 27101634 : hMdEnc->spar_md_prior.band_coeffs_idx[i].drct_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].drct_index_re[j];
1622 : }
1623 : }
1624 :
1625 159500 : return;
1626 : }
1627 :
1628 :
1629 : /*-----------------------------------------------------------------------------------------*
1630 : * Function ivas_spar_quant_pred_coeffs_dtx()
1631 : *
1632 : * Calculate quantization pred coeffs
1633 : *-----------------------------------------------------------------------------------------*/
1634 :
1635 7654 : static void ivas_spar_quant_pred_coeffs_dtx(
1636 : ivas_spar_md_t *pSpar_md,
1637 : const float *pValues,
1638 : const int16_t ndm,
1639 : int16_t *pIndex,
1640 : const int16_t dim1,
1641 : float *pQuant )
1642 : {
1643 : int16_t i;
1644 : int16_t q_lvl;
1645 : float pr_min_max[2];
1646 :
1647 7654 : pr_min_max[0] = pSpar_md->min_max[0];
1648 7654 : pr_min_max[1] = pSpar_md->min_max[1];
1649 :
1650 30616 : for ( i = 0; i < dim1; i++ )
1651 : {
1652 22962 : q_lvl = dtx_pr_real_q_levels[ndm - 1][i];
1653 22962 : ivas_quantise_real_values( &pValues[i], q_lvl, pr_min_max[0], pr_min_max[1], &pIndex[i], &pQuant[i], 1 );
1654 : }
1655 :
1656 7654 : return;
1657 : }
1658 :
1659 :
1660 : /*-----------------------------------------------------------------------------------------*
1661 : * Function ivas_quant_p_per_band_dtx()
1662 : *
1663 : * Calculate quantization p
1664 : *-----------------------------------------------------------------------------------------*/
1665 :
1666 7654 : static void ivas_quant_p_per_band_dtx(
1667 : float *pP_mat,
1668 : const int16_t num_dec,
1669 : const int16_t num_dmx,
1670 : int16_t *ppIdx_pd,
1671 : float *pP_out,
1672 : const int16_t num_ch )
1673 : {
1674 : int16_t i;
1675 7654 : int16_t dim = num_ch - num_dmx;
1676 :
1677 7654 : if ( num_dec == num_ch - 1 )
1678 : {
1679 17144 : for ( i = 0; i < dim; i++ )
1680 : {
1681 12858 : if ( pP_mat[i] < pr_boost_range[1] && pP_mat[i] > pr_boost_range[0] )
1682 : {
1683 5565 : pP_mat[i] = pr_boost_range[1];
1684 : }
1685 : }
1686 : }
1687 :
1688 7654 : if ( dim != num_dec )
1689 : {
1690 0 : assert( !"Not Supported!" );
1691 : }
1692 :
1693 27248 : for ( i = 0; i < dim; i++ )
1694 : {
1695 19594 : ivas_quantise_real_values( &pP_mat[i], dtx_pd_real_q_levels[num_ch - num_dec - 1][i], dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &ppIdx_pd[i], &pP_out[i], 1 );
1696 : }
1697 :
1698 7654 : return;
1699 : }
1700 :
1701 : /*-----------------------------------------------------------------------------------------*
1702 : * Function ivas_write_parameter_bitstream_dtx()
1703 : *
1704 : * Write MD DTX parameters into bitstream
1705 : *-----------------------------------------------------------------------------------------*/
1706 :
1707 3827 : static void ivas_write_parameter_bitstream_dtx(
1708 : ivas_spar_md_t *pSpar_md,
1709 : BSTR_ENC_HANDLE hMetaData,
1710 : int16_t *num_dmx,
1711 : int16_t *num_dec,
1712 : const int16_t num_bands )
1713 : {
1714 : int16_t i, j;
1715 : float val;
1716 : int16_t idx;
1717 : float pr_min_max[2];
1718 : int16_t zero_pad_bits, sid_bits_len;
1719 : int16_t sba_spar_bitlen;
1720 :
1721 3827 : sid_bits_len = hMetaData->nb_bits_tot;
1722 3827 : pr_min_max[0] = pSpar_md->min_max[0];
1723 3827 : pr_min_max[1] = pSpar_md->min_max[1];
1724 :
1725 11481 : for ( i = 0; i < num_bands; i++ )
1726 : {
1727 7654 : int16_t ndm = num_dmx[i];
1728 7654 : int16_t ndec = num_dec[i];
1729 :
1730 30616 : for ( j = 0; j < FOA_CHANNELS - 1; j++ )
1731 : {
1732 : int16_t pr, pd;
1733 : int16_t pr_q_lvls, pd_q_lvls, pr_pd_bits;
1734 : int16_t pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2;
1735 : uint16_t value;
1736 :
1737 22962 : pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0];
1738 22962 : pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1];
1739 22962 : pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0];
1740 22962 : pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1];
1741 :
1742 22962 : if ( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 )
1743 : {
1744 22962 : pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1];
1745 22962 : pr = pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1];
1746 :
1747 22962 : if ( ( j + 1 ) > ndec )
1748 : {
1749 3368 : pd_q_lvls = 1;
1750 3368 : pd = 0;
1751 : }
1752 : else
1753 : {
1754 19594 : pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1];
1755 19594 : pd = pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1];
1756 : }
1757 22962 : val = dtx_pd_real_min_max[0];
1758 22962 : ivas_quantise_real_values( &val, pd_q_lvls, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &idx, &val, 1 );
1759 :
1760 22962 : pd -= idx;
1761 :
1762 22962 : val = pr_min_max[0];
1763 22962 : ivas_quantise_real_values( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 );
1764 :
1765 22962 : pr -= idx;
1766 22962 : pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls );
1767 :
1768 22962 : value = (uint16_t) ( pr * pd_q_lvls + pd );
1769 :
1770 22962 : push_next_indice( hMetaData, value, pr_pd_bits );
1771 : }
1772 : }
1773 : }
1774 :
1775 3827 : sid_bits_len = hMetaData->nb_bits_tot - sid_bits_len;
1776 3827 : sba_spar_bitlen = ivas_sba_spar_sid_bitlen( num_dmx[0] );
1777 3827 : zero_pad_bits = sba_spar_bitlen - sid_bits_len;
1778 :
1779 3827 : assert( zero_pad_bits >= 0 );
1780 3827 : if ( num_dmx[0] == 2 )
1781 : {
1782 1684 : zero_pad_bits -= 1;
1783 : }
1784 :
1785 5511 : while ( zero_pad_bits > 0 )
1786 : {
1787 1684 : j = min( zero_pad_bits, 16 );
1788 1684 : push_next_indice( hMetaData, 0, j );
1789 1684 : zero_pad_bits -= j;
1790 : }
1791 :
1792 3827 : return;
1793 : }
1794 :
1795 :
1796 : /*-----------------------------------------------------------------------------------------*
1797 : * Function ivas_quant_pred_coeffs_per_band()
1798 : *
1799 : * Quantization of prediction coefficients
1800 : *-----------------------------------------------------------------------------------------*/
1801 :
1802 1289776 : static void ivas_quant_pred_coeffs_per_band(
1803 : ivas_band_coeffs_t *pband_coeffs,
1804 : ivas_band_coeffs_ind_t *pBand_coeffs_idx,
1805 : ivas_quant_strat_t *pQs,
1806 : const int16_t num_ch )
1807 : {
1808 1289776 : ivas_quantise_real_values( pband_coeffs->pred_re, pQs->PR.q_levels[0], pQs->PR.min, pQs->PR.max, pBand_coeffs_idx->pred_index_re, pband_coeffs->pred_quant_re, ( num_ch - 1 ) );
1809 :
1810 1289776 : return;
1811 : }
1812 :
1813 :
1814 : /*-----------------------------------------------------------------------------------------*
1815 : * Function ivas_quant_c_per_band()
1816 : *
1817 : * Quantization of cross prediction c coeffs for each band
1818 : *-----------------------------------------------------------------------------------------*/
1819 :
1820 848624 : static void ivas_quant_c_per_band(
1821 : ivas_band_coeffs_t *pband_coeffs,
1822 : ivas_band_coeffs_ind_t *pBand_coeffs_idx,
1823 : ivas_quant_strat_t *pQs,
1824 : const int16_t ndec,
1825 : const int16_t ndm )
1826 : {
1827 : int16_t i;
1828 : int16_t j, k;
1829 : float C_re[IVAS_SPAR_MAX_C_COEFF];
1830 848624 : k = 0;
1831 2981400 : for ( i = 0; i < ndec; i++ )
1832 : {
1833 6980264 : for ( j = 0; j < ndm - 1; j++ )
1834 : {
1835 4847488 : C_re[k] = pband_coeffs->C_re[i][j];
1836 4847488 : k++;
1837 : }
1838 : }
1839 848624 : ivas_quantise_real_values( C_re, pQs->C.q_levels[0], pQs->C.min, pQs->C.max, pBand_coeffs_idx->drct_index_re, C_re, ndec * ( ndm - 1 ) );
1840 848624 : k = 0;
1841 2981400 : for ( i = 0; i < ndec; i++ )
1842 : {
1843 6980264 : for ( j = 0; j < ndm - 1; j++ )
1844 : {
1845 4847488 : pband_coeffs->C_quant_re[i][j] = C_re[k];
1846 4847488 : k++;
1847 : }
1848 : }
1849 :
1850 848624 : return;
1851 : }
1852 :
1853 :
1854 : /*-----------------------------------------------------------------------------------------*
1855 : * Function ivas_quant_p_per_band()
1856 : *
1857 : * Quantization of decorrelation p coeffs for each band
1858 : *-----------------------------------------------------------------------------------------*/
1859 :
1860 1136736 : static void ivas_quant_p_per_band(
1861 : ivas_band_coeffs_t *pband_coeffs,
1862 : ivas_band_coeffs_ind_t *pBand_coeffs_idx,
1863 : ivas_quant_strat_t *pQs,
1864 : const int16_t num_ch )
1865 : {
1866 1136736 : ivas_quantise_real_values( pband_coeffs->P_re, pQs->P_r.q_levels[0], pQs->P_r.min, pQs->P_r.max, pBand_coeffs_idx->decd_index_re, pband_coeffs->P_quant_re, num_ch - 1 );
1867 :
1868 1136736 : return;
1869 : }
|