Commit 66ab9171 authored by Malenovsky, Vladimir's avatar Malenovsky, Vladimir
Browse files

rebase to main

parent 79848565
Loading
Loading
Loading
Loading
Loading
+16 −40
Original line number Diff line number Diff line
@@ -450,6 +450,7 @@ int main(

    asked_frame_size = arg.renderFramesize;
    uint16_t aeID = arg.aeSequence.count > 0 ? arg.aeSequence.pID[0] : IVAS_DEFAULT_AEID;
    arg.enableHeadRotation = arg.enableHeadRotation || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM;

    if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputConfig, arg.renderFramesize, arg.customLsOutputEnabled, arg.hrtfReaderEnabled,
                                       arg.enableHeadRotation, arg.enableExternalOrientation, arg.orientation_tracking, arg.renderConfigEnabled, arg.roomSize, arg.non_diegetic_pan_enabled,
@@ -497,13 +498,6 @@ int main(
#endif
    }

#ifdef FIX_VE
    if ( arg.renderFramesize != asked_frame_size )
    {
        fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for decoding to split-rendering binaural output!\n" );
    }
#endif

    /*------------------------------------------------------------------------------------------*
     * Configure VoIP mode
     *------------------------------------------------------------------------------------------*/
@@ -2252,7 +2246,6 @@ static ivas_error decodeG192(
#endif
#endif
    IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS];
    IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { -3, 0, 0, 0 }, { -3, 0, 0, 0 }, { -3, 0, 0, 0 }, { -3, 0, 0, 0 } };
    IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
    int16_t vec_pos_update, vec_pos_len;
    SplitFileReadWrite *splitRendWriter = NULL;
@@ -2440,12 +2433,10 @@ static ivas_error decodeG192(
        }

        /* Head-tracking input simulation */
#ifdef FIX_VE
        if ( arg.enableHeadRotation )
#else
        if ( arg.enableHeadRotation || isSplitRend )
#endif
        {
            IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];

            if ( headRotReader == NULL )
            {
                for ( i = 0; i < num_subframes; i++ )
@@ -2483,6 +2474,7 @@ static ivas_error decodeG192(

        if ( arg.enableExternalOrientation )
        {
            IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
            int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
            int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
            int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
@@ -2869,32 +2861,16 @@ static ivas_error decodeG192(
        }

        /* Head-tracking input simulation */
#ifdef FIX_VE
        if ( arg.enableHeadRotation )
#else
        if ( arg.enableHeadRotation || isSplitRend )
#endif
        {
            if ( headRotReader == NULL )
            {
                Quaternions[0].w = -3.0f;
                Quaternions[0].x = 0.0f;
                Quaternions[0].y = 0.0f;
                Quaternions[0].z = 0.0f;
                Pos[0].x = 0.0f;
                Pos[0].y = 0.0f;
                Pos[0].z = 0.0f;
            }
            else
            {
                if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[0], &Pos[0] ) ) != IVAS_ERR_OK )
            IVAS_QUATERNION Quaternion;
            if ( ( error = HeadRotationFileReading( headRotReader, &Quaternion, &Pos[0] ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) );
                goto cleanup;
            }
            }

            if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[0], Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK )
            if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
@@ -3217,7 +3193,6 @@ static ivas_error decodeVoIP(

    IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN;
    IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS];
    IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { -3, 0, 0, 0 }, { -3, 0, 0, 0 }, { -3, 0, 0, 0 }, { -3, 0, 0, 0 } };
    IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
    int16_t vec_pos_update, vec_pos_len;
    int16_t nOutSamples = 0;
