Commit 01b7954a authored by vaclav's avatar vaclav
Browse files
parents ec9c6659 a3b28b2a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@
#define IVAS_MAX_BITS_PER_FRAME     ( 512000 / 50 )
#define IVAS_MAX_NUM_OBJECTS        4
#define IVAS_MAX_OUTPUT_CHANNELS    16
#define IVAS_CLDFB_NO_CHANNELS_MAX  60
#define IVAS_CLDFB_NO_CHANNELS_MAX  ( 60 )
#define IVAS_MAX_INPUT_LFE_CHANNELS 4

#define RENDERER_HEAD_POSITIONS_PER_FRAME 4
@@ -163,6 +163,7 @@ typedef struct _IVAS_LS_CUSTOM_LAYOUT

} IVAS_CUSTOM_LS_DATA;

typedef struct ivas_LS_setup_custom *IVAS_LSSETUP_CUSTOM_HANDLE;
typedef struct ivas_LS_setup_custom IVAS_LSSETUP_CUSTOM_STRUCT;


+3 −3
Original line number Diff line number Diff line
@@ -151,12 +151,10 @@
#define FIX_382_MASA_META_FRAMING_ASYNC                 /* Nokia: Issue 382: detect potential MASA metadata framing offset */
#define FIX_386_CORECODER_RECONFIG                      /* VA: Issue 386: Resolve ToDo comments in CoreCoder reconfig. */


#define SBA2MONO                                        /* FhG: Issue 365: Adapt processing of SBA mono output to be in line with stereo output (less delay, lower complexity) */
#define FIX_379_EXT_METADATA                            /* Eri: Extended metadata issues */
#define FIX_379_ANGLE                                   /* Eri: Extended metadata issues related to angle structure */


#define NOKIA_PARAMBIN_REQULARIZATION                   /* Nokia: Contribution - Configured reqularization factor for parametric binauralizer. */
#define NOKIA_ADAPTIVE_BINAURAL_PROTOS                  /* Nokia: Contribution 28: Adaptive binaural prototypes */
#define NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT              /* Nokia: enable adaptive binaural prototype complexity optimizations */
@@ -169,6 +167,8 @@

#define ISSUE_24_CLEANUP_MCT_LFE                        /* Issue 24: Cleanup LFE path withing MCT */

#define FIX_398_MASA_DIRECTION_ALIGNMENT                /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */

#define FIX_401_DIRAC_RENDERER_META_READ_INDICES        /* Nokia: Issue 401: Fix metadata reading indices in DirAC renderer. */
#define FIX_406_IVAS_POSITION                           /* Eri: Issue 406: Unify IVAS_POSITION to use IVAS_VECTOR3 instead */

