diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 6f42b17a403be04fad6d118480fd442b7330e6b8..bc5907a34ad007da5f208e43567e9583d38f1573 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1206,6 +1206,9 @@ enum #define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/ #define HR_MASA_ER_LEVELS 16 #endif +#ifdef FIX_HBR_MASAMETA +#define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */ +#endif #define LIMIT_ER_ELEVATION_ENC 4 #define LIMIT_ER_SIMPLE_ENC 6 diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 7c0955436d02a2fbcadaaa565dd5c5bfd2d967d8..d2226937ff95cd4386a428d5345e217aa56d53ce 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -313,20 +313,31 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const int32_t sampling_rate /* i : Sampling rate */ - , +#ifdef FIX_HBR_MASAMETA + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ +#else + const int32_t sampling_rate, /* i : Sampling rate */ +#endif MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ) { uint8_t band, sf; +#ifdef FIX_HBR_MASAMETA + int16_t highBand; +#else int16_t maxBin, highBand, maxBand; +#endif uint8_t numBands48k; +#ifndef FIX_HBR_MASAMETA if ( sampling_rate == 48000 ) { return; } +#endif +#ifndef FIX_HBR_MASAMETA /* Find maximum band usable at this sample rate */ maxBin = (int16_t) ( CLDFB_NO_CHANNELS_MAX * sampling_rate / 48000 ); maxBand = 0; @@ -335,7 +346,7 @@ void masa_sample_rate_band_correction( maxBand++; } maxBand--; - +#endif numBands48k = config->numCodingBands; for ( band = 1; band < config->numCodingBands + 1; band++ ) @@ -346,6 +357,19 @@ void masa_sample_rate_band_correction( { config->numCodingBands = band; hQMetaData->numCodingBands = band; +#ifdef FIX_HBR_MASAMETA + if ( is_encoder ) + { + if ( hQMetaData->q_direction->cfg.nbands > band ) + { + hQMetaData->q_direction->cfg.nbands = band; + } + if ( hQMetaData->no_directions == 2 && hQMetaData->q_direction[1].cfg.nbands > band ) + { + hQMetaData->q_direction[1].cfg.nbands = band; + } + } +#endif band_mapping[band] = maxBand; break; } @@ -393,7 +417,11 @@ void masa_sample_rate_band_correction( /* in decoder, zero the EXT out MASA meta buffer */ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { +#ifdef FIX_HBR_MASAMETA + for ( band = hQMetaData->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) +#else for ( band = config->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) +#endif { hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4e8f41dfc54e173e7af9a99d386945253f87190a..d3a1eda3cce85877350cdaa2ecbc5f0a4634c0b1 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3166,9 +3166,13 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index, /* i/o: bitstream position */ - const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ const int16_t bits_sph_idx, const int16_t bits_sp_coh +#ifdef FIX_HBR_MASAMETA + , + uint8_t ncoding_bands_config +#endif ); #endif @@ -3477,7 +3481,7 @@ int16_t ivas_sba_get_nchan_metadata( void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); /*! r: flag indicating to code SPAR HOA MD for all bands */ @@ -3485,7 +3489,7 @@ void ivas_sba_get_spar_hoa_md_flag( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ int16_t *spar_hoa_md_flag, - int16_t *spar_hoa_dirac2spar_md_flag + int16_t *spar_hoa_dirac2spar_md_flag ); void ivas_sba_zero_vert_comp( @@ -5139,8 +5143,13 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ +#ifdef FIX_HBR_MASAMETA + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ +#else const int32_t sampling_rate, /* i : sampling rate */ - MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +#endif + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ); void invdct4_transform( diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index e38ad28e691ecbc9343e42971c08e3e10a6af483..4c4a2299382ab75dd50eb93c05bab19e2daf6abb 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -471,6 +471,9 @@ typedef struct int16_t nbands; int16_t nblocks; int16_t start_band; +#ifdef FIX_HBR_MASAMETA + uint8_t inactiveBands; +#endif int16_t search_effort; MC_LS_SETUP mc_ls_setup; diff --git a/lib_com/options.h b/lib_com/options.h index 00d703e68c52a6306a56b0749022afe9229d56f9..80382c5bcd2a477c307da439322bb53f31944300 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ +#define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index d17a5fdac7593d15ceeff79e55837268ec1e6b1c..7445bfb4894103069b518c76da51d939b6088b54 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -201,11 +201,21 @@ ivas_error ivas_masa_decode( { if ( ivas_total_brate >= IVAS_512k ) { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 ); + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 +#ifdef FIX_HBR_MASAMETA + , + hMasa->config.numCodingBands +#endif + ); } else { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 ); + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 +#ifdef FIX_HBR_MASAMETA + , + hMasa->config.numCodingBands +#endif + ); } } else @@ -497,6 +507,10 @@ static ivas_error ivas_masa_dec_config( { int16_t i; MASA_DECODER_HANDLE hMasa; +#ifdef FIX_HBR_MASAMETA + uint8_t maxBand; + int16_t maxBin; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -547,6 +561,26 @@ static ivas_error ivas_masa_dec_config( ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); +#ifdef FIX_HBR_MASAMETA + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) + { + maxBand++; + } + maxBand--; + + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta ); + } + else + { + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL ); + } +#else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ @@ -556,6 +590,7 @@ static ivas_error ivas_masa_dec_config( { masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL ); } +#endif return error; } diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index a6fe0c0b7456ceeaa512812df5be17e22ac23670..67aefe90386249495c0756cf1e5d7d2a0731d1f5 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -797,7 +797,12 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( int16_t *index, /* i/o: bitstream position */ const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ const int16_t bits_sph_idx, - const int16_t bits_sp_coh ) + const int16_t bits_sp_coh +#ifdef FIX_HBR_MASAMETA + , + uint8_t ncoding_bands_config +#endif +) { int16_t d, b, m; int16_t bits_diff_sum; @@ -807,6 +812,10 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( int16_t bits_no_dirs_coh, bits_sur_coherence; uint16_t all_coherence_zero; int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; +#ifdef FIX_HBR_MASAMETA + int16_t codedBands, sf_nbands0, sf_nbands1; + sf_nbands1 = 1; +#endif #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; @@ -831,7 +840,57 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #endif start_index_0 = *index; +#ifdef FIX_HBR_MASAMETA + /* read number of higher inactive/not encoded bands */ + if ( bitstream[( *index )--] ) + { + codedBands = MASA_MAXIMUM_CODING_SUBBANDS - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1; + } + else + { + codedBands = MASA_MAXIMUM_CODING_SUBBANDS; + } + for ( b = codedBands; b < ncoding_bands_config; b++ ) + { + for ( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) + { + hQMetaData->q_direction[0].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[b].spread_coherence[m] = 0u; + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence[m] = 0u; + } + } + if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[b].surround_coherence[m] = 0u; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->twoDirBands[b] = 0; + } + } + sf_nbands0 = hQMetaData->q_direction[0].cfg.nbands; + + hQMetaData->q_direction[0].cfg.nbands = codedBands; + +#endif /*Coherence flag decoding*/ bits_no_dirs_coh = 0; all_coherence_zero = 1; @@ -853,12 +912,23 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( { /* Read which bands have 2 directions */ hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; +#ifdef FIX_HBR_MASAMETA + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } +#endif set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands ); d = *index; dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); p[0] = dif_p[0]; hQMetaData->twoDirBands[p[0]] = 1; +#ifdef FIX_HBR_MASAMETA + for ( b = 1; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) +#else for ( b = 1; b < hQMetaData->numTwoDirBands; b++ ) +#endif { dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); p[b] = p[b - 1] + dif_p[b] + 1; @@ -867,6 +937,16 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( bits_no_dirs_coh += ( d - *index ); } +#ifdef FIX_HBR_MASAMETA + if ( bits_sph_idx == 16 && hQMetaData->no_directions == 2 ) + { + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } + } +#endif bits_diff_sum = ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); if ( hQMetaData->no_directions == 2 ) @@ -1095,6 +1175,14 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->dir_comp_ratio = 1.0f; } +#ifdef FIX_HBR_MASAMETA + hQMetaData->q_direction[0].cfg.nbands = sf_nbands0; + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].cfg.nbands = sf_nbands1; + } +#endif + return ( start_index_0 - *index ); } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 2de3fa05cfefafa48b234a254fbada16e3720267..0c768f1a176107342df11f6df965acaa24998ab2 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -499,6 +499,10 @@ ivas_error ivas_masa_enc_config( uint8_t coherencePresent; uint8_t isActualTwoDir; /* Flag to tell that when there are two directions present in metadata, they both contain meaningful information. */ int32_t ivas_total_brate; +#ifdef FIX_HBR_MASAMETA + uint8_t maxBand; + int16_t maxBin, sf; +#endif ivas_error error; #ifdef HR_METADATA SPHERICAL_GRID_DATA *sphGrid; @@ -637,7 +641,57 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); +#ifdef FIX_HBR_MASAMETA + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) + { + maxBand++; + } + maxBand--; + + if ( ivas_total_brate > IVAS_256k ) + { + int16_t continueLoop; + continueLoop = 1; + while ( maxBand > 5 && continueLoop ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + if ( hMasa->data.energy[sf][maxBand - 1] > 100000 ) + { + continueLoop = 0; + break; + } + } + if ( continueLoop ) + { + maxBand--; + } + } + + if ( maxBand < MASA_MAXIMUM_CODING_SUBBANDS ) + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = MASA_MAXIMUM_CODING_SUBBANDS - maxBand; + } + else + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; + } + } + + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, ivas_total_brate > IVAS_256k, NULL ); + + if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands ) + { + hMasa->config.numTwoDirBands = hMasa->config.numCodingBands; + set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); + } + +#else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); +#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) @@ -744,8 +798,11 @@ static void combine_freqbands_and_subframes( } } } - +#ifdef FIX_HBR_MASAMETA + if ( numCodingBands <= MAX_REDUCED_NBANDS ) +#else if ( numCodingBands < MASA_FREQUENCY_BANDS ) +#endif { /* reduce metadata *frequency* resolution. time resolution is not touched */ for ( i = 0; i < numDirections; i++ ) @@ -2281,6 +2338,9 @@ static void masa_metadata_direction_alignment( { /* swap the metadata of the two directions in this TF-tile */ float tmp_val; +#ifdef FIX_HBR_MASAMETA + uint16_t tmp_int_val; +#endif tmp_val = hMeta->directional_meta[0].azimuth[sf][band]; hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; hMeta->directional_meta[1].azimuth[sf][band] = tmp_val; @@ -2288,7 +2348,11 @@ static void masa_metadata_direction_alignment( tmp_val = hMeta->directional_meta[0].elevation[sf][band]; hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; hMeta->directional_meta[1].elevation[sf][band] = tmp_val; - +#ifdef FIX_HBR_MASAMETA + tmp_int_val = hMeta->directional_meta[0].spherical_index[sf][band]; + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; + hMeta->directional_meta[1].spherical_index[sf][band] = tmp_int_val; +#endif tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band]; hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 2de45098702962b89da2cf964c715767d59684c1..40d5bff892bbe423454478a822e67b0cf968be98 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -797,7 +797,19 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( /* Check if coherence should be encoded */ all_coherence_zero = 1; bits_no_dirs_coh = 0; - +#ifdef FIX_HBR_MASAMETA + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + push_next_indice( hMetaData, 1, 1 ); + /* write the number of inactive higher bands */ + ivas_qmetadata_encode_extended_gr( hMetaData, hQMetaData->q_direction->cfg.inactiveBands - 1, MASA_MAXIMUM_CODING_SUBBANDS, 1 ); + } + else + { + /* no change */ + push_next_indice( hMetaData, 0, 1 ); + } +#endif if ( hQMetaData->coherence_flag ) { all_coherence_zero = hQMetaData->all_coherence_zero; @@ -966,7 +978,16 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( } } } - +#ifdef FIX_HBR_MASAMETA + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + hQMetaData->q_direction[0].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + if ( ndirections > 1 ) + { + hQMetaData->q_direction[1].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + } + } +#endif return error; } #endif @@ -4725,9 +4746,7 @@ static int16_t coherence_coding_length( if ( sum_s( no_cv, coding_subbands ) > MASA_COH_LIMIT_2IDX ) { -#ifdef DEBUGGING - assert( coding_subbands % 2 == 0 ); -#endif + no_cb = 1; half_coding_subbands = coding_subbands / 2; for ( j = 0; j < half_coding_subbands; j++ )