@@ -3420,8 +3395,10 @@ static ivas_error decodeVoIP(
        }

        /* Head-tracking input simulation */
        if ( arg.enableHeadRotation || isSplitRend )
        if ( arg.enableHeadRotation )
        {
            IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];

            if ( headRotReader == NULL )
            {
                for ( i = 0; i < num_subframes; i++ )
@@ -3460,6 +3437,7 @@ static ivas_error decodeVoIP(

        if ( arg.enableExternalOrientation )
        {
            IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
            int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
            int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
            int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
@@ -4399,10 +4377,6 @@ static ivas_error restartDecoder(

    IVAS_AUDIO_CONFIG outputConfig = ( decMode == IVAS_DEC_MODE_IVAS ) ? arg->outputConfig : IVAS_AUDIO_CONFIG_MONO;

    /*------------------------------------------------------------------------------------------*
     * Configure the decoder
     *------------------------------------------------------------------------------------------*/

    if ( ( error = IVAS_DEC_Configure( hIvasDec, arg->output_Fs, outputConfig, arg->renderFramesize, arg->customLsOutputEnabled, arg->hrtfReaderEnabled,
                                       arg->enableHeadRotation, arg->enableExternalOrientation, arg->orientation_tracking, arg->renderConfigEnabled, arg->roomSize, arg->non_diegetic_pan_enabled,
                                       arg->non_diegetic_pan_gain, arg->dpidEnabled, aeID, arg->objEditEnabled, arg->delayCompensationEnabled ) ) != IVAS_ERR_OK )
@@ -4436,11 +4410,11 @@ static ivas_error restartDecoder(
            goto cleanup;
        }
    }
#endif

    /*------------------------------------------------------------------------------------------*
     * Configure VoIP mode
     *------------------------------------------------------------------------------------------*/
#endif

    if ( arg->voipMode )
    {
@@ -4473,9 +4447,11 @@ static ivas_error restartDecoder(
        }
    }

#ifdef FIX_VE
    /*------------------------------------------------------------------------------------------*
     * Load custom loudspeaker layout data
     *------------------------------------------------------------------------------------------*/
#endif

    if ( arg->customLsOutputEnabled && hLsCustomData != NULL )
    {
+146 −216

File changed.

Preview size limit exceeded, changes collapsed.

+57 −34
Original line number Diff line number Diff line
@@ -234,116 +234,96 @@ static const CmdLnParser_Option cliOptions[] = {
        .id = CmdLnOptionId_inputFile,
        .match = "input_file",
        .matchShort = "i",
        .placeholder = "<path>",
        .description = "Path to the input file (WAV, raw PCM or scene description file)",
        .isMandatory = true,
    },
    {
        .id = CmdLnOptionId_inputFormat,
        .match = "input_format",
        .matchShort = "if",
        .placeholder = "<format>",
        .description = "Audio format of input file (e.g. 5_1 or HOA3 or META,\nuse -l for a list)",
        .isMandatory = true,
    },
    {
        .id = CmdLnOptionId_inputMetadata,
        .match = "input_metadata",
        .matchShort = "im",
        .placeholder = "<path1> [<path2>...]",
        .description = "Space-separated list of path to metadata files for ISM/MASA/OMASA/\nOSBA/BINAURAL_SPLIT_PCM inputs. \nFor OMASA, ISM files must be specified first.",
    },
    {
        .id = CmdLnOptionId_outputFile,
        .match = "output_file",
        .matchShort = "o",
        .placeholder = "<path>",
        .description = "Path to the output file",
        .isMandatory = true,
    },
    {
        .id = CmdLnOptionId_outputFormat,
        .match = "output_format",
        .matchShort = "of",
        .placeholder = "<format>",
        .description = "Output format to render.\nAlternatively, can be a custom loudspeaker layout file",
        .isMandatory = true,
    },
    {
        .id = CmdLnOptionId_sampleRate,
        .match = "sample_rate",
        .matchShort = "fs",
        .placeholder = "<fs>",
        .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw\nPCM inputs",
    },
    {
        .id = CmdLnOptionId_trajFile,
        .match = "trajectory_file",
        .matchShort = "T",
        .placeholder = "<path>",
        .description = "Head rotation trajectory file for simulation of head tracking\n(only for binaural outputs)",
    },
    {
        .id = CmdLnOptionId_outputMetadata,
        .match = "output_metadata",
        .matchShort = "om",
        .placeholder = "<path>",
        .description = "coded metadata file for BINAURAL_SPLIT_PCM output mode",
    },
    {
        .id = CmdLnOptionId_SplitRendBFIFile,
        .match = "post_rend_bfi_file",
        .matchShort = "prbfi",
        .placeholder = "<path>",
        .description = "Split rendering option: bfi file",
    },
    {
        .id = CmdLnOptionId_refRotFile,
        .match = "reference_rotation_file",
        .matchShort = "rf",
        .placeholder = "<path>",
        .description = "Reference rotation trajectory file for simulation of head tracking\n(only for binaural outputs)",
    },
    {
        .id = CmdLnOptionId_customHrtfFile,
        .match = "custom_hrtf",
        .matchShort = "hrtf",
        .placeholder = "<path>",
        .description = "Custom HRTF file for binaural rendering\n(only for binaural outputs)",
    },
    {
        .id = CmdLnOptionId_renderConfigFile,
        .match = "render_config_parameters",
        .matchShort = "render_config",
        .placeholder = "<path>",
        .description = "Binaural renderer configuration parameters in file\n(only for binaural outputs)",
    },
    {
        .id = CmdLnOptionId_nonDiegeticPan,
        .match = "non_diegetic_panning",
        .matchShort = "non_diegetic_pan",
        .placeholder = "<value>",
        .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right,\ncenter or c or 0 ->middle",
    },
    {
        .id = CmdLnOptionId_orientationTracking,
        .match = "tracking_type",
        .matchShort = "otr",
        .placeholder = "<type>",
        .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec`\nor `ref_vec_lev` (only for binaural outputs)",
    },
    {
        .id = CmdlnOptionId_lfePosition,
        .match = "lfe_position",
        .matchShort = "lp",
        .placeholder = "<gain>,<azi>,<ele>",
        .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth,\nelevation] where gain is linear (like --gain, -g) and azimuth,\nelevation are in degrees. If specified, overrides the default\nbehavior which attempts to map input to output LFE channel(s)",
    },
    {
        .id = CmdlnOptionId_lfeMatrix,
        .match = "lfe_matrix",
        .matchShort = "lm",
        .placeholder = "<path>",
        .description = "LFE panning matrix. File (CSV table) containing a matrix of\ndimensions [ num_input_lfe x num_output_channels ] with elements\nspecifying linear routing gain (like --gain, -g). If specified,\noverrides the output LFE position option and the default\nbehavior which attempts to map input to output LFE channel(s)",
    },
    {
@@ -356,7 +336,6 @@ static const CmdLnParser_Option cliOptions[] = {
        .id = CmdLnOptionId_complexityLevel,
        .match = "complexity_level",
        .matchShort = "level",
        .placeholder = "<level>",
        .description = "Complexity level, level = (1, 2, 3), will be defined after\ncharacterisation.",
    },
    {
@@ -369,7 +348,6 @@ static const CmdLnParser_Option cliOptions[] = {
        .id = CmdLnOptionId_inputGain,
        .match = "gain",
        .matchShort = "g",
        .placeholder = "<gain>",
        .description = "Input gain (linear, not in dB) to be applied to input audio file",
    },
    {
@@ -382,50 +360,43 @@ static const CmdLnParser_Option cliOptions[] = {
        .id = CmdLnOptionId_referenceVectorFile,
        .match = "reference_vector_file",
        .matchShort = "rvf",
        .placeholder = "<path>",
        .description = "Reference vector trajectory file for simulation of head tracking\n(only for binaural outputs)",
    },
    {
        .id = CmdLnOptionId_exteriorOrientationFile,
        .match = "exterior_orientation_file",
        .matchShort = "exof",
        .placeholder = "<path>",
        .description = "External orientation trajectory file for simulation of external\norientations",
    },
    {
        .id = CmdLnOptionId_framing,
        .match = "framing",
        .matchShort = "fr",
        .placeholder = "<duration>",
        .description = "Set render audio framing in ms",
        .description = "Set Render audio framing.",
    },
    {
        .id = CmdLnOptionId_syncMdDelay,
        .match = "sync_md_delay",
        .matchShort = "smd",
        .placeholder = "<duration>",
        .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by\n5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)",
    },
    {
        .id = CmdLnOptionId_directivityPatternId,
        .match = "ism_directivity_pattern_id",
        .matchShort = "dpid",
        .placeholder = "<id1> [<id2>...]",
        .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated\nlist of up to 4 numbers (unsigned integers) can be specified for\nBINAURAL and BINAURAL_ROOM_REVERB output.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\nISMs 1,2,3 and 4 respectively. \nThis option needs to be accompanied by a render_config file,\notherwise a default directivity pattern is used.",
    },
    {
        .id = CmdLnOptionId_acousticEnvironmentId,
        .match = "acoustic_environment_id",
        .matchShort = "aeid",
        .placeholder = "<id|path>",
        .description = "Acoustic environment ID (number > 0) alternatively, it can be\na text file where each line contains \"ID duration\" for\nBINAURAL_ROOM_REVERB output.",
    },
    {
        .id = CmdLnOptionId_roomSize,
        .match = "room_size",
        .matchShort = "rsz",
        .placeholder = "<size>",
        .description = "Selects default reverb based on a room size (S - small |\nM - medium | L - large)",
        .description = "Selects default reverb based on a room size (S - small | M - medium | L - large)",
    }
};

@@ -1480,7 +1451,7 @@ int main(

        if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, outFile, delayNumSamples_temp, delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nError: Could not open split rend metadata file %s!\n", outFile );
            fprintf( stderr, "\nCould not open split rend metadata file %s\n", outFile );
            goto cleanup;
        }
    }
@@ -2630,6 +2601,53 @@ static bool parseReverbRoomSize(
    return true;
}


static bool checkRequiredArgs(
    CmdlnArgs args )
{
    const CmdLnParser_Option *tmpOption;

    /* Check required arguments */
    bool missingRequiredArg = false;
    if ( isEmptyString( args.inputFilePath ) )
    {
        tmpOption = findOptionById( CmdLnOptionId_inputFile );
        fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort );
        missingRequiredArg = true;
    }

    const bool singleInputSpecified = args.inConfig.numAudioObjects != 0 ||
                                      args.inConfig.numAmbisonicsBuses != 0 ||
                                      args.inConfig.numMultiChannelBuses != 0 ||
                                      args.inConfig.numMasaBuses != 0;

    if ( !args.sceneDescriptionInput && !singleInputSpecified )
    {
        /* Neither scene description input nor single-type input was specified on command line */
        tmpOption = findOptionById( CmdLnOptionId_inputFormat );
        fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort );
        missingRequiredArg = true;
    }
    if ( isEmptyString( args.outputFilePath ) )
    {
        tmpOption = findOptionById( CmdLnOptionId_outputFile );
        fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort );
        missingRequiredArg = true;
    }
    if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_INVALID )
    {
        tmpOption = findOptionById( CmdLnOptionId_outputFormat );
        fprintf( stderr, "Missing required argument: %s (%s)\n", tmpOption->match, tmpOption->matchShort );
        missingRequiredArg = true;
    }
    if ( missingRequiredArg )
    {
        CmdLnParser_printUsage( args.executableName, cliOptions, numCliOptions );
    }

    return !missingRequiredArg;
}

static CmdlnArgs defaultArgs(
    const char *executableName )
{
@@ -2709,7 +2727,7 @@ static CmdlnArgs defaultArgs(
    return args;
}

static int16_t parseOption(
static void parseOption(
    const int32_t optionId,
    char **optionValues,
    const int16_t numOptionValues,
@@ -2899,7 +2917,7 @@ static int16_t parseOption(
            break;
    }

    return 0;
    return;
}

static CmdlnArgs parseCmdlnArgs(
@@ -2913,6 +2931,11 @@ static CmdlnArgs parseCmdlnArgs(
        exit( -1 ); /* Error printout handled by failing function */
    }

    if ( !checkRequiredArgs( args ) )
    {
        exit( -1 ); /* Error printout handled by failing function */
    }

    if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
    {
        args.Opt_Headrotation = 1;
+0 −2
Original line number Diff line number Diff line
@@ -186,8 +186,6 @@

#define FIX_VE

#define FIX_VE

/* #################### End BE switches ################################## */

/* #################### Start NON-BE switches ############################ */
+7 −7
Original line number Diff line number Diff line
@@ -405,21 +405,21 @@ ivas_error ivas_td_binaural_renderer_sf_splitBinaural(
        mvr2r( output_local[i], output[i], nSamplesRendered );
    }

#ifdef FIX_VE
    if ( pMultiBinPoseData->num_poses > 1 )
    {
#endif
    /* Restore original head rotation */
    for ( i = 0; i < st_ivas->hCombinedOrientationData->num_subframes; ++i )
    {
        st_ivas->hCombinedOrientationData->Quaternions[i] = originalHeadRot[i];
    }

#ifdef FIX_VE
    }
    if ( pMultiBinPoseData->num_poses > 1 )
    {
#endif

        /* restore original td renderer handle */
        st_ivas->hBinRendererTd = origTdRendHandle;
#ifdef FIX_VE
    }
#endif

    pop_wmops();
    return IVAS_ERR_OK;
Loading