+1 −1
Original line number Diff line number Diff line
@@ -1003,7 +1003,7 @@ ivas_error IVAS_DEC_FeedCustomLsData(
)
{
    int16_t i, is_planar;
    IVAS_LSSETUP_CUSTOM_STRUCT *hLsSetupCustom;
    IVAS_LSSETUP_CUSTOM_HANDLE hLsSetupCustom;

    if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
    {
+181 −0
Original line number Diff line number Diff line
@@ -73,6 +73,10 @@ static uint8_t are_masa_subframes_similar( const MASA_METADATA_HANDLE frame1, co
static void detect_framing_async( MASA_ENCODER_HANDLE hMasa );
#endif

#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT
static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa );
#endif

/*-----------------------------------------------------------------------*
 * Local constants
 *-----------------------------------------------------------------------*/
@@ -155,6 +159,13 @@ ivas_error ivas_masa_enc_open(
    hMasa->data.sync_state.frame_mode = MASA_FRAME_4SF;
#endif

#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT
    set_zero( hMasa->data.dir_align_state.previous_azi_dir1, MASA_FREQUENCY_BANDS );
    set_zero( hMasa->data.dir_align_state.previous_ele_dir1, MASA_FREQUENCY_BANDS );
    set_zero( hMasa->data.dir_align_state.previous_azi_dir2, MASA_FREQUENCY_BANDS );
    set_zero( hMasa->data.dir_align_state.previous_ele_dir2, MASA_FREQUENCY_BANDS );
#endif

    st_ivas->hMasa = hMasa;

    return error;
@@ -525,8 +536,13 @@ ivas_error ivas_masa_enc_config(

    if ( ivas_format == MASA_FORMAT )
    {
#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT
        masa_metadata_direction_alignment( hMasa );
#endif

#ifdef FIX_382_MASA_META_FRAMING_ASYNC
        detect_framing_async( hMasa ); /* detect the offset, set 1sf/4sf mode based on this. potentially also shift the metadata using a history buffer */

        if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 )
        {
            /* average over sub-frames */
@@ -2198,3 +2214,168 @@ static void detect_framing_async(
    return;
}
#endif


#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT
/*-------------------------------------------------------------------*
 * masa_metadata_direction_alignment()
 *
 * In 2dir MASA metadata, determine the ordering of the directional
 * fields such that the azi/ele change across time is minimized.
 *-------------------------------------------------------------------*/

static void masa_metadata_direction_alignment(
    MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */
)
{
    uint8_t band, n_dirs;

    MASA_DIR_ALIGN_HANDLE hAlignState;
    MASA_METADATA_HANDLE hMeta;

    hAlignState = &( hMasa->data.dir_align_state );
    hMeta = &( hMasa->masaMetadata );

    n_dirs = hMeta->descriptive_meta.numberOfDirections + 1; /* 1-based */
    for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ )
    {
        uint8_t sf;
        float diff_swap, diff_no_swap;

        /* trade 2*(cos+sin) against storing the values between frames */
        float prev_ele_dir1_sin, prev_ele_dir2_sin;
        float prev_ele_dir1_cos, prev_ele_dir2_cos;

        prev_ele_dir1_sin = sinf( hAlignState->previous_ele_dir1[band] );
        prev_ele_dir2_sin = sinf( hAlignState->previous_ele_dir2[band] );

        prev_ele_dir1_cos = cosf( hAlignState->previous_ele_dir1[band] );
        prev_ele_dir2_cos = cosf( hAlignState->previous_ele_dir2[band] );

        for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
        {
            float azi_rad1, ele_rad1;
            float azi_rad2, ele_rad2;
            float cos_ele1, cos_ele2;
            float sin_ele1, sin_ele2;

            azi_rad1 = hMeta->directional_meta[0].azimuth[sf][band] * PI_OVER_180;
            ele_rad1 = hMeta->directional_meta[0].elevation[sf][band] * PI_OVER_180;

            if ( n_dirs > 1 )
            {
                azi_rad2 = hMeta->directional_meta[1].azimuth[sf][band] * PI_OVER_180;
                ele_rad2 = hMeta->directional_meta[1].elevation[sf][band] * PI_OVER_180;

                /* quick checks to detect constant data and earlier flip */
                if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) < EPSILON &&
                     fabsf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) < EPSILON &&
                     fabsf( ele_rad1 - hAlignState->previous_ele_dir1[band] ) < EPSILON &&
                     fabsf( ele_rad2 - hAlignState->previous_ele_dir2[band] ) < EPSILON )
                {
                    diff_swap = 1.0f;
                    diff_no_swap = 0.0f;
                    /* cached values that will be used for the short-cuts and over-written by the real computations, if done */
                    sin_ele1 = prev_ele_dir1_sin;
                    sin_ele2 = prev_ele_dir2_sin;
                    cos_ele1 = prev_ele_dir1_cos;
                    cos_ele2 = prev_ele_dir2_cos;
                }
                else if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) < EPSILON &&
                          fabsf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) < EPSILON &&
                          fabsf( ele_rad1 - hAlignState->previous_ele_dir2[band] ) < EPSILON &&
                          fabsf( ele_rad2 - hAlignState->previous_ele_dir1[band] ) < EPSILON )
                {
                    diff_swap = 0.0f;
                    diff_no_swap = 1.0f;
                    /* cached values that will be used for the short-cuts and over-written by the real computations, if done */
                    sin_ele1 = prev_ele_dir2_sin;
                    sin_ele2 = prev_ele_dir1_sin;
                    cos_ele1 = prev_ele_dir2_cos;
                    cos_ele2 = prev_ele_dir1_cos;
                }
                else
                {
                    /* angular distance of the two vectors */
                    /* pre-compute values for re-use */
                    sin_ele1 = sinf( ele_rad1 );
                    sin_ele2 = sinf( ele_rad2 );

                    cos_ele1 = cosf( ele_rad1 );
                    cos_ele2 = cosf( ele_rad2 );

                    diff_no_swap = acosf( cos_ele1 * prev_ele_dir1_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) + sin_ele1 * prev_ele_dir1_sin ) +
                                   acosf( cos_ele2 * prev_ele_dir2_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) + sin_ele2 * prev_ele_dir2_sin );

                    diff_swap = acosf( cos_ele1 * prev_ele_dir2_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) + sin_ele1 * prev_ele_dir2_sin ) +
                                acosf( cos_ele2 * prev_ele_dir1_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) + sin_ele2 * prev_ele_dir1_sin );
                }
            }
            else
            {
                /* 1dir */
                sin_ele1 = sinf( ele_rad1 );
                cos_ele1 = cosf( ele_rad1 );

                azi_rad2 = 0.0f;
                ele_rad2 = 0.0f;

                sin_ele2 = 0.0f; /* sin(0) */
                cos_ele2 = 1.0f; /* cos(0) */

                diff_swap = 1.0f;
                diff_no_swap = 0.0f;
            }

            if ( n_dirs > 1 && diff_no_swap > diff_swap )
            {
                /* swap the metadata of the two directions in this TF-tile */
                float tmp_val;
                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;

                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;

                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;

                tmp_val = hMeta->directional_meta[0].spread_coherence[sf][band];
                hMeta->directional_meta[0].spread_coherence[sf][band] = hMeta->directional_meta[1].spread_coherence[sf][band];
                hMeta->directional_meta[1].spread_coherence[sf][band] = tmp_val;

                hAlignState->previous_azi_dir1[band] = azi_rad2;
                hAlignState->previous_ele_dir1[band] = ele_rad2;

                hAlignState->previous_azi_dir2[band] = azi_rad1;
                hAlignState->previous_ele_dir2[band] = ele_rad1;

                prev_ele_dir1_cos = cos_ele2;
                prev_ele_dir1_sin = sin_ele2;

                prev_ele_dir2_cos = cos_ele1;
                prev_ele_dir2_sin = sin_ele1;
            }
            else
            {
                hAlignState->previous_azi_dir1[band] = azi_rad1;
                hAlignState->previous_ele_dir1[band] = ele_rad1;

                hAlignState->previous_azi_dir2[band] = azi_rad2;
                hAlignState->previous_ele_dir2[band] = ele_rad2;

                prev_ele_dir1_cos = cos_ele1;
                prev_ele_dir1_sin = sin_ele1;

                prev_ele_dir2_cos = cos_ele2;
                prev_ele_dir2_sin = sin_ele2;
            }
        } /* sf */
    }     /* band */

    return;
}
#endif
+18 −0
Original line number Diff line number Diff line
@@ -740,6 +740,18 @@ typedef struct ivas_param_mc_enc_data_structure
 * MASA encoder structures
 *----------------------------------------------------------------------------------*/

