1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 /**
17 *************************************************************************
18 * @file M4MCS_API.c
19 * @brief MCS implementation (Video Compressor Service)
20 * @note This file implements the API and the processing of the MCS
21 *************************************************************************
22 **/
23
24 /****************/
25 /*** Includes ***/
26 /****************/
27
28 /**
29 * OSAL headers */
30 #include "M4OSA_Memory.h" /**< OSAL memory management */
31 #include "M4OSA_Debug.h" /**< OSAL debug management */
32
33 /* Our headers */
34 #include "M4MCS_API.h"
35 #include "M4MCS_ErrorCodes.h"
36 #include "M4MCS_InternalTypes.h"
37 #include "M4MCS_InternalConfig.h"
38 #include "M4MCS_InternalFunctions.h"
39
40 /* Common headers (for aac) */
41 #include "M4_Common.h"
42
43 #ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
44 #include "M4VD_EXTERNAL_Interface.h"
45 #endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
46
47
48
49 /**
50 ******************************************************************************
51 * M4OSA_ERR M4MCS_intCheckAudioEffects(M4MCS_InternalContext* pContext)
52 * @brief Check if an effect has to be applied currently
53 * @note It is called by the stepEncoding function
54 * @param pContext (IN) MCS internal context
55 * @return M4NO_ERROR: No error
56 ******************************************************************************
57 */
M4MCS_intCheckAudioEffects(M4MCS_InternalContext * pC)58 M4OSA_ERR M4MCS_intCheckAudioEffects(M4MCS_InternalContext* pC)
59 {
60 M4OSA_Int8 *pActiveEffectNumber = &(pC->pActiveEffectNumber);
61
62 *pActiveEffectNumber = -1;
63
64 if(pC->ReaderAudioAU.m_CTS > pC->uiBeginCutTime
65 && pC->ReaderAudioAU.m_CTS < pC->uiEndCutTime)
66 {
67 M4OSA_UInt32 outputRelatedTime = 0;
68 M4OSA_UInt8 uiEffectIndex = 0;
69 outputRelatedTime =
70 (M4OSA_UInt32)(pC->ReaderAudioAU.m_CTS - pC->uiBeginCutTime + 0.5);
71
72 for(uiEffectIndex=0; uiEffectIndex<pC->nbEffects; uiEffectIndex++)
73 {
74 if ((outputRelatedTime >=
75 (M4OSA_UInt32)(pC->pEffects[uiEffectIndex].uiStartTime)) &&
76 (outputRelatedTime <
77 (M4OSA_UInt32)(pC->pEffects[uiEffectIndex].uiStartTime +\
78 pC->pEffects[uiEffectIndex].uiDuration)))
79 {
80 *pActiveEffectNumber = uiEffectIndex;
81 uiEffectIndex = pC->nbEffects;
82 }
83 }
84 }
85
86 return M4NO_ERROR;
87 }
88
89
90 /**
91 ******************************************************************************
92 * M4OSA_ERR M4MCS_editAudioEffectFct_FadeIn()
93 * @brief Apply audio effect FadeIn to pPCMdata
94 * @param pC (IN/OUT) Internal edit context
95 * @param pPCMdata (IN/OUT) Input and Output PCM audio data
96 * @param uiPCMsize (IN) Size of pPCMdata
97 * @param pProgress (IN) Effect progress
98 * @return M4NO_ERROR: No error
99 ******************************************************************************
100 */
M4MCS_editAudioEffectFct_FadeIn(M4OSA_Void * pFunctionContext,M4OSA_Int16 * pPCMdata,M4OSA_UInt32 uiPCMsize,M4MCS_ExternalProgress * pProgress)101 M4OSA_ERR M4MCS_editAudioEffectFct_FadeIn( M4OSA_Void *pFunctionContext,
102 M4OSA_Int16 *pPCMdata,
103 M4OSA_UInt32 uiPCMsize,
104 M4MCS_ExternalProgress *pProgress)
105 {
106 /* we will cast each Int16 sample into this Int32 variable */
107 M4OSA_Int32 i32sample;
108
109 /**
110 * Sanity check */
111 if(pProgress->uiProgress > 1000)
112 {
113 pProgress->uiProgress = 1000;
114 }
115
116 /**
117 * From buffer size (bytes) to number of sample (int16): divide by two */
118 uiPCMsize >>= 1;
119
120 /**
121 * Loop on samples */
122 while (uiPCMsize-->0) /**< decrementing to optimize */
123 {
124 i32sample = *pPCMdata;
125 i32sample *= pProgress->uiProgress;
126 i32sample /= 1000;
127 *pPCMdata++ = (M4OSA_Int16)i32sample;
128 }
129
130 /**
131 * Return */
132 M4OSA_TRACE3_0("M4MCS_editAudioEffectFct_FadeIn: returning M4NO_ERROR");
133 return M4NO_ERROR;
134 }
135
136
137 /**
138 ******************************************************************************
139 * M4OSA_ERR M4MCS_editAudioEffectFct_FadeOut()
140 * @brief Apply audio effect FadeIn to pPCMdata
141 * @param pC (IN/OUT) Internal edit context
142 * @param pPCMdata (IN/OUT) Input and Output PCM audio data
143 * @param uiPCMsize (IN) Size of pPCMdata
144 * @param pProgress (IN) Effect progress
145 * @return M4NO_ERROR: No error
146 ******************************************************************************
147 */
M4MCS_editAudioEffectFct_FadeOut(M4OSA_Void * pFunctionContext,M4OSA_Int16 * pPCMdata,M4OSA_UInt32 uiPCMsize,M4MCS_ExternalProgress * pProgress)148 M4OSA_ERR M4MCS_editAudioEffectFct_FadeOut( M4OSA_Void *pFunctionContext,
149 M4OSA_Int16 *pPCMdata,
150 M4OSA_UInt32 uiPCMsize,
151 M4MCS_ExternalProgress *pProgress)
152 {
153 /* we will cast each Int16 sample into this Int32 variable */
154 M4OSA_Int32 i32sample;
155
156 /**
157 * Sanity check */
158 if(pProgress->uiProgress > 1000)
159 {
160 pProgress->uiProgress = 1000;
161 }
162 pProgress->uiProgress = 1000 - pProgress->uiProgress;
163
164 /**
165 * From buffer size (bytes) to number of sample (int16): divide by two */
166 uiPCMsize >>= 1;
167
168 /**
169 * Loop on samples */
170 while (uiPCMsize-->0) /**< decrementing to optimize */
171 {
172 i32sample = *pPCMdata;
173 i32sample *= pProgress->uiProgress;
174 i32sample /= 1000;
175 *pPCMdata++ = (M4OSA_Int16)i32sample;
176 }
177
178 /**
179 * Return */
180 M4OSA_TRACE3_0("M4MCS_editAudioEffectFct_FadeOut: returning M4NO_ERROR");
181 return M4NO_ERROR;
182 }
183
184