| /* |
| * 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; |
| } |
| |