#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT
typedef struct ivas_masa_dir_align_struct
{
    float previous_azi_dir1[MASA_FREQUENCY_BANDS];
    float previous_ele_dir1[MASA_FREQUENCY_BANDS];

    float previous_azi_dir2[MASA_FREQUENCY_BANDS];
    float previous_ele_dir2[MASA_FREQUENCY_BANDS];

} MASA_DIR_ALIGN_STATE, *MASA_DIR_ALIGN_HANDLE;
#endif

#ifdef FIX_382_MASA_META_FRAMING_ASYNC
/* structure storing MASA framing sync detection and compensation data */
typedef struct ivas_masa_sync_struct
@@ -748,6 +760,7 @@ typedef struct ivas_masa_sync_struct
    uint8_t prev_sim_stop;
    uint8_t prev_offset;
    MASA_FRAME_MODE frame_mode;

} MASA_SYNC_STATE, *MASA_SYNC_HANDLE;
#endif

@@ -773,6 +786,11 @@ typedef struct ivas_masa_encoder_data_struct
#ifdef FIX_382_MASA_META_FRAMING_ASYNC
    MASA_SYNC_STATE sync_state;
#endif

#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT
    MASA_DIR_ALIGN_STATE dir_align_state;
#endif

} MASA_ENCODER_DATA;

typedef struct ivas_masa_encoder_struct