Loading lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ #define NONBE_FIX_SBA_SIGNALING_BITS_B /* FhG: issue 1061: option B: signal sba order additionally in OSBA */ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nok: issue 1497 - porting OMASA EXT MR */ #define NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* Nok: issue 1074 fixing number of objects signaling in OMASA low rate */ /* #################### End BASOP porting switches ############################ */ /* clang-format on */ Loading lib_dec/ivas_init_dec.c +18 −0 Original line number Diff line number Diff line Loading @@ -349,12 +349,30 @@ ivas_error ivas_dec_setup( if ( st_ivas->nchan_ism > 0 ) { #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ /* info about the number of objects: '00' - MASA format at the encoder '01' - MASA_ISM_FORMAT at the encoder, with 4 objects '10' - MASA_ISM_FORMAT at the encoder, with 3 objects '11' - MASA_ISM_FORMAT at the encoder, with 1 or 2 objects reading if 1 or 2 objects is performed later */ st_ivas->nchan_ism = 5 - st_ivas->nchan_ism; if ( st_ivas->nchan_transport == 1 && st_ivas->nchan_ism == 2 ) { st_ivas->nchan_ism = 1; } /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 and the corresponding bit is not used here*/ #else /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ if ( st_ivas->nchan_transport == 2 && st_ivas->nchan_ism == 3 ) { st_ivas->nchan_ism = 4; } /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 */ #endif st_ivas->nchan_transport = 2; element_mode_flag = 1; } Loading lib_dec/ivas_masa_dec.c +130 −79 Original line number Diff line number Diff line Loading @@ -151,6 +151,52 @@ ivas_error ivas_masa_decode( { if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR if ( ivas_format == MASA_FORMAT ) { /* re-read the number of objects, needed in case of bad frame */ st_ivas->nchan_ism = 5 - ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2] ); } if ( ivas_format == MASA_FORMAT && st_ivas->nchan_ism != 5 ) { /* there was OMASA in the input */ hMasa->config.input_ivas_format = MASA_ISM_FORMAT; if ( st_ivas->nchan_ism < 3 ) { /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */ if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] == 0 ) { st_ivas->nchan_ism = 1; } st->next_bit_pos -= MASA_TRANSP_BITS; *nb_bits_read += MASA_TRANSP_BITS; /* the two reserved bits were already read in ivas_init_dec()*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = st->bit_stream[( st->next_bit_pos )--]; *nb_bits_read += MASA_HEADER_BITS; /* read number of directions */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits_read )++; hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); } else { /* if there are 3 or 4 objects the number of transport channels bit is given to MASA format and used to read number of directions*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits_read )++; hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); /* the two reserved bits were already read in ivas_init_dec()*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = st->bit_stream[( st->next_bit_pos )--]; *nb_bits_read += MASA_HEADER_BITS; } } else { #endif if ( ivas_format != MASA_ISM_FORMAT ) { /* number of transport channels is always 2 for MASA_ISM format */ Loading Loading @@ -251,6 +297,7 @@ ivas_error ivas_masa_decode( #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #ifndef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* read 2 bits: '00' - MASA format at the encoder '01' - MASA_ISM_FORMAT at the encoder, with 1 object Loading @@ -258,6 +305,7 @@ ivas_error ivas_masa_decode( '11' - MASA_ISM_FORMAT at the encoder, with 3 or 4 objects reading if 3 or 4 object is performed later */ #endif byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--]; Loading Loading @@ -289,6 +337,9 @@ ivas_error ivas_masa_decode( byteBuffer = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits_read )++; hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR } #endif } else { Loading lib_enc/ivas_masa_enc.c +35 −4 Original line number Diff line number Diff line Loading @@ -421,6 +421,18 @@ ivas_error ivas_masa_encode( #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* use the MASA number of transport channels bit to signal if there are 1 or 2 objects */ if ( nchan_ism == 1 || nchan_ism == 2 ) { push_next_indice( hMetaData, nchan_ism - 1, MASA_TRANSP_BITS ); } else { /* for 3 or 4 objects write already the number of MASA directions */ push_next_indice( hMetaData, hQMetaData->no_directions - 1, MASA_TRANSP_BITS ); } #else /* use the MASA number of transport channels bit to signal if there are 3 or 4 objects */ if ( nchan_ism == 4 ) { Loading @@ -430,6 +442,7 @@ ivas_error ivas_masa_encode( { push_next_indice( hMetaData, 0, MASA_TRANSP_BITS ); } #endif } else { Loading @@ -445,6 +458,16 @@ ivas_error ivas_masa_encode( if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR if ( nchan_ism >= 3 ) /* if 3 or 4 objects */ { push_next_indice( hMetaData, 5 - nchan_ism, MASA_HEADER_BITS ); } else { push_next_indice( hMetaData, 3, MASA_HEADER_BITS ); } #else if ( nchan_ism <= 3 ) { push_next_indice( hMetaData, nchan_ism, MASA_HEADER_BITS ); Loading @@ -453,6 +476,7 @@ ivas_error ivas_masa_encode( { push_next_indice( hMetaData, nchan_ism - 1, MASA_HEADER_BITS ); } #endif hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; #else /* signal MASA_ISM_FORMAT to decoder */ Loading @@ -469,9 +493,16 @@ ivas_error ivas_masa_encode( push_next_indice( hMetaData, 0, MASA_HEADER_BITS ); hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; } #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR if ( !( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE && nchan_ism > 2 ) ) { #endif /* write number of directions */ push_next_indice( hMetaData, hQMetaData->no_directions - 1, 1 ); hQMetaData->metadata_max_bits -= 1; #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR } #endif /* write subframe mode */ push_next_indice( hMetaData, hQMetaData->q_direction[0].cfg.nblocks == 1 ? 1 : 0, MASA_SUBFRAME_BITS ); Loading Loading
lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ #define NONBE_FIX_SBA_SIGNALING_BITS_B /* FhG: issue 1061: option B: signal sba order additionally in OSBA */ #define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nok: issue 1497 - porting OMASA EXT MR */ #define NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* Nok: issue 1074 fixing number of objects signaling in OMASA low rate */ /* #################### End BASOP porting switches ############################ */ /* clang-format on */ Loading
lib_dec/ivas_init_dec.c +18 −0 Original line number Diff line number Diff line Loading @@ -349,12 +349,30 @@ ivas_error ivas_dec_setup( if ( st_ivas->nchan_ism > 0 ) { #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ /* info about the number of objects: '00' - MASA format at the encoder '01' - MASA_ISM_FORMAT at the encoder, with 4 objects '10' - MASA_ISM_FORMAT at the encoder, with 3 objects '11' - MASA_ISM_FORMAT at the encoder, with 1 or 2 objects reading if 1 or 2 objects is performed later */ st_ivas->nchan_ism = 5 - st_ivas->nchan_ism; if ( st_ivas->nchan_transport == 1 && st_ivas->nchan_ism == 2 ) { st_ivas->nchan_ism = 1; } /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 and the corresponding bit is not used here*/ #else /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ if ( st_ivas->nchan_transport == 2 && st_ivas->nchan_ism == 3 ) { st_ivas->nchan_ism = 4; } /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 */ #endif st_ivas->nchan_transport = 2; element_mode_flag = 1; } Loading
lib_dec/ivas_masa_dec.c +130 −79 Original line number Diff line number Diff line Loading @@ -151,6 +151,52 @@ ivas_error ivas_masa_decode( { if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR if ( ivas_format == MASA_FORMAT ) { /* re-read the number of objects, needed in case of bad frame */ st_ivas->nchan_ism = 5 - ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2] ); } if ( ivas_format == MASA_FORMAT && st_ivas->nchan_ism != 5 ) { /* there was OMASA in the input */ hMasa->config.input_ivas_format = MASA_ISM_FORMAT; if ( st_ivas->nchan_ism < 3 ) { /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */ if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] == 0 ) { st_ivas->nchan_ism = 1; } st->next_bit_pos -= MASA_TRANSP_BITS; *nb_bits_read += MASA_TRANSP_BITS; /* the two reserved bits were already read in ivas_init_dec()*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = st->bit_stream[( st->next_bit_pos )--]; *nb_bits_read += MASA_HEADER_BITS; /* read number of directions */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits_read )++; hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); } else { /* if there are 3 or 4 objects the number of transport channels bit is given to MASA format and used to read number of directions*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits_read )++; hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); /* the two reserved bits were already read in ivas_init_dec()*/ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = st->bit_stream[( st->next_bit_pos )--]; *nb_bits_read += MASA_HEADER_BITS; } } else { #endif if ( ivas_format != MASA_ISM_FORMAT ) { /* number of transport channels is always 2 for MASA_ISM format */ Loading Loading @@ -251,6 +297,7 @@ ivas_error ivas_masa_decode( #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #ifndef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* read 2 bits: '00' - MASA format at the encoder '01' - MASA_ISM_FORMAT at the encoder, with 1 object Loading @@ -258,6 +305,7 @@ ivas_error ivas_masa_decode( '11' - MASA_ISM_FORMAT at the encoder, with 3 or 4 objects reading if 3 or 4 object is performed later */ #endif byteBuffer = st->bit_stream[( st->next_bit_pos )--]; byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--]; Loading Loading @@ -289,6 +337,9 @@ ivas_error ivas_masa_decode( byteBuffer = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits_read )++; hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 ); #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR } #endif } else { Loading
lib_enc/ivas_masa_enc.c +35 −4 Original line number Diff line number Diff line Loading @@ -421,6 +421,18 @@ ivas_error ivas_masa_encode( #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR /* use the MASA number of transport channels bit to signal if there are 1 or 2 objects */ if ( nchan_ism == 1 || nchan_ism == 2 ) { push_next_indice( hMetaData, nchan_ism - 1, MASA_TRANSP_BITS ); } else { /* for 3 or 4 objects write already the number of MASA directions */ push_next_indice( hMetaData, hQMetaData->no_directions - 1, MASA_TRANSP_BITS ); } #else /* use the MASA number of transport channels bit to signal if there are 3 or 4 objects */ if ( nchan_ism == 4 ) { Loading @@ -430,6 +442,7 @@ ivas_error ivas_masa_encode( { push_next_indice( hMetaData, 0, MASA_TRANSP_BITS ); } #endif } else { Loading @@ -445,6 +458,16 @@ ivas_error ivas_masa_encode( if ( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE ) { #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR if ( nchan_ism >= 3 ) /* if 3 or 4 objects */ { push_next_indice( hMetaData, 5 - nchan_ism, MASA_HEADER_BITS ); } else { push_next_indice( hMetaData, 3, MASA_HEADER_BITS ); } #else if ( nchan_ism <= 3 ) { push_next_indice( hMetaData, nchan_ism, MASA_HEADER_BITS ); Loading @@ -453,6 +476,7 @@ ivas_error ivas_masa_encode( { push_next_indice( hMetaData, nchan_ism - 1, MASA_HEADER_BITS ); } #endif hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; #else /* signal MASA_ISM_FORMAT to decoder */ Loading @@ -469,9 +493,16 @@ ivas_error ivas_masa_encode( push_next_indice( hMetaData, 0, MASA_HEADER_BITS ); hQMetaData->metadata_max_bits -= MASA_HEADER_BITS; } #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR if ( !( ivas_format == MASA_ISM_FORMAT && ism_mode == ISM_MODE_NONE && nchan_ism > 2 ) ) { #endif /* write number of directions */ push_next_indice( hMetaData, hQMetaData->no_directions - 1, 1 ); hQMetaData->metadata_max_bits -= 1; #ifdef NONBE_FIX_1074_NOBJ_SIGNAL_OMASA_LBR } #endif /* write subframe mode */ push_next_indice( hMetaData, hQMetaData->q_direction[0].cfg.nblocks == 1 ? 1 : 0, MASA_SUBFRAME_BITS ); Loading