fixed svace issue
[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 ((EXYNOS_OMX_COLOR_FORMATTYPE)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 ((EXYNOS_OMX_COLOR_FORMATTYPE)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 (pOutbufOps->Get_Buffer) {
1161                      if (pOutbufOps->Get_Buffer(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, i, &pBuffer) != VIDEO_ERROR_NONE) {
1162                          Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get Output buffer info");
1163                          ret = OMX_ErrorInsufficientResources;
1164                          goto EXIT;
1165                      }
1166                 }
1167
1168                 for (nPlanes = 0; nPlanes < MFC_OUTPUT_BUFFER_PLANE; nPlanes++) {
1169                     pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[nPlanes] = (void *)pBuffer->planes[nPlanes].addr;
1170                     pVideoEnc->pMFCEncOutputBuffer[i]->fd[nPlanes] = pBuffer->planes[nPlanes].fd;
1171                     pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[nPlanes] = pBuffer->planes[nPlanes].allocSize;
1172                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncOutputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[nPlanes]);
1173                 }
1174
1175                 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr,
1176                                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1177             }
1178         }
1179
1180         /* start header encoding */
1181         if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
1182             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
1183             ret = OMX_ErrorInsufficientResources;
1184             goto EXIT;
1185         }
1186     } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1187         /* Register input buffer */
1188         /*************/
1189         /*    TBD    */
1190         /*************/
1191         ExynosVideoPlane plane;
1192         for (i = 0; i < pExynosOutputPort->portDefinition.nBufferCountActual; i++) {
1193             plane.addr = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
1194             plane.fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[0];
1195             plane.allocSize = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
1196             if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
1197                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
1198                 ret = OMX_ErrorInsufficientResources;
1199                 goto EXIT;
1200             }
1201         }
1202     }
1203
1204    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
1205
1206     ret = OMX_ErrorNone;
1207
1208 EXIT:
1209     FunctionOut();
1210
1211     return ret;
1212 }
1213
1214 OMX_ERRORTYPE Exynos_Mpeg4Enc_GetParameter(
1215     OMX_IN    OMX_HANDLETYPE hComponent,
1216     OMX_IN    OMX_INDEXTYPE  nParamIndex,
1217     OMX_INOUT OMX_PTR        pComponentParameterStructure)
1218 {
1219     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1220     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1221     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1222
1223     FunctionIn();
1224
1225     if (hComponent == NULL || pComponentParameterStructure == NULL) {
1226         ret = OMX_ErrorBadParameter;
1227         goto EXIT;
1228     }
1229     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1230     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1231     if (ret != OMX_ErrorNone) {
1232         goto EXIT;
1233     }
1234     if (pOMXComponent->pComponentPrivate == NULL) {
1235         ret = OMX_ErrorBadParameter;
1236         goto EXIT;
1237     }
1238
1239     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1240     if (pExynosComponent->currentState == OMX_StateInvalid ) {
1241         ret = OMX_ErrorInvalidState;
1242         goto EXIT;
1243     }
1244
1245     switch (nParamIndex) {
1246     case OMX_IndexParamVideoMpeg4:
1247     {
1248         OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
1249         OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = NULL;
1250         EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
1251
1252         ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1253         if (ret != OMX_ErrorNone) {
1254             goto EXIT;
1255         }
1256
1257         if (pDstMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
1258             ret = OMX_ErrorBadPortIndex;
1259             goto EXIT;
1260         }
1261
1262         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1263         pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstMpeg4Component->nPortIndex];
1264
1265         Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1266     }
1267         break;
1268     case OMX_IndexParamVideoH263:
1269     {
1270         OMX_VIDEO_PARAM_H263TYPE  *pDstH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
1271         OMX_VIDEO_PARAM_H263TYPE  *pSrcH263Component = NULL;
1272         EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
1273
1274         ret = Exynos_OMX_Check_SizeVersion(pDstH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1275         if (ret != OMX_ErrorNone) {
1276             goto EXIT;
1277         }
1278
1279         if (pDstH263Component->nPortIndex >= ALL_PORT_NUM) {
1280             ret = OMX_ErrorBadPortIndex;
1281             goto EXIT;
1282         }
1283
1284         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1285         pSrcH263Component = &pMpeg4Enc->h263Component[pDstH263Component->nPortIndex];
1286
1287         Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1288     }
1289         break;
1290     case OMX_IndexParamStandardComponentRole:
1291     {
1292         OMX_S32 codecType;
1293         OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
1294         ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1295         if (ret != OMX_ErrorNone) {
1296             goto EXIT;
1297         }
1298
1299         codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1300         if (codecType == CODEC_TYPE_MPEG4)
1301             Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
1302         else
1303             Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
1304     }
1305         break;
1306     case OMX_IndexParamVideoProfileLevelQuerySupported:
1307     {
1308         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1309         EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel = NULL;
1310         OMX_U32                           maxProfileLevelNum = 0;
1311         OMX_S32                           codecType;
1312
1313         ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1314         if (ret != OMX_ErrorNone) {
1315             goto EXIT;
1316         }
1317
1318         if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1319             ret = OMX_ErrorBadPortIndex;
1320             goto EXIT;
1321         }
1322
1323         codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1324         if (codecType == CODEC_TYPE_MPEG4) {
1325             pProfileLevel = supportedMPEG4ProfileLevels;
1326             maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
1327         } else {
1328             pProfileLevel = supportedH263ProfileLevels;
1329             maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
1330         }
1331
1332         if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
1333             ret = OMX_ErrorNoMore;
1334             goto EXIT;
1335         }
1336
1337         pProfileLevel += pDstProfileLevel->nProfileIndex;
1338         pDstProfileLevel->eProfile = pProfileLevel->profile;
1339         pDstProfileLevel->eLevel = pProfileLevel->level;
1340     }
1341         break;
1342     case OMX_IndexParamVideoProfileLevelCurrent:
1343     {
1344         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1345         OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Component = NULL;
1346         OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Component = NULL;
1347         EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
1348         OMX_S32                           codecType;
1349
1350         ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1351         if (ret != OMX_ErrorNone) {
1352             goto EXIT;
1353         }
1354
1355         if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1356             ret = OMX_ErrorBadPortIndex;
1357             goto EXIT;
1358         }
1359
1360         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1361         codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
1362         if (codecType == CODEC_TYPE_MPEG4) {
1363             pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstProfileLevel->nPortIndex];
1364             pDstProfileLevel->eProfile = pSrcMpeg4Component->eProfile;
1365             pDstProfileLevel->eLevel = pSrcMpeg4Component->eLevel;
1366         } else {
1367             pSrcH263Component = &pMpeg4Enc->h263Component[pDstProfileLevel->nPortIndex];
1368             pDstProfileLevel->eProfile = pSrcH263Component->eProfile;
1369             pDstProfileLevel->eLevel = pSrcH263Component->eLevel;
1370         }
1371     }
1372         break;
1373     case OMX_IndexParamVideoErrorCorrection:
1374     {
1375         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1376         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
1377         EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
1378
1379         ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1380         if (ret != OMX_ErrorNone) {
1381             goto EXIT;
1382         }
1383
1384         if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
1385             ret = OMX_ErrorBadPortIndex;
1386             goto EXIT;
1387         }
1388
1389         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1390         pSrcErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
1391
1392         pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1393         pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1394         pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1395         pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1396         pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1397     }
1398         break;
1399     default:
1400         ret = Exynos_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1401         break;
1402     }
1403 EXIT:
1404     FunctionOut();
1405
1406     return ret;
1407 }
1408
1409 OMX_ERRORTYPE Exynos_Mpeg4Enc_SetParameter(
1410     OMX_IN OMX_HANDLETYPE hComponent,
1411     OMX_IN OMX_INDEXTYPE  nIndex,
1412     OMX_IN OMX_PTR        pComponentParameterStructure)
1413 {
1414     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1415     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1416     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1417
1418     FunctionIn();
1419
1420     if (hComponent == NULL || pComponentParameterStructure == NULL) {
1421         ret = OMX_ErrorBadParameter;
1422         goto EXIT;
1423     }
1424     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1425     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1426     if (ret != OMX_ErrorNone) {
1427         goto EXIT;
1428     }
1429     if (pOMXComponent->pComponentPrivate == NULL) {
1430         ret = OMX_ErrorBadParameter;
1431         goto EXIT;
1432     }
1433
1434     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1435     if (pExynosComponent->currentState == OMX_StateInvalid ) {
1436         ret = OMX_ErrorInvalidState;
1437         goto EXIT;
1438     }
1439
1440     switch (nIndex) {
1441     case OMX_IndexParamVideoMpeg4:
1442     {
1443         OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = NULL;
1444         OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
1445         EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
1446
1447         ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1448         if (ret != OMX_ErrorNone) {
1449             goto EXIT;
1450         }
1451
1452         if (pSrcMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
1453             ret = OMX_ErrorBadPortIndex;
1454             goto EXIT;
1455         }
1456
1457         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1458         pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcMpeg4Component->nPortIndex];
1459
1460         Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1461     }
1462         break;
1463     case OMX_IndexParamVideoH263:
1464     {
1465         OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = NULL;
1466         OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
1467         EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
1468
1469         ret = Exynos_OMX_Check_SizeVersion(pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1470         if (ret != OMX_ErrorNone) {
1471             goto EXIT;
1472         }
1473
1474         if (pSrcH263Component->nPortIndex >= ALL_PORT_NUM) {
1475             ret = OMX_ErrorBadPortIndex;
1476             goto EXIT;
1477         }
1478
1479         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1480         pDstH263Component = &pMpeg4Enc->h263Component[pSrcH263Component->nPortIndex];
1481
1482         Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1483     }
1484         break;
1485     case OMX_IndexParamStandardComponentRole:
1486     {
1487         OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
1488
1489         ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1490         if (ret != OMX_ErrorNone) {
1491             goto EXIT;
1492         }
1493
1494         if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1495             ret = OMX_ErrorIncorrectStateOperation;
1496             goto EXIT;
1497         }
1498
1499         if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE)) {
1500             pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1501             //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4;
1502         } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE)) {
1503             pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
1504             //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263;
1505         } else {
1506             ret = OMX_ErrorBadParameter;
1507             goto EXIT;
1508         }
1509     }
1510         break;
1511     case OMX_IndexParamVideoProfileLevelCurrent:
1512     {
1513         OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1514         OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Component = NULL;
1515         OMX_VIDEO_PARAM_H263TYPE         *pDstH263Component = NULL;
1516         EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
1517         OMX_S32                           codecType;
1518
1519         ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1520         if (ret != OMX_ErrorNone)
1521             goto EXIT;
1522
1523         if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1524             ret = OMX_ErrorBadPortIndex;
1525             goto EXIT;
1526         }
1527
1528         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1529         codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
1530         if (codecType == CODEC_TYPE_MPEG4) {
1531             /*
1532              * To do: Check validity of profile & level parameters
1533              */
1534
1535             pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcProfileLevel->nPortIndex];
1536             pDstMpeg4Component->eProfile = pSrcProfileLevel->eProfile;
1537             pDstMpeg4Component->eLevel = pSrcProfileLevel->eLevel;
1538         } else {
1539             /*
1540              * To do: Check validity of profile & level parameters
1541              */
1542
1543             pDstH263Component = &pMpeg4Enc->h263Component[pSrcProfileLevel->nPortIndex];
1544             pDstH263Component->eProfile = pSrcProfileLevel->eProfile;
1545             pDstH263Component->eLevel = pSrcProfileLevel->eLevel;
1546         }
1547     }
1548         break;
1549     case OMX_IndexParamVideoErrorCorrection:
1550     {
1551         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1552         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1553         EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
1554
1555         ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1556         if (ret != OMX_ErrorNone) {
1557             goto EXIT;
1558         }
1559
1560         if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
1561             ret = OMX_ErrorBadPortIndex;
1562             goto EXIT;
1563         }
1564
1565         pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1566         pDstErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
1567
1568         pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1569         pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1570         pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1571         pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1572         pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1573     }
1574         break;
1575     default:
1576         ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1577         break;
1578     }
1579 EXIT:
1580     FunctionOut();
1581
1582     return ret;
1583 }
1584
1585 OMX_ERRORTYPE Exynos_Mpeg4Enc_GetConfig(
1586     OMX_IN OMX_HANDLETYPE hComponent,
1587     OMX_IN OMX_INDEXTYPE  nIndex,
1588     OMX_IN OMX_PTR        pComponentConfigStructure)
1589 {
1590     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1591     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1592     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1593
1594     FunctionIn();
1595
1596     if (hComponent == NULL || pComponentConfigStructure == NULL) {
1597         ret = OMX_ErrorBadParameter;
1598         goto EXIT;
1599     }
1600     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1601     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1602     if (ret != OMX_ErrorNone) {
1603         goto EXIT;
1604     }
1605     if (pOMXComponent->pComponentPrivate == NULL) {
1606         ret = OMX_ErrorBadParameter;
1607         goto EXIT;
1608     }
1609     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1610     if (pExynosComponent->currentState == OMX_StateInvalid) {
1611         ret = OMX_ErrorInvalidState;
1612         goto EXIT;
1613     }
1614
1615     switch (nIndex) {
1616     default:
1617         ret = Exynos_OMX_VideoEncodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1618         break;
1619     }
1620
1621 EXIT:
1622     FunctionOut();
1623
1624     return ret;
1625 }
1626
1627 OMX_ERRORTYPE Exynos_Mpeg4Enc_SetConfig(
1628     OMX_IN OMX_HANDLETYPE hComponent,
1629     OMX_IN OMX_INDEXTYPE  nIndex,
1630     OMX_IN OMX_PTR        pComponentConfigStructure)
1631 {
1632     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
1633     OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
1634     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
1635     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
1636     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
1637
1638     FunctionIn();
1639
1640     if (hComponent == NULL || pComponentConfigStructure == NULL) {
1641         ret = OMX_ErrorBadParameter;
1642         goto EXIT;
1643     }
1644     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1645     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1646     if (ret != OMX_ErrorNone) {
1647         goto EXIT;
1648     }
1649     if (pOMXComponent->pComponentPrivate == NULL) {
1650         ret = OMX_ErrorBadParameter;
1651         goto EXIT;
1652     }
1653     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1654     if (pExynosComponent->currentState == OMX_StateInvalid) {
1655         ret = OMX_ErrorInvalidState;
1656         goto EXIT;
1657     }
1658
1659     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1660     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
1661
1662     switch ((EXYNOS_OMX_INDEXTYPE)nIndex) {
1663     case OMX_IndexConfigVideoIntraPeriod:
1664     {
1665         OMX_U32 nPFrames = (*((OMX_U32 *)pComponentConfigStructure)) - 1;
1666
1667         if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
1668             pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
1669         else
1670             pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
1671
1672         ret = OMX_ErrorNone;
1673     }
1674         break;
1675     default:
1676         ret = Exynos_OMX_VideoEncodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1677         break;
1678     }
1679
1680 EXIT:
1681     if (ret == OMX_ErrorNone)
1682         pVideoEnc->configChange = OMX_TRUE;
1683
1684     FunctionOut();
1685
1686     return ret;
1687 }
1688
1689 OMX_ERRORTYPE Exynos_Mpeg4Enc_GetExtensionIndex(
1690     OMX_IN  OMX_HANDLETYPE  hComponent,
1691     OMX_IN  OMX_STRING      cParameterName,
1692     OMX_OUT OMX_INDEXTYPE  *pIndexType)
1693 {
1694     OMX_ERRORTYPE             ret              = OMX_ErrorNone;
1695     OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
1696     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1697
1698     FunctionIn();
1699
1700     if (hComponent == NULL) {
1701         ret = OMX_ErrorBadParameter;
1702         goto EXIT;
1703     }
1704     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1705     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1706     if (ret != OMX_ErrorNone) {
1707         goto EXIT;
1708     }
1709     if (pOMXComponent->pComponentPrivate == NULL) {
1710         ret = OMX_ErrorBadParameter;
1711         goto EXIT;
1712     }
1713     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1714     if ((cParameterName == NULL) || (pIndexType == NULL)) {
1715         ret = OMX_ErrorBadParameter;
1716         goto EXIT;
1717     }
1718     if (pExynosComponent->currentState == OMX_StateInvalid) {
1719         ret = OMX_ErrorInvalidState;
1720         goto EXIT;
1721     }
1722     if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) {
1723         *pIndexType = OMX_IndexConfigVideoIntraPeriod;
1724         ret = OMX_ErrorNone;
1725     } else {
1726         ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
1727     }
1728
1729 EXIT:
1730     FunctionOut();
1731
1732     return ret;
1733 }
1734
1735 OMX_ERRORTYPE Exynos_Mpeg4Enc_ComponentRoleEnum(
1736     OMX_IN  OMX_HANDLETYPE hComponent,
1737     OMX_OUT OMX_U8        *cRole,
1738     OMX_IN  OMX_U32        nIndex)
1739 {
1740     OMX_ERRORTYPE               ret              = OMX_ErrorNone;
1741     OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
1742     EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
1743     OMX_S32                     codecType;
1744
1745     FunctionIn();
1746
1747     if ((hComponent == NULL) || (cRole == NULL)) {
1748         ret = OMX_ErrorBadParameter;
1749         goto EXIT;
1750     }
1751     if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) { /* supports only one role */
1752         ret = OMX_ErrorNoMore;
1753         goto EXIT;
1754     }
1755     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1756     ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1757     if (ret != OMX_ErrorNone) {
1758         goto EXIT;
1759     }
1760     if (pOMXComponent->pComponentPrivate == NULL) {
1761         ret = OMX_ErrorBadParameter;
1762         goto EXIT;
1763     }
1764
1765     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1766     if (pExynosComponent->currentState == OMX_StateInvalid ) {
1767         ret = OMX_ErrorInvalidState;
1768         goto EXIT;
1769     }
1770
1771     codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1772     if (codecType == CODEC_TYPE_MPEG4)
1773         Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
1774     else
1775         Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
1776
1777 EXIT:
1778     FunctionOut();
1779
1780     return ret;
1781 }
1782
1783 /* MFC Init */
1784 OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
1785 {
1786     OMX_ERRORTYPE             ret = OMX_ErrorNone;
1787     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1788     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1789     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1790     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1791     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;;
1792     OMX_COLOR_FORMATTYPE      eColorFormat;
1793
1794
1795     CSC_METHOD csc_method = CSC_METHOD_SW;
1796
1797     int i = 0;
1798
1799     FunctionIn();
1800
1801     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
1802     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
1803     pVideoEnc->bFirstOutput = OMX_FALSE;
1804     pExynosComponent->bUseFlagEOF = OMX_TRUE;
1805     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1806
1807     eColorFormat = pExynosInputPort->portDefinition.format.video.eColorFormat;
1808     if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
1809 #ifndef TIZEN_FEATURE_E3250 /* we do not use OMX_COLOR_FormatAndroidOpaque */
1810         if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
1811             pExynosInputPort->bufferProcessType = BUFFER_COPY;
1812         } else {
1813             pExynosInputPort->bufferProcessType = BUFFER_SHARE;
1814         }
1815 #endif
1816     } else {
1817         if (eColorFormat == (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd ||
1818             eColorFormat == (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd) {
1819             pExynosInputPort->bufferProcessType = BUFFER_SHARE;
1820         } else {
1821             pExynosInputPort->bufferProcessType = BUFFER_COPY;
1822         }
1823     }
1824
1825     /* Mpeg4/H.263 Codec Open */
1826     ret = Mpeg4CodecOpen(pMpeg4Enc);
1827     if (ret != OMX_ErrorNone) {
1828         goto EXIT;
1829     }
1830
1831     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
1832         Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1833         Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1834
1835         if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
1836             for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1837                 pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
1838                 if (pVideoEnc->pMFCEncInputBuffer[i] == NULL) {
1839                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc input buffer");
1840                     ret = OMX_ErrorInsufficientResources;
1841                     goto EXIT;
1842                 }
1843                 /* Use ION Allocator */
1844                 /*Alloc Y-Buffer */
1845                 pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
1846                 pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
1847                 pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
1848                 /*Alloc C-Buffer */
1849                 pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
1850                 pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
1851                 pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
1852
1853                 pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
1854
1855                 if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
1856                     (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
1857                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1858                     ret = OMX_ErrorInsufficientResources;
1859                     goto EXIT;
1860                 }
1861
1862                 /* MFC input buffers are 1 plane. */
1863                 pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
1864                 pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
1865                 pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
1866
1867                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
1868                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
1869                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
1870
1871                 Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
1872             }
1873         } else {
1874             ret = Mpeg4CodecSrcInit(pOMXComponent);
1875             if (ret != OMX_ErrorNone)
1876                 goto EXIT;
1877         }
1878     } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
1879         /*************/
1880         /*    TBD    */
1881         /*************/
1882         /* Does not require any actions. */
1883     }
1884
1885     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1886         Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
1887         Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1888     } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1889         /*************/
1890         /*    TBD    */
1891         /*************/
1892         /* Does not require any actions. */
1893     }
1894
1895     pMpeg4Enc->bSourceStart = OMX_FALSE;
1896     Exynos_OSAL_SignalCreate(&pMpeg4Enc->hSourceStartEvent);
1897     pMpeg4Enc->bDestinationStart = OMX_FALSE;
1898     Exynos_OSAL_SignalCreate(&pMpeg4Enc->hDestinationStartEvent);
1899
1900     Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
1901     Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
1902     pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp = 0;
1903     pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp = 0;
1904
1905     pExynosComponent->getAllDelayBuffer = OMX_FALSE;
1906
1907 #if 0//defined(USE_CSC_GSCALER)
1908     csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1909 #endif
1910     pVideoEnc->csc_handle = csc_init(csc_method);
1911     if (pVideoEnc->csc_handle == NULL) {
1912         ret = OMX_ErrorInsufficientResources;
1913         goto EXIT;
1914     }
1915     pVideoEnc->csc_set_format = OMX_FALSE;
1916
1917 EXIT:
1918     FunctionOut();
1919
1920     return ret;
1921 }
1922
1923 /* MFC Terminate */
1924 OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
1925 {
1926     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
1927     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1928     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
1929     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1930     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1931     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1932
1933     int i = 0;
1934
1935     FunctionIn();
1936
1937     if (pVideoEnc->csc_handle != NULL) {
1938         csc_deinit(pVideoEnc->csc_handle);
1939         pVideoEnc->csc_handle = NULL;
1940     }
1941
1942     Exynos_OSAL_SignalTerminate(pMpeg4Enc->hDestinationStartEvent);
1943     pMpeg4Enc->hDestinationStartEvent = NULL;
1944     pMpeg4Enc->bDestinationStart = OMX_FALSE;
1945     Exynos_OSAL_SignalTerminate(pMpeg4Enc->hSourceStartEvent);
1946     pMpeg4Enc->hSourceStartEvent = NULL;
1947     pMpeg4Enc->bSourceStart = OMX_FALSE;
1948
1949     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1950         if (pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf == OMX_TRUE) {
1951             for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1952                 if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
1953 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
1954                     for (int plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1955                         if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL)
1956                             Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
1957                     }
1958 #endif
1959                     Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]);
1960                     pVideoEnc->pMFCEncInputBuffer[i] = NULL;
1961                 }
1962             }
1963         }
1964
1965         Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
1966         Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
1967     } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1968         /*************/
1969         /*    TBD    */
1970         /*************/
1971         /* Does not require any actions. */
1972     }
1973
1974     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
1975         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1976             if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
1977 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
1978                 for (int plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1979                     if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL)
1980                         Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
1981                 }
1982 #endif
1983                 Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]);
1984                 pVideoEnc->pMFCEncInputBuffer[i] = NULL;
1985             }
1986         }
1987
1988         Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
1989         Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
1990     } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
1991         /*************/
1992         /*    TBD    */
1993         /*************/
1994         /* Does not require any actions. */
1995     }
1996     Mpeg4CodecClose(pMpeg4Enc);
1997
1998     FunctionOut();
1999
2000     return ret;
2001 }
2002
2003 OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2004 {
2005     OMX_ERRORTYPE               ret = OMX_ErrorNone;
2006     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2007     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2008     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2009     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2010     EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2011     OMX_U32  oneFrameSize = pSrcInputData->dataLen;
2012     ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
2013     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
2014     ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
2015
2016     FunctionIn();
2017
2018     if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
2019         ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
2020 //        if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)
2021         if (ret != OMX_ErrorNone)
2022             goto EXIT;
2023     }
2024     if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
2025         ret = Mpeg4CodecDstSetup(pOMXComponent);
2026     }
2027
2028     if (pVideoEnc->configChange == OMX_TRUE) {
2029         if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
2030             Change_Mpeg4Enc_Param(pExynosComponent);
2031         else
2032             Change_H263Enc_Param(pExynosComponent);
2033
2034         pVideoEnc->configChange = OMX_FALSE;
2035     }
2036
2037
2038     if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
2039         OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE]  = {0, };
2040         ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
2041         int plane;
2042
2043         pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
2044         pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
2045         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);
2046         pEncOps->Set_FrameTag(hMFCHandle, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp);
2047         pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp++;
2048         pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
2049
2050         /* queue work for input buffer */
2051         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader);
2052             pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
2053             pMFCYUVDataSize[1] = pMFCYUVDataSize[0]/2;
2054
2055         codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
2056                                     (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
2057 //#ifdef USE_METADATABUFFERTYPE
2058         if ((codecReturn == VIDEO_ERROR_NOBUFFERS) &&
2059             /*(pExynosInputPort->bStoreMetaData == OMX_TRUE) &&*/
2060             (pExynosInputPort->bufferProcessType & BUFFER_SHARE)) {
2061             OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
2062             nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
2063                                 ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
2064             nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
2065             for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
2066                 planes[plane].addr = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[plane];
2067                 planes[plane].allocSize = nAllocLen[plane];
2068                 planes[plane].fd = pSrcInputData->buffer.multiPlaneBuffer.fd[plane];
2069             }
2070
2071             /* Register input buffer */
2072             if (pInbufOps->Register(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
2073                         planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
2074                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
2075                 ret = OMX_ErrorInsufficientResources;
2076                 goto EXIT;
2077             }
2078             codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
2079                                         (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
2080
2081         }
2082 //#endif
2083         if (codecReturn != VIDEO_ERROR_NONE) {
2084             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__);
2085             ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
2086             goto EXIT;
2087         }
2088         Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
2089         if (pMpeg4Enc->bSourceStart == OMX_FALSE) {
2090             pMpeg4Enc->bSourceStart = OMX_TRUE;
2091             Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent);
2092             Exynos_OSAL_SleepMillisec(0);
2093         }
2094         if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
2095             pMpeg4Enc->bDestinationStart = OMX_TRUE;
2096             Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent);
2097             Exynos_OSAL_SleepMillisec(0);
2098         }
2099     }
2100
2101     ret = OMX_ErrorNone;
2102
2103 EXIT:
2104     FunctionOut();
2105
2106     return ret;
2107 }
2108
2109 OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2110 {
2111     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
2112     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2113     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2114     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2115     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2116     EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2117     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
2118     ExynosVideoBuffer       *pVideoBuffer;
2119
2120     FunctionIn();
2121
2122     pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
2123
2124     pSrcOutputData->dataLen       = 0;
2125     pSrcOutputData->usedDataLen   = 0;
2126     pSrcOutputData->remainDataLen = 0;
2127     pSrcOutputData->nFlags    = 0;
2128     pSrcOutputData->timeStamp = 0;
2129
2130     if (pVideoBuffer == NULL) {
2131         pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
2132         pSrcOutputData->allocSize  = 0;
2133         pSrcOutputData->pPrivate = NULL;
2134         pSrcOutputData->bufferHeader = NULL;
2135     } else {
2136         int plane = 0;
2137         for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
2138             pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
2139             pSrcOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
2140         }
2141         pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize +
2142                                         pVideoBuffer->planes[1].allocSize +
2143                                         pVideoBuffer->planes[2].allocSize;
2144
2145         if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2146             int i = 0;
2147             while (pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] != pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]) {
2148                 i++;
2149                 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
2150                     Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - Lost buffer", __FUNCTION__, __LINE__);
2151                     ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
2152                     goto EXIT;
2153                 }
2154             }
2155             pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
2156             pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
2157         }
2158
2159         /* For Share Buffer */
2160         pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
2161     }
2162
2163     ret = OMX_ErrorNone;
2164
2165 EXIT:
2166     FunctionOut();
2167
2168     return ret;
2169 }
2170
2171 OMX_ERRORTYPE Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2172 {
2173     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
2174     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2175     EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2176     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2177     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
2178     OMX_U32 dataLen = 0;
2179     ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
2180
2181     FunctionIn();
2182
2183     if (pDstInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) {
2184         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
2185         ret = OMX_ErrorBadParameter;
2186         goto EXIT;
2187     }
2188
2189     codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
2190                      (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
2191
2192     if (codecReturn != VIDEO_ERROR_NONE) {
2193         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__, __LINE__);
2194         ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
2195         goto EXIT;
2196     }
2197     Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
2198
2199     ret = OMX_ErrorNone;
2200
2201 EXIT:
2202     FunctionOut();
2203
2204     return ret;
2205 }
2206
2207 OMX_ERRORTYPE Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2208 {
2209     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
2210     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2211     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2212     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
2213     void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
2214     ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
2215     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
2216     ExynosVideoBuffer       *pVideoBuffer;
2217     ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
2218     OMX_S32 indexTimestamp = 0;
2219
2220     FunctionIn();
2221
2222     if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
2223         ret = OMX_ErrorNone;
2224         goto EXIT;
2225     }
2226
2227     if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
2228         ret = OMX_ErrorNone;
2229         goto EXIT;
2230     }
2231
2232     pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp++;
2233     pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
2234
2235     pDstOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
2236     pDstOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
2237     pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize;
2238     pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize;
2239     pDstOutputData->remainDataLen = pVideoBuffer->planes[0].dataSize;
2240     pDstOutputData->usedDataLen = 0;
2241     pDstOutputData->pPrivate = pVideoBuffer;
2242     /* For Share Buffer */
2243     pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
2244
2245     if (pVideoEnc->bFirstOutput == OMX_FALSE) {
2246
2247         pDstOutputData->timeStamp = 0;
2248         pDstOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
2249         pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
2250         pVideoEnc->bFirstOutput = OMX_TRUE;
2251     } else {
2252         indexTimestamp = pEncOps->Get_FrameTag(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
2253         if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
2254             pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp];
2255             pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp];
2256         } else {
2257             pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
2258             pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
2259         }
2260
2261         pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
2262         if (pVideoBuffer->frameType == VIDEO_FRAME_I)
2263             pDstOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
2264     }
2265
2266     if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
2267         ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
2268         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%x displayStatus:%d, nFlags0x%x", pExynosComponent, displayStatus, pDstOutputData->nFlags);
2269         pDstOutputData->remainDataLen = 0;
2270     }
2271
2272     ret = OMX_ErrorNone;
2273
2274 EXIT:
2275     FunctionOut();
2276
2277     return ret;
2278 }
2279
2280 OMX_ERRORTYPE Exynos_Mpeg4Enc_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2281 {
2282     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2283     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2284     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2285
2286     FunctionIn();
2287
2288     if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2289         ret = OMX_ErrorNone;
2290         goto EXIT;
2291     }
2292     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2293         ret = OMX_ErrorNone;
2294         goto EXIT;
2295     }
2296
2297     ret = Exynos_Mpeg4Enc_SrcIn(pOMXComponent, pSrcInputData);
2298     if (ret != OMX_ErrorNone) {
2299         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__, __LINE__);
2300         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2301                                                 pExynosComponent->callbackData,
2302                                                 OMX_EventError, ret, 0, NULL);
2303     }
2304
2305 EXIT:
2306     FunctionOut();
2307
2308     return ret;
2309 }
2310
2311 OMX_ERRORTYPE Exynos_Mpeg4Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2312 {
2313     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2314     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2315     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2316     EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2317
2318     FunctionIn();
2319
2320     if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2321         ret = OMX_ErrorNone;
2322         goto EXIT;
2323     }
2324
2325     if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2326         if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2327             ret = OMX_ErrorNone;
2328             goto EXIT;
2329         }
2330     }
2331     if ((pMpeg4Enc->bSourceStart == OMX_FALSE) &&
2332        (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
2333         Exynos_OSAL_SignalWait(pMpeg4Enc->hSourceStartEvent, DEF_MAX_WAIT_TIME);
2334         Exynos_OSAL_SignalReset(pMpeg4Enc->hSourceStartEvent);
2335     }
2336
2337     ret = Exynos_Mpeg4Enc_SrcOut(pOMXComponent, pSrcOutputData);
2338     if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
2339         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__, __LINE__);
2340         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2341                                                 pExynosComponent->callbackData,
2342                                                 OMX_EventError, ret, 0, NULL);
2343     }
2344
2345 EXIT:
2346     FunctionOut();
2347
2348     return ret;
2349 }
2350
2351 OMX_ERRORTYPE Exynos_Mpeg4Enc_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2352 {
2353     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2354     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2355     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2356     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2357
2358     FunctionIn();
2359
2360     if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2361         ret = OMX_ErrorNone;
2362         goto EXIT;
2363     }
2364     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2365         ret = OMX_ErrorNone;
2366         goto EXIT;
2367     }
2368     if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
2369         if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) &&
2370            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2371             Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2372             Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent);
2373         }
2374     }
2375     if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
2376         ret = Exynos_Mpeg4Enc_DstIn(pOMXComponent, pDstInputData);
2377         if (ret != OMX_ErrorNone) {
2378             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__, __LINE__);
2379             pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2380                                                 pExynosComponent->callbackData,
2381                                                 OMX_EventError, ret, 0, NULL);
2382         }
2383     }
2384
2385 EXIT:
2386     FunctionOut();
2387
2388     return ret;
2389 }
2390
2391 OMX_ERRORTYPE Exynos_Mpeg4Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2392 {
2393     OMX_ERRORTYPE             ret = OMX_ErrorNone;
2394     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2395     EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2396     EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2397
2398     FunctionIn();
2399
2400     if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2401         ret = OMX_ErrorNone;
2402         goto EXIT;
2403     }
2404     if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2405         ret = OMX_ErrorNone;
2406         goto EXIT;
2407     }
2408
2409     if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
2410         if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) &&
2411            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2412             Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2413             Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent);
2414         }
2415     }
2416     ret = Exynos_Mpeg4Enc_DstOut(pOMXComponent, pDstOutputData);
2417     if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
2418         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__, __LINE__);
2419         pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2420                                                 pExynosComponent->callbackData,
2421                                                 OMX_EventError, ret, 0, NULL);
2422     }
2423
2424 EXIT:
2425     FunctionOut();
2426
2427     return ret;
2428 }
2429
2430 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
2431     OMX_HANDLETYPE hComponent,
2432     OMX_STRING     componentName)
2433 {
2434     OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
2435     OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
2436     EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
2437     EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
2438     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
2439     EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
2440     OMX_S32                        codecType        = -1;
2441     int i = 0;
2442
2443     FunctionIn();
2444
2445     if ((hComponent == NULL) || (componentName == NULL)) {
2446         ret = OMX_ErrorBadParameter;
2447         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
2448         goto EXIT;
2449     }
2450     if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC, componentName) == 0) {
2451         codecType = CODEC_TYPE_MPEG4;
2452     } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC, componentName) == 0) {
2453         codecType = CODEC_TYPE_H263;
2454     } else {
2455         ret = OMX_ErrorBadParameter;
2456         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
2457         goto EXIT;
2458     }
2459
2460     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2461     ret = Exynos_OMX_VideoEncodeComponentInit(pOMXComponent);
2462     if (ret != OMX_ErrorNone) {
2463         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
2464         goto EXIT;
2465     }
2466     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2467     pExynosComponent->codecType = HW_VIDEO_ENC_CODEC;
2468
2469     pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
2470     if (pExynosComponent->componentName == NULL) {
2471         Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2472         ret = OMX_ErrorInsufficientResources;
2473         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
2474         goto EXIT;
2475     }
2476     Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
2477
2478     pMpeg4Enc = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE));
2479     if (pMpeg4Enc == NULL) {
2480         Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2481         ret = OMX_ErrorInsufficientResources;
2482         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
2483         goto EXIT;
2484     }
2485     Exynos_OSAL_Memset(pMpeg4Enc, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE));
2486     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2487     pVideoEnc->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Enc;
2488     pMpeg4Enc->hMFCMpeg4Handle.codecType = codecType;
2489
2490     if (codecType == CODEC_TYPE_MPEG4)
2491         Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_ENC);
2492     else
2493         Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_ENC);
2494
2495
2496     /* In case of BUFFER_COPY mode
2497             bShareableBuf = TRUE means MemoryType is V4L2_MEMORY_USERPTR
2498             bShareableBuf = FALSE means MemoryType is V4L2_MEMORY_MMAP
2499          In case of BUFFER_SHARE
2500             bShareableBuf should be TRUE, FALSE is ignored
2501     */
2502     pMpeg4Enc->hMFCMpeg4Handle.bShareableBuf = OMX_FALSE; //Check bStoreMetaData in Init function
2503
2504     /* Set componentVersion */
2505     pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2506     pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2507     pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
2508     pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
2509     /* Set specVersion */
2510     pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2511     pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2512     pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
2513     pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
2514
2515     /* Input port */
2516     pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2517     pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2518     pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2519     pExynosPort->portDefinition.format.video.nBitrate = 64000;
2520     pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
2521     pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
2522     pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2523     pExynosPort->portDefinition.format.video.pNativeRender = 0;
2524     pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2525     Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2526     Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
2527 #ifdef TIZEN_FEATURE_E3250
2528     pExynosPort->portDefinition.format.video.eColorFormat = OMX_SEC_COLOR_FormatNV12L_DmaBuf_Fd;
2529 #else
2530     pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2531 #endif
2532     pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2533     pExynosPort->bufferProcessType = BUFFER_COPY;
2534     pExynosPort->portWayType = WAY2_PORT;
2535
2536     /* Output port */
2537     pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2538     pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2539     pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2540     pExynosPort->portDefinition.format.video.nBitrate = 64000;
2541     pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
2542     pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
2543     if (codecType == CODEC_TYPE_MPEG4) {
2544         pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
2545         Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2546         Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
2547     } else {
2548         pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
2549         Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2550         Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
2551     }
2552     pExynosPort->portDefinition.format.video.pNativeRender = 0;
2553     pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2554     pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
2555     pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2556     pExynosPort->bufferProcessType = BUFFER_COPY;
2557     pExynosPort->portWayType = WAY2_PORT;
2558
2559     if (codecType == CODEC_TYPE_MPEG4) {
2560         for(i = 0; i < ALL_PORT_NUM; i++) {
2561             INIT_SET_SIZE_VERSION(&pMpeg4Enc->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
2562             pMpeg4Enc->mpeg4Component[i].nPortIndex = i;
2563             pMpeg4Enc->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
2564             pMpeg4Enc->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level4;
2565
2566             pMpeg4Enc->mpeg4Component[i].nPFrames = 10;
2567             pMpeg4Enc->mpeg4Component[i].nBFrames = 0;          /* No support for B frames */
2568             pMpeg4Enc->mpeg4Component[i].nMaxPacketSize = 256;  /* Default value */
2569             pMpeg4Enc->mpeg4Component[i].nAllowedPictureTypes =  OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
2570             pMpeg4Enc->mpeg4Component[i].bGov = OMX_FALSE;
2571
2572         }
2573     } else {
2574         for(i = 0; i < ALL_PORT_NUM; i++) {
2575             INIT_SET_SIZE_VERSION(&pMpeg4Enc->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
2576             pMpeg4Enc->h263Component[i].nPortIndex = i;
2577             pMpeg4Enc->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline;
2578             pMpeg4Enc->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
2579
2580             pMpeg4Enc->h263Component[i].nPFrames = 20;
2581             pMpeg4Enc->h263Component[i].nBFrames = 0;          /* No support for B frames */
2582             pMpeg4Enc->h263Component[i].bPLUSPTYPEAllowed = OMX_FALSE;
2583             pMpeg4Enc->h263Component[i].nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
2584             pMpeg4Enc->h263Component[i].bForceRoundingTypeToZero = OMX_TRUE;
2585             pMpeg4Enc->h263Component[i].nPictureHeaderRepetition = 0;
2586             pMpeg4Enc->h263Component[i].nGOBHeaderInterval = 0;
2587         }
2588     }
2589
2590     pOMXComponent->GetParameter      = &Exynos_Mpeg4Enc_GetParameter;
2591     pOMXComponent->SetParameter      = &Exynos_Mpeg4Enc_SetParameter;
2592     pOMXComponent->GetConfig         = &Exynos_Mpeg4Enc_GetConfig;
2593     pOMXComponent->SetConfig         = &Exynos_Mpeg4Enc_SetConfig;
2594     pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Enc_GetExtensionIndex;
2595     pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Enc_ComponentRoleEnum;
2596     pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
2597
2598     pExynosComponent->exynos_codec_componentInit      = &Exynos_Mpeg4Enc_Init;
2599     pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Enc_Terminate;
2600
2601     pVideoEnc->exynos_codec_srcInputProcess  = &Exynos_Mpeg4Enc_srcInputBufferProcess;
2602     pVideoEnc->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Enc_srcOutputBufferProcess;
2603     pVideoEnc->exynos_codec_dstInputProcess  = &Exynos_Mpeg4Enc_dstInputBufferProcess;
2604     pVideoEnc->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Enc_dstOutputBufferProcess;
2605
2606     pVideoEnc->exynos_codec_start         = &Mpeg4CodecStart;
2607     pVideoEnc->exynos_codec_stop          = &Mpeg4CodecStop;
2608     pVideoEnc->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
2609     pVideoEnc->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnqueueAllBuffer;
2610
2611     pVideoEnc->exynos_checkInputFrame        = NULL;
2612     pVideoEnc->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
2613     pVideoEnc->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
2614
2615 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2616     pVideoEnc->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2617     if (pVideoEnc->hSharedMemory == NULL) {
2618         Exynos_OSAL_Free(pMpeg4Enc);
2619         pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2620         Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2621         ret = OMX_ErrorInsufficientResources;
2622         goto EXIT;
2623     }
2624 #endif
2625     pExynosComponent->currentState = OMX_StateLoaded;
2626
2627     ret = OMX_ErrorNone;
2628
2629 EXIT:
2630     FunctionOut();
2631
2632     return ret;
2633 }
2634
2635 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
2636 {
2637     OMX_ERRORTYPE               ret              = OMX_ErrorNone;
2638     OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
2639     EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
2640     EXYNOS_MPEG4ENC_HANDLE     *pMpeg4Enc        = NULL;
2641
2642 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2643     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
2644     pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
2645 #endif
2646     FunctionIn();
2647
2648     if (hComponent == NULL) {
2649         ret = OMX_ErrorBadParameter;
2650         goto EXIT;
2651     }
2652     pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2653     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2654 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2655     Exynos_OSAL_SharedMemory_Close(pVideoEnc->hSharedMemory);
2656 #endif
2657     Exynos_OSAL_Free(pExynosComponent->componentName);
2658     pExynosComponent->componentName = NULL;
2659
2660     pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2661     if (pMpeg4Enc != NULL) {
2662         Exynos_OSAL_Free(pMpeg4Enc);
2663         pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2664     }
2665
2666     ret = Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
2667     if (ret != OMX_ErrorNone) {
2668         goto EXIT;
2669     }
2670
2671     ret = OMX_ErrorNone;
2672
2673 EXIT:
2674     FunctionOut();
2675
2676     return ret;
2677 }