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