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   M4MCS_API.c
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  MCS implementation (Video Compressor Service)
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   This file implements the API and the processing of the MCS
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *************************************************************************
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **/
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*** Includes ***/
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * OSAL headers */
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h"   /**< OSAL memory management */
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"    /**< OSAL debug management */
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Our headers */
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_API.h"
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_ErrorCodes.h"
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalTypes.h"
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalConfig.h"
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalFunctions.h"
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Common headers (for aac) */
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Common.h"
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VD_EXTERNAL_Interface.h"
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intCheckAudioEffects(M4MCS_InternalContext* pContext)
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Check if an effect has to be applied currently
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    It is called by the stepEncoding function
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext    (IN) MCS internal context
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:    No error
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_intCheckAudioEffects(M4MCS_InternalContext* pC)
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int8 *pActiveEffectNumber = &(pC->pActiveEffectNumber);
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pActiveEffectNumber = -1;
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pC->ReaderAudioAU.m_CTS > pC->uiBeginCutTime
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    && pC->ReaderAudioAU.m_CTS < pC->uiEndCutTime)
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 outputRelatedTime = 0;
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt8 uiEffectIndex = 0;
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outputRelatedTime =
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)(pC->ReaderAudioAU.m_CTS  - pC->uiBeginCutTime + 0.5);
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for(uiEffectIndex=0; uiEffectIndex<pC->nbEffects; uiEffectIndex++)
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if ((outputRelatedTime >=
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt32)(pC->pEffects[uiEffectIndex].uiStartTime)) &&
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (outputRelatedTime <
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt32)(pC->pEffects[uiEffectIndex].uiStartTime +\
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pEffects[uiEffectIndex].uiDuration)))
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pActiveEffectNumber = uiEffectIndex;
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiEffectIndex = pC->nbEffects;
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_editAudioEffectFct_FadeIn()
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Apply audio effect FadeIn to pPCMdata
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pC            (IN/OUT) Internal edit context
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pPCMdata    (IN/OUT) Input and Output PCM audio data
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    uiPCMsize    (IN)     Size of pPCMdata
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pProgress    (IN)     Effect progress
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:             No error
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_editAudioEffectFct_FadeIn(  M4OSA_Void *pFunctionContext,
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            M4OSA_Int16 *pPCMdata,
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            M4OSA_UInt32 uiPCMsize,
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            M4MCS_ExternalProgress *pProgress)
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* we will cast each Int16 sample into this Int32 variable */
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 i32sample;
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Sanity check */
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pProgress->uiProgress > 1000)
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pProgress->uiProgress = 1000;
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * From buffer size (bytes) to number of sample (int16): divide by two */
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiPCMsize >>= 1;
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Loop on samples */
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while (uiPCMsize-->0) /**< decrementing to optimize */
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i32sample = *pPCMdata;
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i32sample *= pProgress->uiProgress;
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i32sample /= 1000;
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pPCMdata++ = (M4OSA_Int16)i32sample;
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     *    Return */
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_editAudioEffectFct_FadeIn: returning M4NO_ERROR");
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_editAudioEffectFct_FadeOut()
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Apply audio effect FadeIn to pPCMdata
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC            (IN/OUT) Internal edit context
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pPCMdata    (IN/OUT) Input and Output PCM audio data
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    uiPCMsize    (IN)     Size of pPCMdata
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pProgress    (IN)     Effect progress
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:             No error
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_editAudioEffectFct_FadeOut( M4OSA_Void *pFunctionContext,
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            M4OSA_Int16 *pPCMdata,
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            M4OSA_UInt32 uiPCMsize,
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            M4MCS_ExternalProgress *pProgress)
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* we will cast each Int16 sample into this Int32 variable */
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 i32sample;
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Sanity check */
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pProgress->uiProgress > 1000)
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pProgress->uiProgress = 1000;
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pProgress->uiProgress = 1000 - pProgress->uiProgress;
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * From buffer size (bytes) to number of sample (int16): divide by two */
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiPCMsize >>= 1;
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * Loop on samples */
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while (uiPCMsize-->0) /**< decrementing to optimize */
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i32sample = *pPCMdata;
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i32sample *= pProgress->uiProgress;
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        i32sample /= 1000;
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pPCMdata++ = (M4OSA_Int16)i32sample;
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     *    Return */
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_editAudioEffectFct_FadeOut: returning M4NO_ERROR");
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
184