Commit d0f9e9d6 authored by advasila's avatar advasila
Browse files

fix issue 944

parent 44277c75
Loading
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -990,6 +990,10 @@ ivas_error ivas_ism_enc(
    const int16_t input_frame,                                  /* i  : input frame length per channel              */
    int16_t *nb_bits_metadata,                                  /* i  : number of metadata bits                     */
    const int16_t flag_omasa_ener_brate                         /* i  : less bitrate for objects in OMASA flag      */
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA 
    ,
    int16_t changed_object                                      /* i : tells if the separated object changed in OMASA */
#endif
);

ivas_error ivas_ism_metadata_enc(
@@ -1008,6 +1012,10 @@ ivas_error ivas_ism_metadata_enc(
    const int16_t flag_omasa_ener_brate,                        /* i  : less bitrate for objects in OMASA flag      */
    int16_t *omasa_stereo_sw_cnt,
    const int16_t ini_frame
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA 
    ,
    int16_t changed_object                                      /* i  : tells if the separated object has changed   */
#endif 
);

ivas_error ivas_ism_metadata_dec(
@@ -5702,6 +5710,10 @@ void ivas_omasa_enc(
    const ISM_MODE ism_mode,                                    /* i  : ISM mode                                */
    float *data_separated_object,                               /* o  : Separated object audio signal           */
    int16_t* idx_separated_object                               /* o  : Index of the separated object           */
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA 
    ,
    int16_t * changed_object                                    /* o  : signals if separated object has changed */
#endif
);

void ivas_set_surplus_brate_enc(
+2 −0
Original line number Diff line number Diff line
@@ -166,6 +166,8 @@
#define NONBE_FIX_869_MASA_PREREND_MERGE                      /* Nokia: issue: #869: MASA pre-rend not updating energy */
#define NONBE_FIX_931_IGF_STEREO_DEC_NOISE	                  /* FhG: issue #931: fix noise substitution in the stereo IGF decoder      */

#define NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA                 /* Nokia: issue 944: fix FEC error in OMASA */

/* ##################### End NON-BE switches ########################### */

/* ################## End DEVELOPMENT switches ######################### */
+40 −7
Original line number Diff line number Diff line
@@ -196,7 +196,12 @@ ivas_error ivas_enc(
            ivas_param_ism_stereo_dmx( st_ivas, data_f, input_frame );

            /* Core coding of Stereo DMX */
            if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK )
            if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                         ,
                                         0
#endif
                                         ) ) != IVAS_ERR_OK )
            {
                return error;
            }
@@ -204,7 +209,12 @@ ivas_error ivas_enc(
        else if ( st_ivas->ism_mode == ISM_MODE_DISC )
        {
            /* Analysis, decision about bitrates per channel & core coding */
            if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK )
            if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                         ,
                                         0
#endif
                                         ) ) != IVAS_ERR_OK )
            {
                return error;
            }
@@ -275,9 +285,12 @@ ivas_error ivas_enc(
    else if ( ivas_format == MASA_ISM_FORMAT )
    {
        float *data_separated_object;

        int16_t idx_separated_object;
        int16_t flag_omasa_ener_brate;
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
        int16_t force_absolute_coding;
        force_absolute_coding = 0;
#endif

        flag_omasa_ener_brate = 0;

@@ -305,7 +318,12 @@ ivas_error ivas_enc(
        if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC )
        {
            /* Estimate MASA parameters for the objects */
            ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object );
            ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                            ,
                            &force_absolute_coding
#endif
            );
        }

        /* Encode ISMs transport channels */
@@ -319,7 +337,12 @@ ivas_error ivas_enc(
        }
        else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
        {
            if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 ) ) != IVAS_ERR_OK )
            if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                         ,
                                         force_absolute_coding
#endif
                                         ) ) != IVAS_ERR_OK )
            {
                return error;
            }
@@ -329,7 +352,12 @@ ivas_error ivas_enc(
            flag_omasa_ener_brate = ivas_omasa_ener_brate( st_ivas->hEncoderConfig->nchan_ism, ivas_total_brate, data_f, input_frame );

            /* Analysis, decision about bitrates per channel & core coding */
            if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate ) ) != IVAS_ERR_OK )
            if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                         ,
                                         0
#endif
                                         ) ) != IVAS_ERR_OK )
            {
                return error;
            }
