Loading lib_enc/ivas_masa_enc.c +0 −250 Original line number Diff line number Diff line Loading @@ -2332,253 +2332,3 @@ static void masa_metadata_direction_alignment( } #endif #ifdef HR_METADATA1 void indexDirection( uint16_t *sphIndex, /* o : output index for direction */ float theta, /* i : input elevation to be indexed */ float phi, /* i : input azimuth to be indexed */ const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ) { float abs_theta, phi_q; int16_t sign_th, id_phi, id_th; int32_t idx_sph; int32_t cum_n; phi = phi + 180; if ( theta < 0 ) { abs_theta = -theta; sign_th = -1; } else { abs_theta = theta; sign_th = 1; } quantize_theta_phi( gridData->no_theta, gridData->no_phi, abs_theta, &id_phi, phi, &id_th, &phi_q ); /* Starting from Equator, alternating positive and negative */ if ( id_th == 0 ) { idx_sph = id_phi; } else { if ( id_th == gridData->no_theta - 1 ) { idx_sph = 65534 + ( sign_th < 0 ); } else { theta = MASA_ANGLE_AT_EQUATOR * (float) ( id_th + 0.5f ); if ( id_th == 1 ) { cum_n = 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); } else { cum_n = 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); } cum_n += gridData->no_phi[0]; if ( sign_th > 0 ) { cum_n -= 2 * gridData->no_phi[id_th]; } else { cum_n -= gridData->no_phi[id_th]; } idx_sph = cum_n + id_phi; } } *sphIndex = idx_sph; } int16_t quantize_theta( /* o : index of quantized value */ float x, /* i : theta value to be quantized */ int16_t no_cb, /* i : number of codewords */ float *xhat /* o : quantized value */ ) { int16_t imin; float diff1, diff2; imin = (int16_t) ( x * MASA_INV_ANGLE_AT_EQUATOR_DEG + 0.5f ); if ( imin >= no_cb - 1 ) { imin = no_cb - 1; diff1 = x - 90; diff2 = x - MASA_ANGLE_AT_EQUATOR_DEG * ( imin - 1 ); if ( fabsf( diff1 ) > fabsf( diff2 ) ) { imin--; *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; } else { *xhat = 90; } } else { *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; } return imin; } void quantize_theta_phi( const int16_t no_th, /* i : elevation codebook size */ const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword */ const float abs_theta, /* i : absolute value of elevation to be quantized */ int16_t *id_phi, /* o : azimuth index */ const float phi, /* i : input azimuth value; to be quantized */ int16_t *id_theta, /* o : elevation index */ float *phi_q /* o : rotated quantized azimuth */ ) { float theta_hat, theta_hat1, phi_hat, phi_hat1; int16_t id_th, id_th1, id_th2, id_ph, id_ph1; float d, d1; float diff1, diff2; theta_hat = 0; /* to remove warning */ id_th = quantize_theta( abs_theta, no_th, &theta_hat ); if ( no_th > 1 ) { if ( id_th == 0 ) { id_th1 = 1; } else if ( id_th == no_th - 1 ) { id_th1 = no_th - 2; } else { id_th1 = id_th - 1; id_th2 = id_th + 1; diff1 = abs_theta - id_th1 * MASA_ANGLE_AT_EQUATOR_DEG; diff2 = abs_theta - MASA_ANGLE_AT_EQUATOR_DEG * id_th2; if ( id_th2 == no_th - 1 ) { diff2 = abs_theta - 90; } if ( fabsf( diff1 ) > fabsf( diff2 ) ) { id_th1 = id_th2; } } theta_hat1 = MASA_ANGLE_AT_EQUATOR_DEG * id_th1; if ( id_th1 == no_th - 1 ) { theta_hat1 = 90; } if ( no_phi_loc[id_th] > 1 ) { id_ph = quantize_phi( phi, ( id_th % 2 == 1 ), &phi_hat, no_phi_loc[id_th] ); } else { id_ph = MASA_NO_INDEX; phi_hat = 180; *phi_q = 0; } if ( ( no_phi_loc[id_th1] > 1 ) && ( id_ph < MASA_NO_INDEX ) ) { id_ph1 = quantize_phi( phi, ( id_th1 % 2 == 1 ), &phi_hat1, no_phi_loc[id_th1] ); d = direction_distance( abs_theta, theta_hat, phi, phi_hat ); d1 = direction_distance( abs_theta, theta_hat1, phi, phi_hat1 ); if ( d1 > d ) { id_ph = id_ph1; id_th = id_th1; /*theta_hat = ANGLE_AT_EQUATOR_DEG * id_th1; */ } } } else { id_ph = quantize_phi( phi, ( id_th % 2 == 1 ), &phi_hat, no_phi_loc[id_th] ); } *id_phi = id_ph; *id_theta = id_th; } int16_t quantize_phi( /* o : index azimuth */ float phi, /* i : azimuth value */ int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ float *phi_hat, /* o : quantized azimuth */ const int16_t n /* i : azimuth codebook size */ ) { int16_t id_phi; float dd; float delta_phi; delta_phi = 360.0f / (float) n; if ( n == 1 ) { *phi_hat = 0; return 0; } if ( flag_delta == 1 ) { dd = delta_phi / 2.0f; } else { dd = 0; } id_phi = (int16_t) ( ( phi - dd + delta_phi / 2.0f ) / (float) delta_phi ); if ( id_phi == n ) { id_phi = 0; } if ( id_phi == -1 ) { id_phi = n - 1; } *phi_hat = id_phi * delta_phi + dd; return id_phi; } float direction_distance( /* o : distortion value */ float theta, /* i : elevation absolute value */ float theta_hat, /* i : quantized elevation value in absolute value */ const float phi, /* i : azimuth value */ const float phi_hat /* i : quantized azimuth value */ ) { float d; theta *= EVS_PI / 180; theta_hat *= EVS_PI / 180; d = sinf( theta ) * sinf( theta_hat ) + cosf( theta ) * cosf( theta_hat ) * cosf( ( phi - phi_hat ) * EVS_PI / 180 ); return d; } #endif No newline at end of file lib_enc/ivas_qmetadata_enc.c +13 −10 Original line number Diff line number Diff line Loading @@ -1517,6 +1517,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; } } if ( hQMetaData->no_directions == 2 ) { for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; ++j ) { for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) Loading @@ -1533,6 +1535,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr; } } } return; } Loading Loading
lib_enc/ivas_masa_enc.c +0 −250 Original line number Diff line number Diff line Loading @@ -2332,253 +2332,3 @@ static void masa_metadata_direction_alignment( } #endif #ifdef HR_METADATA1 void indexDirection( uint16_t *sphIndex, /* o : output index for direction */ float theta, /* i : input elevation to be indexed */ float phi, /* i : input azimuth to be indexed */ const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ) { float abs_theta, phi_q; int16_t sign_th, id_phi, id_th; int32_t idx_sph; int32_t cum_n; phi = phi + 180; if ( theta < 0 ) { abs_theta = -theta; sign_th = -1; } else { abs_theta = theta; sign_th = 1; } quantize_theta_phi( gridData->no_theta, gridData->no_phi, abs_theta, &id_phi, phi, &id_th, &phi_q ); /* Starting from Equator, alternating positive and negative */ if ( id_th == 0 ) { idx_sph = id_phi; } else { if ( id_th == gridData->no_theta - 1 ) { idx_sph = 65534 + ( sign_th < 0 ); } else { theta = MASA_ANGLE_AT_EQUATOR * (float) ( id_th + 0.5f ); if ( id_th == 1 ) { cum_n = 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); } else { cum_n = 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); } cum_n += gridData->no_phi[0]; if ( sign_th > 0 ) { cum_n -= 2 * gridData->no_phi[id_th]; } else { cum_n -= gridData->no_phi[id_th]; } idx_sph = cum_n + id_phi; } } *sphIndex = idx_sph; } int16_t quantize_theta( /* o : index of quantized value */ float x, /* i : theta value to be quantized */ int16_t no_cb, /* i : number of codewords */ float *xhat /* o : quantized value */ ) { int16_t imin; float diff1, diff2; imin = (int16_t) ( x * MASA_INV_ANGLE_AT_EQUATOR_DEG + 0.5f ); if ( imin >= no_cb - 1 ) { imin = no_cb - 1; diff1 = x - 90; diff2 = x - MASA_ANGLE_AT_EQUATOR_DEG * ( imin - 1 ); if ( fabsf( diff1 ) > fabsf( diff2 ) ) { imin--; *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; } else { *xhat = 90; } } else { *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; } return imin; } void quantize_theta_phi( const int16_t no_th, /* i : elevation codebook size */ const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword */ const float abs_theta, /* i : absolute value of elevation to be quantized */ int16_t *id_phi, /* o : azimuth index */ const float phi, /* i : input azimuth value; to be quantized */ int16_t *id_theta, /* o : elevation index */ float *phi_q /* o : rotated quantized azimuth */ ) { float theta_hat, theta_hat1, phi_hat, phi_hat1; int16_t id_th, id_th1, id_th2, id_ph, id_ph1; float d, d1; float diff1, diff2; theta_hat = 0; /* to remove warning */ id_th = quantize_theta( abs_theta, no_th, &theta_hat ); if ( no_th > 1 ) { if ( id_th == 0 ) { id_th1 = 1; } else if ( id_th == no_th - 1 ) { id_th1 = no_th - 2; } else { id_th1 = id_th - 1; id_th2 = id_th + 1; diff1 = abs_theta - id_th1 * MASA_ANGLE_AT_EQUATOR_DEG; diff2 = abs_theta - MASA_ANGLE_AT_EQUATOR_DEG * id_th2; if ( id_th2 == no_th - 1 ) { diff2 = abs_theta - 90; } if ( fabsf( diff1 ) > fabsf( diff2 ) ) { id_th1 = id_th2; } } theta_hat1 = MASA_ANGLE_AT_EQUATOR_DEG * id_th1; if ( id_th1 == no_th - 1 ) { theta_hat1 = 90; } if ( no_phi_loc[id_th] > 1 ) { id_ph = quantize_phi( phi, ( id_th % 2 == 1 ), &phi_hat, no_phi_loc[id_th] ); } else { id_ph = MASA_NO_INDEX; phi_hat = 180; *phi_q = 0; } if ( ( no_phi_loc[id_th1] > 1 ) && ( id_ph < MASA_NO_INDEX ) ) { id_ph1 = quantize_phi( phi, ( id_th1 % 2 == 1 ), &phi_hat1, no_phi_loc[id_th1] ); d = direction_distance( abs_theta, theta_hat, phi, phi_hat ); d1 = direction_distance( abs_theta, theta_hat1, phi, phi_hat1 ); if ( d1 > d ) { id_ph = id_ph1; id_th = id_th1; /*theta_hat = ANGLE_AT_EQUATOR_DEG * id_th1; */ } } } else { id_ph = quantize_phi( phi, ( id_th % 2 == 1 ), &phi_hat, no_phi_loc[id_th] ); } *id_phi = id_ph; *id_theta = id_th; } int16_t quantize_phi( /* o : index azimuth */ float phi, /* i : azimuth value */ int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ float *phi_hat, /* o : quantized azimuth */ const int16_t n /* i : azimuth codebook size */ ) { int16_t id_phi; float dd; float delta_phi; delta_phi = 360.0f / (float) n; if ( n == 1 ) { *phi_hat = 0; return 0; } if ( flag_delta == 1 ) { dd = delta_phi / 2.0f; } else { dd = 0; } id_phi = (int16_t) ( ( phi - dd + delta_phi / 2.0f ) / (float) delta_phi ); if ( id_phi == n ) { id_phi = 0; } if ( id_phi == -1 ) { id_phi = n - 1; } *phi_hat = id_phi * delta_phi + dd; return id_phi; } float direction_distance( /* o : distortion value */ float theta, /* i : elevation absolute value */ float theta_hat, /* i : quantized elevation value in absolute value */ const float phi, /* i : azimuth value */ const float phi_hat /* i : quantized azimuth value */ ) { float d; theta *= EVS_PI / 180; theta_hat *= EVS_PI / 180; d = sinf( theta ) * sinf( theta_hat ) + cosf( theta ) * cosf( theta_hat ) * cosf( ( phi - phi_hat ) * EVS_PI / 180 ); return d; } #endif No newline at end of file
lib_enc/ivas_qmetadata_enc.c +13 −10 Original line number Diff line number Diff line Loading @@ -1517,6 +1517,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; } } if ( hQMetaData->no_directions == 2 ) { for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; ++j ) { for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) Loading @@ -1533,6 +1535,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr; } } } return; } Loading