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