3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * @file Exynos_OMX_Mpeg4enc.c
21 * @author Yunji Kim (yunji.kim@samsung.com)
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 "Exynos_OSAL_Android.h"
39 #include "library_register.h"
40 #include "Exynos_OMX_Mpeg4enc.h"
41 #include "Exynos_OSAL_SharedMemory.h"
42 #include "Exynos_OSAL_Event.h"
44 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
45 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
49 #define EXYNOS_LOG_TAG "EXYNOS_MPEG4_ENC"
50 #define EXYNOS_LOG_OFF
51 //#define EXYNOS_TRACE_ON
52 #include "Exynos_OSAL_Log.h"
54 /* MPEG4 Encoder Supported Levels & profiles */
55 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels
[] ={
56 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level0
},
57 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level0b
},
58 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level1
},
59 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level2
},
60 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level3
},
61 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level4
},
62 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level4a
},
63 {OMX_VIDEO_MPEG4ProfileSimple
, OMX_VIDEO_MPEG4Level5
},
64 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level0
},
65 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level0b
},
66 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level1
},
67 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level2
},
68 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level3
},
69 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level4
},
70 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level4a
},
71 {OMX_VIDEO_MPEG4ProfileAdvancedSimple
, OMX_VIDEO_MPEG4Level5
}};
73 /* H.263 Encoder Supported Levels & profiles */
74 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels
[] = {
75 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level10
},
76 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level20
},
77 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level30
},
78 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level40
},
79 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level45
},
80 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level50
},
81 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level60
},
82 {OMX_VIDEO_H263ProfileBaseline
, OMX_VIDEO_H263Level70
}};
84 static OMX_U32
OMXMpeg4ProfileToMFCProfile(OMX_VIDEO_MPEG4PROFILETYPE profile
)
89 case OMX_VIDEO_MPEG4ProfileSimple
:
92 case OMX_VIDEO_MPEG4ProfileAdvancedSimple
:
102 static OMX_U32
OMXMpeg4LevelToMFCLevel(OMX_VIDEO_MPEG4LEVELTYPE level
)
107 case OMX_VIDEO_MPEG4Level0
:
110 case OMX_VIDEO_MPEG4Level0b
:
113 case OMX_VIDEO_MPEG4Level1
:
116 case OMX_VIDEO_MPEG4Level2
:
119 case OMX_VIDEO_MPEG4Level3
:
122 case OMX_VIDEO_MPEG4Level4
:
123 case OMX_VIDEO_MPEG4Level4a
:
126 case OMX_VIDEO_MPEG4Level5
:
136 static void Print_Mpeg4Enc_Param(ExynosVideoEncParam
*pEncParam
)
138 ExynosVideoEncCommonParam
*pCommonParam
= &pEncParam
->commonParam
;
139 ExynosVideoEncMpeg4Param
*pMpeg4Param
= &pEncParam
->codecParam
.mpeg4
;
141 /* common parameters */
142 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SourceWidth : %d", pCommonParam
->SourceWidth
);
143 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SourceHeight : %d", pCommonParam
->SourceHeight
);
144 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "IDRPeriod : %d", pCommonParam
->IDRPeriod
);
145 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SliceMode : %d", pCommonParam
->SliceMode
);
146 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "RandomIntraMBRefresh : %d", pCommonParam
->RandomIntraMBRefresh
);
147 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Bitrate : %d", pCommonParam
->Bitrate
);
148 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameQp : %d", pCommonParam
->FrameQp
);
149 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameQp_P : %d", pCommonParam
->FrameQp_P
);
150 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "QSCodeMax : %d", pCommonParam
->QSCodeMax
);
151 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "QSCodeMin : %d", pCommonParam
->QSCodeMin
);
152 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "PadControlOn : %d", pCommonParam
->PadControlOn
);
153 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "LumaPadVal : %d", pCommonParam
->LumaPadVal
);
154 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "CbPadVal : %d", pCommonParam
->CbPadVal
);
155 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "CrPadVal : %d", pCommonParam
->CrPadVal
);
156 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameMap : %d", pCommonParam
->FrameMap
);
158 /* Mpeg4 specific parameters */
159 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "ProfileIDC : %d", pMpeg4Param
->ProfileIDC
);
160 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "LevelIDC : %d", pMpeg4Param
->LevelIDC
);
161 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameQp_B : %d", pMpeg4Param
->FrameQp_B
);
162 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "TimeIncreamentRes : %d", pMpeg4Param
->TimeIncreamentRes
);
163 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "VopTimeIncreament : %d", pMpeg4Param
->VopTimeIncreament
);
164 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SliceArgument : %d", pMpeg4Param
->SliceArgument
);
165 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "NumberBFrames : %d", pMpeg4Param
->NumberBFrames
);
166 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "DisableQpelME : %d", pMpeg4Param
->DisableQpelME
);
168 /* rate control related parameters */
169 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "EnableFRMRateControl : %d", pCommonParam
->EnableFRMRateControl
);
170 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "EnableMBRateControl : %d", pCommonParam
->EnableMBRateControl
);
171 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "CBRPeriodRf : %d", pCommonParam
->CBRPeriodRf
);
174 static void Print_H263Enc_Param(ExynosVideoEncParam
*pEncParam
)
176 ExynosVideoEncCommonParam
*pCommonParam
= &pEncParam
->commonParam
;
177 ExynosVideoEncH263Param
*pH263Param
= &pEncParam
->codecParam
.h263
;
179 /* common parameters */
180 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SourceWidth : %d", pCommonParam
->SourceWidth
);
181 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SourceHeight : %d", pCommonParam
->SourceHeight
);
182 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "IDRPeriod : %d", pCommonParam
->IDRPeriod
);
183 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SliceMode : %d", pCommonParam
->SliceMode
);
184 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "RandomIntraMBRefresh : %d", pCommonParam
->RandomIntraMBRefresh
);
185 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Bitrate : %d", pCommonParam
->Bitrate
);
186 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameQp : %d", pCommonParam
->FrameQp
);
187 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameQp_P : %d", pCommonParam
->FrameQp_P
);
188 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "QSCodeMax : %d", pCommonParam
->QSCodeMax
);
189 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "QSCodeMin : %d", pCommonParam
->QSCodeMin
);
190 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "PadControlOn : %d", pCommonParam
->PadControlOn
);
191 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "LumaPadVal : %d", pCommonParam
->LumaPadVal
);
192 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "CbPadVal : %d", pCommonParam
->CbPadVal
);
193 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "CrPadVal : %d", pCommonParam
->CrPadVal
);
194 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameMap : %d", pCommonParam
->FrameMap
);
196 /* H263 specific parameters */
197 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "FrameRate : %d", pH263Param
->FrameRate
);
199 /* rate control related parameters */
200 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "EnableFRMRateControl : %d", pCommonParam
->EnableFRMRateControl
);
201 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "EnableMBRateControl : %d", pCommonParam
->EnableMBRateControl
);
202 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "CBRPeriodRf : %d", pCommonParam
->CBRPeriodRf
);
205 static void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
207 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
208 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
209 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
210 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
211 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
;
213 ExynosVideoEncParam
*pEncParam
= NULL
;
214 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
215 ExynosVideoEncMpeg4Param
*pMpeg4Param
= NULL
;
217 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
218 pMpeg4Enc
= pVideoEnc
->hCodecHandle
;
219 pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
220 pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
221 pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
223 pEncParam
= &pMFCMpeg4Handle
->encParam
;
224 pCommonParam
= &pEncParam
->commonParam
;
225 pMpeg4Param
= &pEncParam
->codecParam
.mpeg4
;
226 pEncParam
->eCompressionFormat
= VIDEO_CODING_MPEG4
;
227 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "eCompressionFormat: %d", pEncParam
->eCompressionFormat
);
229 /* common parameters */
230 pCommonParam
->SourceWidth
= pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
;
231 pCommonParam
->SourceHeight
= pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
;
232 pCommonParam
->IDRPeriod
= pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1;
233 pCommonParam
->SliceMode
= 0;
234 pCommonParam
->RandomIntraMBRefresh
= 0;
235 pCommonParam
->Bitrate
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
236 pCommonParam
->FrameQp
= pVideoEnc
->quantization
.nQpI
;
237 pCommonParam
->FrameQp_P
= pVideoEnc
->quantization
.nQpP
;
238 pCommonParam
->QSCodeMax
= 30;
239 pCommonParam
->QSCodeMin
= 10;
240 pCommonParam
->PadControlOn
= 0; /* 0: Use boundary pixel, 1: Use the below setting value */
241 pCommonParam
->LumaPadVal
= 0;
242 pCommonParam
->CbPadVal
= 0;
243 pCommonParam
->CrPadVal
= 0;
245 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
246 if (pVideoEnc
->ANBColorFormat
== OMX_SEC_COLOR_FormatNV21Linear
)
247 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
248 if (pVideoEnc
->ANBColorFormat
== OMX_SEC_COLOR_FormatNV12Tiled
)
249 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
251 switch ((EXYNOS_OMX_COLOR_FORMATTYPE
)pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
) {
252 case OMX_COLOR_FormatYUV420SemiPlanar
:
253 case OMX_COLOR_FormatYUV420Planar
: /* Converted to NV12 in Exynos_CSC_InputData */
254 #ifdef USE_METADATABUFFERTYPE
255 case OMX_COLOR_FormatAndroidOpaque
:
257 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
259 case OMX_SEC_COLOR_FormatNV21Linear
:
260 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV21
;
262 case OMX_SEC_COLOR_FormatNV12Tiled
:
264 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
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;
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;
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;
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;
303 Print_Mpeg4Enc_Param(pEncParam
);
306 static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
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
;
314 ExynosVideoEncParam
*pEncParam
= NULL
;
315 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
316 ExynosVideoEncH263Param
*pH263Param
= NULL
;
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
];
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
);
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;
346 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
347 if (pVideoEnc
->ANBColorFormat
== OMX_SEC_COLOR_FormatNV21Linear
)
348 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
349 if (pVideoEnc
->ANBColorFormat
== OMX_SEC_COLOR_FormatNV12Tiled
)
350 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
352 switch ((EXYNOS_OMX_COLOR_FORMATTYPE
)pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
) {
353 case OMX_COLOR_FormatYUV420SemiPlanar
:
354 case OMX_COLOR_FormatYUV420Planar
: /* Converted to NV12 in Exynos_CSC_InputData */
355 #ifdef USE_METADATABUFFERTYPE
356 case OMX_COLOR_FormatAndroidOpaque
:
358 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
360 case OMX_SEC_COLOR_FormatNV21Linear
:
361 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV21
;
363 case OMX_SEC_COLOR_FormatNV12Tiled
:
365 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
370 /* H263 specific parameters */
371 pH263Param
->FrameRate
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
373 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
]);
374 /* rate control related parameters */
375 switch (pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
]) {
376 case OMX_Video_ControlRateDisable
:
377 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode DBR");
378 pCommonParam
->EnableFRMRateControl
= 0; /* 0: Disable, 1: Frame level RC */
379 pCommonParam
->EnableMBRateControl
= 0; /* 0: Disable, 1:MB level RC */
380 pCommonParam
->CBRPeriodRf
= 100;
382 case OMX_Video_ControlRateConstant
:
383 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode CBR");
384 pCommonParam
->EnableFRMRateControl
= 1; /* 0: Disable, 1: Frame level RC */
385 pCommonParam
->EnableMBRateControl
= 1; /* 0: Disable, 1:MB level RC */
386 pCommonParam
->CBRPeriodRf
= 9;
388 case OMX_Video_ControlRateVariable
:
389 default: /*Android default */
390 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode VBR");
391 pCommonParam
->EnableFRMRateControl
= 1; /* 0: Disable, 1: Frame level RC */
392 pCommonParam
->EnableMBRateControl
= 1; /* 0: Disable, 1:MB level RC */
393 pCommonParam
->CBRPeriodRf
= 100;
397 Print_H263Enc_Param(pEncParam
);
400 static void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
402 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
403 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
404 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
405 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
406 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
;
408 ExynosVideoEncOps
*pEncOps
= NULL
;
409 ExynosVideoEncParam
*pEncParam
= NULL
;
410 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
411 ExynosVideoEncMpeg4Param
*pMpeg4Param
= NULL
;
415 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
416 pMpeg4Enc
= pVideoEnc
->hCodecHandle
;
417 pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
418 pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
419 pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
420 pEncOps
= pMFCMpeg4Handle
->pEncOps
;
422 pEncParam
= &pMFCMpeg4Handle
->encParam
;
423 pCommonParam
= &pEncParam
->commonParam
;
424 pMpeg4Param
= &pEncParam
->codecParam
.mpeg4
;
426 if (pVideoEnc
->IntraRefreshVOP
== OMX_TRUE
) {
427 setParam
= VIDEO_FRAME_I
;
428 pEncOps
->Set_FrameType(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
429 pVideoEnc
->IntraRefreshVOP
= OMX_FALSE
;
431 if (pCommonParam
->IDRPeriod
!= (int)pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1) {
432 setParam
= pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1;
433 pEncOps
->Set_IDRPeriod(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
435 if (pCommonParam
->Bitrate
!= (int)pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
) {
436 setParam
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
437 pEncOps
->Set_BitRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
439 if (pMpeg4Param
->TimeIncreamentRes
!= (int)((pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16)) {
440 setParam
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
441 pEncOps
->Set_FrameRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
444 Set_Mpeg4Enc_Param(pExynosComponent
);
447 static void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
449 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
450 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
451 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
452 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
453 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
;
455 ExynosVideoEncOps
*pEncOps
= NULL
;
456 ExynosVideoEncParam
*pEncParam
= NULL
;
457 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
458 ExynosVideoEncH263Param
*pH263Param
= NULL
;
462 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
463 pMpeg4Enc
= pVideoEnc
->hCodecHandle
;
464 pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
465 pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
466 pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
467 pEncOps
= pMFCMpeg4Handle
->pEncOps
;
469 pEncParam
= &pMFCMpeg4Handle
->encParam
;
470 pCommonParam
= &pEncParam
->commonParam
;
471 pH263Param
= &pEncParam
->codecParam
.h263
;
473 if (pVideoEnc
->IntraRefreshVOP
== OMX_TRUE
) {
474 setParam
= VIDEO_FRAME_I
;
475 pEncOps
->Set_FrameType(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
476 pVideoEnc
->IntraRefreshVOP
= OMX_FALSE
;
478 if (pCommonParam
->IDRPeriod
!= (int)pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1) {
479 setParam
= pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1;
480 pEncOps
->Set_IDRPeriod(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
482 if (pCommonParam
->Bitrate
!= (int)pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
) {
483 setParam
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
484 pEncOps
->Set_BitRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
486 if (pH263Param
->FrameRate
!= (int)((pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16)) {
487 setParam
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
488 pEncOps
->Set_FrameRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
491 Set_H263Enc_Param(pExynosComponent
);
494 OMX_ERRORTYPE
GetCodecInputPrivateData(OMX_PTR codecBuffer
, OMX_PTR addr
[], OMX_U32 size
[])
496 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
502 OMX_ERRORTYPE
GetCodecOutputPrivateData(OMX_PTR codecBuffer
, OMX_PTR
*pVirtAddr
, OMX_U32
*dataSize
)
504 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
505 ExynosVideoBuffer
*pCodecBuffer
;
507 if (codecBuffer
== NULL
) {
508 ret
= OMX_ErrorBadParameter
;
512 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
514 if (pVirtAddr
!= NULL
)
515 *pVirtAddr
= pCodecBuffer
->planes
[0].addr
;
517 if (dataSize
!= NULL
)
518 *dataSize
= pCodecBuffer
->planes
[0].allocSize
;
520 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
526 OMX_ERRORTYPE
Mpeg4CodecOpen(EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
)
528 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
530 ExynosVideoEncOps
*pEncOps
= NULL
;
531 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
532 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
536 if (pMpeg4Enc
== NULL
) {
537 ret
= OMX_ErrorBadParameter
;
538 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
542 /* alloc ops structure */
543 pEncOps
= (ExynosVideoEncOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncOps
));
544 pInbufOps
= (ExynosVideoEncBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps
));
545 pOutbufOps
= (ExynosVideoEncBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps
));
547 if ((pEncOps
== NULL
) || (pInbufOps
== NULL
) || (pOutbufOps
== NULL
)) {
548 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate encoder ops buffer");
549 ret
= OMX_ErrorInsufficientResources
;
553 pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
= pEncOps
;
554 pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
= pInbufOps
;
555 pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
= pOutbufOps
;
557 /* function pointer mapping */
558 pEncOps
->nSize
= sizeof(ExynosVideoEncOps
);
559 pInbufOps
->nSize
= sizeof(ExynosVideoEncBufferOps
);
560 pOutbufOps
->nSize
= sizeof(ExynosVideoEncBufferOps
);
562 Exynos_Video_Register_Encoder(pEncOps
, pInbufOps
, pOutbufOps
);
564 /* check mandatory functions for encoder ops */
565 if ((pEncOps
->Init
== NULL
) || (pEncOps
->Finalize
== NULL
) ||
566 (pEncOps
->Set_FrameTag
== NULL
) || (pEncOps
->Get_FrameTag
== NULL
)) {
567 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
568 ret
= OMX_ErrorInsufficientResources
;
572 /* check mandatory functions for buffer ops */
573 if ((pInbufOps
->Setup
== NULL
) || (pOutbufOps
->Setup
== NULL
) ||
574 (pInbufOps
->Run
== NULL
) || (pOutbufOps
->Run
== NULL
) ||
575 (pInbufOps
->Stop
== NULL
) || (pOutbufOps
->Stop
== NULL
) ||
576 (pInbufOps
->Enqueue
== NULL
) || (pOutbufOps
->Enqueue
== NULL
) ||
577 (pInbufOps
->Dequeue
== NULL
) || (pOutbufOps
->Dequeue
== NULL
)) {
578 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
579 ret
= OMX_ErrorInsufficientResources
;
583 /* alloc context, open, querycap */
585 pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
->Init(V4L2_MEMORY_DMABUF
);
587 pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
->Init(V4L2_MEMORY_USERPTR
);
589 if (pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
== NULL
) {
590 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate context buffer");
591 ret
= OMX_ErrorInsufficientResources
;
598 if (ret
!= OMX_ErrorNone
) {
599 if (pEncOps
!= NULL
) {
600 Exynos_OSAL_Free(pEncOps
);
601 pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
= NULL
;
603 if (pInbufOps
!= NULL
) {
604 Exynos_OSAL_Free(pInbufOps
);
605 pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
= NULL
;
607 if (pOutbufOps
!= NULL
) {
608 Exynos_OSAL_Free(pOutbufOps
);
609 pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
= NULL
;
618 OMX_ERRORTYPE
Mpeg4CodecClose(EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
)
620 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
621 void *hMFCHandle
= NULL
;
622 ExynosVideoEncOps
*pEncOps
= NULL
;
623 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
624 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
628 if (pMpeg4Enc
== NULL
) {
629 ret
= OMX_ErrorBadParameter
;
633 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
634 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
635 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
636 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
638 if (hMFCHandle
!= NULL
) {
639 pEncOps
->Finalize(hMFCHandle
);
640 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
= NULL
;
642 if (pOutbufOps
!= NULL
) {
643 Exynos_OSAL_Free(pOutbufOps
);
644 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
= NULL
;
646 if (pInbufOps
!= NULL
) {
647 Exynos_OSAL_Free(pInbufOps
);
648 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
= NULL
;
650 if (pEncOps
!= NULL
) {
651 Exynos_OSAL_Free(pEncOps
);
652 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
= NULL
;
663 OMX_ERRORTYPE
Mpeg4CodecStart(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
665 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
666 void *hMFCHandle
= NULL
;
667 ExynosVideoEncOps
*pEncOps
= NULL
;
668 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
669 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
670 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
671 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
675 if (pOMXComponent
== NULL
) {
676 ret
= OMX_ErrorBadParameter
;
680 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
681 if (pVideoEnc
== NULL
) {
682 ret
= OMX_ErrorBadParameter
;
686 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
687 if (pMpeg4Enc
== NULL
) {
688 ret
= OMX_ErrorBadParameter
;
692 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
693 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
694 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
695 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
697 if (nPortIndex
== INPUT_PORT_INDEX
)
698 pInbufOps
->Run(hMFCHandle
);
699 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
700 pOutbufOps
->Run(hMFCHandle
);
710 OMX_ERRORTYPE
Mpeg4CodecStop(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
712 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
713 void *hMFCHandle
= NULL
;
714 ExynosVideoEncOps
*pEncOps
= NULL
;
715 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
716 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
717 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
718 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
722 if (pOMXComponent
== NULL
) {
723 ret
= OMX_ErrorBadParameter
;
727 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
728 if (pVideoEnc
== NULL
) {
729 ret
= OMX_ErrorBadParameter
;
732 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
733 if (pMpeg4Enc
== NULL
) {
734 ret
= OMX_ErrorBadParameter
;
738 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
739 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
740 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
741 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
743 if ((nPortIndex
== INPUT_PORT_INDEX
) && (pInbufOps
!= NULL
))
744 pInbufOps
->Stop(hMFCHandle
);
745 else if ((nPortIndex
== OUTPUT_PORT_INDEX
) && (pOutbufOps
!= NULL
))
746 pOutbufOps
->Stop(hMFCHandle
);
756 OMX_ERRORTYPE
Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
758 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
759 void *hMFCHandle
= NULL
;
760 ExynosVideoEncOps
*pEncOps
= NULL
;
761 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
762 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
763 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
764 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
768 if (pOMXComponent
== NULL
) {
769 ret
= OMX_ErrorBadParameter
;
773 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
774 if (pVideoEnc
== NULL
) {
775 ret
= OMX_ErrorBadParameter
;
778 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
779 if (pMpeg4Enc
== NULL
) {
780 ret
= OMX_ErrorBadParameter
;
784 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
785 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
786 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
787 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
789 if (nPortIndex
== INPUT_PORT_INDEX
) {
790 if (pMpeg4Enc
->bSourceStart
== OMX_FALSE
) {
791 Exynos_OSAL_SignalSet(pMpeg4Enc
->hSourceStartEvent
);
792 Exynos_OSAL_SleepMillisec(0);
796 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
797 if (pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) {
798 Exynos_OSAL_SignalSet(pMpeg4Enc
->hDestinationStartEvent
);
799 Exynos_OSAL_SleepMillisec(0);
811 OMX_ERRORTYPE
Mpeg4CodecRegistCodecBuffers(
812 OMX_COMPONENTTYPE
*pOMXComponent
,
816 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
817 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
818 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
819 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
820 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
821 CODEC_ENC_BUFFER
**ppCodecBuffer
= NULL
;
822 ExynosVideoEncBufferOps
*pBufOps
= NULL
;
823 ExynosVideoPlane
*pPlanes
= NULL
;
825 OMX_U32 nPlaneCnt
= 0;
830 if (nPortIndex
== INPUT_PORT_INDEX
) {
831 ppCodecBuffer
= &(pVideoEnc
->pMFCEncInputBuffer
[0]);
832 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
833 pBufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
835 ppCodecBuffer
= &(pVideoEnc
->pMFCEncOutputBuffer
[0]);
836 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
837 pBufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
840 pPlanes
= (ExynosVideoPlane
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane
) * nPlaneCnt
);
841 if (pPlanes
== NULL
) {
842 ret
= OMX_ErrorInsufficientResources
;
846 /* Register buffer */
847 for (i
= 0; i
< nBufferCnt
; i
++) {
848 for (j
= 0; j
< nPlaneCnt
; j
++) {
849 pPlanes
[j
].addr
= ppCodecBuffer
[i
]->pVirAddr
[j
];
850 pPlanes
[j
].fd
= ppCodecBuffer
[i
]->fd
[j
];
851 pPlanes
[j
].allocSize
= ppCodecBuffer
[i
]->bufferSize
[j
];
854 if (pBufOps
->Register(hMFCHandle
, pPlanes
, nPlaneCnt
) != VIDEO_ERROR_NONE
) {
855 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "PORT[%d]: Failed to Register buffer", nPortIndex
);
856 ret
= OMX_ErrorInsufficientResources
;
857 Exynos_OSAL_Free(pPlanes
);
862 Exynos_OSAL_Free(pPlanes
);
872 OMX_ERRORTYPE
Mpeg4CodecEnqueueAllBuffer(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
874 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
875 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
876 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
877 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
878 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
879 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
880 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
883 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
884 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
885 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
889 if ((nPortIndex
!= INPUT_PORT_INDEX
) && (nPortIndex
!= OUTPUT_PORT_INDEX
)) {
890 ret
= OMX_ErrorBadPortIndex
;
894 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
895 (pMpeg4Enc
->bSourceStart
== OMX_TRUE
)) {
896 Exynos_CodecBufferReset(pExynosComponent
, INPUT_PORT_INDEX
);
898 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
899 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
900 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]);
901 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[1]);
903 Exynos_CodecBufferEnqueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
906 pInbufOps
->Clear_Queue(hMFCHandle
);
907 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
908 (pMpeg4Enc
->bDestinationStart
== OMX_TRUE
)) {
909 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
911 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
912 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncOutputBuffer[%d]: 0x%x", i
, pVideoEnc
->pMFCEncOutputBuffer
[i
]);
913 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]);
915 Exynos_CodecBufferEnqueue(pExynosComponent
, OUTPUT_PORT_INDEX
, pVideoEnc
->pMFCEncOutputBuffer
[i
]);
918 pOutbufOps
->Clear_Queue(hMFCHandle
);
927 OMX_ERRORTYPE
Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
929 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
930 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
931 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
932 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
933 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
934 void *hMFCHandle
= pMFCMpeg4Handle
->hMFCHandle
;
935 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
936 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
937 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
939 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
940 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
941 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
942 ExynosVideoEncParam
*pEncParam
= NULL
;
944 ExynosVideoGeometry bufferConf
;
945 OMX_U32 inputBufferNumber
= 0;
950 if ((oneFrameSize
<= 0) && (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
951 OMX_BUFFERHEADERTYPE
*OMXBuffer
= NULL
;
952 OMXBuffer
= Exynos_OutputBufferGetQueue_Direct(pExynosComponent
);
953 if (OMXBuffer
== NULL
) {
954 ret
= OMX_ErrorUndefined
;
958 OMXBuffer
->nTimeStamp
= pSrcInputData
->timeStamp
;
959 OMXBuffer
->nFlags
= pSrcInputData
->nFlags
;
960 Exynos_OMX_OutputBufferReturn(pOMXComponent
, OMXBuffer
);
966 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
967 Set_Mpeg4Enc_Param(pExynosComponent
);
969 Set_H263Enc_Param(pExynosComponent
);
971 pEncParam
= &pMFCMpeg4Handle
->encParam
;
972 if (pEncOps
->Set_EncParam
) {
973 if(pEncOps
->Set_EncParam(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, pEncParam
) != VIDEO_ERROR_NONE
) {
974 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
975 ret
= OMX_ErrorInsufficientResources
;
980 /* input buffer info: only 3 config values needed */
981 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
982 bufferConf
.eColorFormat
= pEncParam
->commonParam
.FrameMap
;
983 bufferConf
.nFrameWidth
= pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
984 bufferConf
.nFrameHeight
= pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
985 pInbufOps
->Set_Shareable(hMFCHandle
);
986 if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
987 inputBufferNumber
= MAX_INPUTBUFFER_NUM_DYNAMIC
;
988 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
989 inputBufferNumber
= MFC_INPUT_BUFFER_NUM_MAX
;
992 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
993 /* should be done before prepare input buffer */
994 if (pInbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
995 ret
= OMX_ErrorInsufficientResources
;
1000 /* set input buffer geometry */
1001 if (pInbufOps
->Set_Geometry
) {
1002 if (pInbufOps
->Set_Geometry(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
1003 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
1004 ret
= OMX_ErrorInsufficientResources
;
1009 /* setup input buffer */
1010 if (pInbufOps
->Setup(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, inputBufferNumber
) != VIDEO_ERROR_NONE
) {
1011 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup input buffer");
1012 ret
= OMX_ErrorInsufficientResources
;
1016 ExynosVideoPlane planes
[MFC_INPUT_BUFFER_PLANE
];
1019 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1020 ret
= Mpeg4CodecRegistCodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
);
1021 if (ret
!= OMX_ErrorNone
)
1023 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1024 if (pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
1028 /* Does not require any actions. */
1030 ret
= OMX_ErrorNotImplemented
;
1035 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCSrc
= OMX_TRUE
;
1036 ret
= OMX_ErrorNone
;
1044 OMX_ERRORTYPE
Mpeg4CodecDstSetup(OMX_COMPONENTTYPE
*pOMXComponent
)
1046 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1047 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1048 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1049 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1050 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
1051 void *hMFCHandle
= pMFCMpeg4Handle
->hMFCHandle
;
1052 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1053 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1055 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1056 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1057 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1058 ExynosVideoGeometry bufferConf
;
1063 int OutBufferSize
= pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
* 3 / 2;
1064 /* set geometry for output (dst) */
1065 if (pOutbufOps
->Set_Geometry
) {
1066 /* only 2 config values needed */
1067 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1068 bufferConf
.eCompressionFormat
= VIDEO_CODING_MPEG4
;
1070 bufferConf
.eCompressionFormat
= VIDEO_CODING_H263
;
1071 bufferConf
.nSizeImage
= OutBufferSize
;
1073 if (pOutbufOps
->Set_Geometry(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
1074 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for output buffer");
1075 ret
= OMX_ErrorInsufficientResources
;
1080 /* should be done before prepare output buffer */
1081 if (pOutbufOps
->Enable_Cacheable
) {
1082 if (pOutbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1083 ret
= OMX_ErrorInsufficientResources
;
1088 if (pOutbufOps
->Set_Shareable
) {
1089 pOutbufOps
->Set_Shareable(hMFCHandle
);
1091 int SetupBufferNumber
= 0;
1092 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
)
1093 SetupBufferNumber
= MFC_OUTPUT_BUFFER_NUM_MAX
;
1095 SetupBufferNumber
= pExynosOutputPort
->portDefinition
.nBufferCountActual
;
1096 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SetupBufferNumber:%d", SetupBufferNumber
);
1098 if (pOutbufOps
->Setup(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, SetupBufferNumber
) != VIDEO_ERROR_NONE
) {
1099 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1100 ret
= OMX_ErrorInsufficientResources
;
1104 OMX_U32 dataLen
[MFC_OUTPUT_BUFFER_PLANE
] = {0};
1105 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1106 OMX_U32 nPlaneSize
[MFC_OUTPUT_BUFFER_PLANE
] = {0};
1107 nPlaneSize
[0] = OutBufferSize
;
1108 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, MFC_OUTPUT_BUFFER_NUM_MAX
, nPlaneSize
);
1109 if (ret
!= OMX_ErrorNone
)
1112 ret
= Mpeg4CodecRegistCodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, MFC_OUTPUT_BUFFER_NUM_MAX
);
1113 if (ret
!= OMX_ErrorNone
)
1116 /* Enqueue output buffer */
1117 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
1118 pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pVideoEnc
->pMFCEncOutputBuffer
[i
]->pVirAddr
,
1119 (unsigned int *)dataLen
, MFC_OUTPUT_BUFFER_PLANE
, NULL
);
1121 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1122 /* Register output buffer */
1126 ExynosVideoPlane plane
;
1127 for (i
= 0; i
< pExynosOutputPort
->portDefinition
.nBufferCountActual
; i
++) {
1128 plane
.addr
= pExynosOutputPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
;
1129 plane
.fd
= pExynosOutputPort
->extendBufferHeader
[i
].buf_fd
[0];
1130 plane
.allocSize
= OutBufferSize
;
1131 if (pOutbufOps
->Register(hMFCHandle
, &plane
, MFC_OUTPUT_BUFFER_PLANE
) != VIDEO_ERROR_NONE
) {
1132 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register output buffer");
1133 ret
= OMX_ErrorInsufficientResources
;
1138 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
= OMX_TRUE
;
1140 ret
= OMX_ErrorNone
;
1148 OMX_ERRORTYPE
Exynos_Mpeg4Enc_GetParameter(
1149 OMX_IN OMX_HANDLETYPE hComponent
,
1150 OMX_IN OMX_INDEXTYPE nParamIndex
,
1151 OMX_INOUT OMX_PTR pComponentParameterStructure
)
1153 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1154 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1155 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1159 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1160 ret
= OMX_ErrorBadParameter
;
1163 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1164 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1165 if (ret
!= OMX_ErrorNone
) {
1168 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1169 ret
= OMX_ErrorBadParameter
;
1173 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1174 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1175 ret
= OMX_ErrorInvalidState
;
1179 switch (nParamIndex
) {
1180 case OMX_IndexParamVideoMpeg4
:
1182 OMX_VIDEO_PARAM_MPEG4TYPE
*pDstMpeg4Component
= (OMX_VIDEO_PARAM_MPEG4TYPE
*)pComponentParameterStructure
;
1183 OMX_VIDEO_PARAM_MPEG4TYPE
*pSrcMpeg4Component
= NULL
;
1184 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1186 ret
= Exynos_OMX_Check_SizeVersion(pDstMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1187 if (ret
!= OMX_ErrorNone
) {
1191 if (pDstMpeg4Component
->nPortIndex
>= ALL_PORT_NUM
) {
1192 ret
= OMX_ErrorBadPortIndex
;
1196 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1197 pSrcMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pDstMpeg4Component
->nPortIndex
];
1199 Exynos_OSAL_Memcpy(pDstMpeg4Component
, pSrcMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1202 case OMX_IndexParamVideoH263
:
1204 OMX_VIDEO_PARAM_H263TYPE
*pDstH263Component
= (OMX_VIDEO_PARAM_H263TYPE
*)pComponentParameterStructure
;
1205 OMX_VIDEO_PARAM_H263TYPE
*pSrcH263Component
= NULL
;
1206 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1208 ret
= Exynos_OMX_Check_SizeVersion(pDstH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1209 if (ret
!= OMX_ErrorNone
) {
1213 if (pDstH263Component
->nPortIndex
>= ALL_PORT_NUM
) {
1214 ret
= OMX_ErrorBadPortIndex
;
1218 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1219 pSrcH263Component
= &pMpeg4Enc
->h263Component
[pDstH263Component
->nPortIndex
];
1221 Exynos_OSAL_Memcpy(pDstH263Component
, pSrcH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1224 case OMX_IndexParamStandardComponentRole
:
1227 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1228 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1229 if (ret
!= OMX_ErrorNone
) {
1233 codecType
= ((EXYNOS_MPEG4ENC_HANDLE
*)(((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
))->hMFCMpeg4Handle
.codecType
;
1234 if (codecType
== CODEC_TYPE_MPEG4
)
1235 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE
);
1237 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE
);
1240 case OMX_IndexParamVideoProfileLevelQuerySupported
:
1242 OMX_VIDEO_PARAM_PROFILELEVELTYPE
*pDstProfileLevel
= (OMX_VIDEO_PARAM_PROFILELEVELTYPE
*)pComponentParameterStructure
;
1243 EXYNOS_OMX_VIDEO_PROFILELEVEL
*pProfileLevel
= NULL
;
1244 OMX_U32 maxProfileLevelNum
= 0;
1247 ret
= Exynos_OMX_Check_SizeVersion(pDstProfileLevel
, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE
));
1248 if (ret
!= OMX_ErrorNone
) {
1252 if (pDstProfileLevel
->nPortIndex
>= ALL_PORT_NUM
) {
1253 ret
= OMX_ErrorBadPortIndex
;
1257 codecType
= ((EXYNOS_MPEG4ENC_HANDLE
*)(((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
))->hMFCMpeg4Handle
.codecType
;
1258 if (codecType
== CODEC_TYPE_MPEG4
) {
1259 pProfileLevel
= supportedMPEG4ProfileLevels
;
1260 maxProfileLevelNum
= sizeof(supportedMPEG4ProfileLevels
) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL
);
1262 pProfileLevel
= supportedH263ProfileLevels
;
1263 maxProfileLevelNum
= sizeof(supportedH263ProfileLevels
) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL
);
1266 if (pDstProfileLevel
->nProfileIndex
>= maxProfileLevelNum
) {
1267 ret
= OMX_ErrorNoMore
;
1271 pProfileLevel
+= pDstProfileLevel
->nProfileIndex
;
1272 pDstProfileLevel
->eProfile
= pProfileLevel
->profile
;
1273 pDstProfileLevel
->eLevel
= pProfileLevel
->level
;
1276 case OMX_IndexParamVideoProfileLevelCurrent
:
1278 OMX_VIDEO_PARAM_PROFILELEVELTYPE
*pDstProfileLevel
= (OMX_VIDEO_PARAM_PROFILELEVELTYPE
*)pComponentParameterStructure
;
1279 OMX_VIDEO_PARAM_MPEG4TYPE
*pSrcMpeg4Component
= NULL
;
1280 OMX_VIDEO_PARAM_H263TYPE
*pSrcH263Component
= NULL
;
1281 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1284 ret
= Exynos_OMX_Check_SizeVersion(pDstProfileLevel
, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE
));
1285 if (ret
!= OMX_ErrorNone
) {
1289 if (pDstProfileLevel
->nPortIndex
>= ALL_PORT_NUM
) {
1290 ret
= OMX_ErrorBadPortIndex
;
1294 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1295 codecType
= pMpeg4Enc
->hMFCMpeg4Handle
.codecType
;
1296 if (codecType
== CODEC_TYPE_MPEG4
) {
1297 pSrcMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pDstProfileLevel
->nPortIndex
];
1298 pDstProfileLevel
->eProfile
= pSrcMpeg4Component
->eProfile
;
1299 pDstProfileLevel
->eLevel
= pSrcMpeg4Component
->eLevel
;
1301 pSrcH263Component
= &pMpeg4Enc
->h263Component
[pDstProfileLevel
->nPortIndex
];
1302 pDstProfileLevel
->eProfile
= pSrcH263Component
->eProfile
;
1303 pDstProfileLevel
->eLevel
= pSrcH263Component
->eLevel
;
1307 case OMX_IndexParamVideoErrorCorrection
:
1309 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1310 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= NULL
;
1311 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1313 ret
= Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1314 if (ret
!= OMX_ErrorNone
) {
1318 if (pDstErrorCorrectionType
->nPortIndex
!= OUTPUT_PORT_INDEX
) {
1319 ret
= OMX_ErrorBadPortIndex
;
1323 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1324 pSrcErrorCorrectionType
= &pMpeg4Enc
->errorCorrectionType
[OUTPUT_PORT_INDEX
];
1326 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1327 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1328 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1329 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1330 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1334 ret
= Exynos_OMX_VideoEncodeGetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1343 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SetParameter(
1344 OMX_IN OMX_HANDLETYPE hComponent
,
1345 OMX_IN OMX_INDEXTYPE nIndex
,
1346 OMX_IN OMX_PTR pComponentParameterStructure
)
1348 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1349 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1350 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1354 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1355 ret
= OMX_ErrorBadParameter
;
1358 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1359 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1360 if (ret
!= OMX_ErrorNone
) {
1363 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1364 ret
= OMX_ErrorBadParameter
;
1368 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1369 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1370 ret
= OMX_ErrorInvalidState
;
1375 case OMX_IndexParamVideoMpeg4
:
1377 OMX_VIDEO_PARAM_MPEG4TYPE
*pDstMpeg4Component
= NULL
;
1378 OMX_VIDEO_PARAM_MPEG4TYPE
*pSrcMpeg4Component
= (OMX_VIDEO_PARAM_MPEG4TYPE
*)pComponentParameterStructure
;
1379 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1381 ret
= Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1382 if (ret
!= OMX_ErrorNone
) {
1386 if (pSrcMpeg4Component
->nPortIndex
>= ALL_PORT_NUM
) {
1387 ret
= OMX_ErrorBadPortIndex
;
1391 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1392 pDstMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pSrcMpeg4Component
->nPortIndex
];
1394 Exynos_OSAL_Memcpy(pDstMpeg4Component
, pSrcMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1397 case OMX_IndexParamVideoH263
:
1399 OMX_VIDEO_PARAM_H263TYPE
*pDstH263Component
= NULL
;
1400 OMX_VIDEO_PARAM_H263TYPE
*pSrcH263Component
= (OMX_VIDEO_PARAM_H263TYPE
*)pComponentParameterStructure
;
1401 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1403 ret
= Exynos_OMX_Check_SizeVersion(pSrcH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1404 if (ret
!= OMX_ErrorNone
) {
1408 if (pSrcH263Component
->nPortIndex
>= ALL_PORT_NUM
) {
1409 ret
= OMX_ErrorBadPortIndex
;
1413 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1414 pDstH263Component
= &pMpeg4Enc
->h263Component
[pSrcH263Component
->nPortIndex
];
1416 Exynos_OSAL_Memcpy(pDstH263Component
, pSrcH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1419 case OMX_IndexParamStandardComponentRole
:
1421 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1423 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1424 if (ret
!= OMX_ErrorNone
) {
1428 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1429 ret
= OMX_ErrorIncorrectStateOperation
;
1433 if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE
)) {
1434 pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingMPEG4
;
1435 //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4;
1436 } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE
)) {
1437 pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingH263
;
1438 //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263;
1440 ret
= OMX_ErrorBadParameter
;
1445 case OMX_IndexParamVideoProfileLevelCurrent
:
1447 OMX_VIDEO_PARAM_PROFILELEVELTYPE
*pSrcProfileLevel
= (OMX_VIDEO_PARAM_PROFILELEVELTYPE
*)pComponentParameterStructure
;
1448 OMX_VIDEO_PARAM_MPEG4TYPE
*pDstMpeg4Component
= NULL
;
1449 OMX_VIDEO_PARAM_H263TYPE
*pDstH263Component
= NULL
;
1450 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1453 ret
= Exynos_OMX_Check_SizeVersion(pSrcProfileLevel
, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE
));
1454 if (ret
!= OMX_ErrorNone
)
1457 if (pSrcProfileLevel
->nPortIndex
>= ALL_PORT_NUM
) {
1458 ret
= OMX_ErrorBadPortIndex
;
1462 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1463 codecType
= pMpeg4Enc
->hMFCMpeg4Handle
.codecType
;
1464 if (codecType
== CODEC_TYPE_MPEG4
) {
1466 * To do: Check validity of profile & level parameters
1469 pDstMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pSrcProfileLevel
->nPortIndex
];
1470 pDstMpeg4Component
->eProfile
= pSrcProfileLevel
->eProfile
;
1471 pDstMpeg4Component
->eLevel
= pSrcProfileLevel
->eLevel
;
1474 * To do: Check validity of profile & level parameters
1477 pDstH263Component
= &pMpeg4Enc
->h263Component
[pSrcProfileLevel
->nPortIndex
];
1478 pDstH263Component
->eProfile
= pSrcProfileLevel
->eProfile
;
1479 pDstH263Component
->eLevel
= pSrcProfileLevel
->eLevel
;
1483 case OMX_IndexParamVideoErrorCorrection
:
1485 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1486 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= NULL
;
1487 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1489 ret
= Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1490 if (ret
!= OMX_ErrorNone
) {
1494 if (pSrcErrorCorrectionType
->nPortIndex
!= OUTPUT_PORT_INDEX
) {
1495 ret
= OMX_ErrorBadPortIndex
;
1499 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1500 pDstErrorCorrectionType
= &pMpeg4Enc
->errorCorrectionType
[OUTPUT_PORT_INDEX
];
1502 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1503 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1504 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1505 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1506 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1510 ret
= Exynos_OMX_VideoEncodeSetParameter(hComponent
, nIndex
, pComponentParameterStructure
);
1519 OMX_ERRORTYPE
Exynos_Mpeg4Enc_GetConfig(
1520 OMX_IN OMX_HANDLETYPE hComponent
,
1521 OMX_IN OMX_INDEXTYPE nIndex
,
1522 OMX_IN OMX_PTR pComponentConfigStructure
)
1524 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1525 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1526 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1530 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1531 ret
= OMX_ErrorBadParameter
;
1534 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1535 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1536 if (ret
!= OMX_ErrorNone
) {
1539 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1540 ret
= OMX_ErrorBadParameter
;
1543 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1544 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1545 ret
= OMX_ErrorInvalidState
;
1551 ret
= Exynos_OMX_VideoEncodeGetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1561 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SetConfig(
1562 OMX_IN OMX_HANDLETYPE hComponent
,
1563 OMX_IN OMX_INDEXTYPE nIndex
,
1564 OMX_IN OMX_PTR pComponentConfigStructure
)
1566 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1567 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1568 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1569 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1570 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1574 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1575 ret
= OMX_ErrorBadParameter
;
1578 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1579 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1580 if (ret
!= OMX_ErrorNone
) {
1583 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1584 ret
= OMX_ErrorBadParameter
;
1587 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1588 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1589 ret
= OMX_ErrorInvalidState
;
1593 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1594 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
1597 case OMX_IndexConfigVideoIntraPeriod
:
1599 OMX_U32 nPFrames
= (*((OMX_U32
*)pComponentConfigStructure
)) - 1;
1601 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1602 pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
= nPFrames
;
1604 pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
= nPFrames
;
1606 ret
= OMX_ErrorNone
;
1610 ret
= Exynos_OMX_VideoEncodeSetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1615 if (ret
== OMX_ErrorNone
)
1616 pVideoEnc
->configChange
= OMX_TRUE
;
1623 OMX_ERRORTYPE
Exynos_Mpeg4Enc_GetExtensionIndex(
1624 OMX_IN OMX_HANDLETYPE hComponent
,
1625 OMX_IN OMX_STRING cParameterName
,
1626 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1628 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1629 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1630 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1634 if (hComponent
== NULL
) {
1635 ret
= OMX_ErrorBadParameter
;
1638 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1639 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1640 if (ret
!= OMX_ErrorNone
) {
1643 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1644 ret
= OMX_ErrorBadParameter
;
1647 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1648 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1649 ret
= OMX_ErrorBadParameter
;
1652 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1653 ret
= OMX_ErrorInvalidState
;
1656 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD
) == 0) {
1657 *pIndexType
= OMX_IndexConfigVideoIntraPeriod
;
1658 ret
= OMX_ErrorNone
;
1660 ret
= Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1669 OMX_ERRORTYPE
Exynos_Mpeg4Enc_ComponentRoleEnum(
1670 OMX_IN OMX_HANDLETYPE hComponent
,
1671 OMX_OUT OMX_U8
*cRole
,
1672 OMX_IN OMX_U32 nIndex
)
1674 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1675 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1676 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1681 if ((hComponent
== NULL
) || (cRole
== NULL
)) {
1682 ret
= OMX_ErrorBadParameter
;
1685 if (nIndex
!= (MAX_COMPONENT_ROLE_NUM
- 1)) { /* supports only one role */
1686 ret
= OMX_ErrorNoMore
;
1689 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1690 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1691 if (ret
!= OMX_ErrorNone
) {
1694 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1695 ret
= OMX_ErrorBadParameter
;
1699 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1700 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1701 ret
= OMX_ErrorInvalidState
;
1705 codecType
= ((EXYNOS_MPEG4ENC_HANDLE
*)(((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
))->hMFCMpeg4Handle
.codecType
;
1706 if (codecType
== CODEC_TYPE_MPEG4
)
1707 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE
);
1709 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE
);
1718 OMX_ERRORTYPE
Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE
*pOMXComponent
)
1720 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1721 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1722 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1723 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1724 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1725 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;;
1726 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
1727 OMX_PTR hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1728 OMX_COLOR_FORMATTYPE eColorFormat
;
1730 ExynosVideoEncOps
*pEncOps
= NULL
;
1731 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
1732 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
1734 CSC_METHOD csc_method
= CSC_METHOD_SW
;
1739 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCSrc
= OMX_FALSE
;
1740 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
= OMX_FALSE
;
1741 pVideoEnc
->bFirstOutput
= OMX_FALSE
;
1742 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
1743 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1745 eColorFormat
= pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
;
1746 if (pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
1747 if (eColorFormat
== OMX_COLOR_FormatAndroidOpaque
) {
1748 pExynosInputPort
->bufferProcessType
= BUFFER_COPY
;
1750 pExynosInputPort
->bufferProcessType
= BUFFER_SHARE
;
1753 pExynosInputPort
->bufferProcessType
= BUFFER_COPY
;
1756 /* Mpeg4/H.263 Codec Open */
1757 ret
= Mpeg4CodecOpen(pMpeg4Enc
);
1758 if (ret
!= OMX_ErrorNone
) {
1762 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1763 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1764 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1766 if ((pExynosInputPort
->bStoreMetaData
!= OMX_TRUE
) &&
1767 (eColorFormat
!= OMX_COLOR_FormatAndroidOpaque
)) {
1768 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1769 OMX_U32 nPlaneSize
[MFC_INPUT_BUFFER_PLANE
] = {0, };
1770 nPlaneSize
[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE
;
1771 nPlaneSize
[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE
;
1773 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->codecSemID
);
1774 Exynos_OSAL_QueueCreate(&pExynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1776 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
, nPlaneSize
);
1777 if (ret
!= OMX_ErrorNone
)
1780 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1781 Exynos_CodecBufferEnqueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
1782 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1786 /* Does not require any actions. */
1790 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1791 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->codecSemID
);
1792 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1793 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1797 /* Does not require any actions. */
1800 pMpeg4Enc
->bSourceStart
= OMX_FALSE
;
1801 Exynos_OSAL_SignalCreate(&pMpeg4Enc
->hSourceStartEvent
);
1802 pMpeg4Enc
->bDestinationStart
= OMX_FALSE
;
1803 Exynos_OSAL_SignalCreate(&pMpeg4Enc
->hDestinationStartEvent
);
1805 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
1806 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
1807 pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
= 0;
1808 pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
= 0;
1810 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
1813 csc_method
= CSC_METHOD_HW
;
1815 pVideoEnc
->csc_handle
= csc_init(csc_method
);
1816 if (pVideoEnc
->csc_handle
== NULL
) {
1817 ret
= OMX_ErrorInsufficientResources
;
1820 pVideoEnc
->csc_set_format
= OMX_FALSE
;
1829 OMX_ERRORTYPE
Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE
*pOMXComponent
)
1831 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1832 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1833 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= ((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
);
1834 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1835 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1836 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1837 OMX_PTR hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1839 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1840 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1841 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1843 int i
= 0, plane
= 0;
1847 if (pVideoEnc
->csc_handle
!= NULL
) {
1848 csc_deinit(pVideoEnc
->csc_handle
);
1849 pVideoEnc
->csc_handle
= NULL
;
1852 Exynos_OSAL_SignalTerminate(pMpeg4Enc
->hDestinationStartEvent
);
1853 pMpeg4Enc
->hDestinationStartEvent
= NULL
;
1854 pMpeg4Enc
->bDestinationStart
= OMX_FALSE
;
1855 Exynos_OSAL_SignalTerminate(pMpeg4Enc
->hSourceStartEvent
);
1856 pMpeg4Enc
->hSourceStartEvent
= NULL
;
1857 pMpeg4Enc
->bSourceStart
= OMX_FALSE
;
1859 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1860 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
1861 Exynos_OSAL_QueueTerminate(&pExynosOutputPort
->codecBufferQ
);
1862 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->codecSemID
);
1863 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1867 /* Does not require any actions. */
1870 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1871 Exynos_Free_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
);
1872 Exynos_OSAL_QueueTerminate(&pExynosInputPort
->codecBufferQ
);
1873 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->codecSemID
);
1874 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1878 /* Does not require any actions. */
1880 Mpeg4CodecClose(pMpeg4Enc
);
1888 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1890 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1891 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1892 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1893 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1894 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1895 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1896 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1897 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
1898 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1899 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1900 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1901 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1906 if (pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1907 ret
= Mpeg4CodecSrcSetup(pOMXComponent
, pSrcInputData
);
1908 if ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)
1911 if (pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
== OMX_FALSE
) {
1912 ret
= Mpeg4CodecDstSetup(pOMXComponent
);
1915 if (pVideoEnc
->configChange
== OMX_TRUE
) {
1916 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1917 Change_Mpeg4Enc_Param(pExynosComponent
);
1919 Change_H263Enc_Param(pExynosComponent
);
1921 pVideoEnc
->configChange
= OMX_FALSE
;
1924 if ((pSrcInputData
->dataLen
> 0) ||
1925 ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
1926 OMX_U32 nAllocLen
[MFC_INPUT_BUFFER_PLANE
] = {0, 0};
1927 OMX_U32 pMFCYUVDataSize
[MFC_INPUT_BUFFER_PLANE
] = {NULL
, NULL
};
1928 ExynosVideoPlane planes
[MFC_INPUT_BUFFER_PLANE
];
1931 pExynosComponent
->timeStamp
[pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
] = pSrcInputData
->timeStamp
;
1932 pExynosComponent
->nFlags
[pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
] = pSrcInputData
->nFlags
;
1933 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
);
1934 pEncOps
->Set_FrameTag(hMFCHandle
, pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
);
1935 pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
++;
1936 pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
%= MAX_TIMESTAMP
;
1938 /* queue work for input buffer */
1939 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize
, pSrcInputData
->bufferHeader
);
1940 pMFCYUVDataSize
[0] = pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
1941 pMFCYUVDataSize
[1] = pMFCYUVDataSize
[0] / 2;
1943 #ifdef USE_METADATABUFFERTYPE
1944 nAllocLen
[0] = ALIGN_TO_16B(pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
) *
1945 ALIGN_TO_16B(pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
);
1946 nAllocLen
[1] = ALIGN(nAllocLen
[0] / 2,256);
1948 if ((pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) &&
1949 (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
)) {
1950 codecReturn
= pInbufOps
->ExtensionEnqueue(hMFCHandle
,
1951 (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1952 (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.fd
,
1953 (unsigned int *)nAllocLen
, (unsigned int *)pMFCYUVDataSize
,
1954 MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1956 codecReturn
= pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1957 (unsigned int *)pMFCYUVDataSize
, MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1960 codecReturn
= pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1961 (unsigned int *)pMFCYUVDataSize
, MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1963 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1964 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__
, __LINE__
);
1965 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
1968 Mpeg4CodecStart(pOMXComponent
, INPUT_PORT_INDEX
);
1969 if (pMpeg4Enc
->bSourceStart
== OMX_FALSE
) {
1970 pMpeg4Enc
->bSourceStart
= OMX_TRUE
;
1971 Exynos_OSAL_SignalSet(pMpeg4Enc
->hSourceStartEvent
);
1972 Exynos_OSAL_SleepMillisec(0);
1974 if (pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) {
1975 pMpeg4Enc
->bDestinationStart
= OMX_TRUE
;
1976 Exynos_OSAL_SignalSet(pMpeg4Enc
->hDestinationStartEvent
);
1977 Exynos_OSAL_SleepMillisec(0);
1981 ret
= OMX_ErrorNone
;
1989 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1991 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1992 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1993 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1994 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1995 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1996 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1997 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1998 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1999 ExynosVideoBuffer
*pVideoBuffer
;
2000 ExynosVideoBuffer videoBuffer
;
2004 if ((pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) &&
2005 (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
)) {
2006 if (pInbufOps
->ExtensionDequeue(hMFCHandle
, &videoBuffer
) == VIDEO_ERROR_NONE
)
2007 pVideoBuffer
= &videoBuffer
;
2009 pVideoBuffer
= NULL
;
2011 pVideoBuffer
= pInbufOps
->Dequeue(hMFCHandle
);
2014 pSrcOutputData
->dataLen
= 0;
2015 pSrcOutputData
->usedDataLen
= 0;
2016 pSrcOutputData
->remainDataLen
= 0;
2017 pSrcOutputData
->nFlags
= 0;
2018 pSrcOutputData
->timeStamp
= 0;
2020 if (pVideoBuffer
== NULL
) {
2021 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= NULL
;
2022 pSrcOutputData
->allocSize
= 0;
2023 pSrcOutputData
->pPrivate
= NULL
;
2024 pSrcOutputData
->bufferHeader
= NULL
;
2027 for (plane
= 0; plane
< MFC_INPUT_BUFFER_PLANE
; plane
++) {
2028 pSrcOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] = pVideoBuffer
->planes
[plane
].addr
;
2029 pSrcOutputData
->buffer
.multiPlaneBuffer
.fd
[plane
] = pVideoBuffer
->planes
[plane
].fd
;
2031 pSrcOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
+
2032 pVideoBuffer
->planes
[1].allocSize
+
2033 pVideoBuffer
->planes
[2].allocSize
;
2035 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
2037 while (pSrcOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] != pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]) {
2038 if (i
>= MFC_INPUT_BUFFER_NUM_MAX
) {
2039 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - Lost buffer", __FUNCTION__
, __LINE__
);
2040 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2045 pVideoEnc
->pMFCEncInputBuffer
[i
]->dataSize
= 0;
2046 pSrcOutputData
->pPrivate
= pVideoEnc
->pMFCEncInputBuffer
[i
];
2049 /* For Share Buffer */
2050 pSrcOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
2053 ret
= OMX_ErrorNone
;
2061 OMX_ERRORTYPE
Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2063 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2064 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2065 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2066 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2067 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
2068 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
2069 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
2070 OMX_U32 dataLen
= 0;
2071 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
2075 if (pDstInputData
->buffer
.singlePlaneBuffer
.dataBuffer
== NULL
) {
2076 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to find input buffer");
2077 ret
= OMX_ErrorBadParameter
;
2081 codecReturn
= pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)&pDstInputData
->buffer
.singlePlaneBuffer
.dataBuffer
,
2082 (unsigned int *)&dataLen
, MFC_OUTPUT_BUFFER_PLANE
, pDstInputData
->bufferHeader
);
2084 if (codecReturn
!= VIDEO_ERROR_NONE
) {
2085 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__
, __LINE__
);
2086 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2089 Mpeg4CodecStart(pOMXComponent
, OUTPUT_PORT_INDEX
);
2091 ret
= OMX_ErrorNone
;
2099 OMX_ERRORTYPE
Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2101 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2102 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2103 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2104 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2105 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2106 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
2107 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
2108 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
2109 ExynosVideoBuffer
*pVideoBuffer
;
2110 ExynosVideoFrameStatusType displayStatus
= VIDEO_FRAME_STATUS_UNKNOWN
;
2111 ExynosVideoGeometry bufferGeometry
;
2112 OMX_S32 indexTimestamp
= 0;
2116 if (pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) {
2117 ret
= OMX_ErrorNone
;
2121 if ((pVideoBuffer
= pOutbufOps
->Dequeue(hMFCHandle
)) == NULL
) {
2122 ret
= OMX_ErrorNone
;
2126 pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
++;
2127 pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
%= MAX_TIMESTAMP
;
2129 pDstOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= pVideoBuffer
->planes
[0].addr
;
2130 pDstOutputData
->buffer
.singlePlaneBuffer
.fd
= pVideoBuffer
->planes
[0].fd
;
2131 pDstOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
;
2132 pDstOutputData
->dataLen
= pVideoBuffer
->planes
[0].dataSize
;
2133 pDstOutputData
->remainDataLen
= pVideoBuffer
->planes
[0].dataSize
;
2134 pDstOutputData
->usedDataLen
= 0;
2135 pDstOutputData
->pPrivate
= pVideoBuffer
;
2136 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2138 pDstOutputData
->pPrivate
= NULL
;
2139 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
2140 if (pDstOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
==
2141 pVideoEnc
->pMFCEncOutputBuffer
[i
]->pVirAddr
[0]) {
2142 pDstOutputData
->pPrivate
= pVideoEnc
->pMFCEncOutputBuffer
[i
]->pVirAddr
[0];
2147 if (pDstOutputData
->pPrivate
== NULL
) {
2148 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
2149 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2154 /* For Share Buffer */
2155 pDstOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
2157 if (pVideoEnc
->bFirstOutput
== OMX_FALSE
) {
2160 /* start header return */
2161 pDstOutputData
->timeStamp
= 0;
2162 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_CODECCONFIG
;
2163 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_ENDOFFRAME
;
2164 pVideoEnc
->bFirstOutput
= OMX_TRUE
;
2166 indexTimestamp
= pEncOps
->Get_FrameTag(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
);
2167 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
2168 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
];
2169 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
];
2171 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
2172 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
2175 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_ENDOFFRAME
;
2176 if (pVideoBuffer
->frameType
== VIDEO_FRAME_I
)
2177 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_SYNCFRAME
;
2180 if ((displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
2181 ((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
2182 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%x displayStatus:%d, nFlags0x%x", pExynosComponent
, displayStatus
, pDstOutputData
->nFlags
);
2183 pDstOutputData
->remainDataLen
= 0;
2186 ret
= OMX_ErrorNone
;
2194 OMX_ERRORTYPE
Exynos_Mpeg4Enc_srcInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
2196 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2197 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2198 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2199 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2203 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2204 ret
= OMX_ErrorNone
;
2207 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2208 ret
= OMX_ErrorNone
;
2212 ret
= Exynos_Mpeg4Enc_SrcIn(pOMXComponent
, pSrcInputData
);
2213 if (ret
!= OMX_ErrorNone
) {
2214 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__
, __LINE__
);
2215 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2216 pExynosComponent
->callbackData
,
2217 OMX_EventError
, ret
, 0, NULL
);
2226 OMX_ERRORTYPE
Exynos_Mpeg4Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
2228 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2229 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2230 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2231 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2235 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2236 ret
= OMX_ErrorNone
;
2240 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
2241 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2242 ret
= OMX_ErrorNone
;
2246 if ((pMpeg4Enc
->bSourceStart
== OMX_FALSE
) &&
2247 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort
))) {
2248 Exynos_OSAL_SignalWait(pMpeg4Enc
->hSourceStartEvent
, DEF_MAX_WAIT_TIME
);
2249 Exynos_OSAL_SignalReset(pMpeg4Enc
->hSourceStartEvent
);
2252 ret
= Exynos_Mpeg4Enc_SrcOut(pOMXComponent
, pSrcOutputData
);
2253 if ((ret
!= OMX_ErrorNone
) && (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2254 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__
, __LINE__
);
2255 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2256 pExynosComponent
->callbackData
,
2257 OMX_EventError
, ret
, 0, NULL
);
2266 OMX_ERRORTYPE
Exynos_Mpeg4Enc_dstInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2268 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2269 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2270 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2271 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2275 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2276 ret
= OMX_ErrorNone
;
2279 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2280 ret
= OMX_ErrorNone
;
2283 if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
2284 if ((pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) &&
2285 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2286 Exynos_OSAL_SignalWait(pMpeg4Enc
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2287 Exynos_OSAL_SignalReset(pMpeg4Enc
->hDestinationStartEvent
);
2290 if (pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
== OMX_TRUE
) {
2291 ret
= Exynos_Mpeg4Enc_DstIn(pOMXComponent
, pDstInputData
);
2292 if (ret
!= OMX_ErrorNone
) {
2293 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__
, __LINE__
);
2294 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2295 pExynosComponent
->callbackData
,
2296 OMX_EventError
, ret
, 0, NULL
);
2306 OMX_ERRORTYPE
Exynos_Mpeg4Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2308 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2309 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2310 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2311 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2315 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2316 ret
= OMX_ErrorNone
;
2319 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2320 ret
= OMX_ErrorNone
;
2324 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2325 if ((pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) &&
2326 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2327 Exynos_OSAL_SignalWait(pMpeg4Enc
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2328 Exynos_OSAL_SignalReset(pMpeg4Enc
->hDestinationStartEvent
);
2331 ret
= Exynos_Mpeg4Enc_DstOut(pOMXComponent
, pDstOutputData
);
2332 if ((ret
!= OMX_ErrorNone
) && (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2333 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__
, __LINE__
);
2334 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2335 pExynosComponent
->callbackData
,
2336 OMX_EventError
, ret
, 0, NULL
);
2345 OSCL_EXPORT_REF OMX_ERRORTYPE
Exynos_OMX_ComponentInit(
2346 OMX_HANDLETYPE hComponent
,
2347 OMX_STRING componentName
)
2349 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2350 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2351 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2352 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
2353 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
2354 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
2355 OMX_S32 codecType
= -1;
2360 if ((hComponent
== NULL
) || (componentName
== NULL
)) {
2361 ret
= OMX_ErrorBadParameter
;
2362 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: parameters are null, ret: %X", __FUNCTION__
, ret
);
2365 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC
, componentName
) == 0) {
2366 codecType
= CODEC_TYPE_MPEG4
;
2367 } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC
, componentName
) == 0) {
2368 codecType
= CODEC_TYPE_H263
;
2370 ret
= OMX_ErrorBadParameter
;
2371 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: componentName(%s) error, ret: %X", __FUNCTION__
, componentName
, ret
);
2375 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2376 ret
= Exynos_OMX_VideoEncodeComponentInit(pOMXComponent
);
2377 if (ret
!= OMX_ErrorNone
) {
2378 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__
, ret
);
2381 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2382 pExynosComponent
->codecType
= HW_VIDEO_ENC_CODEC
;
2384 pExynosComponent
->componentName
= (OMX_STRING
)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE
);
2385 if (pExynosComponent
->componentName
== NULL
) {
2386 Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2387 ret
= OMX_ErrorInsufficientResources
;
2388 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: componentName alloc error, ret: %X", __FUNCTION__
, ret
);
2391 Exynos_OSAL_Memset(pExynosComponent
->componentName
, 0, MAX_OMX_COMPONENT_NAME_SIZE
);
2393 pMpeg4Enc
= Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE
));
2394 if (pMpeg4Enc
== NULL
) {
2395 Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2396 ret
= OMX_ErrorInsufficientResources
;
2397 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__
, ret
);
2400 Exynos_OSAL_Memset(pMpeg4Enc
, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE
));
2401 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2402 pVideoEnc
->hCodecHandle
= (OMX_HANDLETYPE
)pMpeg4Enc
;
2403 pMpeg4Enc
->hMFCMpeg4Handle
.codecType
= codecType
;
2405 if (codecType
== CODEC_TYPE_MPEG4
)
2406 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_MPEG4_ENC
);
2408 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_H263_ENC
);
2410 /* Set componentVersion */
2411 pExynosComponent
->componentVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2412 pExynosComponent
->componentVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2413 pExynosComponent
->componentVersion
.s
.nRevision
= REVISION_NUMBER
;
2414 pExynosComponent
->componentVersion
.s
.nStep
= STEP_NUMBER
;
2415 /* Set specVersion */
2416 pExynosComponent
->specVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2417 pExynosComponent
->specVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2418 pExynosComponent
->specVersion
.s
.nRevision
= REVISION_NUMBER
;
2419 pExynosComponent
->specVersion
.s
.nStep
= STEP_NUMBER
;
2422 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2423 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2424 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2425 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
2426 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
2427 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
2428 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
2429 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2430 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2431 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2432 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
2433 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
2434 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2435 pExynosPort
->bufferProcessType
= BUFFER_COPY
;
2436 pExynosPort
->portWayType
= WAY2_PORT
;
2439 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2440 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2441 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2442 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
2443 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
2444 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
2445 if (codecType
== CODEC_TYPE_MPEG4
) {
2446 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingMPEG4
;
2447 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2448 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/mpeg4");
2450 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingH263
;
2451 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2452 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/h263");
2454 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2455 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2456 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
2457 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2458 pExynosPort
->bufferProcessType
= BUFFER_SHARE
;
2459 pExynosPort
->portWayType
= WAY2_PORT
;
2461 if (codecType
== CODEC_TYPE_MPEG4
) {
2462 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
2463 INIT_SET_SIZE_VERSION(&pMpeg4Enc
->mpeg4Component
[i
], OMX_VIDEO_PARAM_MPEG4TYPE
);
2464 pMpeg4Enc
->mpeg4Component
[i
].nPortIndex
= i
;
2465 pMpeg4Enc
->mpeg4Component
[i
].eProfile
= OMX_VIDEO_MPEG4ProfileSimple
;
2466 pMpeg4Enc
->mpeg4Component
[i
].eLevel
= OMX_VIDEO_MPEG4Level4
;
2468 pMpeg4Enc
->mpeg4Component
[i
].nPFrames
= 10;
2469 pMpeg4Enc
->mpeg4Component
[i
].nBFrames
= 0; /* No support for B frames */
2470 pMpeg4Enc
->mpeg4Component
[i
].nMaxPacketSize
= 256; /* Default value */
2471 pMpeg4Enc
->mpeg4Component
[i
].nAllowedPictureTypes
= OMX_VIDEO_PictureTypeI
| OMX_VIDEO_PictureTypeP
;
2472 pMpeg4Enc
->mpeg4Component
[i
].bGov
= OMX_FALSE
;
2476 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
2477 INIT_SET_SIZE_VERSION(&pMpeg4Enc
->h263Component
[i
], OMX_VIDEO_PARAM_H263TYPE
);
2478 pMpeg4Enc
->h263Component
[i
].nPortIndex
= i
;
2479 pMpeg4Enc
->h263Component
[i
].eProfile
= OMX_VIDEO_H263ProfileBaseline
;
2480 pMpeg4Enc
->h263Component
[i
].eLevel
= OMX_VIDEO_H263Level45
;
2482 pMpeg4Enc
->h263Component
[i
].nPFrames
= 20;
2483 pMpeg4Enc
->h263Component
[i
].nBFrames
= 0; /* No support for B frames */
2484 pMpeg4Enc
->h263Component
[i
].bPLUSPTYPEAllowed
= OMX_FALSE
;
2485 pMpeg4Enc
->h263Component
[i
].nAllowedPictureTypes
= OMX_VIDEO_PictureTypeI
| OMX_VIDEO_PictureTypeP
;
2486 pMpeg4Enc
->h263Component
[i
].bForceRoundingTypeToZero
= OMX_TRUE
;
2487 pMpeg4Enc
->h263Component
[i
].nPictureHeaderRepetition
= 0;
2488 pMpeg4Enc
->h263Component
[i
].nGOBHeaderInterval
= 0;
2492 pOMXComponent
->GetParameter
= &Exynos_Mpeg4Enc_GetParameter
;
2493 pOMXComponent
->SetParameter
= &Exynos_Mpeg4Enc_SetParameter
;
2494 pOMXComponent
->GetConfig
= &Exynos_Mpeg4Enc_GetConfig
;
2495 pOMXComponent
->SetConfig
= &Exynos_Mpeg4Enc_SetConfig
;
2496 pOMXComponent
->GetExtensionIndex
= &Exynos_Mpeg4Enc_GetExtensionIndex
;
2497 pOMXComponent
->ComponentRoleEnum
= &Exynos_Mpeg4Enc_ComponentRoleEnum
;
2498 pOMXComponent
->ComponentDeInit
= &Exynos_OMX_ComponentDeinit
;
2500 pExynosComponent
->exynos_codec_componentInit
= &Exynos_Mpeg4Enc_Init
;
2501 pExynosComponent
->exynos_codec_componentTerminate
= &Exynos_Mpeg4Enc_Terminate
;
2503 pVideoEnc
->exynos_codec_srcInputProcess
= &Exynos_Mpeg4Enc_srcInputBufferProcess
;
2504 pVideoEnc
->exynos_codec_srcOutputProcess
= &Exynos_Mpeg4Enc_srcOutputBufferProcess
;
2505 pVideoEnc
->exynos_codec_dstInputProcess
= &Exynos_Mpeg4Enc_dstInputBufferProcess
;
2506 pVideoEnc
->exynos_codec_dstOutputProcess
= &Exynos_Mpeg4Enc_dstOutputBufferProcess
;
2508 pVideoEnc
->exynos_codec_start
= &Mpeg4CodecStart
;
2509 pVideoEnc
->exynos_codec_stop
= &Mpeg4CodecStop
;
2510 pVideoEnc
->exynos_codec_bufferProcessRun
= &Mpeg4CodecOutputBufferProcessRun
;
2511 pVideoEnc
->exynos_codec_enqueueAllBuffer
= &Mpeg4CodecEnqueueAllBuffer
;
2513 pVideoEnc
->exynos_checkInputFrame
= NULL
;
2514 pVideoEnc
->exynos_codec_getCodecInputPrivateData
= &GetCodecInputPrivateData
;
2515 pVideoEnc
->exynos_codec_getCodecOutputPrivateData
= &GetCodecOutputPrivateData
;
2517 pVideoEnc
->hSharedMemory
= Exynos_OSAL_SharedMemory_Open();
2518 if (pVideoEnc
->hSharedMemory
== NULL
) {
2519 Exynos_OSAL_Free(pMpeg4Enc
);
2520 pMpeg4Enc
= ((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2521 Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2522 ret
= OMX_ErrorInsufficientResources
;
2526 pExynosComponent
->currentState
= OMX_StateLoaded
;
2528 ret
= OMX_ErrorNone
;
2536 OMX_ERRORTYPE
Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent
)
2538 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2539 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2540 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2541 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
2542 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
2546 if (hComponent
== NULL
) {
2547 ret
= OMX_ErrorBadParameter
;
2550 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2551 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2552 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2554 Exynos_OSAL_SharedMemory_Close(pVideoEnc
->hSharedMemory
);
2556 Exynos_OSAL_Free(pExynosComponent
->componentName
);
2557 pExynosComponent
->componentName
= NULL
;
2559 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2560 if (pMpeg4Enc
!= NULL
) {
2561 Exynos_OSAL_Free(pMpeg4Enc
);
2562 pMpeg4Enc
= ((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2565 ret
= Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2566 if (ret
!= OMX_ErrorNone
) {
2570 ret
= OMX_ErrorNone
;