fixed svace issues
[platform/adaptation/ap_samsung/libomxil-e3250-v4l2.git] / openmax / component / video / enc / mpeg4 / Exynos_OMX_Mpeg4enc.c
1 /*
2  *
3  * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 /*
19  * @file        Exynos_OMX_Mpeg4enc.c
20  * @brief
21  * @author      Yunji Kim (yunji.kim@samsung.com)
22  * @version     2.0.0
23  * @history
24  *   2012.02.20 : Create
25  */
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include "Exynos_OMX_Macros.h"
32 #include "Exynos_OMX_Basecomponent.h"
33 #include "Exynos_OMX_Baseport.h"
34 #include "Exynos_OMX_Venc.h"
35 #include "Exynos_OSAL_ETC.h"
36 #include "Exynos_OSAL_Semaphore.h"
37 #include "Exynos_OSAL_Thread.h"
38 #include "library_register.h"
39 #include "Exynos_OMX_Mpeg4enc.h"
40 //#include "ExynosVideoApi.h"
41 #include "Exynos_OSAL_SharedMemory.h"
42 #include "Exynos_OSAL_Event.h"
43 #include "Exynos_OMX_VencControl.h"
44
45 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
46 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
47 #include "csc.h"
48
49 #undef  EXYNOS_LOG_TAG
50 #define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_ENC"
51 #define EXYNOS_LOG_OFF
52 //#define EXYNOS_TRACE_ON
53 #include "Exynos_OSAL_Log.h"
54
55 /* MPEG4 Encoder Supported Levels & profiles */
56 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
57     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
58     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
59     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
60     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
61     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
62     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
63     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
64     {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
65     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
66     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
67     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
68     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
69     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
70     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
71     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
72     {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
73
74 /* H.263 Encoder Supported Levels & profiles */
75 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
76     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
77     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
78     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
79     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
80     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
81     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
82     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
83     {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70}};
84
85 static OMX_U32 OMXMpeg4ProfileToMFCProfile(OMX_VIDEO_MPEG4PROFILETYPE profile)
86 {
87     OMX_U32 ret;
88
89     switch (profile) {
90     case OMX_VIDEO_MPEG4ProfileSimple:
91         ret = 0;
92         break;
93     case OMX_VIDEO_MPEG4ProfileAdvancedSimple:
94         ret = 1;
95         break;
96     default:
97         ret = 0;
98     };
99
100     return ret;
101 }
102
103 static OMX_U32 OMXMpeg4LevelToMFCLevel(OMX_VIDEO_MPEG4LEVELTYPE level)
104 {
105     OMX_U32 ret;
106
107     switch (level) {
108     case OMX_VIDEO_MPEG4Level0:
109         ret = 0;
110         break;
111     case OMX_VIDEO_MPEG4Level0b:
112         ret = 1;
113         break;
114     case OMX_VIDEO_MPEG4Level1:
115         ret = 2;
116         break;
117     case OMX_VIDEO_MPEG4Level2:
118         ret = 3;
119         break;
120     case OMX_VIDEO_MPEG4Level3:
121         ret = 4;
122         break;
123     case OMX_VIDEO_MPEG4Level4:
124     case OMX_VIDEO_MPEG4Level4a:
125         ret = 6;
126         break;
127     case OMX_VIDEO_MPEG4Level5:
128         ret = 7;
129         break;
130     default:
131         ret = 0;
132     };
133
134     return ret;
135 }
136
137 static void Print_Mpeg4Enc_Param(ExynosVideoEncParam *pEncParam)
138 {
139     ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
140     ExynosVideoEncMpeg4Param  *pMpeg4Param  = &pEncParam->codecParam.mpeg4;
141
142     /* common parameters */
143     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
144     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
145     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
146     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
147     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
148     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
149     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
150     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
151     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax               : %d", pCommonParam->QSCodeMax);
152     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
153     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
154     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
155     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
156     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
157     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
158
159     /* Mpeg4 specific parameters */
160     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ProfileIDC              : %d", pMpeg4Param->ProfileIDC);
161     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LevelIDC                : %d", pMpeg4Param->LevelIDC);
162     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_B               : %d", pMpeg4Param->FrameQp_B);
163     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "TimeIncreamentRes       : %d", pMpeg4Param->TimeIncreamentRes);
164     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VopTimeIncreament       : %d", pMpeg4Param->VopTimeIncreament);
165     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceArgument           : %d", pMpeg4Param->SliceArgument);
166     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberBFrames           : %d", pMpeg4Param->NumberBFrames);
167     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "DisableQpelME           : %d", pMpeg4Param->DisableQpelME);
168
169     /* rate control related parameters */
170     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
171     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
172     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
173 }
174
175 static void Print_H263Enc_Param(ExynosVideoEncParam *pEncParam)
176 {
177     ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
178     ExynosVideoEncH263Param   *pH263Param   = &pEncParam->codecParam.h263;
179
180     /* common parameters */
181     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
182     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
183     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
184     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
185     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
186     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
187     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
188     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
189     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax               : %d", pCommonParam->QSCodeMax);
190     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
191     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
192     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
193     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
194     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
195     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
196
197     /* H263 specific parameters */
198     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameRate               : %d", pH263Param->FrameRate);
199
200     /* rate control related parameters */
201     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
202     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
203     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
204 }
205
206 static void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
207 {
208     EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
209     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
210     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
211     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
212     EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
213
214     ExynosVideoEncParam       *pEncParam    = NULL;
215     ExynosVideoEncCommonParam *pCommonParam = NULL;
216     ExynosVideoEncMpeg4Param  *pMpeg4Param  = NULL;
217
218     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
219     pMpeg4Enc = pVideoEnc->hCodecHandle;
220     pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
221     pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
222     pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
223
224     pEncParam    = &pMFCMpeg4Handle->encParam;
225     pCommonParam = &pEncParam->commonParam;
226     pMpeg4Param  = &pEncParam->codecParam.mpeg4;
227     pEncParam->eCompressionFormat = VIDEO_CODING_MPEG4;
228     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
229
230     /* common parameters */
231     pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
232     pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
233     pCommonParam->IDRPeriod    = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
234     pCommonParam->SliceMode    = 0;
235     pCommonParam->RandomIntraMBRefresh = 0;
236     pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
237     pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
238     pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
239     pCommonParam->QSCodeMax    = 30;
240     pCommonParam->QSCodeMin    = 10;
241     pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */
242     pCommonParam->LumaPadVal   = 0;
243     pCommonParam->CbPadVal     = 0;
244     pCommonParam->CrPadVal     = 0;
245
246     switch ((int)pExynosInputPort->portDefinition.format.video.eColorFormat) {
247     case OMX_COLOR_FormatYUV420SemiPlanar:
248     case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_Preprocessor_InputData */
249 #ifdef TIZEN_FEATURE_E3250
250     case OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd:
251 #endif
252 #ifdef USE_METADATABUFFERTYPE
253     case OMX_COLOR_FormatAndroidOpaque:
254 #endif
255         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
256         break;
257     case OMX_SEC_COLOR_FormatNV12Tiled:
258     case OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd:
259         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
260         break;
261     case OMX_SEC_COLOR_FormatNV21Linear:
262         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
263         break;
264     default:
265         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
266         break;
267     }
268
269     /* Mpeg4 specific parameters */
270     pMpeg4Param->ProfileIDC = OMXMpeg4ProfileToMFCProfile(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eProfile);
271     pMpeg4Param->LevelIDC   = OMXMpeg4LevelToMFCLevel(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eLevel);
272     pMpeg4Param->FrameQp_B  = pVideoEnc->quantization.nQpB;
273     pMpeg4Param->TimeIncreamentRes = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
274     pMpeg4Param->VopTimeIncreament = 1;
275     pMpeg4Param->SliceArgument = 0; /* MB number or byte number */
276     pMpeg4Param->NumberBFrames = 0; /* 0(not used) ~ 2 */
277     pMpeg4Param->DisableQpelME = 1;
278
279     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
280     /* rate control related parameters */
281     switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
282     case OMX_Video_ControlRateDisable:
283         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode DBR");
284         pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */
285         pCommonParam->EnableMBRateControl  = 0; /* 0: Disable, 1:MB level RC */
286         pCommonParam->CBRPeriodRf          = 100;
287         break;
288     case OMX_Video_ControlRateConstant:
289         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
290         pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
291         pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
292         pCommonParam->CBRPeriodRf          = 9;
293         break;
294     case OMX_Video_ControlRateVariable:
295     default: /*Android default */
296         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
297         pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
298         pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
299         pCommonParam->CBRPeriodRf          = 100;
300         break;
301     }
302
303     Print_Mpeg4Enc_Param(pEncParam);
304 }
305
306 static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
307 {
308     EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
309     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
310     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
311     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
312     EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
313
314     ExynosVideoEncParam       *pEncParam    = NULL;
315     ExynosVideoEncCommonParam *pCommonParam = NULL;
316     ExynosVideoEncH263Param   *pH263Param   = NULL;
317
318     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
319     pMpeg4Enc = pVideoEnc->hCodecHandle;
320     pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
321     pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
322     pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
323
324     pEncParam    = &pMFCMpeg4Handle->encParam;
325     pCommonParam = &pEncParam->commonParam;
326     pH263Param   = &pEncParam->codecParam.h263;
327     pEncParam->eCompressionFormat = VIDEO_CODING_H263;
328     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
329
330     /* common parameters */
331     pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
332     pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
333     pCommonParam->IDRPeriod    = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
334     pCommonParam->SliceMode    = 0;
335     pCommonParam->RandomIntraMBRefresh = 0;
336     pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
337     pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
338     pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
339     pCommonParam->QSCodeMax    = 30;
340     pCommonParam->QSCodeMin    = 10;
341     pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */
342     pCommonParam->LumaPadVal   = 0;
343     pCommonParam->CbPadVal     = 0;
344     pCommonParam->CrPadVal     = 0;
345
346     switch ((int)pExynosInputPort->portDefinition.format.video.eColorFormat) {
347     case OMX_COLOR_FormatYUV420SemiPlanar:
348     case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_Preprocessor_InputData */
349 #ifdef TIZEN_FEATURE_E3250
350     case OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd:
351 #endif
352 #ifdef USE_METADATABUFFERTYPE
353     case OMX_COLOR_FormatAndroidOpaque:
354 #endif
355         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
356         break;
357     case OMX_SEC_COLOR_FormatNV12Tiled:
358     case OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd:
359         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
360         break;
361     case OMX_SEC_COLOR_FormatNV21Linear:
362         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
363         break;
364     default:
365         pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
366         break;
367     }
368
369     /* H263 specific parameters */
370     pH263Param->FrameRate            = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
371
372     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
373     /* rate control related parameters */
374     switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
375     case OMX_Video_ControlRateVariable:
376         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
377         pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */
378         pCommonParam->EnableMBRateControl  = 0; /* 0: Disable, 1:MB level RC */
379         pCommonParam->CBRPeriodRf          = 100;
380         break;
381     case OMX_Video_ControlRateConstant:
382         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
383         pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
384         pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
385         pCommonParam->CBRPeriodRf          = 10;
386         break;
387     case OMX_Video_ControlRateDisable:
388     default: /*Android default */
389         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
390         pCommonParam->EnableFRMRateControl = 0;
391         pCommonParam->EnableMBRateControl  = 0;
392         pCommonParam->CBRPeriodRf          = 100;
393         break;
394     }
395
396     Print_H263Enc_Param(pEncParam);
397 }
398
399 static void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
400 {
401     EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
402     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
403     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
404     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
405     EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
406
407     ExynosVideoEncOps         *pEncOps      = NULL;
408     ExynosVideoEncParam       *pEncParam    = NULL;
409     ExynosVideoEncCommonParam *pCommonParam = NULL;
410     ExynosVideoEncMpeg4Param  *pMpeg4Param  = NULL;
411
412     int setParam = 0;
413
414     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
415     pMpeg4Enc = pVideoEnc->hCodecHandle;
416     pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
417     pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
418     pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
419     pEncOps = pMFCMpeg4Handle->pEncOps;
420
421     pEncParam    = &pMFCMpeg4Handle->encParam;
422     pCommonParam = &pEncParam->commonParam;
423     pMpeg4Param  = &pEncParam->codecParam.mpeg4;
424
425     if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
426         setParam = VIDEO_FRAME_I;
427         pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
428         pVideoEnc->IntraRefreshVOP = OMX_FALSE;
429     }
430     if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1) {
431         setParam = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
432         pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
433     }
434     if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
435         setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
436         pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
437     }
438   if (pMpeg4Param->TimeIncreamentRes != (int)((pExynosInputPort->portDefinition.format.video.xFramerate) >> 16)) {
439         setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
440         pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
441     }
442
443     Set_Mpeg4Enc_Param(pExynosComponent);
444 }
445
446 static void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
447 {
448     EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
449     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
450     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
451     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
452     EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
453
454     ExynosVideoEncOps         *pEncOps      = NULL;
455     ExynosVideoEncParam       *pEncParam    = NULL;
456     ExynosVideoEncCommonParam *pCommonParam = NULL;
457     ExynosVideoEncH263Param   *pH263Param   = NULL;
458
459     int setParam = 0;
460
461     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
462     pMpeg4Enc = pVideoEnc->hCodecHandle;
463     pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
464     pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
465     pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
466     pEncOps = pMFCMpeg4Handle->pEncOps;
467
468     pEncParam    = &pMFCMpeg4Handle->encParam;
469     pCommonParam = &pEncParam->commonParam;
470     pH263Param   = &pEncParam->codecParam.h263;
471
472     if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
473         setParam = VIDEO_FRAME_I;
474         pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
475         pVideoEnc->IntraRefreshVOP = OMX_FALSE;
476     }
477     if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1) {
478         setParam = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
479         pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
480     }
481     if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
482         setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
483         pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
484     }
485     if (pH263Param->FrameRate != (int)((pExynosInputPort->portDefinition.format.video.xFramerate) >> 16)) {
486         setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
487         pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
488     }
489
490     Set_H263Enc_Param(pExynosComponent);
491 }
492
493 OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[])
494 {
495     return OMX_ErrorNone;
496 }
497
498 OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, OMX_PTR *pVirtAddr, OMX_U32 *dataSize)
499 {
500     OMX_ERRORTYPE       ret = OMX_ErrorNone;
501     ExynosVideoBuffer  *pCodecBuffer;
502
503     if (codecBuffer == NULL) {
504         ret = OMX_ErrorBadParameter;
505         goto EXIT;
506     }
507
508     pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
509
510     if (pVirtAddr != NULL)
511         *pVirtAddr = pCodecBuffer->planes[0].addr;
512
513     if (dataSize != NULL)
514         *dataSize = pCodecBuffer->planes[0].allocSize;
515
516     pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
517
518 EXIT:
519     return ret;
520 }
521
522 OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc)
523 {
524     OMX_ERRORTYPE           ret = OMX_ErrorNone;
525
526     ExynosVideoEncOps       *pEncOps    = NULL;
527     ExynosVideoEncBufferOps *pInbufOps  = NULL;
528     ExynosVideoEncBufferOps *pOutbufOps = NULL;
529     enum v4l2_memory v4l2MemoryType = V4L2_MEMORY_USERPTR;
530
531     FunctionIn();
532
533     if (pMpeg4Enc == NULL) {
534         ret = OMX_ErrorBadParameter;
535         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
536         goto EXIT;
537     }
538
539     /* alloc ops structure */
540     pEncOps = (ExynosVideoEncOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncOps));
541     pInbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps));
542     pOutbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps));
543
544     if ((pEncOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
545         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate encoder ops buffer");
546         ret = OMX_ErrorInsufficientResources;
547         goto EXIT;
548     }
549
550     pMpeg4Enc->hMFCMpeg4Handle.pEncOps = pEncOps;
551     pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = pInbufOps;
552     pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = pOutbufOps;
553
554     /* function pointer mapping */
555     pEncOps->nSize = sizeof(ExynosVideoEncOps);
556     pInbufOps->nSize = sizeof(ExynosVideoEncBufferOps);
557     pOutbufOps->nSize = sizeof(ExynosVideoEncBufferOps);
558
559     Exynos_Video_Register_Encoder(pEncOps, pInbufOps, pOutbufOps);
560
561     /* check mandatory functions for encoder ops */
562     if ((pEncOps->Init == NULL) || (pEncOps->Finalize == NULL) ||
563         (pEncOps->Set_FrameTag == NULL) || (pEncOps->Get_FrameTag == NULL)) {
564         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
565         ret = OMX_ErrorInsufficientResources;
566         goto EXIT;
567     }
568
569     /* check mandatory functions for buffer ops */
570     if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
571         (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
572         (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
573         (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
574         (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
575         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
576         ret = OMX_ErrorInsufficientResources;
577         goto EXIT;
578     }
579
580     if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
581 #ifdef USE_DMA_BUF
582         v4l2MemoryType = V4L2_MEMORY_DMABUF;
583         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "using Enc V4L2_MEMORY_DMABUF");
584 #else
585         v4l2MemoryType = V4L2_MEMORY_USERPTR;
586         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "using Enc V4L2_MEMORY_USEPTR");
587 #endif
588     } else {
589         //v4l2MemoryType = V4L2_MEMORY_MMAP;
590         v4l2MemoryType = V4L2_MEMORY_DMABUF; //if input port is using Buffer-share mode
591         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "using Enc V4L2_MEMORY - DMABUF & MMAP");
592     }
593
594     /* alloc context, open, querycap */
595     pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.pEncOps->Init(v4l2MemoryType);
596     if (pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle == NULL) {
597         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
598         ret = OMX_ErrorInsufficientResources;
599         goto EXIT;
600     }
601
602     ret = OMX_ErrorNone;
603
604 EXIT:
605     if (ret != OMX_ErrorNone) {
606         if (pEncOps != NULL) {
607             Exynos_OSAL_Free(pEncOps);
608             pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL;
609         }
610         if (pInbufOps != NULL) {
611             Exynos_OSAL_Free(pInbufOps);
612             pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL;
613         }
614         if (pOutbufOps != NULL) {
615             Exynos_OSAL_Free(pOutbufOps);
616             pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL;
617         }
618     }
619
620     FunctionOut();
621
622     return ret;
623 }
624
625 OMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc)
626 {
627     OMX_ERRORTYPE            ret = OMX_ErrorNone;
628     void                    *hMFCHandle = NULL;
629     ExynosVideoEncOps       *pEncOps    = NULL;
630     ExynosVideoEncBufferOps *pInbufOps  = NULL;
631     ExynosVideoEncBufferOps *pOutbufOps = NULL;
632
633     FunctionIn();
634
635     if (pMpeg4Enc == NULL) {
636         ret = OMX_ErrorBadParameter;
637         goto EXIT;
638     }
639
640     hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
641     pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
642     pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
643     pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
644
645     if (hMFCHandle != NULL) {
646         pEncOps->Finalize(hMFCHandle);
647         hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = NULL;
648     }
649     if (pOutbufOps != NULL) {
650         Exynos_OSAL_Free(pOutbufOps);
651         pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL;
652     }
653     if (pInbufOps != NULL) {
654         Exynos_OSAL_Free(pInbufOps);
655         pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL;
656     }
657     if (pEncOps != NULL) {
658         Exynos_OSAL_Free(pEncOps);
659         pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL;
660     }
661
662     ret = OMX_ErrorNone;
663
664 EXIT:
665     FunctionOut();
666
667     return ret;
668 }
669
670 OMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
671 {
672     OMX_ERRORTYPE            ret = OMX_ErrorNone;
673     void                    *hMFCHandle = NULL;
674     ExynosVideoEncBufferOps *pInbufOps  = NULL;
675     ExynosVideoEncBufferOps *pOutbufOps = NULL;
676     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
677     EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
678
679     FunctionIn();
680
681     if (pOMXComponent == NULL) {
682         ret = OMX_ErrorBadParameter;
683         goto EXIT;
684     }
685
686     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
687     if (pVideoEnc == NULL) {
688         ret = OMX_ErrorBadParameter;
689         goto EXIT;
690     }
691
692     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
693     if (pMpeg4Enc == NULL) {
694         ret = OMX_ErrorBadParameter;
695         goto EXIT;
696     }
697
698     hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
699     pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
700     pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
701
702     if (nPortIndex == INPUT_PORT_INDEX)
703         pInbufOps->Run(hMFCHandle);
704     else if (nPortIndex == OUTPUT_PORT_INDEX)
705         pOutbufOps->Run(hMFCHandle);
706
707     ret = OMX_ErrorNone;
708
709 EXIT:
710     FunctionOut();
711
712     return ret;
713 }
714
715 OMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
716 {
717     OMX_ERRORTYPE            ret = OMX_ErrorNone;
718     void                    *hMFCHandle = NULL;
719     ExynosVideoEncBufferOps *pInbufOps  = NULL;
720     ExynosVideoEncBufferOps *pOutbufOps = NULL;
721     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
722     EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
723
724     FunctionIn();
725
726     if (pOMXComponent == NULL) {
727         ret = OMX_ErrorBadParameter;
728         goto EXIT;
729     }
730
731     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
732     if (pVideoEnc == NULL) {
733         ret = OMX_ErrorBadParameter;
734         goto EXIT;
735     }
736     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
737     if (pMpeg4Enc == NULL) {
738         ret = OMX_ErrorBadParameter;
739         goto EXIT;
740     }
741
742     hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
743     pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
744     pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
745
746     if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
747         pInbufOps->Stop(hMFCHandle);
748     else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
749         pOutbufOps->Stop(hMFCHandle);
750
751     ret = OMX_ErrorNone;
752
753 EXIT:
754     FunctionOut();
755
756     return ret;
757 }
758
759 OMX_ERRORTYPE Mpeg4CodecSrcInit(OMX_COMPONENTTYPE *pOMXComponent)
760 {
761     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
762     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
763     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
764     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
765     EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
766     void                          *hMFCHandle = pMFCMpeg4Handle->hMFCHandle;
767     EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
768
769
770     ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
771     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
772
773     ExynosVideoEncParam     *pEncParam    = NULL;
774
775     ExynosVideoGeometry      bufferConf;
776     OMX_U32                  inputBufferNumber = 0;
777     int i;
778
779     FunctionIn();
780
781     if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
782         Set_Mpeg4Enc_Param(pExynosComponent);
783     else
784         Set_H263Enc_Param(pExynosComponent);
785
786     pEncParam = &pMFCMpeg4Handle->encParam;
787     if (pEncOps->Set_EncParam) {
788         if(pEncOps->Set_EncParam(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, pEncParam) != VIDEO_ERROR_NONE) {
789             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
790             ret = OMX_ErrorInsufficientResources;
791             goto EXIT;
792         }
793     }
794
795     /* input buffer info: only 3 config values needed */
796     Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
797     bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;;
798     bufferConf.nFrameWidth = pExynosInputPort->portDefinition.format.video.nFrameWidth;
799     bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
800
801     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "bufferConf, eColorFormat=%d, w=%d, h=%d", bufferConf.eColorFormat, bufferConf.nFrameWidth, bufferConf.nFrameHeight);
802
803     if (pExynosInputPort->bufferProcessType & BUFFER_SHARE
804         ||pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE)
805         pInbufOps->Set_Shareable(hMFCHandle);
806
807     if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
808         inputBufferNumber = MAX_CAMERA_INPUTBUFFER_NUM; /* Need change to number of camera buffer */
809     } else if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
810         inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
811     }
812
813     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
814         /* should be done before prepare input buffer */
815         if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
816             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set Enable_Cacheable for input buffer");
817             ret = OMX_ErrorInsufficientResources;
818             goto EXIT;
819         }
820     }
821
822     /* set input buffer geometry */
823     if (pInbufOps->Set_Geometry) {
824
825         if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
826             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
827             ret = OMX_ErrorInsufficientResources;
828             goto EXIT;
829         }
830     }
831
832     /* setup input buffer */
833     if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
834         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
835         ret = OMX_ErrorInsufficientResources;
836         goto EXIT;
837     }
838
839     ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
840     int plane;
841
842     if (pExynosInputPort->bufferProcessType & BUFFER_COPY &&
843         pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
844        /* Register input buffer */
845         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
846             for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
847                 planes[plane].addr = pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane];
848                 planes[plane].allocSize = pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[plane];
849                 planes[plane].fd = pVideoEnc->pMFCEncInputBuffer[i]->fd[plane];
850             }
851             if (pInbufOps->Register(hMFCHandle, planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
852                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
853                 ret = OMX_ErrorInsufficientResources;
854                 goto EXIT;
855             }
856         }
857     } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) &&
858         pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_FALSE) {
859         ExynosVideoBuffer *pBuffer = NULL;
860
861         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
862                 pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
863                 /* get input buffer info */
864                 if (pInbufOps->Get_Buffer) {
865                     if (pInbufOps->Get_Buffer(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, i, &pBuffer) != VIDEO_ERROR_NONE) {
866                         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get input buffer info");
867                         ret = OMX_ErrorInsufficientResources;
868                         goto EXIT;
869                     }
870                 }
871
872                 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
873                      pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] = (void *)pBuffer->planes[plane].addr;
874                     pVideoEnc->pMFCEncInputBuffer[i]->fd[plane] = pBuffer->planes[plane].fd;
875                     pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[plane] = pBuffer->planes[plane].allocSize;
876                     pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
877                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
878                 }
879
880                 Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
881             }
882     } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
883         if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
884             /*************/
885             /*    TBD    */
886             /*************/
887             /* Does not require any actions. */
888         } else {
889 #ifndef TIZEN_FEATURE_E3250 /* slp platform can go into here */
890             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get input buffer info");
891             ret = OMX_ErrorNotImplemented;
892             goto EXIT;
893 #endif
894         }
895     }
896
897 EXIT:
898     FunctionOut();
899
900     return ret;
901 }
902
903 OMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
904 {
905     OMX_ERRORTYPE            ret = OMX_ErrorNone;
906     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
907     EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
908
909     FunctionIn();
910
911     if (pOMXComponent == NULL) {
912         ret = OMX_ErrorBadParameter;
913         goto EXIT;
914     }
915
916     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
917     if (pVideoEnc == NULL) {
918         ret = OMX_ErrorBadParameter;
919         goto EXIT;
920     }
921     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
922     if (pMpeg4Enc == NULL) {
923         ret = OMX_ErrorBadParameter;
924         goto EXIT;
925     }
926
927     if (nPortIndex == INPUT_PORT_INDEX) {
928         if (pMpeg4Enc->bSourceStart == OMX_FALSE) {
929             Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent);
930             Exynos_OSAL_SleepMillisec(0);
931         }
932     }
933
934     if (nPortIndex == OUTPUT_PORT_INDEX) {
935         if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
936             Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent);
937             Exynos_OSAL_SleepMillisec(0);
938         }
939     }
940
941     ret = OMX_ErrorNone;
942
943 EXIT:
944     FunctionOut();
945
946     return ret;
947 }
948
949 OMX_ERRORTYPE Mpeg4CodecEnqueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
950 {
951     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
952     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
953     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
954     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
955     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
956     int i;
957
958     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
959     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
960
961     FunctionIn();
962
963     if ((nPortIndex != INPUT_PORT_INDEX) && (nPortIndex != OUTPUT_PORT_INDEX)) {
964         ret = OMX_ErrorBadPortIndex;
965         goto EXIT;
966     }
967
968     if ((nPortIndex == INPUT_PORT_INDEX) &&
969         (pMpeg4Enc->bSourceStart == OMX_TRUE)) {
970         Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
971
972         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)  {
973             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
974             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
975             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
976
977             Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
978         }
979
980         pInbufOps->Clear_Queue(hMFCHandle);
981     } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
982                (pMpeg4Enc->bDestinationStart == OMX_TRUE)) {
983         ExynosVideoBuffer *pBuffer = NULL;
984
985         Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
986
987         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
988             pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
989             Exynos_CodecBufferEnqueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
990             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncOutputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]);
991 //            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
992 //            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
993         }
994         pOutbufOps->Clear_Queue(hMFCHandle);
995     }
996
997 EXIT:
998     FunctionOut();
999
1000     return ret;
1001 }
1002
1003 OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1004 {
1005     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
1006     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1007     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1008     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1009     OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
1010
1011     FunctionIn();
1012
1013     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
1014         OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
1015         OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
1016         if (OMXBuffer == NULL) {
1017             ret = OMX_ErrorUndefined;
1018             goto EXIT;
1019         }
1020
1021         OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
1022         OMXBuffer->nFlags = pSrcInputData->nFlags;
1023         ret = Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
1024         if (ret != OMX_ErrorNone) {
1025             goto EXIT;
1026         }
1027         goto EXIT;
1028     }
1029
1030     if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1031         Set_Mpeg4Enc_Param(pExynosComponent);
1032     else
1033         Set_H263Enc_Param(pExynosComponent);
1034
1035     if (!((pExynosInputPort->bufferProcessType & BUFFER_COPY) &&
1036         pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_FALSE)) {
1037         ret = Mpeg4CodecSrcInit(pOMXComponent);
1038         if (ret != OMX_ErrorNone)
1039             goto EXIT;
1040     }
1041
1042     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE;
1043     ret = OMX_ErrorNone;
1044
1045 EXIT:
1046     FunctionOut();
1047
1048     return ret;
1049 }
1050
1051 OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
1052 {
1053     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
1054     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1055     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1056     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1057     EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
1058     void                          *hMFCHandle = pMFCMpeg4Handle->hMFCHandle;
1059     EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1060
1061     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
1062     ExynosVideoGeometry      bufferConf;
1063     int i, nPlanes, OutBufferSize;
1064
1065     FunctionIn();
1066
1067     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1068 /*For memory Optimization */
1069         OutBufferSize = 1024*1024*2;//pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
1070     } else {
1071         OutBufferSize = pExynosOutputPort->extendBufferHeader[0].OMXBufferHeader->nAllocLen;
1072     }
1073
1074     /* set geometry for output (dst) */
1075     if (pOutbufOps->Set_Geometry) {
1076         /* only 2 config values needed */
1077         if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1078             bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
1079         else
1080             bufferConf.eCompressionFormat = VIDEO_CODING_H263;
1081         bufferConf.nSizeImage = OutBufferSize;
1082
1083         if (pOutbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
1084             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
1085             ret = OMX_ErrorInsufficientResources;
1086             goto EXIT;
1087         }
1088     }
1089
1090     /* should be done before prepare output buffer */
1091     if (pOutbufOps->Enable_Cacheable) {
1092         if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
1093             ret = OMX_ErrorInsufficientResources;
1094             goto EXIT;
1095         }
1096     }
1097
1098     if (pOutbufOps->Set_Shareable) {
1099         if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE
1100             ||pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE)
1101             pOutbufOps->Set_Shareable(hMFCHandle);
1102     }
1103     int SetupBufferNumber = 0;
1104     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY)
1105         SetupBufferNumber = MFC_OUTPUT_BUFFER_NUM_MAX;
1106     else
1107         SetupBufferNumber = pExynosOutputPort->portDefinition.nBufferCountActual;
1108     Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SetupBufferNumber:%d", SetupBufferNumber);
1109
1110     if (pOutbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, SetupBufferNumber) != VIDEO_ERROR_NONE) {
1111         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
1112         ret = OMX_ErrorInsufficientResources;
1113         goto EXIT;
1114     }
1115
1116     OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0};
1117     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1118         if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
1119             /* Register input buffer */
1120             for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
1121                 ExynosVideoPlane plane;
1122                 pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
1123
1124                 if (pVideoEnc->pMFCEncOutputBuffer[i] == NULL) {
1125                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
1126                     ret = OMX_ErrorInsufficientResources;
1127                     goto EXIT;
1128                 }
1129                 pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] =
1130                     (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, OutBufferSize, NORMAL_MEMORY);
1131
1132                 if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] == NULL) {
1133                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
1134                     ret = OMX_ErrorInsufficientResources;
1135                     goto EXIT;
1136                 }
1137                 pVideoEnc->pMFCEncOutputBuffer[i]->fd[0] =
1138                     Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]);
1139                 pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0] = OutBufferSize;
1140
1141                 plane.addr = pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0];
1142                 plane.fd = pVideoEnc->pMFCEncOutputBuffer[i]->fd[0];
1143                 plane.allocSize = pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0];
1144
1145                 if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
1146                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
1147                     ret = OMX_ErrorInsufficientResources;
1148                     goto EXIT;
1149                 }
1150                 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr,
1151                                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1152             }
1153         }else if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_FALSE) {
1154             /* Register input buffer */
1155             for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
1156                 ExynosVideoBuffer *pBuffer = NULL;
1157
1158                 pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
1159
1160                 if (!pVideoEnc->pMFCEncOutputBuffer[i]) {
1161                     ret = OMX_ErrorInsufficientResources;
1162                     goto ALLOC_FAILED;
1163                 }
1164
1165                 if (pOutbufOps->Get_Buffer) {
1166                      if (pOutbufOps->Get_Buffer(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, i, &pBuffer) != VIDEO_ERROR_NONE) {
1167                          Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get Output buffer info");
1168                          ret = OMX_ErrorInsufficientResources;
1169                          goto EXIT;
1170                      }
1171                 }
1172
1173                 for (nPlanes = 0; nPlanes < MFC_OUTPUT_BUFFER_PLANE; nPlanes++) {
1174                     pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[nPlanes] = (void *)pBuffer->planes[nPlanes].addr;
1175                     pVideoEnc->pMFCEncOutputBuffer[i]->fd[nPlanes] = pBuffer->planes[nPlanes].fd;
1176                     pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[nPlanes] = pBuffer->planes[nPlanes].allocSize;
1177                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncOutputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[nPlanes]);
1178                 }
1179
1180                 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr,
1181                                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1182             }
1183         }
1184
1185         /* start header encoding */
1186         if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
1187             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
1188             ret = OMX_ErrorInsufficientResources;
1189             goto EXIT;
1190         }
1191     } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1192         /* Register input buffer */
1193         /*************/
1194         /*    TBD    */
1195         /*************/
1196         ExynosVideoPlane plane;
1197         for (i = 0; i < pExynosOutputPort->portDefinition.nBufferCountActual; i++) {
1198             plane.addr = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
1199             plane.fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[0];
1200             plane.allocSize = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
1201             if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
1202                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
1203                 ret = OMX_ErrorInsufficientResources;
1204                 goto EXIT;
1205             }
1206         }
1207     }
1208
1209    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
1210
1211     ret = OMX_ErrorNone;
1212
1213 EXIT:
1214     FunctionOut();
1215
1216     return ret;
1217 }
1218
1219 OMX_ERRORTYPE Exynos_Mpeg4Enc_GetParameter(
1220     OMX_IN    OMX_HANDLETYPE hComponent,
1221     OMX_IN    OMX_INDEXTYPE  nParamIndex,
1222     OMX_INOUT OMX_PTR        pComponentParameterStructure)
1223 {
1224     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1225     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1226     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1227
1228     FunctionIn();
1229
1230     if (hComponent == NULL || pComponentParameterStructure == NULL) {
1231         ret = OMX_ErrorBadParameter;
1232         goto EXIT;
1233     }
1234     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1235     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1236     if (ret != OMX_ErrorNone) {
1237         goto EXIT;
1238     }
1239     if (pOMXComponent->pComponentPrivate == NULL) {
1240         ret = OMX_ErrorBadParameter;
1241         goto EXIT;
1242     }
1243
1244     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1245     if (pExynosComponent->currentState == OMX_StateInvalid ) {
1246         ret = OMX_ErrorInvalidState;
1247         goto EXIT;
1248     }
1249
1250     switch (nParamIndex) {
1251     case OMX_IndexParamVideoMpeg4:
1252     {
1253         OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
1254         OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = NULL;
1255         EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
1256
1257         ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1258         if (ret != OMX_ErrorNone) {
1259             goto EXIT;
1260         }
1261
1262         if (pDstMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
1263             ret = OMX_ErrorBadPortIndex;
1264             goto EXIT;
1265         }
1266
1267         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1268         pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstMpeg4Component->nPortIndex];
1269
1270         Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1271     }
1272         break;
1273     case OMX_IndexParamVideoH263:
1274     {
1275         OMX_VIDEO_PARAM_H263TYPE  *pDstH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
1276         OMX_VIDEO_PARAM_H263TYPE  *pSrcH263Component = NULL;
1277         EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
1278
1279         ret = Exynos_OMX_Check_SizeVersion(pDstH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1280         if (ret != OMX_ErrorNone) {
1281             goto EXIT;
1282         }
1283
1284         if (pDstH263Component->nPortIndex >= ALL_PORT_NUM) {
1285             ret = OMX_ErrorBadPortIndex;
1286             goto EXIT;
1287         }
1288
1289         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1290         pSrcH263Component = &pMpeg4Enc->h263Component[pDstH263Component->nPortIndex];
1291
1292         Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1293     }
1294         break;
1295     case OMX_IndexParamStandardComponentRole:
1296     {
1297         OMX_S32 codecType;
1298         OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
1299         ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1300         if (ret != OMX_ErrorNone) {
1301             goto EXIT;
1302         }
1303
1304         codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1305         if (codecType == CODEC_TYPE_MPEG4)
1306             Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
1307         else
1308             Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
1309     }
1310         break;
1311     case OMX_IndexParamVideoProfileLevelQuerySupported:
1312     {
1313         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1314         EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel = NULL;
1315         OMX_U32                           maxProfileLevelNum = 0;
1316         OMX_S32                           codecType;
1317
1318         ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1319         if (ret != OMX_ErrorNone) {
1320             goto EXIT;
1321         }
1322
1323         if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1324             ret = OMX_ErrorBadPortIndex;
1325             goto EXIT;
1326         }
1327
1328         codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1329         if (codecType == CODEC_TYPE_MPEG4) {
1330             pProfileLevel = supportedMPEG4ProfileLevels;
1331             maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
1332         } else {
1333             pProfileLevel = supportedH263ProfileLevels;
1334             maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
1335         }
1336
1337         if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
1338             ret = OMX_ErrorNoMore;
1339             goto EXIT;
1340         }
1341
1342         pProfileLevel += pDstProfileLevel->nProfileIndex;
1343         pDstProfileLevel->eProfile = pProfileLevel->profile;
1344         pDstProfileLevel->eLevel = pProfileLevel->level;
1345     }
1346         break;
1347     case OMX_IndexParamVideoProfileLevelCurrent:
1348     {
1349         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1350         OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Component = NULL;
1351         OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Component = NULL;
1352         EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
1353         OMX_S32                           codecType;
1354
1355         ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1356         if (ret != OMX_ErrorNone) {
1357             goto EXIT;
1358         }
1359
1360         if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1361             ret = OMX_ErrorBadPortIndex;
1362             goto EXIT;
1363         }
1364
1365         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1366         codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
1367         if (codecType == CODEC_TYPE_MPEG4) {
1368             pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstProfileLevel->nPortIndex];
1369             pDstProfileLevel->eProfile = pSrcMpeg4Component->eProfile;
1370             pDstProfileLevel->eLevel = pSrcMpeg4Component->eLevel;
1371         } else {
1372             pSrcH263Component = &pMpeg4Enc->h263Component[pDstProfileLevel->nPortIndex];
1373             pDstProfileLevel->eProfile = pSrcH263Component->eProfile;
1374             pDstProfileLevel->eLevel = pSrcH263Component->eLevel;
1375         }
1376     }
1377         break;
1378     case OMX_IndexParamVideoErrorCorrection:
1379     {
1380         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1381         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
1382         EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
1383
1384         ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1385         if (ret != OMX_ErrorNone) {
1386             goto EXIT;
1387         }
1388
1389         if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
1390             ret = OMX_ErrorBadPortIndex;
1391             goto EXIT;
1392         }
1393
1394         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1395         pSrcErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
1396
1397         pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1398         pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1399         pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1400         pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1401         pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1402     }
1403         break;
1404     default:
1405         ret = Exynos_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1406         break;
1407     }
1408 EXIT:
1409     FunctionOut();
1410
1411     return ret;
1412 }
1413
1414 OMX_ERRORTYPE Exynos_Mpeg4Enc_SetParameter(
1415     OMX_IN OMX_HANDLETYPE hComponent,
1416     OMX_IN OMX_INDEXTYPE  nIndex,
1417     OMX_IN OMX_PTR        pComponentParameterStructure)
1418 {
1419     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1420     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1421     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1422
1423     FunctionIn();
1424
1425     if (hComponent == NULL || pComponentParameterStructure == NULL) {
1426         ret = OMX_ErrorBadParameter;
1427         goto EXIT;
1428     }
1429     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1430     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1431     if (ret != OMX_ErrorNone) {
1432         goto EXIT;
1433     }
1434     if (pOMXComponent->pComponentPrivate == NULL) {
1435         ret = OMX_ErrorBadParameter;
1436         goto EXIT;
1437     }
1438
1439     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1440     if (pExynosComponent->currentState == OMX_StateInvalid ) {
1441         ret = OMX_ErrorInvalidState;
1442         goto EXIT;
1443     }
1444
1445     switch (nIndex) {
1446     case OMX_IndexParamVideoMpeg4:
1447     {
1448         OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = NULL;
1449         OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
1450         EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
1451
1452         ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1453         if (ret != OMX_ErrorNone) {
1454             goto EXIT;
1455         }
1456
1457         if (pSrcMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
1458             ret = OMX_ErrorBadPortIndex;
1459             goto EXIT;
1460         }
1461
1462         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1463         pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcMpeg4Component->nPortIndex];
1464
1465         Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1466     }
1467         break;
1468     case OMX_IndexParamVideoH263:
1469     {
1470         OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = NULL;
1471         OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
1472         EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
1473
1474         ret = Exynos_OMX_Check_SizeVersion(pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1475         if (ret != OMX_ErrorNone) {
1476             goto EXIT;
1477         }
1478
1479         if (pSrcH263Component->nPortIndex >= ALL_PORT_NUM) {
1480             ret = OMX_ErrorBadPortIndex;
1481             goto EXIT;
1482         }
1483
1484         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1485         pDstH263Component = &pMpeg4Enc->h263Component[pSrcH263Component->nPortIndex];
1486
1487         Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1488     }
1489         break;
1490     case OMX_IndexParamStandardComponentRole:
1491     {
1492         OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
1493
1494         ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1495         if (ret != OMX_ErrorNone) {
1496             goto EXIT;
1497         }
1498
1499         if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1500             ret = OMX_ErrorIncorrectStateOperation;
1501             goto EXIT;
1502         }
1503
1504         if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE)) {
1505             pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1506             //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4;
1507         } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE)) {
1508             pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
1509             //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263;
1510         } else {
1511             ret = OMX_ErrorBadParameter;
1512             goto EXIT;
1513         }
1514     }
1515         break;
1516     case OMX_IndexParamVideoProfileLevelCurrent:
1517     {
1518         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1519         OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Component = NULL;
1520         OMX_VIDEO_PARAM_H263TYPE         *pDstH263Component = NULL;
1521         EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
1522         OMX_S32                           codecType;
1523
1524         ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1525         if (ret != OMX_ErrorNone)
1526             goto EXIT;
1527
1528         if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1529             ret = OMX_ErrorBadPortIndex;
1530             goto EXIT;
1531         }
1532
1533         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1534         codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
1535         if (codecType == CODEC_TYPE_MPEG4) {
1536             /*
1537              * To do: Check validity of profile & level parameters
1538              */
1539
1540             pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcProfileLevel->nPortIndex];
1541             pDstMpeg4Component->eProfile = pSrcProfileLevel->eProfile;
1542             pDstMpeg4Component->eLevel = pSrcProfileLevel->eLevel;
1543         } else {
1544             /*
1545              * To do: Check validity of profile & level parameters
1546              */
1547
1548             pDstH263Component = &pMpeg4Enc->h263Component[pSrcProfileLevel->nPortIndex];
1549             pDstH263Component->eProfile = pSrcProfileLevel->eProfile;
1550             pDstH263Component->eLevel = pSrcProfileLevel->eLevel;
1551         }
1552     }
1553         break;
1554     case OMX_IndexParamVideoErrorCorrection:
1555     {
1556         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1557         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1558         EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
1559
1560         ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1561         if (ret != OMX_ErrorNone) {
1562             goto EXIT;
1563         }
1564
1565         if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
1566             ret = OMX_ErrorBadPortIndex;
1567             goto EXIT;
1568         }
1569
1570         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1571         pDstErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
1572
1573         pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1574         pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1575         pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1576         pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1577         pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1578     }
1579         break;
1580     default:
1581         ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1582         break;
1583     }
1584 EXIT:
1585     FunctionOut();
1586
1587     return ret;
1588 }
1589
1590 OMX_ERRORTYPE Exynos_Mpeg4Enc_GetConfig(
1591     OMX_IN OMX_HANDLETYPE hComponent,
1592     OMX_IN OMX_INDEXTYPE  nIndex,
1593     OMX_IN OMX_PTR        pComponentConfigStructure)
1594 {
1595     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1596     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1597     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1598
1599     FunctionIn();
1600
1601     if (hComponent == NULL || pComponentConfigStructure == NULL) {
1602         ret = OMX_ErrorBadParameter;
1603         goto EXIT;
1604     }
1605     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1606     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1607     if (ret != OMX_ErrorNone) {
1608         goto EXIT;
1609     }
1610     if (pOMXComponent->pComponentPrivate == NULL) {
1611         ret = OMX_ErrorBadParameter;
1612         goto EXIT;
1613     }
1614     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1615     if (pExynosComponent->currentState == OMX_StateInvalid) {
1616         ret = OMX_ErrorInvalidState;
1617         goto EXIT;
1618     }
1619
1620     switch (nIndex) {
1621     default:
1622         ret = Exynos_OMX_VideoEncodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1623         break;
1624     }
1625
1626 EXIT:
1627     FunctionOut();
1628
1629     return ret;
1630 }
1631
1632 OMX_ERRORTYPE Exynos_Mpeg4Enc_SetConfig(
1633     OMX_IN OMX_HANDLETYPE hComponent,
1634     OMX_IN OMX_INDEXTYPE  nIndex,
1635     OMX_IN OMX_PTR        pComponentConfigStructure)
1636 {
1637     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
1638     OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
1639     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
1640     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
1641     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
1642
1643     FunctionIn();
1644
1645     if (hComponent == NULL || pComponentConfigStructure == NULL) {
1646         ret = OMX_ErrorBadParameter;
1647         goto EXIT;
1648     }
1649     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1650     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1651     if (ret != OMX_ErrorNone) {
1652         goto EXIT;
1653     }
1654     if (pOMXComponent->pComponentPrivate == NULL) {
1655         ret = OMX_ErrorBadParameter;
1656         goto EXIT;
1657     }
1658     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1659     if (pExynosComponent->currentState == OMX_StateInvalid) {
1660         ret = OMX_ErrorInvalidState;
1661         goto EXIT;
1662     }
1663
1664     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1665     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
1666
1667     switch ((EXYNOS_OMX_INDEXTYPE)nIndex) {
1668     case OMX_IndexConfigVideoIntraPeriod:
1669     {
1670         OMX_U32 nPFrames = (*((OMX_U32 *)pComponentConfigStructure)) - 1;
1671
1672         if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1673             pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
1674         else
1675             pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
1676
1677         ret = OMX_ErrorNone;
1678     }
1679         break;
1680     default:
1681         ret = Exynos_OMX_VideoEncodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1682         break;
1683     }
1684
1685 EXIT:
1686     if (ret == OMX_ErrorNone)
1687         pVideoEnc->configChange = OMX_TRUE;
1688
1689     FunctionOut();
1690
1691     return ret;
1692 }
1693
1694 OMX_ERRORTYPE Exynos_Mpeg4Enc_GetExtensionIndex(
1695     OMX_IN  OMX_HANDLETYPE  hComponent,
1696     OMX_IN  OMX_STRING      cParameterName,
1697     OMX_OUT OMX_INDEXTYPE  *pIndexType)
1698 {
1699     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1700     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1701     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1702
1703     FunctionIn();
1704
1705     if (hComponent == NULL) {
1706         ret = OMX_ErrorBadParameter;
1707         goto EXIT;
1708     }
1709     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1710     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1711     if (ret != OMX_ErrorNone) {
1712         goto EXIT;
1713     }
1714     if (pOMXComponent->pComponentPrivate == NULL) {
1715         ret = OMX_ErrorBadParameter;
1716         goto EXIT;
1717     }
1718     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1719     if ((cParameterName == NULL) || (pIndexType == NULL)) {
1720         ret = OMX_ErrorBadParameter;
1721         goto EXIT;
1722     }
1723     if (pExynosComponent->currentState == OMX_StateInvalid) {
1724         ret = OMX_ErrorInvalidState;
1725         goto EXIT;
1726     }
1727     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) {
1728         *pIndexType = OMX_IndexConfigVideoIntraPeriod;
1729         ret = OMX_ErrorNone;
1730     } else {
1731         ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
1732     }
1733
1734 EXIT:
1735     FunctionOut();
1736
1737     return ret;
1738 }
1739
1740 OMX_ERRORTYPE Exynos_Mpeg4Enc_ComponentRoleEnum(
1741     OMX_IN  OMX_HANDLETYPE hComponent,
1742     OMX_OUT OMX_U8        *cRole,
1743     OMX_IN  OMX_U32        nIndex)
1744 {
1745     OMX_ERRORTYPE               ret              = OMX_ErrorNone;
1746     OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
1747     EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
1748     OMX_S32                     codecType;
1749
1750     FunctionIn();
1751
1752     if ((hComponent == NULL) || (cRole == NULL)) {
1753         ret = OMX_ErrorBadParameter;
1754         goto EXIT;
1755     }
1756     if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) { /* supports only one role */
1757         ret = OMX_ErrorNoMore;
1758         goto EXIT;
1759     }
1760     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1761     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1762     if (ret != OMX_ErrorNone) {
1763         goto EXIT;
1764     }
1765     if (pOMXComponent->pComponentPrivate == NULL) {
1766         ret = OMX_ErrorBadParameter;
1767         goto EXIT;
1768     }
1769
1770     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1771     if (pExynosComponent->currentState == OMX_StateInvalid ) {
1772         ret = OMX_ErrorInvalidState;
1773         goto EXIT;
1774     }
1775
1776     codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1777     if (codecType == CODEC_TYPE_MPEG4)
1778         Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
1779     else
1780         Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
1781
1782 EXIT:
1783     FunctionOut();
1784
1785     return ret;
1786 }
1787
1788 /* MFC Init */
1789 OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
1790 {
1791     OMX_ERRORTYPE             ret = OMX_ErrorNone;
1792     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1793     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1794     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1795     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1796     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;;
1797     OMX_COLOR_FORMATTYPE      eColorFormat;
1798
1799
1800     CSC_METHOD csc_method = CSC_METHOD_SW;
1801
1802     int i = 0;
1803
1804     FunctionIn();
1805
1806     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
1807     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
1808     pVideoEnc->bFirstOutput = OMX_FALSE;
1809     pExynosComponent->bUseFlagEOF = OMX_TRUE;
1810     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1811
1812     eColorFormat = pExynosInputPort->portDefinition.format.video.eColorFormat;
1813     if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
1814 #ifndef TIZEN_FEATURE_E3250 /* we do not use OMX_COLOR_FormatAndroidOpaque */
1815         if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
1816             pExynosInputPort->bufferProcessType = BUFFER_COPY;
1817         } else {
1818             pExynosInputPort->bufferProcessType = BUFFER_SHARE;
1819         }
1820 #endif
1821     } else {
1822         if (eColorFormat == (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd ||
1823             eColorFormat == (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd) {
1824             pExynosInputPort->bufferProcessType = BUFFER_SHARE;
1825         } else {
1826             pExynosInputPort->bufferProcessType = BUFFER_COPY;
1827         }
1828     }
1829
1830     /* Mpeg4/H.263 Codec Open */
1831     ret = Mpeg4CodecOpen(pMpeg4Enc);
1832     if (ret != OMX_ErrorNone) {
1833         goto EXIT;
1834     }
1835
1836     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
1837         Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1838         Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1839
1840         if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
1841             for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1842                 pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
1843                 if (pVideoEnc->pMFCEncInputBuffer[i] == NULL) {
1844                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc input buffer");
1845                     ret = OMX_ErrorInsufficientResources;
1846                     goto EXIT;
1847                 }
1848                 /* Use ION Allocator */
1849                 /*Alloc Y-Buffer */
1850                 pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
1851                 pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
1852                 pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
1853                 /*Alloc C-Buffer */
1854                 pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
1855                 pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
1856                 pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
1857
1858                 pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
1859
1860                 if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
1861                     (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
1862                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1863                     ret = OMX_ErrorInsufficientResources;
1864                     goto EXIT;
1865                 }
1866
1867                 /* MFC input buffers are 1 plane. */
1868                 pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
1869                 pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
1870                 pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
1871
1872                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
1873                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
1874                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
1875
1876                 Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
1877             }
1878         } else {
1879             ret = Mpeg4CodecSrcInit(pOMXComponent);
1880             if (ret != OMX_ErrorNone)
1881                 goto EXIT;
1882         }
1883     } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
1884         /*************/
1885         /*    TBD    */
1886         /*************/
1887         /* Does not require any actions. */
1888     }
1889
1890     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1891         Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
1892         Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1893     } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1894         /*************/
1895         /*    TBD    */
1896         /*************/
1897         /* Does not require any actions. */
1898     }
1899
1900     pMpeg4Enc->bSourceStart = OMX_FALSE;
1901     Exynos_OSAL_SignalCreate(&pMpeg4Enc->hSourceStartEvent);
1902     pMpeg4Enc->bDestinationStart = OMX_FALSE;
1903     Exynos_OSAL_SignalCreate(&pMpeg4Enc->hDestinationStartEvent);
1904
1905     Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
1906     Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
1907     pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp = 0;
1908     pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp = 0;
1909
1910     pExynosComponent->getAllDelayBuffer = OMX_FALSE;
1911
1912 #if 0//defined(USE_CSC_GSCALER)
1913     csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1914 #endif
1915     pVideoEnc->csc_handle = csc_init(csc_method);
1916     if (pVideoEnc->csc_handle == NULL) {
1917         ret = OMX_ErrorInsufficientResources;
1918         goto EXIT;
1919     }
1920     pVideoEnc->csc_set_format = OMX_FALSE;
1921
1922 EXIT:
1923     FunctionOut();
1924
1925     return ret;
1926 }
1927
1928 /* MFC Terminate */
1929 OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
1930 {
1931     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
1932     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1933     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
1934     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1935     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1936     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1937
1938     int i = 0;
1939
1940     FunctionIn();
1941
1942     if (pVideoEnc->csc_handle != NULL) {
1943         csc_deinit(pVideoEnc->csc_handle);
1944         pVideoEnc->csc_handle = NULL;
1945     }
1946
1947     Exynos_OSAL_SignalTerminate(pMpeg4Enc->hDestinationStartEvent);
1948     pMpeg4Enc->hDestinationStartEvent = NULL;
1949     pMpeg4Enc->bDestinationStart = OMX_FALSE;
1950     Exynos_OSAL_SignalTerminate(pMpeg4Enc->hSourceStartEvent);
1951     pMpeg4Enc->hSourceStartEvent = NULL;
1952     pMpeg4Enc->bSourceStart = OMX_FALSE;
1953
1954     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1955         if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
1956             for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1957                 if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
1958 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
1959                     for (int plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1960                         if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL)
1961                             Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
1962                     }
1963 #endif
1964                     Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]);
1965                     pVideoEnc->pMFCEncInputBuffer[i] = NULL;
1966                 }
1967             }
1968         }
1969
1970         Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
1971         Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
1972     } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1973         /*************/
1974         /*    TBD    */
1975         /*************/
1976         /* Does not require any actions. */
1977     }
1978
1979     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
1980         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1981             if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
1982 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
1983                 for (int plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1984                     if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL)
1985                         Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
1986                 }
1987 #endif
1988                 Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]);
1989                 pVideoEnc->pMFCEncInputBuffer[i] = NULL;
1990             }
1991         }
1992
1993         Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
1994         Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
1995     } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
1996         /*************/
1997         /*    TBD    */
1998         /*************/
1999         /* Does not require any actions. */
2000     }
2001     Mpeg4CodecClose(pMpeg4Enc);
2002
2003     FunctionOut();
2004
2005     return ret;
2006 }
2007
2008 OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2009 {
2010     OMX_ERRORTYPE               ret = OMX_ErrorNone;
2011     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2012     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2013     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2014     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2015     EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2016     OMX_U32  oneFrameSize = pSrcInputData->dataLen;
2017     ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
2018     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
2019     ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
2020
2021     FunctionIn();
2022
2023     if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
2024         ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
2025 //        if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)
2026         if (ret != OMX_ErrorNone)
2027             goto EXIT;
2028     }
2029     if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
2030         ret = Mpeg4CodecDstSetup(pOMXComponent);
2031     }
2032
2033     if (pVideoEnc->configChange == OMX_TRUE) {
2034         if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
2035             Change_Mpeg4Enc_Param(pExynosComponent);
2036         else
2037             Change_H263Enc_Param(pExynosComponent);
2038
2039         pVideoEnc->configChange = OMX_FALSE;
2040     }
2041
2042
2043     if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
2044         OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE]  = {0, };
2045         ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
2046         int plane;
2047
2048         pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
2049         pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
2050         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags);
2051         pEncOps->Set_FrameTag(hMFCHandle, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp);
2052         pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp++;
2053         pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
2054
2055         /* queue work for input buffer */
2056         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader);
2057             pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
2058             pMFCYUVDataSize[1] = pMFCYUVDataSize[0]/2;
2059
2060         codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
2061                                     (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
2062 //#ifdef USE_METADATABUFFERTYPE
2063         if ((codecReturn == VIDEO_ERROR_NOBUFFERS) &&
2064             /*(pExynosInputPort->bStoreMetaData == OMX_TRUE) &&*/
2065             (pExynosInputPort->bufferProcessType & BUFFER_SHARE)) {
2066             OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
2067             nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
2068                                 ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
2069             nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
2070             for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
2071                 planes[plane].addr = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[plane];
2072                 planes[plane].allocSize = nAllocLen[plane];
2073                 planes[plane].fd = pSrcInputData->buffer.multiPlaneBuffer.fd[plane];
2074             }
2075
2076             /* Register input buffer */
2077             if (pInbufOps->Register(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
2078                         planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
2079                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
2080                 ret = OMX_ErrorInsufficientResources;
2081                 goto EXIT;
2082             }
2083             codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
2084                                         (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
2085
2086         }
2087 //#endif
2088         if (codecReturn != VIDEO_ERROR_NONE) {
2089             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__);
2090             ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
2091             goto EXIT;
2092         }
2093         Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
2094         if (pMpeg4Enc->bSourceStart == OMX_FALSE) {
2095             pMpeg4Enc->bSourceStart = OMX_TRUE;
2096             Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent);
2097             Exynos_OSAL_SleepMillisec(0);
2098         }
2099         if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
2100             pMpeg4Enc->bDestinationStart = OMX_TRUE;
2101             Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent);
2102             Exynos_OSAL_SleepMillisec(0);
2103         }
2104     }
2105
2106     ret = OMX_ErrorNone;
2107
2108 EXIT:
2109     FunctionOut();
2110
2111     return ret;
2112 }
2113
2114 OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2115 {
2116     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
2117     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2118     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2119     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2120     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2121     EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2122     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
2123     ExynosVideoBuffer       *pVideoBuffer;
2124
2125     FunctionIn();
2126
2127     pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
2128
2129     pSrcOutputData->dataLen       = 0;
2130     pSrcOutputData->usedDataLen   = 0;
2131     pSrcOutputData->remainDataLen = 0;
2132     pSrcOutputData->nFlags    = 0;
2133     pSrcOutputData->timeStamp = 0;
2134
2135     if (pVideoBuffer == NULL) {
2136         pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
2137         pSrcOutputData->allocSize  = 0;
2138         pSrcOutputData->pPrivate = NULL;
2139         pSrcOutputData->bufferHeader = NULL;
2140     } else {
2141         int plane = 0;
2142         for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
2143             pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
2144             pSrcOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
2145         }
2146         pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize +
2147                                         pVideoBuffer->planes[1].allocSize +
2148                                         pVideoBuffer->planes[2].allocSize;
2149
2150         if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2151             int i = 0;
2152             while (pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] != pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]) {
2153                 i++;
2154                 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
2155                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - Lost buffer", __FUNCTION__, __LINE__);
2156                     ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
2157                     goto EXIT;
2158                 }
2159             }
2160             pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
2161             pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
2162         }
2163
2164         /* For Share Buffer */
2165         pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
2166     }
2167
2168     ret = OMX_ErrorNone;
2169
2170 EXIT:
2171     FunctionOut();
2172
2173     return ret;
2174 }
2175
2176 OMX_ERRORTYPE Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2177 {
2178     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
2179     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2180     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2181     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2182     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
2183     OMX_U32 dataLen = 0;
2184     ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
2185
2186     FunctionIn();
2187
2188     if (pDstInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) {
2189         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
2190         ret = OMX_ErrorBadParameter;
2191         goto EXIT;
2192     }
2193
2194     codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
2195                      (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
2196
2197     if (codecReturn != VIDEO_ERROR_NONE) {
2198         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__, __LINE__);
2199         ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
2200         goto EXIT;
2201     }
2202     Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
2203
2204     ret = OMX_ErrorNone;
2205
2206 EXIT:
2207     FunctionOut();
2208
2209     return ret;
2210 }
2211
2212 OMX_ERRORTYPE Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2213 {
2214     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
2215     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2216     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2217     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
2218     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2219     ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
2220     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
2221     ExynosVideoBuffer       *pVideoBuffer;
2222     ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
2223     OMX_S32 indexTimestamp = 0;
2224
2225     FunctionIn();
2226
2227     if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
2228         ret = OMX_ErrorNone;
2229         goto EXIT;
2230     }
2231
2232     if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
2233         ret = OMX_ErrorNone;
2234         goto EXIT;
2235     }
2236
2237     pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp++;
2238     pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
2239
2240     pDstOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
2241     pDstOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
2242     pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize;
2243     pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize;
2244     pDstOutputData->remainDataLen = pVideoBuffer->planes[0].dataSize;
2245     pDstOutputData->usedDataLen = 0;
2246     pDstOutputData->pPrivate = pVideoBuffer;
2247     /* For Share Buffer */
2248     pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
2249
2250     if (pVideoEnc->bFirstOutput == OMX_FALSE) {
2251
2252         pDstOutputData->timeStamp = 0;
2253         pDstOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
2254         pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
2255         pVideoEnc->bFirstOutput = OMX_TRUE;
2256     } else {
2257         indexTimestamp = pEncOps->Get_FrameTag(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
2258         if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
2259             pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp];
2260             pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp];
2261         } else {
2262             pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
2263             pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
2264         }
2265
2266         pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
2267         if (pVideoBuffer->frameType == VIDEO_FRAME_I)
2268             pDstOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
2269     }
2270
2271     if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
2272         ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
2273         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%x displayStatus:%d, nFlags0x%x", pExynosComponent, displayStatus, pDstOutputData->nFlags);
2274         pDstOutputData->remainDataLen = 0;
2275     }
2276
2277     ret = OMX_ErrorNone;
2278
2279 EXIT:
2280     FunctionOut();
2281
2282     return ret;
2283 }
2284
2285 OMX_ERRORTYPE Exynos_Mpeg4Enc_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2286 {
2287     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2288     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2289     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2290
2291     FunctionIn();
2292
2293     if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2294         ret = OMX_ErrorNone;
2295         goto EXIT;
2296     }
2297     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2298         ret = OMX_ErrorNone;
2299         goto EXIT;
2300     }
2301
2302     ret = Exynos_Mpeg4Enc_SrcIn(pOMXComponent, pSrcInputData);
2303     if (ret != OMX_ErrorNone) {
2304         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__, __LINE__);
2305         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2306                                                 pExynosComponent->callbackData,
2307                                                 OMX_EventError, ret, 0, NULL);
2308     }
2309
2310 EXIT:
2311     FunctionOut();
2312
2313     return ret;
2314 }
2315
2316 OMX_ERRORTYPE Exynos_Mpeg4Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2317 {
2318     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2319     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2320     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2321     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2322
2323     FunctionIn();
2324
2325     if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2326         ret = OMX_ErrorNone;
2327         goto EXIT;
2328     }
2329
2330     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2331         if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2332             ret = OMX_ErrorNone;
2333             goto EXIT;
2334         }
2335     }
2336     if ((pMpeg4Enc->bSourceStart == OMX_FALSE) &&
2337        (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
2338         Exynos_OSAL_SignalWait(pMpeg4Enc->hSourceStartEvent, DEF_MAX_WAIT_TIME);
2339         Exynos_OSAL_SignalReset(pMpeg4Enc->hSourceStartEvent);
2340     }
2341
2342     ret = Exynos_Mpeg4Enc_SrcOut(pOMXComponent, pSrcOutputData);
2343     if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
2344         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__, __LINE__);
2345         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2346                                                 pExynosComponent->callbackData,
2347                                                 OMX_EventError, ret, 0, NULL);
2348     }
2349
2350 EXIT:
2351     FunctionOut();
2352
2353     return ret;
2354 }
2355
2356 OMX_ERRORTYPE Exynos_Mpeg4Enc_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2357 {
2358     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2359     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2360     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2361     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2362
2363     FunctionIn();
2364
2365     if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2366         ret = OMX_ErrorNone;
2367         goto EXIT;
2368     }
2369     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2370         ret = OMX_ErrorNone;
2371         goto EXIT;
2372     }
2373     if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
2374         if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) &&
2375            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2376             Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2377             Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent);
2378         }
2379     }
2380     if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
2381         ret = Exynos_Mpeg4Enc_DstIn(pOMXComponent, pDstInputData);
2382         if (ret != OMX_ErrorNone) {
2383             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__, __LINE__);
2384             pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2385                                                 pExynosComponent->callbackData,
2386                                                 OMX_EventError, ret, 0, NULL);
2387         }
2388     }
2389
2390 EXIT:
2391     FunctionOut();
2392
2393     return ret;
2394 }
2395
2396 OMX_ERRORTYPE Exynos_Mpeg4Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2397 {
2398     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2399     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2400     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2401     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2402
2403     FunctionIn();
2404
2405     if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2406         ret = OMX_ErrorNone;
2407         goto EXIT;
2408     }
2409     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2410         ret = OMX_ErrorNone;
2411         goto EXIT;
2412     }
2413
2414     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
2415         if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) &&
2416            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2417             Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2418             Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent);
2419         }
2420     }
2421     ret = Exynos_Mpeg4Enc_DstOut(pOMXComponent, pDstOutputData);
2422     if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
2423         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__, __LINE__);
2424         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2425                                                 pExynosComponent->callbackData,
2426                                                 OMX_EventError, ret, 0, NULL);
2427     }
2428
2429 EXIT:
2430     FunctionOut();
2431
2432     return ret;
2433 }
2434
2435 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
2436     OMX_HANDLETYPE hComponent,
2437     OMX_STRING     componentName)
2438 {
2439     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
2440     OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
2441     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
2442     EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
2443     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
2444     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
2445     OMX_S32                        codecType        = -1;
2446     int i = 0;
2447
2448     FunctionIn();
2449
2450     if ((hComponent == NULL) || (componentName == NULL)) {
2451         ret = OMX_ErrorBadParameter;
2452         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
2453         goto EXIT;
2454     }
2455     if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC, componentName) == 0) {
2456         codecType = CODEC_TYPE_MPEG4;
2457     } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC, componentName) == 0) {
2458         codecType = CODEC_TYPE_H263;
2459     } else {
2460         ret = OMX_ErrorBadParameter;
2461         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
2462         goto EXIT;
2463     }
2464
2465     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2466     ret = Exynos_OMX_VideoEncodeComponentInit(pOMXComponent);
2467     if (ret != OMX_ErrorNone) {
2468         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
2469         goto EXIT;
2470     }
2471     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2472     pExynosComponent->codecType = HW_VIDEO_ENC_CODEC;
2473
2474     pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
2475     if (pExynosComponent->componentName == NULL) {
2476         Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2477         ret = OMX_ErrorInsufficientResources;
2478         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
2479         goto EXIT;
2480     }
2481     Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
2482
2483     pMpeg4Enc = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE));
2484     if (pMpeg4Enc == NULL) {
2485         Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2486         ret = OMX_ErrorInsufficientResources;
2487         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
2488         goto EXIT;
2489     }
2490     Exynos_OSAL_Memset(pMpeg4Enc, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE));
2491     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2492     pVideoEnc->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Enc;
2493     pMpeg4Enc->hMFCMpeg4Handle.codecType = codecType;
2494
2495     if (codecType == CODEC_TYPE_MPEG4)
2496         Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_ENC);
2497     else
2498         Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_ENC);
2499
2500
2501     /* In case of BUFFER_COPY mode
2502             bShareableBuf = TRUE means MemoryType is V4L2_MEMORY_USERPTR
2503             bShareableBuf = FALSE means MemoryType is V4L2_MEMORY_MMAP
2504          In case of BUFFER_SHARE
2505             bShareableBuf should be TRUE, FALSE is ignored
2506     */
2507     pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf = OMX_FALSE; //Check bStoreMetaData in Init function
2508
2509     /* Set componentVersion */
2510     pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2511     pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2512     pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
2513     pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
2514     /* Set specVersion */
2515     pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2516     pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2517     pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
2518     pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
2519
2520     /* Input port */
2521     pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2522     pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2523     pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2524     pExynosPort->portDefinition.format.video.nBitrate = 64000;
2525     pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
2526     pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
2527     pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2528     pExynosPort->portDefinition.format.video.pNativeRender = 0;
2529     pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2530     Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2531     Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
2532 #ifdef TIZEN_FEATURE_E3250
2533     pExynosPort->portDefinition.format.video.eColorFormat = OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd;
2534 #else
2535     pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2536 #endif
2537     pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2538     pExynosPort->bufferProcessType = BUFFER_COPY;
2539     pExynosPort->portWayType = WAY2_PORT;
2540
2541     /* Output port */
2542     pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2543     pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2544     pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2545     pExynosPort->portDefinition.format.video.nBitrate = 64000;
2546     pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
2547     pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
2548     if (codecType == CODEC_TYPE_MPEG4) {
2549         pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
2550         Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2551         Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
2552     } else {
2553         pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
2554         Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2555         Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
2556     }
2557     pExynosPort->portDefinition.format.video.pNativeRender = 0;
2558     pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2559     pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
2560     pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2561     pExynosPort->bufferProcessType = BUFFER_COPY;
2562     pExynosPort->portWayType = WAY2_PORT;
2563
2564     if (codecType == CODEC_TYPE_MPEG4) {
2565         for(i = 0; i < ALL_PORT_NUM; i++) {
2566             INIT_SET_SIZE_VERSION(&pMpeg4Enc->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
2567             pMpeg4Enc->mpeg4Component[i].nPortIndex = i;
2568             pMpeg4Enc->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
2569             pMpeg4Enc->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level4;
2570
2571             pMpeg4Enc->mpeg4Component[i].nPFrames = 10;
2572             pMpeg4Enc->mpeg4Component[i].nBFrames = 0;          /* No support for B frames */
2573             pMpeg4Enc->mpeg4Component[i].nMaxPacketSize = 256;  /* Default value */
2574             pMpeg4Enc->mpeg4Component[i].nAllowedPictureTypes =  OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
2575             pMpeg4Enc->mpeg4Component[i].bGov = OMX_FALSE;
2576
2577         }
2578     } else {
2579         for(i = 0; i < ALL_PORT_NUM; i++) {
2580             INIT_SET_SIZE_VERSION(&pMpeg4Enc->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
2581             pMpeg4Enc->h263Component[i].nPortIndex = i;
2582             pMpeg4Enc->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline;
2583             pMpeg4Enc->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
2584
2585             pMpeg4Enc->h263Component[i].nPFrames = 20;
2586             pMpeg4Enc->h263Component[i].nBFrames = 0;          /* No support for B frames */
2587             pMpeg4Enc->h263Component[i].bPLUSPTYPEAllowed = OMX_FALSE;
2588             pMpeg4Enc->h263Component[i].nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
2589             pMpeg4Enc->h263Component[i].bForceRoundingTypeToZero = OMX_TRUE;
2590             pMpeg4Enc->h263Component[i].nPictureHeaderRepetition = 0;
2591             pMpeg4Enc->h263Component[i].nGOBHeaderInterval = 0;
2592         }
2593     }
2594
2595     pOMXComponent->GetParameter      = &Exynos_Mpeg4Enc_GetParameter;
2596     pOMXComponent->SetParameter      = &Exynos_Mpeg4Enc_SetParameter;
2597     pOMXComponent->GetConfig         = &Exynos_Mpeg4Enc_GetConfig;
2598     pOMXComponent->SetConfig         = &Exynos_Mpeg4Enc_SetConfig;
2599     pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Enc_GetExtensionIndex;
2600     pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Enc_ComponentRoleEnum;
2601     pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
2602
2603     pExynosComponent->exynos_codec_componentInit      = &Exynos_Mpeg4Enc_Init;
2604     pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Enc_Terminate;
2605
2606     pVideoEnc->exynos_codec_srcInputProcess  = &Exynos_Mpeg4Enc_srcInputBufferProcess;
2607     pVideoEnc->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Enc_srcOutputBufferProcess;
2608     pVideoEnc->exynos_codec_dstInputProcess  = &Exynos_Mpeg4Enc_dstInputBufferProcess;
2609     pVideoEnc->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Enc_dstOutputBufferProcess;
2610
2611     pVideoEnc->exynos_codec_start         = &Mpeg4CodecStart;
2612     pVideoEnc->exynos_codec_stop          = &Mpeg4CodecStop;
2613     pVideoEnc->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
2614     pVideoEnc->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnqueueAllBuffer;
2615
2616     pVideoEnc->exynos_checkInputFrame        = NULL;
2617     pVideoEnc->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
2618     pVideoEnc->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
2619
2620 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2621     pVideoEnc->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2622     if (pVideoEnc->hSharedMemory == NULL) {
2623         Exynos_OSAL_Free(pMpeg4Enc);
2624         pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2625         Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2626         ret = OMX_ErrorInsufficientResources;
2627         goto EXIT;
2628     }
2629 #endif
2630     pExynosComponent->currentState = OMX_StateLoaded;
2631
2632     ret = OMX_ErrorNone;
2633
2634 EXIT:
2635     FunctionOut();
2636
2637     return ret;
2638 }
2639
2640 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
2641 {
2642     OMX_ERRORTYPE               ret              = OMX_ErrorNone;
2643     OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
2644     EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
2645     EXYNOS_MPEG4ENC_HANDLE     *pMpeg4Enc        = NULL;
2646
2647 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2648     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
2649     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2650 #endif
2651     FunctionIn();
2652
2653     if (hComponent == NULL) {
2654         ret = OMX_ErrorBadParameter;
2655         goto EXIT;
2656     }
2657     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2658     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2659 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2660     Exynos_OSAL_SharedMemory_Close(pVideoEnc->hSharedMemory);
2661 #endif
2662     Exynos_OSAL_Free(pExynosComponent->componentName);
2663     pExynosComponent->componentName = NULL;
2664
2665     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2666     if (pMpeg4Enc != NULL) {
2667         Exynos_OSAL_Free(pMpeg4Enc);
2668         pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2669     }
2670
2671     ret = Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2672     if (ret != OMX_ErrorNone) {
2673         goto EXIT;
2674     }
2675
2676     ret = OMX_ErrorNone;
2677
2678 EXIT:
2679     FunctionOut();
2680
2681     return ret;
2682 }