17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License.
67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at
77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and
147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License.
157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file    M4VSS3GPP_AudioMixing.c
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Video Studio Service 3GPP audio mixing implementation.
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*** Includes ***/
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "NXPSW_CompilerSwitches.h"
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Our headers */
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_API.h"
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalTypes.h"
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalFunctions.h"
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_ErrorCodes.h"
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Put the definition of silence frames here */
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS3GPP_SILENCE_FRAMES
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalConfig.h"
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * OSAL headers */
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h" /**< OSAL memory management */
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"  /**< OSAL debug management */
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
461526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma#include "VideoEditorResampler.h"
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Static functions
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intAudioMixingOpen( M4VSS3GPP_InternalAudioMixingContext *pC,
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             M4VSS3GPP_AudioMixingSettings *pSettings );
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingStepVideo(
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioMix(
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioReplace(
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingCopyOrig(
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingCopyAdded(
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingConvert(
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingDoMixing(
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingWriteSilence(
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingTransition(
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingCreateVideoEncoder(
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingDestroyVideoEncoder(
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC );
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_Bool M4VSS3GPP_isThresholdBreached( M4OSA_Int32 *averageValue,
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                M4OSA_Int32 storeCount,
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                M4OSA_Int32 thresholdValue );
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    Internal warning */
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS3GPP_WAR_END_OF_ADDED_AUDIO    M4OSA_ERR_CREATE( M4_WAR, M4VSS3GPP, 0x0030)
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* A define used with SSRC 1.04 and above to avoid taking
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiblocks smaller that the minimal block size */
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS_SSRC_MINBLOCKSIZE        600
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_audioMixingInit(M4VSS3GPP_AudioMixingContext* pContext,
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                     M4VSS3GPP_AudioMixingSettings* pSettings)
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Initializes the VSS audio mixing operation (allocates an execution context).
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext        (OUT) Pointer on the VSS audio mixing context to allocate
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pSettings        (IN) Pointer to valid audio mixing settings
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pFileWritePtrFct    (IN) Pointer to OSAL file writer functions
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:            No error
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_ALLOC:        There is no more available memory
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_audioMixingInit( M4VSS3GPP_AudioMixingContext *pContext,
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VSS3GPP_AudioMixingSettings *pSettings,
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_FileReadPointer *pFileReadPtrFct,
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_FileWriterPointer *pFileWritePtrFct )
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC;
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_2(
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingInit called with pContext=0x%x, pSettings=0x%x",
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext, pSettings);
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingInit: pContext is M4OSA_NULL");
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pSettings), M4ERR_PARAMETER,
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingInit: pSettings is M4OSA_NULL");
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileReadPtrFct), M4ERR_PARAMETER,
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingInit: pFileReadPtrFct is M4OSA_NULL");
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileWritePtrFct), M4ERR_PARAMETER,
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingInit: pFileWritePtrFct is M4OSA_NULL");
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pSettings->uiBeginLoop > pSettings->uiEndLoop )
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_audioMixingInit: Begin loop time is higher than end loop time!");
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VSS3GPP_ERR_BEGINLOOP_HIGHER_ENDLOOP;
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Allocate the VSS audio mixing context and return it to the user */
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC = (M4VSS3GPP_InternalAudioMixingContext
137694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_InternalAudioMixingContext),
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP,(M4OSA_Char *)"M4VSS3GPP_InternalAudioMixingContext");
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext = pC;
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC )
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_audioMixingInit(): unable to allocate \
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_InternalAudioMixingContext,returning M4ERR_ALLOC");
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_ALLOC;
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initialization of context Variables */
15032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memset((void *)pC ,0,
15132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                 sizeof(M4VSS3GPP_InternalAudioMixingContext));
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy this setting in context */
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iAddCts = pSettings->uiAddCts;
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bRemoveOriginal = pSettings->bRemoveOriginal;
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->b_DuckingNeedeed = pSettings->b_DuckingNeedeed;
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InDucking_threshold = pSettings->InDucking_threshold;
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->fBTVolLevel = pSettings->fBTVolLevel;
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->fPTVolLevel = pSettings->fPTVolLevel;
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InDucking_lowVolume = pSettings->InDucking_lowVolume;
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bDoDucking = M4OSA_FALSE;
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bLoop = pSettings->bLoop;
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bNoLooping = M4OSA_FALSE;
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bjumpflag = M4OSA_TRUE;
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Init some context variables */
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt = M4OSA_NULL;
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAddedClipCtxt = M4OSA_NULL;
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->fOrigFactor = 1.0F;
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->fAddedFactor = 0.0F;
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bSupportSilence = M4OSA_FALSE;
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bHasAudio = M4OSA_FALSE;
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bAudioMixingIsNeeded = M4OSA_FALSE;
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Init PC->ewc members */
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Decorrelate input and output encoding timestamp to handle encoder prefetch
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.VideoStreamType = M4SYS_kVideoUnknown;
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.bVideoDataPartitioning = M4OSA_FALSE;
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pVideoOutputDsi = M4OSA_NULL;
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.AudioStreamType = M4SYS_kAudioUnknown;
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.uiNbChannels = 1;
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pAudioOutputDsi = M4OSA_NULL;
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pAudioEncCtxt = M4OSA_NULL;
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pAudioEncDSI.pInfo = M4OSA_NULL;
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pSilenceFrameData = M4OSA_NULL;
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pEncContext = M4OSA_NULL;
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.pDummyAuBuffer = M4OSA_NULL;
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.p3gpWriterContext = M4OSA_NULL;
19052897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    pC->pLVAudioResampler = M4OSA_NULL;
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the OSAL filesystem function set */
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOsaFileReadPtr = pFileReadPtrFct;
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOsaFileWritPtr = pFileWritePtrFct;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Ssrc stuff */
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->b_SSRCneeded = M4OSA_FALSE;
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pSsrcBufferIn = M4OSA_NULL;
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pSsrcBufferOut = M4OSA_NULL;
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pTempBuffer = M4OSA_NULL;
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInTempBuffer = M4OSA_NULL;
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferIn = M4OSA_NULL;
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferOut = M4OSA_NULL;
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->SsrcScratch = M4OSA_NULL;
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiBeginLoop = pSettings->uiBeginLoop;
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiEndLoop = pSettings->uiEndLoop;
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset pointers for media and codecs interfaces */
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_clearInterfaceTables(&pC->ShellAPI);
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*  Call the media and codecs subscription module */
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_subscribeMediaAndCodec(&pC->ShellAPI);
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Open input clip, added clip and output clip and proceed with the settings */
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intAudioMixingOpen(pC, pSettings);
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update main state automaton */
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pInputClipCtxt->pVideoStream )
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4VSS3GPP_kAudioMixingState_VIDEO;
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT;
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.iOutputDuration = (M4OSA_Int32)pC->pInputClipCtxt->pSettings->
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ClipProperties.uiClipDuration;
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*gInputParams.lvBTChannelCount*/
233100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru    pC->pLVAudioResampler = LVAudioResamplerCreate(16,
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels,
235100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru        /* gInputParams.lvOutSampleRate*/(M4OSA_Int32)pSettings->outputASF, 1);
236100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru     if( M4OSA_NULL == pC->pLVAudioResampler )
237100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru     {
238100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru         return M4ERR_ALLOC;
239100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru     }
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVAudiosetSampleRate(pC->pLVAudioResampler,
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*gInputParams.lvInSampleRate*/
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency);
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LVAudiosetVolume(pC->pLVAudioResampler,
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int16)(0x1000 ),
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int16)(0x1000 ));
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_audioMixingInit(): returning M4NO_ERROR");
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_audioMixingStep(M4VSS3GPP_AudioMixingContext pContext)
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Perform one step of audio mixing.
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param     pContext          (IN) VSS audio mixing context
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:       No error
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_PARAMETER:  pContext is M4OSA_NULL (debug only)
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param     pProgress         (OUT) Progress percentage (0 to 100) of the finalization operation
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_STATE:      VSS is not in an appropriate state for this function to be called
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4VSS3GPP_WAR_END_OF_AUDIO_MIXING: Audio mixing is over, user should now call
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                               M4VSS3GPP_audioMixingCleanUp()
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_audioMixingStep( M4VSS3GPP_AudioMixingContext pContext,
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_UInt8 *pProgress )
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC =
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4VSS3GPP_InternalAudioMixingContext *)pContext;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4VSS3GPP_audioMixingStep called with pContext=0x%x",
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext);
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingStep: pContext is M4OSA_NULL");
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * State automaton */
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->State )
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_VIDEO:
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4VSS3GPP_intAudioMixingStepVideo(pC);
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Compute the progress percentage
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Note: audio and video CTS are not initialized before
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * the call of M4VSS3GPP_intAudioMixingStepVideo */
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* P4ME00003276: First 0-50% segment is dedicated to state :
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi               M4VSS3GPP_kAudioMixingState_VIDEO */
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = (M4OSA_UInt8)(50 * (pC->ewc.WriterVideoAU.CTS)
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / pC->pInputClipCtxt->pVideoStream->
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_duration);
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * There may be no audio track (Remove audio track feature).
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * In that case we double the current percentage */
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4SYS_kAudioUnknown == pC->ewc.WriterAudioStream.streamType )
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ( *pProgress) <<= 1; /**< x2 */
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( *pProgress >= 50 )
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pProgress =
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    49; /**< Video processing is not greater than 50% */
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_NO_MORE_AU == err )
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->bHasAudio )
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Video is over, state transition to audio and return OK */
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->iAddCts > 0 )
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->State =
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT;
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->State =
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT;
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * No audio, state transition to FINISHED */
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->State = M4VSS3GPP_kAudioMixingState_FINISHED;
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4NO_ERROR;
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4NO_ERROR != err )
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_audioMixingStep: M4VSS3GPP_intAudioMixingStepVideo returns 0x%x!",
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4NO_ERROR;
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT:
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT:
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT:
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->pAddedClipCtxt->iAudioFrameCts
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                != -pC->pAddedClipCtxt->iSilenceFrameDuration
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (pC->pAddedClipCtxt->iAudioFrameCts - 0.5)
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / pC->pAddedClipCtxt->scale_audio > pC->uiEndLoop
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && pC->uiEndLoop > 0 )
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pC->bLoop == M4OSA_FALSE)
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->bNoLooping = M4OSA_TRUE;
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_Int32 jumpCTS = (M4OSA_Int32)(pC->uiBeginLoop);
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump(
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->pReaderContext,
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4_StreamHandler *)pC->pAddedClipCtxt->
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pAudioStream, &jumpCTS);
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( err != M4NO_ERROR )
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_audioMixingStep: error when jumping in added audio clip: 0x%x",
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Use offset to give a correct CTS ... */
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAddedClipCtxt->iAoffset =
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5);
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_FALSE == pC->bRemoveOriginal )
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingStepAudioMix(pC);
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingStepAudioReplace(pC);
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Compute the progress percentage
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Note: audio and video CTS are not initialized before
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * the call of M4VSS3GPP_intAudioMixingStepAudio */
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( 0 != pC->ewc.iOutputDuration )
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* P4ME00003276: Second 50-100% segment is dedicated to states :
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_kAudioMixingState_AUDIO... */
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* For Audio the progress computation is based on dAto and offset,
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                   it is more accurate */
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pProgress = (M4OSA_UInt8)(50
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + (50 * pC->ewc.dATo - pC->pInputClipCtxt->iVoffset)
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    / (pC->ewc.iOutputDuration)); /**< 50 for 100/2 **/
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( *pProgress >= 100 )
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *pProgress =
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        99; /**< It's not really finished, I prefer to return less than 100% */
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pProgress = 99;
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_NO_MORE_AU == err )
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Audio is over, state transition to FINISHED */
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State = M4VSS3GPP_kAudioMixingState_FINISHED;
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4NO_ERROR;
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4NO_ERROR != err )
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_audioMixingStep: M4VSS3GPP_intAudioMixingStepAudio returns 0x%x!",
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4NO_ERROR;
4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_FINISHED:
4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Progress percentage: finalize finished -> 100% */
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = 100;
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Audio mixing is finished, return correct warning */
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_WAR_END_OF_AUDIO_MIXING;
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_audioMixingStep: State error (0x%x)! Returning M4ERR_STATE",
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State);
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_STATE;
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_audioMixingCleanUp(M4VSS3GPP_AudioMixingContext pContext)
4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Free all resources used by the VSS audio mixing operation.
4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    The context is no more valid after this call
4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) VSS audio mixing context
4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:            No error
4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_audioMixingCleanUp( M4VSS3GPP_AudioMixingContext pContext )
4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC =
4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4VSS3GPP_InternalAudioMixingContext *)pContext;
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lastCTS;
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4VSS3GPP_audioMixingCleanUp called with pContext=0x%x",
4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext);
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_audioMixingCleanUp: pContext is M4OSA_NULL");
4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameter */
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pContext )
4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_audioMixingCleanUp(): M4VSS3GPP_audioMixingCleanUp: pContext is\
4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             M4OSA_NULL, returning M4ERR_PARAMETER");
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Close Input 3GPP file */
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pInputClipCtxt )
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_intClipCleanUp(pC->pInputClipCtxt);
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt = M4OSA_NULL;
4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Close Added 3GPP file */
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pAddedClipCtxt )
5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_intClipCleanUp(pC->pAddedClipCtxt);
5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt = M4OSA_NULL;
5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Close the 3GP writer. In normal use case it has already been closed,
5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi      but not in abort use case */
5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->ewc.p3gpWriterContext )
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Update last Video CTS */
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lastCTS = pC->ewc.iOutputDuration;
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pWriterGlobalFcts->pFctSetOption(
5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.p3gpWriterContext,
5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)M4WRITER_kMaxFileDuration, &lastCTS);
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_audioMixingCleanUp: SetOption(M4WRITER_kMaxFileDuration) returns 0x%x",
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pWriterGlobalFcts->pFctCloseWrite(
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.p3gpWriterContext);
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_audioMixingCleanUp: pWriterGlobalFcts->pFctCloseWrite returns 0x%x!",
5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return the error because we have other things to free! */
5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.p3gpWriterContext = M4OSA_NULL;
5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the Audio encoder context */
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->ewc.pAudioEncCtxt )
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctClose(
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pAudioEncCtxt);
5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_audioMixingCleanUp: pAudioEncoderGlobalFcts->pFctClose returns 0x%x",
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctCleanUp(
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pAudioEncCtxt);
5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_audioMixingCleanUp: pAudioEncoderGlobalFcts->pFctCleanUp returns 0x%x",
5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.pAudioEncCtxt = M4OSA_NULL;
5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the ssrc stuff */
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->SsrcScratch )
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
575694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->SsrcScratch);
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->SsrcScratch = M4OSA_NULL;
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pSsrcBufferIn )
5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
581694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pSsrcBufferIn);
5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferIn = M4OSA_NULL;
5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pSsrcBufferOut
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0) )
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
588694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pSsrcBufferOut);
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferOut = M4OSA_NULL;
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pTempBuffer )
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
594694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pTempBuffer);
5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pTempBuffer = M4OSA_NULL;
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59852897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    if (pC->pLVAudioResampler != M4OSA_NULL)
59952897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    {
60052897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        LVDestroy(pC->pLVAudioResampler);
60152897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        pC->pLVAudioResampler = M4OSA_NULL;
60252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    }
60352897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the shells interfaces */
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_unRegisterAllWriters(&pC->ShellAPI);
6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_unRegisterAllEncoders(&pC->ShellAPI);
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_unRegisterAllReaders(&pC->ShellAPI);
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_unRegisterAllDecoders(&pC->ShellAPI);
6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the context */
613694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    free(pContext);
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pContext = M4OSA_NULL;
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_audioMixingCleanUp(): returning M4NO_ERROR");
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************************************************************/
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************************************************************/
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*********                  STATIC FUNCTIONS                         **********/
6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************************************************************/
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************************************************************/
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingOpen()
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Initializes the VSS audio mixing operation (allocates an execution context).
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext        (OUT) Pointer on the VSS audio mixing context to allocate
6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pSettings        (IN) Pointer to valid audio mixing settings
6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:            No error
6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_ALLOC:        There is no more available memory
6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR
6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_intAudioMixingOpen( M4VSS3GPP_InternalAudioMixingContext *pC,
6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             M4VSS3GPP_AudioMixingSettings *pSettings )
6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 outputASF = 0;
6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Header *encHeader;
6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_2(
6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingOpen called with pContext=0x%x, pSettings=0x%x",
6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC, pSettings);
6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * The Add Volume must be (strictly) superior than zero */
6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pSettings->uiAddVolume == 0 )
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): AddVolume is zero,\
6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            returning M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO");
6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO;
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if(pSettings->uiAddVolume >= 100) // If volume is set to 100, no more original audio ...
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bRemoveOriginal = M4OSA_TRUE;
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Build the input clip settings */
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputClipSettings.pFile =
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pSettings->pOriginalClipFile; /**< Input 3GPP file descriptor */
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputClipSettings.FileType = M4VIDEOEDITING_kFileType_3GPP;
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputClipSettings.uiBeginCutTime =
6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0; /**< No notion of cut for the audio mixing feature */
6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputClipSettings.uiEndCutTime =
6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0; /**< No notion of cut for the audio mixing feature */
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Open the original Audio/Video 3GPP clip */
6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intClipInit(&pC->pInputClipCtxt, pC->pOsaFileReadPtr);
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipInit(orig) returns 0x%x",
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intClipOpen(pC->pInputClipCtxt, &pC->InputClipSettings,
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_FALSE, M4OSA_FALSE, M4OSA_TRUE);
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipOpen(orig) returns 0x%x",
6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->pInputClipCtxt->pAudioStream )
7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bRemoveOriginal = M4OSA_TRUE;
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * If there is no video, it's an error */
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->pInputClipCtxt->pVideoStream )
7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): no video stream in clip,\
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            returning M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE");
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE;
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Compute clip properties */
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intBuildAnalysis(pC->pInputClipCtxt,
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pC->pInputClipCtxt->pSettings->ClipProperties);
7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intBuildAnalysis(orig) returns 0x%x",
7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Build the added clip settings */
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AddedClipSettings.pFile =
7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pSettings->pAddedAudioTrackFile; /**< Added file descriptor */
7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AddedClipSettings.FileType = pSettings->AddedAudioFileType;
7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AddedClipSettings.uiBeginCutTime =
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0; /**< No notion of cut for the audio mixing feature */
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AddedClipSettings.uiEndCutTime   = 0;/**< No notion of cut for the audio mixing feature */
7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AddedClipSettings.ClipProperties.uiNbChannels=
7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pSettings->uiNumChannels;
7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AddedClipSettings.ClipProperties.uiSamplingFrequency=    pSettings->uiSamplingFrequency;
7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->AddedClipSettings.pFile )
7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Open the added Audio clip */
7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipInit(&pC->pAddedClipCtxt, pC->pOsaFileReadPtr);
7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipInit(added) returns 0x%x",
7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipOpen(pC->pAddedClipCtxt, &pC->AddedClipSettings,
7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_FALSE, M4OSA_FALSE, M4OSA_TRUE);
7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipOpen(added) returns 0x%x",
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * If there is no audio, it's an error */
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pAddedClipCtxt->pAudioStream )
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): no audio nor video stream in clip,\
7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                returning M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE");
7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE;
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Compute clip properties */
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intBuildAnalysis(pC->pAddedClipCtxt,
7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->pAddedClipCtxt->pSettings->ClipProperties);
7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intBuildAnalysis(added) returns 0x%x",
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pSettings->outputASF )
7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k8000_ASF:
7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 8000;
7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k16000_ASF:
7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 16000;
7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k22050_ASF:
7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 22050;
7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k24000_ASF:
8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 24000;
8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k32000_ASF:
8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 32000;
8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k44100_ASF:
8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 44100;
8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_k48000_ASF:
8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF = 48000;
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0("Bad parameter in output ASF ");
8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_PARAMETER;
8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->bRemoveOriginal == M4OSA_TRUE
8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == M4VIDEOEDITING_kMP3 || pC->pAddedClipCtxt->pSettings->
8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.AudioStreamType == M4VIDEOEDITING_kPCM
8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->pAddedClipCtxt->pSettings->
8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.AudioStreamType
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pSettings->outputAudioFormat
8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->pAddedClipCtxt->pSettings->
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiSamplingFrequency != outputASF
8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->pAddedClipCtxt->pSettings->
8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiNbChannels
8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pSettings->outputNBChannels) )
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAMR_NB )
8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pSettings->outputASF = M4VIDEOEDITING_k8000_ASF;
8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pSettings->outputNBChannels = 1;
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize = 320;
8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAAC )
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize =
8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    2048 * pSettings->outputNBChannels;
8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->pSettings->ClipProperties.uiSamplingFrequency =
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                outputASF;
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( outputASF != pC->pAddedClipCtxt->pSettings->
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiSamplingFrequency )
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* We need to call SSRC in order to align ASF and/or nb of channels */
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Moreover, audio encoder may be needed in case of audio replacing... */
8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->b_SSRCneeded = M4OSA_TRUE;
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pSettings->outputNBChannels
8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                < pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels )
8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Stereo to Mono */
8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ChannelConversion = 1;
8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( pSettings->outputNBChannels
8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                > pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels )
8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Mono to Stereo */
8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ChannelConversion = 2;
8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels =
8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pSettings->outputNBChannels;
8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check compatibility chart */
8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intAudioMixingCompatibility(pC,
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->pInputClipCtxt->pSettings->ClipProperties,
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->pAddedClipCtxt->pSettings->ClipProperties);
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen():\
8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_intAudioMixingCompatibility returns 0x%x",
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check loop parameters */
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiBeginLoop > pC->pAddedClipCtxt->pSettings->
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiClipAudioDuration )
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen():\
8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                begin loop time is higher than added clip audio duration");
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_BEGINLOOP_HIGHER_ENDLOOP;
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Ok, let's go with this audio track */
9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bHasAudio = M4OSA_TRUE;
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* No added file, force remove original */
9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->AddedClipSettings.FileType = M4VIDEOEDITING_kFileType_Unsupported;
9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bRemoveOriginal = M4OSA_TRUE;
9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bHasAudio = M4OSA_FALSE;
9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy the video properties of the input clip to the output properties */
9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.uiVideoBitrate =
9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoBitrate;
9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.uiVideoWidth =
9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoWidth;
9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.uiVideoHeight =
9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoHeight;
9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.uiVideoTimeScale =
9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoTimeScale;
9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.bVideoDataPartitioning =
9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pSettings->ClipProperties.bMPEG4dataPartition;
9270a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    pC->ewc.outputVideoProfile =
9280a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoProfile;
9290a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    pC->ewc.outputVideoLevel =
9300a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoLevel;
9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->pInputClipCtxt->pSettings->ClipProperties.VideoStreamType )
9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VIDEOEDITING_kH263:
9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.VideoStreamType = M4SYS_kH263;
9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VIDEOEDITING_kMPEG4:
9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.VideoStreamType = M4SYS_kMPEG_4;
9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VIDEOEDITING_kH264:
9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.VideoStreamType = M4SYS_kH264;
9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.VideoStreamType = M4SYS_kVideoUnknown;
9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Add a link to video dsi */
9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4SYS_kH264 == pC->ewc.VideoStreamType )
9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* For H.264 encoder case
9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Fetch the DSI from the shell video encoder, and feed it to the writer */
9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingOpen: get DSI for H264 stream");
9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->ewc.pEncContext )
9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen: pC->ewc.pEncContext is NULL");
9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4VSS3GPP_intAudioMixingCreateVideoEncoder(pC);
9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen:\
9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VSS3GPP_intAudioMixingCreateVideoEncoder returned error 0x%x",
9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL != pC->ewc.pEncContext )
9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctGetOption(
9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.pEncContext, M4ENCODER_kOptionID_EncoderHeader,
9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_DataOption) &encHeader);
9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( M4NO_ERROR != err) || (M4OSA_NULL == encHeader->pBuf) )
9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen: failed to get the encoder header (err 0x%x)",
9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_2(
9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen: encHeader->pBuf=0x%x, size=0x%x",
9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    encHeader->pBuf, encHeader->Size);
9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen: send DSI for H264 stream to 3GP writer");
9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Allocate and copy the new DSI */
9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.pVideoOutputDsi =
997694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                    (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(encHeader->Size, M4VSS3GPP,
9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Char *)"pC->ewc.pVideoOutputDsi (H264)");
9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4OSA_NULL == pC->ewc.pVideoOutputDsi )
10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0(
10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingOpen():\
10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        unable to allocate pVideoOutputDsi (H264), returning M4ERR_ALLOC");
10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_ALLOC;
10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.uiVideoOutputDsiSize = (M4OSA_UInt16)encHeader->Size;
100832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)pC->ewc.pVideoOutputDsi, (void *)encHeader->pBuf,
10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    encHeader->Size);
10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4VSS3GPP_intAudioMixingDestroyVideoEncoder(pC);
10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen:\
10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VSS3GPP_intAudioMixingDestroyVideoEncoder returned error 0x%x",
10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
10207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen: pC->ewc.pEncContext is NULL, cannot get the DSI");
10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
10297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_1(
10317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen: input clip video stream type = 0x%x",
10327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.VideoStreamType);
10337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.uiVideoOutputDsiSize =
10347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt16)pC->pInputClipCtxt->pVideoStream->
10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_basicProperties.m_decoderSpecificInfoSize;
10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.pVideoOutputDsi = (M4OSA_MemAddr8)pC->pInputClipCtxt->pVideoStream->
10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_basicProperties.m_pDecoderSpecificInfo;
10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy the audio properties of the added clip to the output properties */
10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->bHasAudio )
10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->bRemoveOriginal == M4OSA_TRUE )
10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiNbChannels =
10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels;
10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiAudioBitrate =
10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAddedClipCtxt->pSettings->ClipProperties.uiAudioBitrate;
10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiSamplingFrequency = pC->pAddedClipCtxt->pSettings->
10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiSamplingFrequency;
10527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiSilencePcmSize =
10537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAddedClipCtxt->pSettings->ClipProperties.uiDecodedPcmSize;
10547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0;
10557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* if output settings are differents from added clip settings,
10577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            we need to reencode BGM */
10587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
10597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                != pSettings->outputAudioFormat
10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                || pC->pAddedClipCtxt->pSettings->
10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiSamplingFrequency != outputASF
10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                || pC->pAddedClipCtxt->pSettings->
10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiNbChannels
10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                != pSettings->outputNBChannels
10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                || pC->pAddedClipCtxt->pSettings->
10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3 )
10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Set reader DSI to NULL (unknown), we will use encoder DSI later */
10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->pAddedClipCtxt->pAudioStream->
10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_basicProperties.m_pDecoderSpecificInfo != M4OSA_NULL )
10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*
1074694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                     free(pC->pAddedClipCtxt->pAudioStream->\
10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       m_basicProperties.m_pDecoderSpecificInfo);
10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       */
10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->pAudioStream->
10787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_basicProperties.m_decoderSpecificInfoSize = 0;
10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->pAudioStream->
10807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_basicProperties.m_pDecoderSpecificInfo = M4OSA_NULL;
10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
10827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.uiNbChannels =
10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels;
10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.uiSamplingFrequency = pC->pInputClipCtxt->pSettings->
10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiSamplingFrequency;
10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0;
10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAMR_NB )
10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.AudioStreamType = M4SYS_kAMR;
10927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.pSilenceFrameData =
10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048;
10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.uiSilenceFrameSize =
10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE;
10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.iSilenceFrameDuration =
10977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION;
10987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.uiAudioBitrate = 12200;
10997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.uiSamplingFrequency = 8000;
11007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.uiSilencePcmSize = 320;
11017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0;
11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAAC )
11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.AudioStreamType = M4SYS_kAAC;
11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pSettings->outputAudioBitrate
11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        == M4VIDEOEDITING_kUndefinedBitrate )
11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        switch( pC->ewc.uiSamplingFrequency )
11117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
11127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case 16000:
11137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
11147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k24_KBPS;
11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                break;
11167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case 22050:
11187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case 24000:
11197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k32_KBPS;
11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                break;
11227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case 32000:
11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k48_KBPS;
11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                break;
11277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case 44100:
11297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case 48000:
11307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k64_KBPS;
11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                break;
11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            default:
11357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
11367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k64_KBPS;
11377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                break;
11387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pC->ewc.uiNbChannels == 2 )
11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /* Output bitrate have to be doubled */
11437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.uiAudioBitrate += pC->ewc.uiAudioBitrate;
11447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
11457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
11487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiAudioBitrate = pSettings->outputAudioBitrate;
11497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
11507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->ewc.uiNbChannels == 1 )
11527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
11537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.pSilenceFrameData =
11547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO;
11557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiSilenceFrameSize =
11567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE;
11577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
11587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
11597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.pSilenceFrameData =
11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO;
11627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiSilenceFrameSize =
11637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE;
11647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.iSilenceFrameDuration =
11667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        1024; /* AAC is always 1024/Freq sample duration */
11677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
11687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
11707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
11717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                switch( pC->pAddedClipCtxt->pSettings->
11727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.AudioStreamType )
11737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kAMR_NB:
11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.AudioStreamType = M4SYS_kAMR;
11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.pSilenceFrameData =
11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048;
11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiSilenceFrameSize =
11797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE;
11807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.iSilenceFrameDuration =
11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION;
11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kAAC:
11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kAACplus:
11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_keAACplus:
11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.AudioStreamType = M4SYS_kAAC;
11887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pC->ewc.uiNbChannels == 1 )
11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.pSilenceFrameData =
11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO;
11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.uiSilenceFrameSize =
11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE;
11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else
11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.pSilenceFrameData =
11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO;
12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.uiSilenceFrameSize =
12017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE;
12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.iSilenceFrameDuration =
12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            1024; /* AAC is always 1024/Freq sample duration */
12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kEVRC:
12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.AudioStreamType = M4SYS_kEVRC;
12097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.pSilenceFrameData = M4OSA_NULL;
12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiSilenceFrameSize = 0;
12117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.iSilenceFrameDuration = 160; /* EVRC frames are 20 ms at 8000 Hz
12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            (makes it easier to factorize amr and evrc code) */
12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
12147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kPCM:
12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /* Set reader DSI to NULL (unknown), we will use encoder DSI later */
12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pAddedClipCtxt->pAudioStream->
12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_basicProperties.m_decoderSpecificInfoSize = 0;
12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pAddedClipCtxt->pAudioStream->
12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_basicProperties.m_pDecoderSpecificInfo =
12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_NULL;
12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pC->pAddedClipCtxt->pSettings->
12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            ClipProperties.uiSamplingFrequency == 8000 )
12257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.AudioStreamType = M4SYS_kAMR;
12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.pSilenceFrameData = (M4OSA_UInt8
12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048;
12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.uiSilenceFrameSize =
12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE;
12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.iSilenceFrameDuration =
12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION;
12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.uiAudioBitrate = M4VIDEOEDITING_k12_2_KBPS;
12347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
12357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else if( pC->pAddedClipCtxt->pSettings->
12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            ClipProperties.uiSamplingFrequency == 16000 )
12377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if( pC->ewc.uiNbChannels == 1 )
12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.AudioStreamType = M4SYS_kAAC;
12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.pSilenceFrameData = (M4OSA_UInt8
12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    *)M4VSS3GPP_AAC_AU_SILENCE_MONO;
12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiSilenceFrameSize =
12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE;
12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.iSilenceFrameDuration =
12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    1024; /* AAC is always 1024/Freq sample duration */
12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k32_KBPS;
12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
12507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            else
12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.AudioStreamType = M4SYS_kAAC;
12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.pSilenceFrameData = (M4OSA_UInt8
12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    *)M4VSS3GPP_AAC_AU_SILENCE_STEREO;
12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiSilenceFrameSize =
12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE;
12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.iSilenceFrameDuration =
12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    1024; /* AAC is always 1024/Freq sample duration */
12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->ewc.uiAudioBitrate =
12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VIDEOEDITING_k64_KBPS;
12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else
12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.AudioStreamType = M4SYS_kAudioUnknown;
12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    default:
12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.AudioStreamType = M4SYS_kAudioUnknown;
12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Add a link to audio dsi */
12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiAudioOutputDsiSize =
12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)pC->pAddedClipCtxt->pAudioStream->
12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_decoderSpecificInfoSize;
12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pAudioOutputDsi = (M4OSA_MemAddr8)pC->pAddedClipCtxt->pAudioStream->
12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_pDecoderSpecificInfo;
12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiNbChannels =
12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels;
12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiAudioBitrate =
12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pInputClipCtxt->pSettings->ClipProperties.uiAudioBitrate;
12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiSamplingFrequency = pC->pInputClipCtxt->pSettings->
12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiSamplingFrequency;
12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiSilencePcmSize =
12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pInputClipCtxt->pSettings->ClipProperties.uiDecodedPcmSize;
12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0;
12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pC->pInputClipCtxt->pSettings->
12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.AudioStreamType )
12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kAMR_NB:
12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.AudioStreamType = M4SYS_kAMR;
12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.pSilenceFrameData =
13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048;
13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.uiSilenceFrameSize =
13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE;
13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.iSilenceFrameDuration =
13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION;
13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kAAC:
13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kAACplus:
13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_keAACplus:
13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.AudioStreamType = M4SYS_kAAC;
13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->ewc.uiNbChannels == 1 )
13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.pSilenceFrameData =
13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO;
13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiSilenceFrameSize =
13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE;
13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.pSilenceFrameData =
13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO;
13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ewc.uiSilenceFrameSize =
13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE;
13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.iSilenceFrameDuration =
13277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        1024; /* AAC is always 1024/Freq sample duration */
13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.AudioStreamType = M4SYS_kAudioUnknown;
13327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0(
13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingOpen: No audio track in input file.");
13347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED;
13357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
13367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
13377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Add a link to audio dsi */
13397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiAudioOutputDsiSize =
13407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)pC->pInputClipCtxt->pAudioStream->
13417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_decoderSpecificInfoSize;
13427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pAudioOutputDsi = (M4OSA_MemAddr8)pC->pInputClipCtxt->pAudioStream->
13437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_pDecoderSpecificInfo;
13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy common 'silence frame stuff' to ClipContext */
13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->uiSilencePcmSize = pC->ewc.uiSilencePcmSize;
13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->pSilenceFrameData = pC->ewc.pSilenceFrameData;
13517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->uiSilenceFrameSize = pC->ewc.uiSilenceFrameSize;
13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->iSilenceFrameDuration = pC->ewc.iSilenceFrameDuration;
13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->scale_audio = pC->ewc.scale_audio;
13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->iAudioFrameCts =
13567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        -pC->pInputClipCtxt->iSilenceFrameDuration; /* Reset time */
13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy common 'silence frame stuff' to ClipContext */
13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->bHasAudio )
13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->uiSilencePcmSize = pC->ewc.uiSilencePcmSize;
13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->pSilenceFrameData = pC->ewc.pSilenceFrameData;
13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->uiSilenceFrameSize = pC->ewc.uiSilenceFrameSize;
13657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->iSilenceFrameDuration =
13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.iSilenceFrameDuration;
13677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->scale_audio = pC->ewc.scale_audio;
13687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->iAudioFrameCts =
13707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            -pC->pAddedClipCtxt->iSilenceFrameDuration; /* Reset time */
13717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
13747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check AddCts is lower than original clip duration */
13757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4OSA_NULL != pC->pInputClipCtxt->pVideoStream)
13767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->iAddCts > (M4OSA_Int32)pC->pInputClipCtxt->pVideoStream->
13777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        m_basicProperties.m_duration) )
13787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
13797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): uiAddCts is larger than video duration,\
13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            returning M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION");
13827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION;
13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * If the audio tracks are not compatible, replace input track by silence */
13877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_FALSE == pC->pInputClipCtxt->pSettings->
13887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ClipProperties.bAudioIsCompatibleWithMasterClip )
13897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
13907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_intClipDeleteAudioTrack(pC->pInputClipCtxt);
13917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
13947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check if audio mixing is required */
13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( ( pC->bHasAudio) && (M4OSA_FALSE
13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->pAddedClipCtxt->pSettings->ClipProperties.bAudioIsEditable))
13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (M4OSA_TRUE == pC->bRemoveOriginal) ) /*||
13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                 (pSettings->uiAddVolume >= 100)) */
13997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bAudioMixingIsNeeded = M4OSA_FALSE;
14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
14047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bAudioMixingIsNeeded = M4OSA_TRUE;
14057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
14067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
14087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check if output audio can support silence frames
14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    Trick i use bAudioIsCompatibleWithMasterClip filed to store that  */
14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->bHasAudio )
14117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
14127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bSupportSilence = pC->pAddedClipCtxt->pSettings->
14137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.bAudioIsCompatibleWithMasterClip;
14147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_FALSE == pC->bSupportSilence )
14167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
14177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->iAddCts > 0 )
14187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
14197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
14207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen():\
14217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    iAddCts should be set to 0 with this audio track !");
14227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK;
14237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
14247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( 0 < pC->uiEndLoop )
14267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
14287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen():\
14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiEndLoop should be set to 0 with this audio track !");
14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK;
14317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
14327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
14337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
14347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->b_DuckingNeedeed == M4OSA_FALSE)
14357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
14367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
14377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Compute the factor to apply to sample to do the mixing */
14387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->fAddedFactor = 0.50F;
14397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->fOrigFactor = 0.50F;
14407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
14417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
14447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check if SSRC is needed */
14457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->b_SSRCneeded )
14467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
14477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 numerator, denominator, ratio, ratioBuffer;
14487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
14507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Init the SSRC module */
14517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SSRC_ReturnStatus_en
14527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ReturnStatus; /* Function return status                       */
14537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVM_INT16 NrSamplesMin =
14547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /* Minimal number of samples on the input or on the output */
14557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVM_INT32
14567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ScratchSize; /* The size of the scratch memory               */
14577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVM_INT16
14587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pInputInScratch; /* Pointer to input in the scratch buffer       */
14597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVM_INT16
14607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *
14617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pOutputInScratch; /* Pointer to the output in the scratch buffer  */
14627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        SSRC_Params_t ssrcParams;          /* Memory for init parameters                    */
14637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->pAddedClipCtxt->pSettings->
14657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiSamplingFrequency )
14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 8000:
14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_8000;
14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 11025:
14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_11025;
14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 12000:
14767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_12000;
14777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 16000:
14807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_16000;
14817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 22050:
14847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_22050;
14857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 24000:
14887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_24000;
14897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 32000:
14927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_32000;
14937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 44100:
14967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_44100;
14977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 48000:
15007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_In = LVM_FS_48000;
15017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
15047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
15057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen: invalid added clip sampling frequency (%d Hz),\
15067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    returning M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM",
15077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->pSettings->
15087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiSamplingFrequency);
15097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM;
15107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( 1 == pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels )
15137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
15147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_NrOfChannels = LVM_MONO;
15157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
15177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
15187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_NrOfChannels = LVM_STEREO;
15197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->ewc.uiSamplingFrequency )
15227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
15237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 8000:
15247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_8000;
15257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 16000:
15287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_16000;
15297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 22050:
15327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_22050;
15337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 24000:
15367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_24000;
15377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 32000:
15407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_32000;
15417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 44100:
15447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_44100;
15457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 48000:
15487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_48000;
15497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
15527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
15537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen: invalid output sampling frequency (%d Hz),\
15547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    returning M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED",
15557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.uiSamplingFrequency);
15567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED;
15577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ReturnStatus = 0;
15607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch (ssrcParams.SSRC_Fs_In){
15627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_8000:
15637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 320;
15647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_11025:
15667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn =441;
15677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_12000:
15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn =    480;
15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_16000:
15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn =    640;
15737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_22050:
15757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn =    882;
15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_24000:
15787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn =    960;
15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_32000:
15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 1280;
15827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_44100:
15847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 1764;
15857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_48000:
15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 1920;
15887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ReturnStatus = -1;
15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch (ssrcParams.SSRC_Fs_Out){
15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_8000:
15967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut= 320;
15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_11025:
15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut =441;
16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_12000:
16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut=    480;
16037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_16000:
16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut=    640;
16067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_22050:
16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut=    882;
16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_24000:
16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut=    960;
16127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_32000:
16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 1280;
16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_44100:
16177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut= 1764;
16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_48000:
16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 1920;
16217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ReturnStatus = -1;
16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ReturnStatus != SSRC_OK )
16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
16297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen:\
16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Error code %d returned by the SSRC_GetNrSamples function",
16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ReturnStatus);
16327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED;
16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NrSamplesMin =
16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (LVM_INT16)((ssrcParams.NrSamplesIn > ssrcParams.NrSamplesOut)
16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ? ssrcParams.NrSamplesOut : ssrcParams.NrSamplesIn);
16387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( NrSamplesMin < M4VSS_SSRC_MINBLOCKSIZE )
16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        { /* Don't take blocks smaller that the minimal block size */
16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = (LVM_INT16)(ssrcParams.NrSamplesIn << 1);
16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = (LVM_INT16)(ssrcParams.NrSamplesOut << 1);
16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NrSamplesMin = (LVM_INT16)(NrSamplesMin << 1);
16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iSsrcNbSamplIn = (LVM_INT16)(
16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.
16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NrSamplesIn); /* multiplication by NrOfChannels is done below */
16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iSsrcNbSamplOut = (LVM_INT16)(ssrcParams.NrSamplesOut);
16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        numerator =
16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency
16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels;
16537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        denominator =
16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->pSettings->ClipProperties.uiSamplingFrequency
16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels;
16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( numerator % denominator == 0 )
16587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ratioBuffer = (M4OSA_UInt32)(numerator / denominator);
16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ratioBuffer = (M4OSA_UInt32)(numerator / denominator) + 1;
16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ratio =
16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)(( pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize
16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * ratioBuffer) / (pC->iSsrcNbSamplIn * sizeof(short)
16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * pC->pAddedClipCtxt->pSettings->
16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiNbChannels));
16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ratio == 0 )
16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* It means that the input size of SSRC bufferIn is bigger than the asked buffer */
16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->minimumBufferIn = pC->iSsrcNbSamplIn * sizeof(short)
16767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * pC->pAddedClipCtxt->pSettings->
16777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiNbChannels;
16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ratio++; /* We use the immediate superior integer */
16827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->minimumBufferIn = ratio * (pC->iSsrcNbSamplIn * sizeof(short)
16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * pC->pAddedClipCtxt->pSettings->
16847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiNbChannels);
16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate buffer for the input of the SSRC */
16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferIn =
1690694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->minimumBufferIn
16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + pC->pAddedClipCtxt->
16927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            AudioDecBufferOut.
16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_bufferSize,
16947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferIn");
16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pSsrcBufferIn )
16977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
16997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen():\
17007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                unable to allocate pSsrcBufferIn, returning M4ERR_ALLOC");
17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
17027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn;
17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate buffer for the output of the SSRC */
17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* The "3" value below should be optimized ... one day ... */
17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferOut =
1709694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(3 * pC->iSsrcNbSamplOut * sizeof(short)
17107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * pC->ewc.uiNbChannels, M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferOut");
17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pSsrcBufferOut )
17137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
17147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
17157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen():\
17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                unable to allocate pSsrcBufferOut, returning M4ERR_ALLOC");
17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferOut = pC->pSsrcBufferOut;
17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
17227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate temporary buffer needed in case of channel conversion */
17237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ChannelConversion > 0 )
17247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
17257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* The "3" value below should be optimized ... one day ... */
17267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pTempBuffer =
1727694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(3 * pC->iSsrcNbSamplOut
17287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * sizeof(short) * pC->pAddedClipCtxt->pSettings->
17297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ClipProperties.uiNbChannels, M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferOut");
17307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_NULL == pC->pTempBuffer )
17327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
17337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
17347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingOpen():\
17357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    unable to allocate pTempBuffer, returning M4ERR_ALLOC");
17367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
17377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
17387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInTempBuffer = pC->pTempBuffer;
17397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
17417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->ChannelConversion > 0 )
17427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
17437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->minimumBufferIn =
17447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize;
17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate buffer for the input of the SSRC */
17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferIn =
1749694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->minimumBufferIn
17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + pC->pAddedClipCtxt->
17517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            AudioDecBufferOut.
17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_bufferSize,
17537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferIn");
17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pSsrcBufferIn )
17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): \
17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                unable to allocate pSsrcBufferIn, returning M4ERR_ALLOC");
17607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
17617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn;
17637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
17657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate buffer for the output of the SSRC */
17667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* The "3" value below should be optimized ... one day ... */
1767694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        pC->pSsrcBufferOut = (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(
17687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize,
17697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferOut");
17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pSsrcBufferOut )
17727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen():\
17757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                unable to allocate pSsrcBufferOut, returning M4ERR_ALLOC");
17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
17777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferOut = pC->pSsrcBufferOut;
17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( (pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3)||
17817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         (pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kPCM))
17827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
17837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 minbuffer = 0;
17847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAAC )
17867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->minimumBufferIn = 2048 * pC->ewc.uiNbChannels;
17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            minbuffer = pC->minimumBufferIn;
17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAMR_NB )
17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
17927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->minimumBufferIn = 320;
17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize > 320 )
17957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                minbuffer = pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize;
17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
17987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
17997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                minbuffer = pC->minimumBufferIn; /* Not really possible ...*/
18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("Bad output audio format, in case of MP3 replacing");
18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_PARAMETER;
18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate buffer for the input of the SSRC */
18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferIn =
1812694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(2 * minbuffer, M4VSS3GPP,
18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"pSsrcBufferIn");
18147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pSsrcBufferIn )
18167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
18187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): unable to allocate pSsrcBufferIn,\
18197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                returning M4ERR_ALLOC");
18207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn;
18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferOut = pC->pPosInSsrcBufferIn;
18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferOut = pC->pSsrcBufferIn;
18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
18297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check if audio encoder is needed to do audio mixing or audio resampling */
18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->bAudioMixingIsNeeded || M4VIDEOEDITING_kPCM
18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || M4VIDEOEDITING_kMP3
18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != pSettings->outputAudioFormat
18367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency
18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != outputASF
18387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels
18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != pSettings->outputNBChannels )
18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Init the audio encoder */
18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intCreateAudioEncoder(&pC->ewc, &pC->ShellAPI,
18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiAudioBitrate);
18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
18477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
18497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intCreateAudioEncoder() returns 0x%x",
18507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
18517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
18527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* In case of PCM, MP3 or audio replace with reencoding, use encoder DSI */
18557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ewc.uiAudioOutputDsiSize == 0 && (M4VIDEOEDITING_kPCM
18567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
18577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || M4VIDEOEDITING_kMP3 == pC->pAddedClipCtxt->pSettings->
18587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.AudioStreamType
18597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->pAddedClipCtxt->pSettings->
18607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.AudioStreamType
18617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pSettings->outputAudioFormat
18627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->pAddedClipCtxt->pSettings->
18637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiSamplingFrequency != outputASF
18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->pAddedClipCtxt->pSettings->
18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ClipProperties.uiNbChannels
18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pSettings->outputNBChannels) )
18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.uiAudioOutputDsiSize =
18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt16)pC->ewc.pAudioEncDSI.infoSize;
18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pAudioOutputDsi = pC->ewc.pAudioEncDSI.pInfo;
18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
18757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Init the output 3GPP file */
18767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*11/12/2008 CR3283 add the max output file size for the MMS use case in VideoArtist*/
18777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intCreate3GPPOutputFile(&pC->ewc, &pC->ShellAPI,
18787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOsaFileWritPtr, pSettings->pOutputClipFile,
18797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOsaFileReadPtr, pSettings->pTemporaryFile, 0);
18807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
18827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
18837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
18847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intCreate3GPPOutputFile() returns 0x%x",
18857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
18867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
18877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
18887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
18907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
18917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingOpen(): returning M4NO_ERROR");
18927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
18937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
18947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingWriteSilence()
18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Write an audio silence frame into the writer
18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Mainly used when padding with silence
19007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC            (IN) VSS audio mixing internal context
19017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingWriteSilence(
19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
19067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext,
19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
19117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
19137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingWriteSilence:\
19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         pWriterDataFcts->pStartAU(audio) returns 0x%x!", err);
19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_0("A #### silence AU");
19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
192132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)pC->ewc.WriterAudioAU.dataAddress,
192232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        (void *)pC->ewc.pSilenceFrameData, pC->ewc.uiSilenceFrameSize);
19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterAudioAU.size = pC->ewc.uiSilenceFrameSize;
19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterAudioAU.CTS =
19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Time)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5);
19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2("B ---- write : cts  = %ld [ 0x%x ]",
19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int32)(pC->ewc.dATo), pC->ewc.WriterAudioAU.size);
19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext,
19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
19377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingWriteSilence:\
19387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pWriterDataFcts->pProcessAU(silence) returns 0x%x!",
19397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
19407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio;
19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingStepVideo(M4VSS3GPP_InternalAudioMixingContext *pC)
19517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Perform one step of video.
19527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
19537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC            (IN) VSS audio mixing internal context
19547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
19557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
19567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
19577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingStepVideo(
19587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
19597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
19607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt16 offset;
19627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3("  VIDEO step : dVTo = %f  state = %d  offset = %ld",
19647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.dOutputVidCts, pC->State, pC->pInputClipCtxt->iVoffset);
19657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
19677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Read the input video AU */
19687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pInputClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu(
19697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pReaderContext,
19707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4_StreamHandler *)pC->pInputClipCtxt->pVideoStream,
19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pC->pInputClipCtxt->VideoAU);
19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_1(
19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingStepVideo(): m_pFctGetNextAu(video) returns 0x%x",
19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3("C .... read  : cts  = %.0f + %ld [ 0x%x ]",
19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->VideoAU.m_CTS, pC->pInputClipCtxt->iVoffset,
19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->VideoAU.m_size);
19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the output AU to write into */
19877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext,
19887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_VIDEO_STREAM_ID, &pC->ewc.WriterVideoAU);
19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
19927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingStepVideo: pWriterDataFcts->pStartAU(Video) returns 0x%x!",
19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    offset = 0;
19997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* for h.264 stream do not read the 1st 4 bytes as they are header indicators */
20007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pInputClipCtxt->pVideoStream->m_basicProperties.m_streamType
20017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == M4DA_StreamTypeVideoMpeg4Avc )
20027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
20037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_0(
20047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingStepVideo(): input stream type H264");
20057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        offset = 4;
20067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputClipCtxt->VideoAU.m_size  -=  offset;
20087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
20097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check that the video AU is not larger than expected */
20107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pInputClipCtxt->VideoAU.m_size > pC->ewc.uiVideoMaxAuSize )
20117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
20127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_2(
20137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingStepVideo: AU size greater than MaxAuSize (%d>%d)!\
20147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            returning M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE",
20157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->VideoAU.m_size, pC->ewc.uiVideoMaxAuSize);
20167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE;
20177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
20207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy the input AU payload to the output AU */
202132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)pC->ewc.WriterVideoAU.dataAddress,
202232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        (void *)(pC->pInputClipCtxt->VideoAU.m_dataAddress + offset),
20237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (pC->pInputClipCtxt->VideoAU.m_size));
20247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
20267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy the input AU parameters to the output AU */
20277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterVideoAU.size = pC->pInputClipCtxt->VideoAU.m_size;
20287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterVideoAU.CTS =
20297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)(pC->pInputClipCtxt->VideoAU.m_CTS + 0.5);
20307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterVideoAU.attribute = pC->pInputClipCtxt->VideoAU.m_attribute;
20317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
20337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Write the AU */
20347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2("D ---- write : cts  = %lu [ 0x%x ]",
20357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterVideoAU.CTS, pC->ewc.WriterVideoAU.size);
20367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext,
20387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_VIDEO_STREAM_ID, &pC->ewc.WriterVideoAU);
20397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
20417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
20427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
20437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingStepVideo: pWriterDataFcts->pProcessAU(Video) returns 0x%x!",
20447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
20457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
20467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
20497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
20507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingStepVideo(): returning M4NO_ERROR");
20517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
20527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
20537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
20557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
20567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioMix(M4VSS3GPP_InternalAudioMixingContext *pC)
20577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Perform one step of audio.
20587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
20597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC            (IN) VSS audio mixing internal context
20607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
20617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
20627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
20637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioMix(
20647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
20657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
20667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
20677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3("  AUDIO mix  : dATo = %f  state = %d  offset = %ld",
20697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.dATo, pC->State, pC->pInputClipCtxt->iAoffset);
20707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->State )
20727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
20737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**********************************************************/
20747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT:
20757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
20767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingCopyOrig(pC);
20777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
20797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
20807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
20817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix:\
20827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intAudioMixingCopyOrig(1) returns 0x%x!",
20837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
20847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
20857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
20867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
20887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Check if we reached the AddCts */
20897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ewc.dATo >= pC->iAddCts )
20907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
20917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
20927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * First segment is over, state transition to second and return OK */
20937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT;
20947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* Transition from reading state to encoding state */
20967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4VSS3GPP_intAudioMixingTransition(pC);
20977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
20997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
21007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
21017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioMix(): pre-encode fails err = 0x%x",
21027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
21037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
21047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
21057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
21077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Return with no error so the step function will be called again */
21087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->iAoffset =
21097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5);
21107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE2_0(
21127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix(): returning M4NO_ERROR (1->2)");
21137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4NO_ERROR;
21157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
21167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
21177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
21187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**********************************************************/
21207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT:
21217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
21227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4OSA_TRUE == pC->bAudioMixingIsNeeded ) /**< Mix */
21237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
21247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
21257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Read the added audio AU */
21267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->ChannelConversion > 0 || pC->b_SSRCneeded == M4OSA_TRUE
21277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        || pC->pAddedClipCtxt->pSettings->
21287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3 )
21297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
21307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /* In case of sampling freq conversion and/or channel conversion,
21317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           the read next AU will be    called by the
21327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           M4VSS3GPP_intAudioMixingDoMixing function */
21337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
21347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
21357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
21367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err =
21377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_intClipReadNextAudioFrame(pC->pAddedClipCtxt);
21387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE2_3("E .... read  : cts  = %.0f + %.0f [ 0x%x ]",
21407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pAddedClipCtxt->iAudioFrameCts
21417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            / pC->pAddedClipCtxt->scale_audio,
21427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pAddedClipCtxt->iAoffset
21437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            / pC->pAddedClipCtxt->scale_audio,
21447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pAddedClipCtxt->uiAudioFrameSize);
21457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( M4WAR_NO_MORE_AU == err )
21477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
21487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /**
21497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * Decide what to do when audio is over */
21507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if( pC->uiEndLoop > 0 )
21517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
21527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                /**
21537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                * Jump at the Begin loop time */
21547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop);
21557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err = pC->pAddedClipCtxt->ShellAPI.m_pReader->
21577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    m_pFctJump(
21587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->pAddedClipCtxt->pReaderContext,
21597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    (M4_StreamHandler
21607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    *)pC->pAddedClipCtxt->pAudioStream,
21617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    &time);
21627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                if( M4NO_ERROR != err )
21647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                {
21657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_TRACE1_1(
21667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        "M4VSS3GPP_intAudioMixingStepAudioMix():\
21677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        m_pReader->m_pFctJump(audio returns 0x%x",
21687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        err);
21697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    return err;
21707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                }
21717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
21727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            else
21737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
21747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                /* Transition from encoding state to reading state */
21757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err = M4VSS3GPP_intAudioMixingTransition(pC);
21767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                if( M4NO_ERROR != err )
21787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                {
21797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_TRACE1_1(
21807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        "M4VSS3GPP_intAudioMixingStepAudioMix():\
21817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        pre-encode fails err = 0x%x",
21827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        err);
21837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    return err;
21847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                }
21857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                /**
21877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                * Second segment is over, state transition to third and
21887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 return OK */
21897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->State =
21907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT;
21917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                /**
21937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                * Return with no error so the step function will be
21947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 called again */
21957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_TRACE2_0(
21967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    "M4VSS3GPP_intAudioMixingStepAudioMix():\
21977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    returning M4NO_ERROR (2->3) a");
21987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return M4NO_ERROR;
21997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
22007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
22017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else if( M4NO_ERROR != err )
22027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
22037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1(
22047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4VSS3GPP_intAudioMixingStepAudioMix():\
22057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                m_pFctGetNextAu(audio) returns 0x%x",
22067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err);
22077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return err;
22087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
22097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
22107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
22127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Read the original audio AU */
22137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pInputClipCtxt);
22147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE2_3("F .... read  : cts  = %.0f + %.0f [ 0x%x ]",
22167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->iAudioFrameCts
22177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / pC->pInputClipCtxt->scale_audio,
22187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->iAoffset
22197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / pC->pInputClipCtxt->scale_audio,
22207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->uiAudioFrameSize);
22217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
22237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
22247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE3_1(
22257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioMix():\
22267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pFctGetNextAu(audio) returns 0x%x",
22277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
22287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
22297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
22307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->ChannelConversion == 0
22327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && pC->b_SSRCneeded == M4OSA_FALSE
22337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && pC->pAddedClipCtxt->pSettings->
22347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.AudioStreamType != M4VIDEOEDITING_kMP3 )
22357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
22367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
22377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Get the output AU to write into */
22387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err = pC->ShellAPI.pWriterDataFcts->pStartAU(
22397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ewc.p3gpWriterContext,
22407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_WRITER_AUDIO_STREAM_ID,
22417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            &pC->ewc.WriterAudioAU);
22427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( M4NO_ERROR != err )
22447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
22457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1(
22467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4VSS3GPP_intAudioMixingStepAudioMix:\
22477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pWriterDataFcts->pStartAU(audio) returns 0x%x!",
22487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err);
22497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return err;
22507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
22517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
22527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
22547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Perform the audio mixing */
22557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4VSS3GPP_intAudioMixingDoMixing(pC);
22567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( err == M4VSS3GPP_WAR_END_OF_ADDED_AUDIO )
22587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
22597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4NO_ERROR;
22607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
22617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
22637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
22647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
22657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioMix:\
22667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_intAudioMixingDoMixing returns 0x%x!",
22677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
22687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
22697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
22707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
22717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else /**< No mix, just copy added audio */
22727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
22737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4VSS3GPP_intAudioMixingCopyAdded(pC);
22747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4WAR_NO_MORE_AU == err )
22767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
22777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
22787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Decide what to do when audio is over */
22797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pC->uiEndLoop > 0 )
22807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
22817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /**
22827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * Jump at the Begin loop time */
22837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop);
22847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err =
22867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump(
22877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->pAddedClipCtxt->pReaderContext,
22887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4_StreamHandler
22897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                *)pC->pAddedClipCtxt->pAudioStream,
22907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                &time);
22917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if( M4NO_ERROR != err )
22937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
22947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_TRACE1_1(
22957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    "M4VSS3GPP_intAudioMixingStepAudioMix():\
22967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    m_pReader->m_pFctJump(audio returns 0x%x",
22977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    err);
22987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return err;
22997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
23007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /**
23027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * 'BZZZ' bug fix:
23037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * add a silence frame */
23047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err = M4VSS3GPP_intAudioMixingWriteSilence(pC);
23057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if( M4NO_ERROR != err )
23077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
23087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_TRACE1_1(
23097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    "M4VSS3GPP_intAudioMixingStepAudioMix():\
23107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x",
23117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    err);
23127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return err;
23137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
23147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /**
23167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * Return with no error so the step function will be called again to
23177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                              read audio data */
23187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pAddedClipCtxt->iAoffset =
23197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio
23207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                + 0.5);
23217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE2_0(
23237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4VSS3GPP_intAudioMixingStepAudioMix():\
23247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    returning M4NO_ERROR (loop)");
23257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4NO_ERROR;
23267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
23277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else
23287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
23297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /* Transition to begin cut */
23307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err = M4VSS3GPP_intAudioMixingTransition(pC);
23317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            if( M4NO_ERROR != err )
23337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
23347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_TRACE1_1(
23357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    "M4VSS3GPP_intAudioMixingStepAudioMix():\
23367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pre-encode fails err = 0x%x",
23377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    err);
23387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                return err;
23397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
23407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /**
23427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * Second segment is over, state transition to third */
23437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->State =
23447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT;
23457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /**
23477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            * Return with no error so the step function will be called again */
23487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE2_0(
23497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4VSS3GPP_intAudioMixingStepAudioMix():\
23507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                returning M4NO_ERROR (2->3) b");
23517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4NO_ERROR;
23527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
23537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
23547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( M4NO_ERROR != err )
23557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
23567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
23577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioMix():\
23587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4VSS3GPP_intAudioMixingCopyOrig(2) returns 0x%x",
23597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
23607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
23617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
23627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
23637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
23657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Check if we reached the end of the video */
23667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ewc.dATo >= pC->ewc.iOutputDuration )
23677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
23687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0(
23697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix(): Video duration reached,\
23707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        returning M4WAR_NO_MORE_AU");
23717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4WAR_NO_MORE_AU; /**< Simulate end of file error */
23727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
23737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
23747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
23757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**********************************************************/
23777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT:
23787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
23797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingCopyOrig(pC);
23807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
23827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
23837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
23847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix:\
23857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intAudioMixingCopyOrig(3) returns 0x%x!",
23867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
23877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
23887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
23897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
23917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Check if we reached the end of the video */
23927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ewc.dATo >= pC->ewc.iOutputDuration )
23937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
23947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0(
23957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix():\
23967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Video duration reached, returning M4WAR_NO_MORE_AU");
23977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4WAR_NO_MORE_AU; /**< Simulate end of file error */
23987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
23997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
24007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
24017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi       default:
24027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
24037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
24047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
24067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
24077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0(
24087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingStepAudioMix(): returning M4NO_ERROR");
24097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
24107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
24117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
24137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
24147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioReplace(M4VSS3GPP_InternalAudioMixingContext *pC)
24157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Perform one step of audio.
24167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
24177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC            (IN) VSS audio mixing internal context
24187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
24197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
24207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
24217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioReplace(
24227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
24237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
24247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
24257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3("  AUDIO repl : dATo = %f  state = %d  offset = %ld",
24277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.dATo, pC->State, pC->pInputClipCtxt->iAoffset);
24287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->State )
24307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
24317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**********************************************************/
24327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT:
24337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
24347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
24357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Replace the SID (silence) payload in the writer AU */
24367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingWriteSilence(pC);
24377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
24397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
24407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
24417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix():\
24427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x",
24437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
24447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
24457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
24467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
24487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Check if we reached the AddCts */
24497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ewc.dATo >= pC->iAddCts )
24507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
24517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
24527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * First segment is over, state transition to second and return OK */
24537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT;
24547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
24567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Return with no error so the step function will be called again */
24577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->iAoffset =
24587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5);
24597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE2_0("M4VSS3GPP_intAudioMixingStepAudioReplace():\
24617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         returning M4NO_ERROR (1->2)");
24627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4NO_ERROR;
24637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
24647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
24657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
24667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**********************************************************/
24687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT:
24697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
24707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingCopyAdded(pC);
24717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4WAR_NO_MORE_AU == err )
24737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
24747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
24757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Decide what to do when audio is over */
24767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiEndLoop > 0 )
24787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
24797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
24807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Jump at the Begin loop time */
24817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop);
24827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err = pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump(
24847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pAddedClipCtxt->pReaderContext,
24857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4_StreamHandler
24867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            *)pC->pAddedClipCtxt->pAudioStream, &time);
24877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( M4NO_ERROR != err )
24897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
24907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1(
24917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4VSS3GPP_intAudioMixingStepAudioReplace():\
24927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                m_pReader->m_pFctJump(audio returns 0x%x",
24937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err);
24947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return err;
24957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
24967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
24987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * 'BZZZ' bug fix:
24997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * add a silence frame */
25007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err = M4VSS3GPP_intAudioMixingWriteSilence(pC);
25017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( M4NO_ERROR != err )
25037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
25047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1(
25057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4VSS3GPP_intAudioMixingStepAudioMix():\
25067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x",
25077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err);
25087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return err;
25097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
25107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
25127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Return with no error so the step function will be called again to
25137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                          read audio data */
25147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pAddedClipCtxt->iAoffset =
25157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5);
25167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE2_0(
25187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioReplace():\
25197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            returning M4NO_ERROR (loop)");
25207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4NO_ERROR;
25227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
25237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( M4OSA_TRUE == pC->bSupportSilence )
25247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
25257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
25267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Second segment is over, state transition to third and return OK */
25277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT;
25287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
25307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Return with no error so the step function will be called again */
25317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE2_0(
25327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioReplace():\
25337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 returning M4NO_ERROR (2->3)");
25347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4NO_ERROR;
25357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
25367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
25377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
25387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
25397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * The third segment (silence) is only done if supported.
25407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * In other case, we finish here. */
25417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->State = M4VSS3GPP_kAudioMixingState_FINISHED;
25427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /**
25447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * Return with no error so the step function will be called again */
25457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE2_0(
25467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4VSS3GPP_intAudioMixingStepAudioReplace():\
25477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 returning M4NO_ERROR (2->F)");
25487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4NO_ERROR;
25497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
25507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else if( M4NO_ERROR != err )
25527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
25537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
25547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioReplace():\
25557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intAudioMixingCopyOrig(2) returns 0x%x",
25567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
25577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
25587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
25617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Check if we reached the end of the clip */
25627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ewc.dATo >= pC->ewc.iOutputDuration )
25637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
25647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0(
25657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioReplace(): Clip duration reached,\
25667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        returning M4WAR_NO_MORE_AU");
25677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4WAR_NO_MORE_AU; /**< Simulate end of file error */
25687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
25707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
25717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**********************************************************/
25737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT:
25747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
25757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
25767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Replace the SID (silence) payload in the writer AU */
25777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingWriteSilence(pC);
25787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
25807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
25817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
25827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix():\
25837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x",
25847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
25857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
25867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
25897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Check if we reached the end of the video */
25907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ewc.dATo >= pC->ewc.iOutputDuration )
25917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
25927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0(
25937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioReplace():\
25947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        Video duration reached, returning M4WAR_NO_MORE_AU");
25957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4WAR_NO_MORE_AU; /**< Simulate end of file error */
25967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
25987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
25997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
26007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
26017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
26027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
26057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0(
26067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingStepAudioReplace(): returning M4NO_ERROR");
26077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
26087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
26097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
26117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
26127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingCopyOrig(M4VSS3GPP_InternalAudioMixingContext *pC)
26137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Read one AU from the original audio file and write it to the output
26147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
26157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC    (IN) VSS audio mixing internal context
26167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
26177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
26187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingCopyOrig(
26197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
26207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
26217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
26227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Read the input original audio AU */
26257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pInputClipCtxt);
26267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3("G .... read  : cts  = %.0f + %.0f [ 0x%x ]",
26287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->iAudioFrameCts / pC->pInputClipCtxt->scale_audio,
26297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->iAoffset / pC->pInputClipCtxt->scale_audio,
26307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->uiAudioFrameSize);
26317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
26337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
26347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_1(
26357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingCopyOrig(): m_pFctGetNextAu(audio) returns 0x%x",
26367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
26377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
26387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
26397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the output AU to write into */
26427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext,
26437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
26447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
26467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
26477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
26487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingCopyOrig: pWriterDataFcts->pStartAU(audio) returns 0x%x!",
26497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
26507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
26517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
26527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy the input AU properties to the output AU */
26557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterAudioAU.size = pC->pInputClipCtxt->uiAudioFrameSize;
26567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterAudioAU.CTS =
26577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->iAudioFrameCts + pC->pInputClipCtxt->iAoffset;
26587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy the AU itself */
266132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)pC->ewc.WriterAudioAU.dataAddress,
266232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        (void *)pC->pInputClipCtxt->pAudioFramePtr, pC->ewc.WriterAudioAU.size);
26637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Write the mixed AU */
26667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2("H ---- write : cts  = %ld [ 0x%x ]",
26677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio),
26687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterAudioAU.size);
26697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext,
26717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
26727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
26747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
26757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
26767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingCopyOrig: pWriterDataFcts->pProcessAU(audio) returns 0x%x!",
26777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
26787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
26797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
26807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Increment the audio CTS for the next step */
26837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio;
26847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
26877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingCopyOrig(): returning M4NO_ERROR");
26887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
26897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
26907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
26927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
26937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingCopyAdded(M4VSS3GPP_InternalAudioMixingContext *pC)
26947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Read one AU from the added audio file and write it to the output
26957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
26967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC    (IN) VSS audio mixing internal context
26977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
26987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
26997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingCopyAdded(
27007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
27017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
27027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
27037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3 ||
27057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kPCM ||
27067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->b_SSRCneeded == M4OSA_TRUE ||
27077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ChannelConversion > 0)
27087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
27097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_AudioBuffer pEncInBuffer; /**< Encoder input buffer for api */
27107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ENCODER_AudioBuffer
27117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncOutBuffer; /**< Encoder output buffer for api */
27127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Time
27137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameTimeDelta; /**< Duration of the encoded (then written) data */
27147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_MemAddr8 tempPosBuffer;
27157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intAudioMixingConvert(pC);
27177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err == M4VSS3GPP_WAR_END_OF_ADDED_AUDIO )
27197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE2_0(
27217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCopyAdded:\
27227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_intAudioMixingConvert end of added file");
27237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4NO_ERROR;
27247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( err != M4NO_ERROR )
27267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingCopyAdded:\
27287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_intAudioMixingConvert returned 0x%x", err);
27297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
27307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
27337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Get the output AU to write into */
27347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext,
27357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
27367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
27387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
27407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingStepAudioMix:\
27417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pWriterDataFcts->pStartAU(audio) returns 0x%x!",
27427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
27437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
27447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* [Mono] or [Stereo interleaved] : all is in one buffer */
27477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncInBuffer.pTableBuffer[0] = pC->pSsrcBufferOut;
27487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncInBuffer.pTableBufferSize[0] =
27497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
27507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncInBuffer.pTableBuffer[1] = M4OSA_NULL;
27517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncInBuffer.pTableBufferSize[1] = 0;
27527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Time in ms from data size, because it is PCM16 samples */
27547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frameTimeDelta = pEncInBuffer.pTableBufferSize[0] / sizeof(short)
27557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / pC->ewc.uiNbChannels;
27567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
27587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Prepare output buffer */
27597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncOutBuffer.pTableBuffer[0] =
27607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress;
27617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncOutBuffer.pTableBufferSize[0] = 0;
27627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_0("K **** blend AUs");
27647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
27657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Encode the PCM audio */
27667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep(
27687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pAudioEncCtxt, &pEncInBuffer, &pEncOutBuffer);
27697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
27717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
27737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingDoMixing():\
27747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pAudioEncoderGlobalFcts->pFctStep returns 0x%x",
27757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
27767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
27777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
27807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Set AU cts and size */
27817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterAudioAU.size =
27827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncOutBuffer.
27837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pTableBufferSize[0]; /**< Get the size of encoded data */
27847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterAudioAU.CTS += frameTimeDelta;
27857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Update decoded buffer here */
27877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0 )
27887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            tempPosBuffer = pC->pSsrcBufferOut
27907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
279132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memmove((void *)pC->pSsrcBufferOut, (void *)tempPosBuffer,
27927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferOut - tempPosBuffer);
27937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInSsrcBufferOut -=
27947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
27957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
27977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            tempPosBuffer = pC->pSsrcBufferIn + pC->minimumBufferIn;
279932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer,
28007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferIn - tempPosBuffer);
28017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInSsrcBufferIn -= pC->minimumBufferIn;
28027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
28037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Write the mixed AU */
28067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_2("J ---- write : cts  = %ld [ 0x%x ]",
28077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio),
28087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.WriterAudioAU.size);
28097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err =
28117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext,
28127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
28137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
28157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
28167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
28177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCopyAdded:\
28187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pWriterDataFcts->pProcessAU(audio) returns 0x%x!",
28197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
28207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
28217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
28227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Increment the audio CTS for the next step */
28257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.dATo += frameTimeDelta / pC->ewc.scale_audio;
28267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
28277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
28287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
28297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Read the added audio AU */
28317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pAddedClipCtxt);
28327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_3("I .... read  : cts  = %.0f + %.0f [ 0x%x ]",
28347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->iAudioFrameCts
28357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / pC->pAddedClipCtxt->scale_audio,
28367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->iAoffset / pC->pAddedClipCtxt->scale_audio,
28377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->uiAudioFrameSize);
28387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
28407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
28417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_1(
28427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCopyAdded(): m_pFctGetNextAu(audio) returns 0x%x",
28437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
28447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
28457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
28467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Get the output AU to write into */
28497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext,
28507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
28517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
28537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
28547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
28557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCopyAdded:\
28567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pWriterDataFcts->pStartAU(audio) returns 0x%x!",
28577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
28587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
28597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
28607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Copy the input AU properties to the output AU */
28637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /** THE CHECK BELOW IS ADDED TO PREVENT ISSUES LINKED TO PRE-ALLOCATED MAX AU SIZE
28657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        max AU size is set based on M4VSS3GPP_AUDIO_MAX_AU_SIZE defined in file
28667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_InternalConfig.h, If this error occurs increase the limit set in this file
28677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        */
28687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pAddedClipCtxt->uiAudioFrameSize > pC->ewc.WriterAudioAU.size )
28697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
28707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_2(
28717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "ERROR: audio AU size (%d) to copy larger than allocated one (%d) => abort",
28727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAddedClipCtxt->uiAudioFrameSize,
28737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.WriterAudioAU.size);
28747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
28757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "PLEASE CONTACT SUPPORT TO EXTEND MAX AU SIZE IN THE PRODUCT LIBRARY");
28767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4ERR_UNSUPPORTED_MEDIA_TYPE;
28777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
28787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
28797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterAudioAU.size = pC->pAddedClipCtxt->uiAudioFrameSize;
28807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterAudioAU.CTS =
28817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->iAudioFrameCts + pC->pAddedClipCtxt->iAoffset;
28827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Copy the AU itself */
288532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->ewc.WriterAudioAU.dataAddress,
288632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pC->pAddedClipCtxt->pAudioFramePtr, pC->ewc.WriterAudioAU.size);
28877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Write the mixed AU */
28907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_2("J ---- write : cts  = %ld [ 0x%x ]",
28917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio),
28927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.WriterAudioAU.size);
28937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err =
28957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext,
28967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
28977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
28997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
29007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
29017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCopyAdded:\
29027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pWriterDataFcts->pProcessAU(audio) returns 0x%x!",
29037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
29047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
29057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
29067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
29087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Increment the audio CTS for the next step */
29097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio;
29107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
29147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingCopyAdded(): returning M4NO_ERROR");
29157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
29167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
29177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
29197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
29207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR  M4VSS3GPP_intAudioMixingConvert(M4VSS3GPP_InternalAudioMixingContext *pC)
29217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Convert PCM of added track to the right ASF / nb of Channels
29227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
29237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC    (IN) VSS audio mixing internal context
29247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
29257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
29267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
29277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingConvert(
29287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
29297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
29307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
29317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int ssrcErr; /**< Error while ssrc processing */
29327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiChannelConvertorNbSamples =
29337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize / sizeof(short)
29347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        / pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels;
29357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 tempPosBuffer;
29367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 outFrameCount = uiChannelConvertorNbSamples;
29387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Do we need to feed SSRC buffer In ? */
29397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * RC: This is not really optimum (memmove). We should handle this with linked list. */
29417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( pC->pPosInSsrcBufferIn - pC->pSsrcBufferIn < (M4OSA_Int32)pC->minimumBufferIn )
29427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
29437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* We need to get more PCM data */
29447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (pC->bNoLooping == M4OSA_TRUE)
29457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
29467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4WAR_NO_MORE_AU;
29477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
29487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
29497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
29507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pAddedClipCtxt);
29517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
29527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(pC->bjumpflag)
29537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
29547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
29557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Jump at the Begin loop time */
29567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop);
29577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err =
29597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump\
29607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (pC->pAddedClipCtxt->pReaderContext,
29617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     (M4_StreamHandler*)pC->pAddedClipCtxt->pAudioStream, &time);
29627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (M4NO_ERROR != err)
29637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
29647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingConvert():\
29657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     m_pReader->m_pFctJump(audio returns 0x%x", err);
29667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
29677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
29687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->bjumpflag = M4OSA_FALSE;
29697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
29707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_3("E .... read  : cts  = %.0f + %.0f [ 0x%x ]",
29717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             pC->pAddedClipCtxt->iAudioFrameCts / pC->pAddedClipCtxt->scale_audio,
29727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 pC->pAddedClipCtxt->iAoffset / pC->pAddedClipCtxt->scale_audio,
29737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     pC->pAddedClipCtxt->uiAudioFrameSize);
29747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4WAR_NO_MORE_AU == err )
29757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
29767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(pC->bNoLooping == M4OSA_TRUE)
29777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
29787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->uiEndLoop =0; /* Value 0 means no looping is required */
29797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
29807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
29817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Decide what to do when audio is over */
29827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->uiEndLoop > 0 )
29837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
29847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
29857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Jump at the Begin loop time */
29867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop);
29877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump(
29897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pAddedClipCtxt->pReaderContext,
29907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4_StreamHandler *)pC->pAddedClipCtxt->
29917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pAudioStream, &time);
29927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
29947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
29957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
29967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingConvert():\
29977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_pReader->m_pFctJump(audio returns 0x%x",
29987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
29997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
30007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
30017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
30027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
30037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
30047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Transition from encoding state to reading state */
30057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intAudioMixingTransition(pC);
30067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
30087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
30097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
30107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingStepAudioMix(): pre-encode fails err = 0x%x",
30117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
30127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
30137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
30147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
30167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Second segment is over, state transition to third and return OK */
30177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT;
30187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
30207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Return with no error so the step function will be called again */
30217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_0(
30227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingConvert():\
30237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    returning M4VSS3GPP_WAR_END_OF_ADDED_AUDIO (2->3) a");
30247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4VSS3GPP_WAR_END_OF_ADDED_AUDIO;
30257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
30267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
30277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( M4NO_ERROR != err )
30287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
30297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
30307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingConvert(): m_pFctGetNextAu(audio) returns 0x%x",
30317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
30327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
30337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
30347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pAddedClipCtxt);
30367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
30387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
30397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
30407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingDoMixing:\
30417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_intClipDecodeCurrentAudioFrame(added) returns 0x%x",
30427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
30437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU;
30447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
30457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Copy decoded data into SSRC buffer in */
304732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->pPosInSsrcBufferIn,
304832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pC->pAddedClipCtxt->AudioDecBufferOut.m_dataAddress,
30497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize);
30507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Update position pointer into SSRC buffer In */
30517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferIn +=
30537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize;
30547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
30557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Do the resampling / channel conversion if needed (=feed buffer out) */
30577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->b_SSRCneeded == M4OSA_TRUE )
30587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ChannelConversion = 0;
30607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ChannelConversion > 0 )
30617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
30627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( pC->pPosInTempBuffer - pC->pTempBuffer
30637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                < (M4OSA_Int32)(pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize
30647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels)
30657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / pC->ChannelConversion )
30667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* We use ChannelConversion variable because in case 2, we need twice less data */
30677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
30687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcErr = 0;
306932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memset((void *)pC->pPosInTempBuffer,0,
307032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (pC->iSsrcNbSamplOut * sizeof(short) * pC->ewc.uiNbChannels));
30717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LVAudioresample_LowQuality((short*)pC->pPosInTempBuffer,
30737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (short*)pC->pSsrcBufferIn,
30747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->iSsrcNbSamplOut,
30757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pLVAudioResampler);
30767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( 0 != ssrcErr )
30777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
30787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
30797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingConvert: SSRC_Process returns 0x%x, returning ",
30807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ssrcErr);
30817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return ssrcErr;
30827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
30837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInTempBuffer += pC->iSsrcNbSamplOut * sizeof(short)
30857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * pC->pAddedClipCtxt->pSettings->
30867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiNbChannels;
30877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Update SSRC bufferIn */
30897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                tempPosBuffer =
30907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pSsrcBufferIn + (pC->iSsrcNbSamplIn * sizeof(short)
30917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * pC->pAddedClipCtxt->pSettings->
30927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiNbChannels);
309332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer,
30947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferIn - tempPosBuffer);
30957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferIn -= pC->iSsrcNbSamplIn * sizeof(short)
30967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * pC->pAddedClipCtxt->pSettings->
30977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiNbChannels;
30987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
30997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
31007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
31017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
31027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut
31037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize )
31047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
31057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcErr = 0;
310632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memset((void *)pC->pPosInSsrcBufferOut,0,
310732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (pC->iSsrcNbSamplOut * sizeof(short) * pC->ewc.uiNbChannels));
31087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                LVAudioresample_LowQuality((short*)pC->pPosInSsrcBufferOut,
31107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (short*)pC->pSsrcBufferIn,
31117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->iSsrcNbSamplOut,
31127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pLVAudioResampler);
31137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( 0 != ssrcErr )
31147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
31167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingConvert: SSRC_Process returns 0x%x, returning ",
31177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ssrcErr);
31187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return ssrcErr;
31197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferOut +=
31217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->iSsrcNbSamplOut * sizeof(short) * pC->ewc.uiNbChannels;
31227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Update SSRC bufferIn */
31247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                tempPosBuffer =
31257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pSsrcBufferIn + (pC->iSsrcNbSamplIn * sizeof(short)
31267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * pC->pAddedClipCtxt->pSettings->
31277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiNbChannels);
312832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer,
31297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferIn - tempPosBuffer);
31307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferIn -= pC->iSsrcNbSamplIn * sizeof(short)
31317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * pC->pAddedClipCtxt->pSettings->
31327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ClipProperties.uiNbChannels;
31337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
31347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
31357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Convert Stereo<->Mono */
31377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->ChannelConversion )
31387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
31397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 0: /* No channel conversion */
31407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
31417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 1: /* stereo to mono */
31437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut
31447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize )
31457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    From2iToMono_16((short *)pC->pTempBuffer,
31477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short *)pC->pSsrcBufferOut,
31487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short)(uiChannelConvertorNbSamples));
31497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* Update pTempBuffer */
31507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    tempPosBuffer = pC->pTempBuffer
31517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + (uiChannelConvertorNbSamples * sizeof(short)
31527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
31537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.
31547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        uiNbChannels); /* Buffer is in bytes */
315532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memmove((void *)pC->pTempBuffer, (void *)tempPosBuffer,
31567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pPosInTempBuffer - tempPosBuffer);
31577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInTempBuffer -=
31587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (uiChannelConvertorNbSamples * sizeof(short)
31597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
31607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.uiNbChannels);
31617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferOut +=
31627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
31637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
31657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 2: /* mono to stereo */
31677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut
31687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize )
31697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    MonoTo2I_16((short *)pC->pTempBuffer,
31717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short *)pC->pSsrcBufferOut,
31727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short)uiChannelConvertorNbSamples);
31737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    tempPosBuffer = pC->pTempBuffer
31747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + (uiChannelConvertorNbSamples * sizeof(short)
31757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
31767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.uiNbChannels);
317732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memmove((void *)pC->pTempBuffer, (void *)tempPosBuffer,
31787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pPosInTempBuffer - tempPosBuffer);
31797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInTempBuffer -=
31807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (uiChannelConvertorNbSamples * sizeof(short)
31817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
31827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.uiNbChannels);
31837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferOut +=
31847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
31857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
31877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
31887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
31897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->ChannelConversion > 0 )
31907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
31917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //M4OSA_UInt32 uiChannelConvertorNbSamples =
31927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize / sizeof(short) /
31937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels;
31947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Convert Stereo<->Mono */
31957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->ChannelConversion )
31967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
31977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 0: /* No channel conversion */
31987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
31997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 1: /* stereo to mono */
32017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut
32027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize )
32037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
32047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    From2iToMono_16((short *)pC->pSsrcBufferIn,
32057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short *)pC->pSsrcBufferOut,
32067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short)(uiChannelConvertorNbSamples));
32077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* Update pTempBuffer */
32087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    tempPosBuffer = pC->pSsrcBufferIn
32097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + (uiChannelConvertorNbSamples * sizeof(short)
32107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
32117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.
32127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        uiNbChannels); /* Buffer is in bytes */
321332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer,
32147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pPosInSsrcBufferIn - tempPosBuffer);
32157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferIn -=
32167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (uiChannelConvertorNbSamples * sizeof(short)
32177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
32187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.uiNbChannels);
32197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferOut +=
32207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
32217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
32227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
32237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 2: /* mono to stereo */
32257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut
32267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize )
32277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
32287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    MonoTo2I_16((short *)pC->pSsrcBufferIn,
32297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short *)pC->pSsrcBufferOut,
32307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (short)uiChannelConvertorNbSamples);
32317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    tempPosBuffer = pC->pSsrcBufferIn
32327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + (uiChannelConvertorNbSamples * sizeof(short)
32337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
32347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.uiNbChannels);
323532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer,
32367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pPosInSsrcBufferIn - tempPosBuffer);
32377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferIn -=
32387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (uiChannelConvertorNbSamples * sizeof(short)
32397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        * pC->pAddedClipCtxt->pSettings->
32407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        ClipProperties.uiNbChannels);
32417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pPosInSsrcBufferOut +=
32427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
32437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
32447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
32457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
32467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
32487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* No channel conversion nor sampl. freq. conversion needed, just buffer management */
32507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferOut = pC->pPosInSsrcBufferIn;
32517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
32547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
32557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Int32 M4VSS3GPP_getDecibelSound( M4OSA_UInt32 value )
32577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int dbSound = 1;
32597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( value == 0 )
32617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return 0;
32627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( value > 0x4000 && value <= 0x8000 )      // 32768
32647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 90;
32657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x2000 && value <= 0x4000 ) // 16384
32677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 84;
32687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x1000 && value <= 0x2000 ) // 8192
32707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 78;
32717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0800 && value <= 0x1000 ) // 4028
32737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 72;
32747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0400 && value <= 0x0800 ) // 2048
32767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 66;
32777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0200 && value <= 0x0400 ) // 1024
32797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 60;
32807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0100 && value <= 0x0200 ) // 512
32827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 54;
32837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0080 && value <= 0x0100 ) // 256
32857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 48;
32867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0040 && value <= 0x0080 ) // 128
32887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 42;
32897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0020 && value <= 0x0040 ) // 64
32917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 36;
32927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0010 && value <= 0x0020 ) // 32
32947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 30;
32957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0008 && value <= 0x0010 ) //16
32977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 24;
32987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0007 && value <= 0x0008 ) //8
33007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 24;
33017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0003 && value <= 0x0007 ) // 4
33037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 18;
33047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x0001 && value <= 0x0003 ) //2
33067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 12;
33077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( value > 0x000 && value <= 0x0001 )  // 1
33097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 6;
33107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
33127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        dbSound = 0;
33137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return dbSound;
33157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
33177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
33187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR  M4VSS3GPP_intAudioMixingDoMixing(M4VSS3GPP_InternalAudioMixingContext *pC)
33197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Mix the current audio AUs (decoder, mix, encode)
33207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
33217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC    (IN) VSS audio mixing internal context
33227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
33237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
33247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
33257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingDoMixing(
33267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
33277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
33287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
33297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int16 *pPCMdata1;
33307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int16 *pPCMdata2;
33317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiPCMsize;
33327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AudioBuffer pEncInBuffer;  /**< Encoder input buffer for api */
33347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AudioBuffer pEncOutBuffer; /**< Encoder output buffer for api */
33357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time
33367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frameTimeDelta; /**< Duration of the encoded (then written) data */
33377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 tempPosBuffer;
33387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ducking variable */
33397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt16 loopIndex = 0;
33407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int16 *pPCM16Sample = M4OSA_NULL;
33417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 peakDbValue = 0;
33427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 previousDbValue = 0;
33437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 i;
33447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
33467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Decode original audio track AU */
33477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pInputClipCtxt);
33497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
33517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
33527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
33537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingDoMixing:\
33547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_intClipDecodeCurrentAudioFrame(orig) returns 0x%x",
33557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
33567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU;
33577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0
33607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
33617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == M4VIDEOEDITING_kMP3 )
33627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
33637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intAudioMixingConvert(pC);
33647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err == M4VSS3GPP_WAR_END_OF_ADDED_AUDIO )
33667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
33677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
33687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
33717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
33727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
33737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingDoMixing: M4VSS3GPP_intAudioMixingConvert returned 0x%x",
33747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
33757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_AUDIO_DECODED_PCM_SIZE_ISSUE;
33767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
33797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Get the output AU to write into */
33807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext,
33817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
33827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
33847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
33857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
33867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingStepAudioMix:\
33877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pWriterDataFcts->pStartAU(audio) returns 0x%x!",
33887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
33897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
33907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pPCMdata2 = (M4OSA_Int16 *)pC->pSsrcBufferOut;
33937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
33957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
33967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
33977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Decode added audio track AU */
33987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pAddedClipCtxt);
33997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
34017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
34037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingDoMixing:\
34047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_intClipDecodeCurrentAudioFrame(added) returns 0x%x",
34057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
34067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU;
34077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
34107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check both clips decoded the same amount of PCM samples */
34117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize
34127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize )
34137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
34157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingDoMixing:\
34167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                both clips AU must have the same decoded PCM size!");
34177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_AUDIO_DECODED_PCM_SIZE_ISSUE;
34187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pPCMdata2 = (M4OSA_Int16 *)pC->pAddedClipCtxt->AudioDecBufferOut.m_dataAddress;
34207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
34217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
34237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Mix the two decoded PCM audios */
34247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pPCMdata1 =
34257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int16 *)pC->pInputClipCtxt->AudioDecBufferOut.m_dataAddress;
34267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiPCMsize = pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize
34277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        / 2; /*buffer size (bytes) to number of sample (int16)*/
34287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->b_DuckingNeedeed )
34307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
34317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        loopIndex = 0;
34327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        peakDbValue = 0;
34337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        previousDbValue = peakDbValue;
34347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pPCM16Sample = (M4OSA_Int16 *)pC->pInputClipCtxt->
34367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            AudioDecBufferOut.m_dataAddress;
34377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //Calculate the peak value
34397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         while( loopIndex
34407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             < pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize
34417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / sizeof(M4OSA_Int16) )
34427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pPCM16Sample[loopIndex] >= 0 )
34447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
34457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                peakDbValue = previousDbValue > pPCM16Sample[loopIndex]
34467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ? previousDbValue : pPCM16Sample[loopIndex];
34477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                previousDbValue = peakDbValue;
34487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
34497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
34507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
34517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                peakDbValue = previousDbValue > -pPCM16Sample[loopIndex]
34527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ? previousDbValue : -pPCM16Sample[loopIndex];
34537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                previousDbValue = peakDbValue;
34547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
34557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            loopIndex++;
34567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->audioVolumeArray[pC->audVolArrIndex] =
34597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_getDecibelSound(peakDbValue);
34607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* WINDOW_SIZE is 10 by default and check for threshold is done after 10 cycles */
34627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->audVolArrIndex >= WINDOW_SIZE - 1 )
34637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->bDoDucking =
34657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VSS3GPP_isThresholdBreached((M4OSA_Int32 *)&(pC->audioVolumeArray),
34667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->audVolArrIndex, pC->InDucking_threshold);
34677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->audVolArrIndex = 0;
34697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
34717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->audVolArrIndex++;
34737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*
34767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *Below logic controls the mixing weightage for Background Track and Primary Track
34777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *for the duration of window under analysis to give fade-out for Background and fade-in
34787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *for primary
34797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *
34807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *Current fading factor is distributed in equal range over the defined window size.
34817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *
34827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *For a window size = 25 (500 ms (window under analysis) / 20 ms (sample duration))
34837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *
34847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        */
34857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->bDoDucking )
34877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->duckingFactor
34897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                > pC->InDucking_lowVolume ) // FADE OUT BG Track
34907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
34917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    // decrement ducking factor in total steps in factor of low volume steps to reach
34927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    // low volume level
34937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->duckingFactor -= (pC->InDucking_lowVolume);
34947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
34957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
34967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
34977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->duckingFactor = pC->InDucking_lowVolume;
34987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
34997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
35017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
35027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->duckingFactor < 1.0 ) // FADE IN BG Track
35037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
35047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                // increment ducking factor in total steps of low volume factor to reach
35057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                // orig.volume level
35067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->duckingFactor += (pC->InDucking_lowVolume);
35077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
35087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
35097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi           {
35107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->duckingFactor = 1.0;
35117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
35127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* endif - ducking_enable */
35147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Mixing Logic */
35167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( uiPCMsize-- > 0 )
35187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
35197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_Int32 temp;
35207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi           /* set vol factor for BT and PT */
35227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pPCMdata2 = (M4OSA_Int16)(*pPCMdata2 * pC->fBTVolLevel);
35237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pPCMdata1 = (M4OSA_Int16)(*pPCMdata1 * pC->fPTVolLevel);
35257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* mix the two samples */
35277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pPCMdata2 = (M4OSA_Int16)(( *pPCMdata2) * (pC->duckingFactor));
35297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pPCMdata1 = (M4OSA_Int16)(*pPCMdata2 / 2 + *pPCMdata1 / 2);
35307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( *pPCMdata1 < 0 )
35337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
35347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = -( *pPCMdata1)
35357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * 2; // bring to same Amplitude level as it was original
35367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( temp > 32767 )
35387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
35397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *pPCMdata1 = -32766; // less then max allowed value
35407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
35417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
35427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
35437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *pPCMdata1 = (M4OSA_Int16)(-temp);
35447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi               }
35457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
35477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
35487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = ( *pPCMdata1)
35497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * 2; // bring to same Amplitude level as it was original
35507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( temp > 32768 )
35527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
35537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pPCMdata1 = 32767; // less than max allowed value
35547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
35557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
35567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
35577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pPCMdata1 = (M4OSA_Int16)temp;
35587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
35597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPCMdata2++;
35627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPCMdata1++;
35637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
35667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
35677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( uiPCMsize-- > 0 )
35687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi       {
35697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* mix the two samples */
35707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pPCMdata1 = (M4OSA_Int16)(*pPCMdata1 * pC->fOrigFactor * pC->fPTVolLevel
35717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi               + *pPCMdata2 * pC->fAddedFactor * pC->fBTVolLevel );
35727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPCMdata1++;
35747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPCMdata2++;
35757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Update pC->pSsrcBufferOut buffer */
35797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0 )
35817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
35827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        tempPosBuffer = pC->pSsrcBufferOut
35837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
358432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memmove((void *)pC->pSsrcBufferOut, (void *)tempPosBuffer,
35857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInSsrcBufferOut - tempPosBuffer);
35867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferOut -=
35877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
35887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType
35907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == M4VIDEOEDITING_kMP3 )
35917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
35927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        tempPosBuffer = pC->pSsrcBufferIn
35937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
359432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer,
35957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInSsrcBufferIn - tempPosBuffer);
35967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferIn -=
35977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
35987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* [Mono] or [Stereo interleaved] : all is in one buffer */
36017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBuffer[0] =
36027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->AudioDecBufferOut.m_dataAddress;
36037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBufferSize[0] =
36047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
36057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBuffer[1] = M4OSA_NULL;
36067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBufferSize[1] = 0;
36077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Time in ms from data size, because it is PCM16 samples */
36097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    frameTimeDelta =
36107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncInBuffer.pTableBufferSize[0] / sizeof(short) / pC->ewc.uiNbChannels;
36117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare output buffer */
36147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncOutBuffer.pTableBuffer[0] =
36157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress;
36167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncOutBuffer.pTableBufferSize[0] = 0;
36177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_0("K **** blend AUs");
36197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Encode the PCM audio */
36227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep(pC->ewc.pAudioEncCtxt,
36237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pEncInBuffer, &pEncOutBuffer);
36247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
36267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
36287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingDoMixing(): pAudioEncoderGlobalFcts->pFctStep returns 0x%x",
36297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
36307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
36317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set AU cts and size */
36357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterAudioAU.size =
36367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncOutBuffer.pTableBufferSize[0]; /**< Get the size of encoded data */
36377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.WriterAudioAU.CTS += frameTimeDelta;
36387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Write the AU */
36417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2("L ---- write : cts  = %ld [ 0x%x ]",
36427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio),
36437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.WriterAudioAU.size);
36447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext,
36467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU);
36477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
36497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
36517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingDoMixing: pWriterDataFcts->pProcessAU returns 0x%x!",
36527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
36537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
36547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Increment the audio CTS for the next step */
36587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.dATo += frameTimeDelta / pC->ewc.scale_audio;
36597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
36627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingDoMixing(): returning M4NO_ERROR");
36637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
36647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
36657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
36677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
36687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR  M4VSS3GPP_intAudioMixingTransition(M4VSS3GPP_InternalAudioMixingContext *pC)
36697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Decode/encode a few AU backward to initiate the encoder for later Mix segment.
36707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
36717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC    (IN) VSS audio mixing internal context
36727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
36737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
36747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
36757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingTransition(
36767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
36777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
36787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
36797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AudioBuffer pEncInBuffer;  /**< Encoder input buffer for api */
36817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AudioBuffer pEncOutBuffer; /**< Encoder output buffer for api */
36827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time
36837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frameTimeDelta = 0; /**< Duration of the encoded (then written) data */
36847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 iTargetCts, iCurrentCts;
36867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * 'BZZZ' bug fix:
36897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * add a silence frame */
36907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4VSS3GPP_intAudioMixingWriteSilence(pC);
36917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
36937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
36957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingTransition():\
36967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x",
36977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
36987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
36997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
37007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    iCurrentCts = (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5);
37027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Do not do pre-encode step if there is no mixing (remove, 100 %, or not editable) */
37047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_FALSE == pC->bAudioMixingIsNeeded )
37057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
37067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
37077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Advance in the original audio stream to reach the current time
37087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * (We don't want iAudioCTS to be modified by the jump function,
37097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * so we have to use a local variable). */
37107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_intClipJumpAudioAt(pC->pInputClipCtxt, &iCurrentCts);
37117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
37137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
37147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingTransition:\
37157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             M4VSS3GPP_intClipJumpAudioAt() returns 0x%x!", err);
37167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
37177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
37187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
37197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
37207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
37217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**< don't try to pre-decode if clip is at its beginning... */
37227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( iCurrentCts > 0 )
37237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
37247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
37257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Get the output AU to write into */
37267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->ShellAPI.pWriterDataFcts->pStartAU(
37277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID,
37287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ewc.WriterAudioAU);
37297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
37317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
37327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
37337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingTransition:\
37347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pWriterDataFcts->pStartAU(audio) returns 0x%x!",
37357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
37367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
37377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
37387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
37407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Jump a few AUs backward */
37417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            iTargetCts = iCurrentCts - M4VSS3GPP_NB_AU_PREFETCH
37427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * pC->ewc.iSilenceFrameDuration;
37437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( iTargetCts < 0 )
37457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
37467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                iTargetCts = 0; /**< Sanity check */
37477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
37487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4VSS3GPP_intClipJumpAudioAt(pC->pInputClipCtxt, &iTargetCts);
37507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
37527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
37537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
37547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingTransition: DECODE_ENCODE-prefetch:\
37557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VSS3GPP_intClipJumpAudioAt returns 0x%x!",
37567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
37577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
37587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
37597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
37617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Decode/encode up to the wanted position */
37627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( pC->pInputClipCtxt->iAudioFrameCts < iCurrentCts )
37637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
37647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pInputClipCtxt);
37657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_3("M .... read  : cts  = %.0f + %.0f [ 0x%x ]",
37677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt->iAudioFrameCts
37687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    / pC->pInputClipCtxt->scale_audio,
37697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt->iAoffset
37707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    / pC->pInputClipCtxt->scale_audio,
37717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt->uiAudioFrameSize);
37727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4OSA_ERR_IS_ERROR(err) )
37747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
37757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
37767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingTransition: DECODE_ENCODE-prefetch:\
37777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intClipReadNextAudioFrame(b) returns 0x%x!",
37787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
37797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
37807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
37817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(
37837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt);
37847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
37867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
37877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
37887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingTransition: DECODE_ENCODE-prefetch:\
37897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VSS3GPP_intClipDecodeCurrentAudioFrame returns 0x%x!",
37907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
37917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
37927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
37937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* [Mono] or [Stereo interleaved] : all is in one buffer */
37957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncInBuffer.pTableBuffer[0] =
37967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt->AudioDecBufferOut.m_dataAddress;
37977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncInBuffer.pTableBufferSize[0] =
37987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize;
37997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncInBuffer.pTableBuffer[1] = M4OSA_NULL;
38007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncInBuffer.pTableBufferSize[1] = 0;
38017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Time in ms from data size, because it is PCM16 samples */
38037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                frameTimeDelta =
38047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pEncInBuffer.pTableBufferSize[0] / sizeof(short)
38057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    / pC->ewc.uiNbChannels;
38067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
38087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Prepare output buffer */
38097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncOutBuffer.pTableBuffer[0] =
38107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress;
38117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncOutBuffer.pTableBufferSize[0] = 0;
38127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_0("N **** pre-encode");
38147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
38167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Encode the PCM audio */
38177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep(
38187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.pAudioEncCtxt, &pEncInBuffer, &pEncOutBuffer);
38197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
38217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
38227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
38237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingTransition():\
38247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pAudioEncoderGlobalFcts->pFctStep returns 0x%x",
38257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
38267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
38277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
38287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
38297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
38317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Set AU cts and size */
38327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.WriterAudioAU.size = pEncOutBuffer.pTableBufferSize[
38337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                0]; /**< Get the size of encoded data */
38347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.WriterAudioAU.CTS += frameTimeDelta;
38357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
38377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Write the AU */
38387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_2("O ---- write : cts  = %ld [ 0x%x ]",
38397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio),
38407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.WriterAudioAU.size);
38417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->ShellAPI.pWriterDataFcts->pProcessAU(
38437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID,
38447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    &pC->ewc.WriterAudioAU);
38457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
38477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
38487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
38497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingTransition:\
38507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pWriterDataFcts->pProcessAU returns 0x%x!",    err);
38517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
38527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
38537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
38557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Increment the audio CTS for the next step */
38567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio;
38577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
38587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
38597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
38617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
38627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
38647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
38657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingCreateVideoEncoder()
38667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Creates the video encoder
38677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
38687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
38697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
38707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingCreateVideoEncoder(
38717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
38727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
38737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
38747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AdvancedParams EncParams;
38757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
38777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Simulate a writer interface with our specific function */
38787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.OurWriterDataInterface.pProcessAU =
38797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_intProcessAU; /**< This function is VSS 3GPP specific,
38807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                but it follow the writer interface */
38817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.OurWriterDataInterface.pStartAU =
38827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VSS3GPP_intStartAU; /**< This function is VSS 3GPP specific,
38837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                              but it follow the writer interface */
38847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.OurWriterDataInterface.pWriterContext =
38857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4WRITER_Context)
38867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC; /**< We give the internal context as writer context */
38877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
38897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the encoder interface, if not already done */
38907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->ShellAPI.pVideoEncoderGlobalFcts )
38917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
38927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4VSS3GPP_setCurrentVideoEncoder(&pC->ShellAPI,
38937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.VideoStreamType);
38947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
38957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingCreateVideoEncoder: setCurrentEncoder returns 0x%x",
38967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
38977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_CHECK_RETURN(err);
38987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
38997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
39017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set encoder shell parameters according to VSS settings */
39027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Common parameters */
39047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.InputFormat = M4ENCODER_kIYUV420;
39057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.FrameWidth = pC->ewc.uiVideoWidth;
39067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.FrameHeight = pC->ewc.uiVideoHeight;
39077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.uiTimeScale = pC->ewc.uiVideoTimeScale;
39080a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    EncParams.videoProfile = pC->ewc.outputVideoProfile;
39090a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    EncParams.videoLevel = pC->ewc.outputVideoLevel;
39107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* No strict regulation in video editor */
39127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Because of the effects and transitions we should allow more flexibility */
39137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Also it prevents to drop important frames
39147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi      (with a bad result on sheduling and block effetcs) */
39157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.bInternalRegulation = M4OSA_FALSE;
39167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.FrameRate = M4ENCODER_kVARIABLE_FPS;
39177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
39197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Other encoder settings (defaults) */
39207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.uiHorizontalSearchRange = 0;     /* use default */
39217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.uiVerticalSearchRange = 0;       /* use default */
39227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.bErrorResilience = M4OSA_FALSE;  /* no error resilience */
39237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.uiIVopPeriod = 0;                /* use default */
39247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.uiMotionEstimationTools = 0;     /* M4V_MOTION_EST_TOOLS_ALL */
39257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.bAcPrediction = M4OSA_TRUE;      /* use AC prediction */
39267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.uiStartingQuantizerValue = 10;   /* initial QP = 10 */
39277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.bDataPartitioning = M4OSA_FALSE; /* no data partitioning */
39287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->ewc.VideoStreamType )
39307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
39317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4SYS_kH263:
39327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.Format = M4ENCODER_kH263;
39347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiStartingQuantizerValue = 10;
39367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiRateFactor = 1; /* default */
39377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bErrorResilience = M4OSA_FALSE;
39397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bDataPartitioning = M4OSA_FALSE;
39407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
39417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4SYS_kMPEG_4:
39437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.Format = M4ENCODER_kMPEG4;
39457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiStartingQuantizerValue = 8;
39477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiRateFactor = 1;
39487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_FALSE == pC->ewc.bVideoDataPartitioning )
39507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
39517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                EncParams.bErrorResilience = M4OSA_FALSE;
39527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                EncParams.bDataPartitioning = M4OSA_FALSE;
39537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
39547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
39557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
39567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                EncParams.bErrorResilience = M4OSA_TRUE;
39577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                EncParams.bDataPartitioning = M4OSA_TRUE;
39587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
39597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
39607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4SYS_kH264:
39627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
39637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCreateVideoEncoder: M4SYS_H264");
39647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.Format = M4ENCODER_kH264;
39667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiStartingQuantizerValue = 10;
39687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiRateFactor = 1; /* default */
39697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bErrorResilience = M4OSA_FALSE;
39717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bDataPartitioning = M4OSA_FALSE;
39727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
39737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
39757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
39767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCreateVideoEncoder: Unknown videoStreamType 0x%x",
39777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.VideoStreamType);
39787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT;
39797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
39807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    EncParams.Bitrate =
39827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoBitrate;
39837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE1_0(
39857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingCreateVideoEncoder: calling encoder pFctInit");
39867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
39877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Init the video encoder (advanced settings version of the encoder Open function) */
39887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctInit(&pC->ewc.pEncContext,
39897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pC->ewc.OurWriterDataInterface, M4VSS3GPP_intVPP, pC,
39907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ShellAPI.pCurrentVideoEncoderExternalAPI,
39917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ShellAPI.pCurrentVideoEncoderUserData);
39927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
39947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
39957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
39967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingCreateVideoEncoder:\
39977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pVideoEncoderGlobalFcts->pFctInit returns 0x%x",
39987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
39997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
40007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
40017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed;
40037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE1_0(
40047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingCreateVideoEncoder: calling encoder pFctOpen");
40050a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    M4OSA_TRACE1_2("vss: audio mix encoder open profile :%d, level %d",
40060a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.videoProfile, EncParams.videoLevel);
40077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctOpen(pC->ewc.pEncContext,
40087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pC->ewc.WriterVideoAU, &EncParams);
40097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
40117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
40127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
40137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4VSS3GPP_intAudioMixingCreateVideoEncoder:\
40147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pVideoEncoderGlobalFcts->pFctOpen returns 0x%x",
40157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
40167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
40177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
40187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped;
40207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE1_0(
40217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingCreateVideoEncoder: calling encoder pFctStart");
40227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart )
40247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
40257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart(
40267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pEncContext);
40277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
40297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
40307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
40317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingCreateVideoEncoder:\
40327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pVideoEncoderGlobalFcts->pFctStart returns 0x%x",
40337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
40347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
40357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
40367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
40377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ewc.encoderState = M4VSS3GPP_kEncoderRunning;
40397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
40417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *    Return */
40427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0(
40437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingCreateVideoEncoder: returning M4NO_ERROR");
40447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
40457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
40467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
40487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
40497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intAudioMixingDestroyVideoEncoder()
40507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Destroy the video encoder
40517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
40527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
40537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
40547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intAudioMixingDestroyVideoEncoder(
40557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_InternalAudioMixingContext *pC )
40567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
40577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
40587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->ewc.pEncContext )
40607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
40617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VSS3GPP_kEncoderRunning == pC->ewc.encoderState )
40627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
40637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop != M4OSA_NULL )
40647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
40657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop(
40667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ewc.pEncContext);
40677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
40697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
40707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
40717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4VSS3GPP_intAudioMixingDestroyVideoEncoder:\
40727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pVideoEncoderGlobalFcts->pFctStop returns 0x%x",
40737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
40747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
40757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
40767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped;
40787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
40797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Has the encoder actually been opened? Don't close it if that's not the case. */
40817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VSS3GPP_kEncoderStopped == pC->ewc.encoderState )
40827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
40837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctClose(
40847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ewc.pEncContext);
40857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
40877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
40887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
40897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4VSS3GPP_intAudioMixingDestroyVideoEncoder:\
40907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pVideoEncoderGlobalFcts->pFctClose returns 0x%x",
40917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
40927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
40937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed;
40957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
40967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctCleanup(
40987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ewc.pEncContext);
40997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
41017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
41027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
41037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4VSS3GPP_intAudioMixingDestroyVideoEncoder:\
41047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pVideoEncoderGlobalFcts->pFctCleanup returns 0x%x!",
41057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
41067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< We do not return the error here because we still have stuff to free */
41077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
41087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.encoderState = M4VSS3GPP_kNoEncoder;
41107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
41117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Reset variable */
41127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ewc.pEncContext = M4OSA_NULL;
41137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
41147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1(
41167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intAudioMixingDestroyVideoEncoder: returning 0x%x", err);
41177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
41187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
41197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Bool M4VSS3GPP_isThresholdBreached( M4OSA_Int32 *averageValue,
41217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                         M4OSA_Int32 storeCount, M4OSA_Int32 thresholdValue )
41227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
41237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool result = 0;
41247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int i;
41257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int finalValue = 0;
41267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( i = 0; i < storeCount; i++ )
41287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        finalValue += averageValue[i];
41297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    finalValue = finalValue / storeCount;
41317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( finalValue > thresholdValue )
41347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result = M4OSA_TRUE;
41357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
41367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result = M4OSA_FALSE;
41377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return result;
41397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4140