/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
*************************************************************************
* @file M4MCS_API.c
* @brief MCS implementation (Video Compressor Service)
* @note This file implements the API and the processing of the MCS
*************************************************************************
**/
/****************/
/*** Includes ***/
/****************/
/**
* OSAL headers */
#include "M4OSA_Memory.h" /**< OSAL memory management */
#include "M4OSA_Debug.h" /**< OSAL debug management */
/* Our headers */
#include "M4MCS_API.h"
#include "M4MCS_ErrorCodes.h"
#include "M4MCS_InternalTypes.h"
#include "M4MCS_InternalConfig.h"
#include "M4MCS_InternalFunctions.h"
/* Common headers (for aac) */
#include "M4_Common.h"
#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
#include "M4VD_EXTERNAL_Interface.h"
#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
/**
******************************************************************************
* M4OSA_ERR M4MCS_intCheckAudioEffects(M4MCS_InternalContext* pContext)
* @brief Check if an effect has to be applied currently
* @note It is called by the stepEncoding function
* @param pContext (IN) MCS internal context
* @return M4NO_ERROR: No error
******************************************************************************
*/
M4OSA_ERR M4MCS_intCheckAudioEffects(M4MCS_InternalContext* pC)
{
M4OSA_Int8 *pActiveEffectNumber = &(pC->pActiveEffectNumber);
*pActiveEffectNumber = -1;
if(pC->ReaderAudioAU.m_CTS > pC->uiBeginCutTime
&& pC->ReaderAudioAU.m_CTS < pC->uiEndCutTime)
{
M4OSA_UInt32 outputRelatedTime = 0;
M4OSA_UInt8 uiEffectIndex = 0;
outputRelatedTime =
(M4OSA_UInt32)(pC->ReaderAudioAU.m_CTS - pC->uiBeginCutTime + 0.5);
for(uiEffectIndex=0; uiEffectIndex<pC->nbEffects; uiEffectIndex++)
{
if ((outputRelatedTime >=
(M4OSA_UInt32)(pC->pEffects[uiEffectIndex].uiStartTime)) &&
(outputRelatedTime <
(M4OSA_UInt32)(pC->pEffects[uiEffectIndex].uiStartTime +\
pC->pEffects[uiEffectIndex].uiDuration)))
{
*pActiveEffectNumber = uiEffectIndex;
uiEffectIndex = pC->nbEffects;
}
}
}
return M4NO_ERROR;
}
/**
******************************************************************************
* M4OSA_ERR M4MCS_editAudioEffectFct_FadeIn()
* @brief Apply audio effect FadeIn to pPCMdata
* @param pC (IN/OUT) Internal edit context
* @param pPCMdata (IN/OUT) Input and Output PCM audio data
* @param uiPCMsize (IN) Size of pPCMdata
* @param pProgress (IN) Effect progress
* @return M4NO_ERROR: No error
******************************************************************************
*/
M4OSA_ERR M4MCS_editAudioEffectFct_FadeIn( M4OSA_Void *pFunctionContext,
M4OSA_Int16 *pPCMdata,
M4OSA_UInt32 uiPCMsize,
M4MCS_ExternalProgress *pProgress)
{
/* we will cast each Int16 sample into this Int32 variable */
M4OSA_Int32 i32sample;
/**
* Sanity check */
if(pProgress->uiProgress > 1000)
{
pProgress->uiProgress = 1000;
}
/**
* From buffer size (bytes) to number of sample (int16): divide by two */
uiPCMsize >>= 1;
/**
* Loop on samples */
while (uiPCMsize-->0) /**< decrementing to optimize */
{
i32sample = *pPCMdata;
i32sample *= pProgress->uiProgress;
i32sample /= 1000;
*pPCMdata++ = (M4OSA_Int16)i32sample;
}
/**
* Return */
M4OSA_TRACE3_0("M4MCS_editAudioEffectFct_FadeIn: returning M4NO_ERROR");
return M4NO_ERROR;
}
/**
******************************************************************************
* M4OSA_ERR M4MCS_editAudioEffectFct_FadeOut()
* @brief Apply audio effect FadeIn to pPCMdata
* @param pC (IN/OUT) Internal edit context
* @param pPCMdata (IN/OUT) Input and Output PCM audio data
* @param uiPCMsize (IN) Size of pPCMdata
* @param pProgress (IN) Effect progress
* @return M4NO_ERROR: No error
******************************************************************************
*/
M4OSA_ERR M4MCS_editAudioEffectFct_FadeOut( M4OSA_Void *pFunctionContext,
M4OSA_Int16 *pPCMdata,
M4OSA_UInt32 uiPCMsize,
M4MCS_ExternalProgress *pProgress)
{
/* we will cast each Int16 sample into this Int32 variable */
M4OSA_Int32 i32sample;
/**
* Sanity check */
if(pProgress->uiProgress > 1000)
{
pProgress->uiProgress = 1000;
}
pProgress->uiProgress = 1000 - pProgress->uiProgress;
/**
* From buffer size (bytes) to number of sample (int16): divide by two */
uiPCMsize >>= 1;
/**
* Loop on samples */
while (uiPCMsize-->0) /**< decrementing to optimize */
{
i32sample = *pPCMdata;
i32sample *= pProgress->uiProgress;
i32sample /= 1000;
*pPCMdata++ = (M4OSA_Int16)i32sample;
}
/**
* Return */
M4OSA_TRACE3_0("M4MCS_editAudioEffectFct_FadeOut: returning M4NO_ERROR");
return M4NO_ERROR;
}