@@ -399,7 +427,12 @@ ivas_error ivas_enc(
            n = hEncoderConfig->nchan_ism;
            hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData;

            if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK )
            if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                                  ,
                                                  0
#endif
                                                  ) ) != IVAS_ERR_OK )
            {
                return error;
            }
+16 −2
Original line number Diff line number Diff line
@@ -54,6 +54,10 @@ ivas_error ivas_ism_enc(
    const int16_t input_frame,          /* i  : input frame length per channel  */
    int16_t *nb_bits_metadata,          /* i  : number of metadata bits         */
    const int16_t flag_omasa_ener_brate /* i  : less bitrate for objects in OMASA flag */
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
    ,
    int16_t force_absolute_coding
#endif
)
{
    SCE_ENC_HANDLE hSCE;
@@ -236,7 +240,12 @@ ivas_error ivas_ism_enc(
    else if ( st_ivas->ism_mode == ISM_MODE_PARAM )
    {
        if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData,
                                              nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK )
                                              nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                              ,
                                              0
#endif
                                              ) ) != IVAS_ERR_OK )
        {
            return error;
        }
@@ -259,7 +268,12 @@ ivas_error ivas_ism_enc(
        ism_total_brate_ref = ism_total_brate;

        if ( ( error = ivas_ism_metadata_enc( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData,
                                              nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK )
                                              nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                              ,
                                              force_absolute_coding
#endif
                                              ) ) != IVAS_ERR_OK )
        {
            return error;
        }
+40 −5
Original line number Diff line number Diff line
@@ -67,7 +67,12 @@
 * Local function declarations
 *-----------------------------------------------------------------------*/

static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 );
static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                  ,
                                  int16_t changed_object
#endif
);

static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius );

@@ -182,7 +187,12 @@ ivas_error ivas_ism_metadata_enc(
    const float lp_noise_CPE,
    const int16_t flag_omasa_ener_brate, /* i  : less bitrate for objects in OMASA flag */
    int16_t *omasa_stereo_sw_cnt,
    const int16_t ini_frame )
    const int16_t ini_frame
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
    ,
    int16_t changed_object /* i : tells if the separated object has changed */
#endif
)
{
    int16_t i, ch, nb_bits_start = 0;
    int16_t flag_abs_azimuth[MAX_NUM_OBJECTS];
@@ -429,7 +439,12 @@ ivas_error ivas_ism_metadata_enc(
                    }

                    idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
                    encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL );
                    encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                          ,
                                          changed_object
#endif
                    );
                }
                else
                {
@@ -443,7 +458,12 @@ ivas_error ivas_ism_metadata_enc(
                        idx_angle1_abs = hParamIsm->azi_index[ch];
                        idx_angle2_abs = hParamIsm->ele_index[ch];
                    }
                    encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] );
                    encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch]
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                          ,
                                          changed_object
#endif
                    );

                    /*----------------------------------------------------------------*
                     * Quantize and encode radius, yaw, and pitch
@@ -454,7 +474,12 @@ ivas_error ivas_ism_metadata_enc(
                        idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
                        idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS );

                        encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] );
                        encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch]
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
                                              ,
                                              changed_object
#endif
                        );
                        encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] );
                    }
                }
@@ -984,6 +1009,10 @@ static void encode_angle_indices(
    const int16_t idx_angle2_abs,         /* i  : Elevation index               */
    int16_t *flag_abs_angle1,             /* o  : Azimuth/yaw encoding mode     */
    int16_t *flag_abs_angle2              /* o  : Elevation/pitch encoding mode */
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
    ,
    int16_t changed_object /* i  : tells if separated object has changed in OMASA */
#endif
)
{
    int16_t idx_angle1, nbits_diff_angle1, diff;
@@ -1000,6 +1029,9 @@ static void encode_angle_indices(
    *flag_abs_angle1 = 0;                      /* differential coding by default */
    if ( angle->angle1_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
         || last_ism_metadata_flag == 0        /* If last frame had no metadata coded, do not use differential coding */
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
         || changed_object
#endif
    )
    {
        *flag_abs_angle1 = 1;
@@ -1097,6 +1129,9 @@ static void encode_angle_indices(
        *flag_abs_angle2 = 0;                      /* differential coding by default */
        if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
             || last_ism_metadata_flag == 0        /* If last frame had no metadata coded, do not use differential coding */
#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA
             || changed_object
#endif
        )
        {
            *flag_abs_angle2 = 1;
Loading