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
->Bitrate
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
235 pCommonParam
->FrameQp
= pVideoEnc
->quantization
.nQpI
;
236 pCommonParam
->FrameQp_P
= pVideoEnc
->quantization
.nQpP
;
237 pCommonParam
->QSCodeMax
= 30;
238 pCommonParam
->QSCodeMin
= 10;
239 pCommonParam
->PadControlOn
= 0; /* 0: Use boundary pixel, 1: Use the below setting value */
240 pCommonParam
->LumaPadVal
= 0;
241 pCommonParam
->CbPadVal
= 0;
242 pCommonParam
->CrPadVal
= 0;
244 if (pVideoEnc
->intraRefresh
.eRefreshMode
== OMX_VIDEO_IntraRefreshCyclic
) {
246 pCommonParam
->RandomIntraMBRefresh
= pVideoEnc
->intraRefresh
.nCirMBs
;
247 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "RandomIntraMBRefresh: %d", pCommonParam
->RandomIntraMBRefresh
);
249 /* Don't support "Adaptive" and "Cyclic + Adaptive" */
250 pCommonParam
->RandomIntraMBRefresh
= 0;
253 switch ((EXYNOS_OMX_COLOR_FORMATTYPE
)pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
) {
254 case OMX_COLOR_FormatYUV420SemiPlanar
:
255 case OMX_COLOR_FormatYUV420Planar
: /* Converted to NV12 in Exynos_CSC_InputData */
256 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
258 #ifdef USE_METADATABUFFERTYPE
259 case OMX_COLOR_FormatAndroidOpaque
:
260 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
261 switch (pVideoEnc
->ANBColorFormat
) {
262 case OMX_COLOR_FormatYUV420SemiPlanar
:
263 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
265 case OMX_SEC_COLOR_FormatNV12Tiled
:
266 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
269 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
273 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
277 case OMX_SEC_COLOR_FormatNV21Linear
:
278 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV21
;
280 case OMX_SEC_COLOR_FormatNV12Tiled
:
282 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
286 /* Mpeg4 specific parameters */
287 pMpeg4Param
->ProfileIDC
= OMXMpeg4ProfileToMFCProfile(pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].eProfile
);
288 pMpeg4Param
->LevelIDC
= OMXMpeg4LevelToMFCLevel(pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].eLevel
);
289 pMpeg4Param
->FrameQp_B
= pVideoEnc
->quantization
.nQpB
;
290 pMpeg4Param
->TimeIncreamentRes
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
291 pMpeg4Param
->VopTimeIncreament
= 1;
292 pMpeg4Param
->SliceArgument
= 0; /* MB number or byte number */
293 pMpeg4Param
->NumberBFrames
= 0; /* 0(not used) ~ 2 */
294 pMpeg4Param
->DisableQpelME
= 1;
296 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
]);
297 /* rate control related parameters */
298 switch (pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
]) {
299 case OMX_Video_ControlRateDisable
:
300 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode DBR");
301 pCommonParam
->EnableFRMRateControl
= 0; /* 0: Disable, 1: Frame level RC */
302 pCommonParam
->EnableMBRateControl
= 0; /* 0: Disable, 1:MB level RC */
303 pCommonParam
->CBRPeriodRf
= 100;
305 case OMX_Video_ControlRateConstant
:
306 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode CBR");
307 pCommonParam
->EnableFRMRateControl
= 1; /* 0: Disable, 1: Frame level RC */
308 pCommonParam
->EnableMBRateControl
= 1; /* 0: Disable, 1:MB level RC */
309 pCommonParam
->CBRPeriodRf
= 9;
311 case OMX_Video_ControlRateVariable
:
312 default: /*Android default */
313 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode VBR");
314 pCommonParam
->EnableFRMRateControl
= 1; /* 0: Disable, 1: Frame level RC */
315 pCommonParam
->EnableMBRateControl
= 1; /* 0: Disable, 1:MB level RC */
316 pCommonParam
->CBRPeriodRf
= 100;
320 Print_Mpeg4Enc_Param(pEncParam
);
323 static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
325 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
326 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
327 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
328 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
329 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
;
331 ExynosVideoEncParam
*pEncParam
= NULL
;
332 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
333 ExynosVideoEncH263Param
*pH263Param
= NULL
;
335 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
336 pMpeg4Enc
= pVideoEnc
->hCodecHandle
;
337 pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
338 pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
339 pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
341 pEncParam
= &pMFCMpeg4Handle
->encParam
;
342 pCommonParam
= &pEncParam
->commonParam
;
343 pH263Param
= &pEncParam
->codecParam
.h263
;
344 pEncParam
->eCompressionFormat
= VIDEO_CODING_H263
;
345 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "eCompressionFormat: %d", pEncParam
->eCompressionFormat
);
347 /* common parameters */
348 pCommonParam
->SourceWidth
= pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
;
349 pCommonParam
->SourceHeight
= pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
;
350 pCommonParam
->IDRPeriod
= pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1;
351 pCommonParam
->SliceMode
= 0;
352 pCommonParam
->Bitrate
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
353 pCommonParam
->FrameQp
= pVideoEnc
->quantization
.nQpI
;
354 pCommonParam
->FrameQp_P
= pVideoEnc
->quantization
.nQpP
;
355 pCommonParam
->QSCodeMax
= 30;
356 pCommonParam
->QSCodeMin
= 10;
357 pCommonParam
->PadControlOn
= 0; /* 0: Use boundary pixel, 1: Use the below setting value */
358 pCommonParam
->LumaPadVal
= 0;
359 pCommonParam
->CbPadVal
= 0;
360 pCommonParam
->CrPadVal
= 0;
362 if (pVideoEnc
->intraRefresh
.eRefreshMode
== OMX_VIDEO_IntraRefreshCyclic
) {
364 pCommonParam
->RandomIntraMBRefresh
= pVideoEnc
->intraRefresh
.nCirMBs
;
365 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "RandomIntraMBRefresh: %d", pCommonParam
->RandomIntraMBRefresh
);
367 /* Don't support "Adaptive" and "Cyclic + Adaptive" */
368 pCommonParam
->RandomIntraMBRefresh
= 0;
371 switch ((EXYNOS_OMX_COLOR_FORMATTYPE
)pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
) {
372 case OMX_COLOR_FormatYUV420SemiPlanar
:
373 case OMX_COLOR_FormatYUV420Planar
: /* Converted to NV12 in Exynos_CSC_InputData */
374 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
376 #ifdef USE_METADATABUFFERTYPE
377 case OMX_COLOR_FormatAndroidOpaque
:
378 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
379 switch (pVideoEnc
->ANBColorFormat
) {
380 case OMX_COLOR_FormatYUV420SemiPlanar
:
381 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
383 case OMX_SEC_COLOR_FormatNV12Tiled
:
384 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
387 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
391 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12
;
395 case OMX_SEC_COLOR_FormatNV21Linear
:
396 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV21
;
398 case OMX_SEC_COLOR_FormatNV12Tiled
:
400 pCommonParam
->FrameMap
= VIDEO_COLORFORMAT_NV12_TILED
;
404 /* H263 specific parameters */
405 pH263Param
->FrameRate
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
407 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
]);
408 /* rate control related parameters */
409 switch (pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
]) {
410 case OMX_Video_ControlRateDisable
:
411 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode DBR");
412 pCommonParam
->EnableFRMRateControl
= 0; /* 0: Disable, 1: Frame level RC */
413 pCommonParam
->EnableMBRateControl
= 0; /* 0: Disable, 1:MB level RC */
414 pCommonParam
->CBRPeriodRf
= 100;
416 case OMX_Video_ControlRateConstant
:
417 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode CBR");
418 pCommonParam
->EnableFRMRateControl
= 1; /* 0: Disable, 1: Frame level RC */
419 pCommonParam
->EnableMBRateControl
= 1; /* 0: Disable, 1:MB level RC */
420 pCommonParam
->CBRPeriodRf
= 9;
422 case OMX_Video_ControlRateVariable
:
423 default: /*Android default */
424 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Video Encode VBR");
425 pCommonParam
->EnableFRMRateControl
= 1; /* 0: Disable, 1: Frame level RC */
426 pCommonParam
->EnableMBRateControl
= 1; /* 0: Disable, 1:MB level RC */
427 pCommonParam
->CBRPeriodRf
= 100;
431 Print_H263Enc_Param(pEncParam
);
434 static void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
436 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
437 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
438 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
439 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
440 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
;
442 ExynosVideoEncOps
*pEncOps
= NULL
;
443 ExynosVideoEncParam
*pEncParam
= NULL
;
444 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
445 ExynosVideoEncMpeg4Param
*pMpeg4Param
= NULL
;
449 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
450 pMpeg4Enc
= pVideoEnc
->hCodecHandle
;
451 pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
452 pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
453 pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
454 pEncOps
= pMFCMpeg4Handle
->pEncOps
;
456 pEncParam
= &pMFCMpeg4Handle
->encParam
;
457 pCommonParam
= &pEncParam
->commonParam
;
458 pMpeg4Param
= &pEncParam
->codecParam
.mpeg4
;
460 if (pVideoEnc
->IntraRefreshVOP
== OMX_TRUE
) {
461 setParam
= VIDEO_FRAME_I
;
462 pEncOps
->Set_FrameType(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
463 pVideoEnc
->IntraRefreshVOP
= OMX_FALSE
;
465 if (pCommonParam
->IDRPeriod
!= (int)pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1) {
466 setParam
= pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1;
467 pEncOps
->Set_IDRPeriod(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
469 if (pCommonParam
->Bitrate
!= (int)pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
) {
470 setParam
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
471 pEncOps
->Set_BitRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
473 if (pMpeg4Param
->TimeIncreamentRes
!= (int)((pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16)) {
474 setParam
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
475 pEncOps
->Set_FrameRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
478 Set_Mpeg4Enc_Param(pExynosComponent
);
481 static void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
)
483 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
484 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
485 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
486 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
487 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
;
489 ExynosVideoEncOps
*pEncOps
= NULL
;
490 ExynosVideoEncParam
*pEncParam
= NULL
;
491 ExynosVideoEncCommonParam
*pCommonParam
= NULL
;
492 ExynosVideoEncH263Param
*pH263Param
= NULL
;
496 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
497 pMpeg4Enc
= pVideoEnc
->hCodecHandle
;
498 pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
499 pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
500 pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
501 pEncOps
= pMFCMpeg4Handle
->pEncOps
;
503 pEncParam
= &pMFCMpeg4Handle
->encParam
;
504 pCommonParam
= &pEncParam
->commonParam
;
505 pH263Param
= &pEncParam
->codecParam
.h263
;
507 if (pVideoEnc
->IntraRefreshVOP
== OMX_TRUE
) {
508 setParam
= VIDEO_FRAME_I
;
509 pEncOps
->Set_FrameType(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
510 pVideoEnc
->IntraRefreshVOP
= OMX_FALSE
;
512 if (pCommonParam
->IDRPeriod
!= (int)pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1) {
513 setParam
= pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
+ 1;
514 pEncOps
->Set_IDRPeriod(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
516 if (pCommonParam
->Bitrate
!= (int)pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
) {
517 setParam
= pExynosOutputPort
->portDefinition
.format
.video
.nBitrate
;
518 pEncOps
->Set_BitRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
520 if (pH263Param
->FrameRate
!= (int)((pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16)) {
521 setParam
= (pExynosInputPort
->portDefinition
.format
.video
.xFramerate
) >> 16;
522 pEncOps
->Set_FrameRate(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, setParam
);
525 Set_H263Enc_Param(pExynosComponent
);
528 OMX_ERRORTYPE
GetCodecInputPrivateData(OMX_PTR codecBuffer
, OMX_PTR addr
[], OMX_U32 size
[])
530 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
536 OMX_ERRORTYPE
GetCodecOutputPrivateData(OMX_PTR codecBuffer
, OMX_PTR
*pVirtAddr
, OMX_U32
*dataSize
)
538 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
539 ExynosVideoBuffer
*pCodecBuffer
;
541 if (codecBuffer
== NULL
) {
542 ret
= OMX_ErrorBadParameter
;
546 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
548 if (pVirtAddr
!= NULL
)
549 *pVirtAddr
= pCodecBuffer
->planes
[0].addr
;
551 if (dataSize
!= NULL
)
552 *dataSize
= pCodecBuffer
->planes
[0].allocSize
;
554 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
560 OMX_ERRORTYPE
Mpeg4CodecOpen(EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
)
562 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
564 ExynosVideoEncOps
*pEncOps
= NULL
;
565 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
566 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
570 if (pMpeg4Enc
== NULL
) {
571 ret
= OMX_ErrorBadParameter
;
572 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
576 /* alloc ops structure */
577 pEncOps
= (ExynosVideoEncOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncOps
));
578 pInbufOps
= (ExynosVideoEncBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps
));
579 pOutbufOps
= (ExynosVideoEncBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps
));
581 if ((pEncOps
== NULL
) || (pInbufOps
== NULL
) || (pOutbufOps
== NULL
)) {
582 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate encoder ops buffer");
583 ret
= OMX_ErrorInsufficientResources
;
587 pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
= pEncOps
;
588 pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
= pInbufOps
;
589 pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
= pOutbufOps
;
591 /* function pointer mapping */
592 pEncOps
->nSize
= sizeof(ExynosVideoEncOps
);
593 pInbufOps
->nSize
= sizeof(ExynosVideoEncBufferOps
);
594 pOutbufOps
->nSize
= sizeof(ExynosVideoEncBufferOps
);
596 Exynos_Video_Register_Encoder(pEncOps
, pInbufOps
, pOutbufOps
);
598 /* check mandatory functions for encoder ops */
599 if ((pEncOps
->Init
== NULL
) || (pEncOps
->Finalize
== NULL
) ||
600 (pEncOps
->Set_FrameTag
== NULL
) || (pEncOps
->Get_FrameTag
== NULL
)) {
601 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
602 ret
= OMX_ErrorInsufficientResources
;
606 /* check mandatory functions for buffer ops */
607 if ((pInbufOps
->Setup
== NULL
) || (pOutbufOps
->Setup
== NULL
) ||
608 (pInbufOps
->Run
== NULL
) || (pOutbufOps
->Run
== NULL
) ||
609 (pInbufOps
->Stop
== NULL
) || (pOutbufOps
->Stop
== NULL
) ||
610 (pInbufOps
->Enqueue
== NULL
) || (pOutbufOps
->Enqueue
== NULL
) ||
611 (pInbufOps
->Dequeue
== NULL
) || (pOutbufOps
->Dequeue
== NULL
)) {
612 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
613 ret
= OMX_ErrorInsufficientResources
;
617 /* alloc context, open, querycap */
619 pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
->Init(V4L2_MEMORY_DMABUF
);
621 pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
->Init(V4L2_MEMORY_USERPTR
);
623 if (pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
== NULL
) {
624 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate context buffer");
625 ret
= OMX_ErrorInsufficientResources
;
632 if (ret
!= OMX_ErrorNone
) {
633 if (pEncOps
!= NULL
) {
634 Exynos_OSAL_Free(pEncOps
);
635 pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
= NULL
;
637 if (pInbufOps
!= NULL
) {
638 Exynos_OSAL_Free(pInbufOps
);
639 pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
= NULL
;
641 if (pOutbufOps
!= NULL
) {
642 Exynos_OSAL_Free(pOutbufOps
);
643 pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
= NULL
;
652 OMX_ERRORTYPE
Mpeg4CodecClose(EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
)
654 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
655 void *hMFCHandle
= NULL
;
656 ExynosVideoEncOps
*pEncOps
= NULL
;
657 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
658 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
662 if (pMpeg4Enc
== NULL
) {
663 ret
= OMX_ErrorBadParameter
;
667 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
668 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
669 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
670 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
672 if (hMFCHandle
!= NULL
) {
673 pEncOps
->Finalize(hMFCHandle
);
674 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
= NULL
;
676 if (pOutbufOps
!= NULL
) {
677 Exynos_OSAL_Free(pOutbufOps
);
678 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
= NULL
;
680 if (pInbufOps
!= NULL
) {
681 Exynos_OSAL_Free(pInbufOps
);
682 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
= NULL
;
684 if (pEncOps
!= NULL
) {
685 Exynos_OSAL_Free(pEncOps
);
686 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
= NULL
;
697 OMX_ERRORTYPE
Mpeg4CodecStart(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
699 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
700 void *hMFCHandle
= NULL
;
701 ExynosVideoEncOps
*pEncOps
= NULL
;
702 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
703 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
704 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
705 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
709 if (pOMXComponent
== NULL
) {
710 ret
= OMX_ErrorBadParameter
;
714 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
715 if (pVideoEnc
== NULL
) {
716 ret
= OMX_ErrorBadParameter
;
720 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
721 if (pMpeg4Enc
== NULL
) {
722 ret
= OMX_ErrorBadParameter
;
726 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
727 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
728 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
729 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
731 if (nPortIndex
== INPUT_PORT_INDEX
)
732 pInbufOps
->Run(hMFCHandle
);
733 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
734 pOutbufOps
->Run(hMFCHandle
);
744 OMX_ERRORTYPE
Mpeg4CodecStop(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
746 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
747 void *hMFCHandle
= NULL
;
748 ExynosVideoEncOps
*pEncOps
= NULL
;
749 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
750 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
751 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
752 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
756 if (pOMXComponent
== NULL
) {
757 ret
= OMX_ErrorBadParameter
;
761 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
762 if (pVideoEnc
== NULL
) {
763 ret
= OMX_ErrorBadParameter
;
766 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
767 if (pMpeg4Enc
== NULL
) {
768 ret
= OMX_ErrorBadParameter
;
772 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
773 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
774 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
775 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
777 if ((nPortIndex
== INPUT_PORT_INDEX
) && (pInbufOps
!= NULL
))
778 pInbufOps
->Stop(hMFCHandle
);
779 else if ((nPortIndex
== OUTPUT_PORT_INDEX
) && (pOutbufOps
!= NULL
))
780 pOutbufOps
->Stop(hMFCHandle
);
790 OMX_ERRORTYPE
Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
792 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
793 void *hMFCHandle
= NULL
;
794 ExynosVideoEncOps
*pEncOps
= NULL
;
795 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
796 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
797 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
798 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
802 if (pOMXComponent
== NULL
) {
803 ret
= OMX_ErrorBadParameter
;
807 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
808 if (pVideoEnc
== NULL
) {
809 ret
= OMX_ErrorBadParameter
;
812 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
813 if (pMpeg4Enc
== NULL
) {
814 ret
= OMX_ErrorBadParameter
;
818 hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
819 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
820 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
821 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
823 if (nPortIndex
== INPUT_PORT_INDEX
) {
824 if (pMpeg4Enc
->bSourceStart
== OMX_FALSE
) {
825 Exynos_OSAL_SignalSet(pMpeg4Enc
->hSourceStartEvent
);
826 Exynos_OSAL_SleepMillisec(0);
830 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
831 if (pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) {
832 Exynos_OSAL_SignalSet(pMpeg4Enc
->hDestinationStartEvent
);
833 Exynos_OSAL_SleepMillisec(0);
845 OMX_ERRORTYPE
Mpeg4CodecRegistCodecBuffers(
846 OMX_COMPONENTTYPE
*pOMXComponent
,
850 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
851 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
852 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
853 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
854 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
855 CODEC_ENC_BUFFER
**ppCodecBuffer
= NULL
;
856 ExynosVideoEncBufferOps
*pBufOps
= NULL
;
857 ExynosVideoPlane
*pPlanes
= NULL
;
859 OMX_U32 nPlaneCnt
= 0;
864 if (nPortIndex
== INPUT_PORT_INDEX
) {
865 ppCodecBuffer
= &(pVideoEnc
->pMFCEncInputBuffer
[0]);
866 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
867 pBufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
869 ppCodecBuffer
= &(pVideoEnc
->pMFCEncOutputBuffer
[0]);
870 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
871 pBufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
874 pPlanes
= (ExynosVideoPlane
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane
) * nPlaneCnt
);
875 if (pPlanes
== NULL
) {
876 ret
= OMX_ErrorInsufficientResources
;
880 /* Register buffer */
881 for (i
= 0; i
< nBufferCnt
; i
++) {
882 for (j
= 0; j
< nPlaneCnt
; j
++) {
883 pPlanes
[j
].addr
= ppCodecBuffer
[i
]->pVirAddr
[j
];
884 pPlanes
[j
].fd
= ppCodecBuffer
[i
]->fd
[j
];
885 pPlanes
[j
].allocSize
= ppCodecBuffer
[i
]->bufferSize
[j
];
888 if (pBufOps
->Register(hMFCHandle
, pPlanes
, nPlaneCnt
) != VIDEO_ERROR_NONE
) {
889 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "PORT[%d]: Failed to Register buffer", nPortIndex
);
890 ret
= OMX_ErrorInsufficientResources
;
891 Exynos_OSAL_Free(pPlanes
);
896 Exynos_OSAL_Free(pPlanes
);
906 OMX_ERRORTYPE
Mpeg4CodecEnqueueAllBuffer(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
908 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
909 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
910 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
911 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
912 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
913 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
914 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
917 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
918 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
919 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
923 if ((nPortIndex
!= INPUT_PORT_INDEX
) && (nPortIndex
!= OUTPUT_PORT_INDEX
)) {
924 ret
= OMX_ErrorBadPortIndex
;
928 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
929 (pMpeg4Enc
->bSourceStart
== OMX_TRUE
)) {
930 Exynos_CodecBufferReset(pExynosComponent
, INPUT_PORT_INDEX
);
932 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
933 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
934 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]);
935 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[1]);
937 Exynos_CodecBufferEnqueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
940 pInbufOps
->Clear_Queue(hMFCHandle
);
941 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
942 (pMpeg4Enc
->bDestinationStart
== OMX_TRUE
)) {
943 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
945 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
946 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncOutputBuffer[%d]: 0x%x", i
, pVideoEnc
->pMFCEncOutputBuffer
[i
]);
947 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]);
949 Exynos_CodecBufferEnqueue(pExynosComponent
, OUTPUT_PORT_INDEX
, pVideoEnc
->pMFCEncOutputBuffer
[i
]);
952 pOutbufOps
->Clear_Queue(hMFCHandle
);
961 OMX_ERRORTYPE
Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
963 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
964 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
965 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
966 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
967 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
968 void *hMFCHandle
= pMFCMpeg4Handle
->hMFCHandle
;
969 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
970 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
971 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
973 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
974 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
975 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
976 ExynosVideoEncParam
*pEncParam
= NULL
;
978 ExynosVideoGeometry bufferConf
;
979 OMX_U32 inputBufferNumber
= 0;
984 if ((oneFrameSize
<= 0) && (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
985 OMX_BUFFERHEADERTYPE
*OMXBuffer
= NULL
;
986 OMXBuffer
= Exynos_OutputBufferGetQueue_Direct(pExynosComponent
);
987 if (OMXBuffer
== NULL
) {
988 ret
= OMX_ErrorUndefined
;
992 OMXBuffer
->nTimeStamp
= pSrcInputData
->timeStamp
;
993 OMXBuffer
->nFlags
= pSrcInputData
->nFlags
;
994 Exynos_OMX_OutputBufferReturn(pOMXComponent
, OMXBuffer
);
1000 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1001 Set_Mpeg4Enc_Param(pExynosComponent
);
1003 Set_H263Enc_Param(pExynosComponent
);
1005 pEncParam
= &pMFCMpeg4Handle
->encParam
;
1006 if (pEncOps
->Set_EncParam
) {
1007 if(pEncOps
->Set_EncParam(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, pEncParam
) != VIDEO_ERROR_NONE
) {
1008 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
1009 ret
= OMX_ErrorInsufficientResources
;
1014 /* input buffer info: only 3 config values needed */
1015 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
1016 bufferConf
.eColorFormat
= pEncParam
->commonParam
.FrameMap
;
1017 bufferConf
.nFrameWidth
= pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
1018 bufferConf
.nFrameHeight
= pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
1019 pInbufOps
->Set_Shareable(hMFCHandle
);
1020 if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1021 inputBufferNumber
= MAX_INPUTBUFFER_NUM_DYNAMIC
;
1022 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1023 inputBufferNumber
= MFC_INPUT_BUFFER_NUM_MAX
;
1026 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1027 /* should be done before prepare input buffer */
1028 if (pInbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1029 ret
= OMX_ErrorInsufficientResources
;
1034 /* set input buffer geometry */
1035 if (pInbufOps
->Set_Geometry
) {
1036 if (pInbufOps
->Set_Geometry(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
1037 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
1038 ret
= OMX_ErrorInsufficientResources
;
1043 /* setup input buffer */
1044 if (pInbufOps
->Setup(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, inputBufferNumber
) != VIDEO_ERROR_NONE
) {
1045 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup input buffer");
1046 ret
= OMX_ErrorInsufficientResources
;
1050 ExynosVideoPlane planes
[MFC_INPUT_BUFFER_PLANE
];
1053 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1054 ret
= Mpeg4CodecRegistCodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
);
1055 if (ret
!= OMX_ErrorNone
)
1057 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1058 if (pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
1062 /* Does not require any actions. */
1064 ret
= OMX_ErrorNotImplemented
;
1069 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCSrc
= OMX_TRUE
;
1070 ret
= OMX_ErrorNone
;
1078 OMX_ERRORTYPE
Mpeg4CodecDstSetup(OMX_COMPONENTTYPE
*pOMXComponent
)
1080 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1081 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1082 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1083 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1084 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
1085 void *hMFCHandle
= pMFCMpeg4Handle
->hMFCHandle
;
1086 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1087 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1089 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1090 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1091 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1092 ExynosVideoGeometry bufferConf
;
1097 int OutBufferSize
= pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
* 3 / 2;
1098 /* set geometry for output (dst) */
1099 if (pOutbufOps
->Set_Geometry
) {
1100 /* only 2 config values needed */
1101 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1102 bufferConf
.eCompressionFormat
= VIDEO_CODING_MPEG4
;
1104 bufferConf
.eCompressionFormat
= VIDEO_CODING_H263
;
1105 bufferConf
.nSizeImage
= OutBufferSize
;
1107 if (pOutbufOps
->Set_Geometry(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
1108 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for output buffer");
1109 ret
= OMX_ErrorInsufficientResources
;
1114 /* should be done before prepare output buffer */
1115 if (pOutbufOps
->Enable_Cacheable
) {
1116 if (pOutbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1117 ret
= OMX_ErrorInsufficientResources
;
1122 if (pOutbufOps
->Set_Shareable
) {
1123 pOutbufOps
->Set_Shareable(hMFCHandle
);
1125 int SetupBufferNumber
= 0;
1126 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
)
1127 SetupBufferNumber
= MFC_OUTPUT_BUFFER_NUM_MAX
;
1129 SetupBufferNumber
= pExynosOutputPort
->portDefinition
.nBufferCountActual
;
1130 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "SetupBufferNumber:%d", SetupBufferNumber
);
1132 if (pOutbufOps
->Setup(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
, SetupBufferNumber
) != VIDEO_ERROR_NONE
) {
1133 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1134 ret
= OMX_ErrorInsufficientResources
;
1138 OMX_U32 dataLen
[MFC_OUTPUT_BUFFER_PLANE
] = {0};
1139 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1140 OMX_U32 nPlaneSize
[MFC_OUTPUT_BUFFER_PLANE
] = {0};
1141 nPlaneSize
[0] = OutBufferSize
;
1142 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, MFC_OUTPUT_BUFFER_NUM_MAX
, nPlaneSize
);
1143 if (ret
!= OMX_ErrorNone
)
1146 ret
= Mpeg4CodecRegistCodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, MFC_OUTPUT_BUFFER_NUM_MAX
);
1147 if (ret
!= OMX_ErrorNone
)
1150 /* Enqueue output buffer */
1151 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
1152 pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pVideoEnc
->pMFCEncOutputBuffer
[i
]->pVirAddr
,
1153 (unsigned int *)dataLen
, MFC_OUTPUT_BUFFER_PLANE
, NULL
);
1155 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1156 /* Register output buffer */
1160 ExynosVideoPlane plane
;
1161 for (i
= 0; i
< pExynosOutputPort
->portDefinition
.nBufferCountActual
; i
++) {
1162 plane
.addr
= pExynosOutputPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
;
1163 plane
.fd
= pExynosOutputPort
->extendBufferHeader
[i
].buf_fd
[0];
1164 plane
.allocSize
= OutBufferSize
;
1165 if (pOutbufOps
->Register(hMFCHandle
, &plane
, MFC_OUTPUT_BUFFER_PLANE
) != VIDEO_ERROR_NONE
) {
1166 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register output buffer");
1167 ret
= OMX_ErrorInsufficientResources
;
1172 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
= OMX_TRUE
;
1174 ret
= OMX_ErrorNone
;
1182 OMX_ERRORTYPE
Exynos_Mpeg4Enc_GetParameter(
1183 OMX_IN OMX_HANDLETYPE hComponent
,
1184 OMX_IN OMX_INDEXTYPE nParamIndex
,
1185 OMX_INOUT OMX_PTR pComponentParameterStructure
)
1187 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1188 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1189 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1193 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1194 ret
= OMX_ErrorBadParameter
;
1197 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1198 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1199 if (ret
!= OMX_ErrorNone
) {
1202 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1203 ret
= OMX_ErrorBadParameter
;
1207 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1208 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1209 ret
= OMX_ErrorInvalidState
;
1213 switch (nParamIndex
) {
1214 case OMX_IndexParamVideoMpeg4
:
1216 OMX_VIDEO_PARAM_MPEG4TYPE
*pDstMpeg4Component
= (OMX_VIDEO_PARAM_MPEG4TYPE
*)pComponentParameterStructure
;
1217 OMX_VIDEO_PARAM_MPEG4TYPE
*pSrcMpeg4Component
= NULL
;
1218 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1220 ret
= Exynos_OMX_Check_SizeVersion(pDstMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1221 if (ret
!= OMX_ErrorNone
) {
1225 if (pDstMpeg4Component
->nPortIndex
>= ALL_PORT_NUM
) {
1226 ret
= OMX_ErrorBadPortIndex
;
1230 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1231 pSrcMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pDstMpeg4Component
->nPortIndex
];
1233 Exynos_OSAL_Memcpy(pDstMpeg4Component
, pSrcMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1236 case OMX_IndexParamVideoH263
:
1238 OMX_VIDEO_PARAM_H263TYPE
*pDstH263Component
= (OMX_VIDEO_PARAM_H263TYPE
*)pComponentParameterStructure
;
1239 OMX_VIDEO_PARAM_H263TYPE
*pSrcH263Component
= NULL
;
1240 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1242 ret
= Exynos_OMX_Check_SizeVersion(pDstH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1243 if (ret
!= OMX_ErrorNone
) {
1247 if (pDstH263Component
->nPortIndex
>= ALL_PORT_NUM
) {
1248 ret
= OMX_ErrorBadPortIndex
;
1252 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1253 pSrcH263Component
= &pMpeg4Enc
->h263Component
[pDstH263Component
->nPortIndex
];
1255 Exynos_OSAL_Memcpy(pDstH263Component
, pSrcH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1258 case OMX_IndexParamStandardComponentRole
:
1261 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1262 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1263 if (ret
!= OMX_ErrorNone
) {
1267 codecType
= ((EXYNOS_MPEG4ENC_HANDLE
*)(((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
))->hMFCMpeg4Handle
.codecType
;
1268 if (codecType
== CODEC_TYPE_MPEG4
)
1269 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE
);
1271 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE
);
1274 case OMX_IndexParamVideoProfileLevelQuerySupported
:
1276 OMX_VIDEO_PARAM_PROFILELEVELTYPE
*pDstProfileLevel
= (OMX_VIDEO_PARAM_PROFILELEVELTYPE
*)pComponentParameterStructure
;
1277 EXYNOS_OMX_VIDEO_PROFILELEVEL
*pProfileLevel
= NULL
;
1278 OMX_U32 maxProfileLevelNum
= 0;
1281 ret
= Exynos_OMX_Check_SizeVersion(pDstProfileLevel
, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE
));
1282 if (ret
!= OMX_ErrorNone
) {
1286 if (pDstProfileLevel
->nPortIndex
>= ALL_PORT_NUM
) {
1287 ret
= OMX_ErrorBadPortIndex
;
1291 codecType
= ((EXYNOS_MPEG4ENC_HANDLE
*)(((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
))->hMFCMpeg4Handle
.codecType
;
1292 if (codecType
== CODEC_TYPE_MPEG4
) {
1293 pProfileLevel
= supportedMPEG4ProfileLevels
;
1294 maxProfileLevelNum
= sizeof(supportedMPEG4ProfileLevels
) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL
);
1296 pProfileLevel
= supportedH263ProfileLevels
;
1297 maxProfileLevelNum
= sizeof(supportedH263ProfileLevels
) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL
);
1300 if (pDstProfileLevel
->nProfileIndex
>= maxProfileLevelNum
) {
1301 ret
= OMX_ErrorNoMore
;
1305 pProfileLevel
+= pDstProfileLevel
->nProfileIndex
;
1306 pDstProfileLevel
->eProfile
= pProfileLevel
->profile
;
1307 pDstProfileLevel
->eLevel
= pProfileLevel
->level
;
1310 case OMX_IndexParamVideoProfileLevelCurrent
:
1312 OMX_VIDEO_PARAM_PROFILELEVELTYPE
*pDstProfileLevel
= (OMX_VIDEO_PARAM_PROFILELEVELTYPE
*)pComponentParameterStructure
;
1313 OMX_VIDEO_PARAM_MPEG4TYPE
*pSrcMpeg4Component
= NULL
;
1314 OMX_VIDEO_PARAM_H263TYPE
*pSrcH263Component
= NULL
;
1315 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1318 ret
= Exynos_OMX_Check_SizeVersion(pDstProfileLevel
, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE
));
1319 if (ret
!= OMX_ErrorNone
) {
1323 if (pDstProfileLevel
->nPortIndex
>= ALL_PORT_NUM
) {
1324 ret
= OMX_ErrorBadPortIndex
;
1328 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1329 codecType
= pMpeg4Enc
->hMFCMpeg4Handle
.codecType
;
1330 if (codecType
== CODEC_TYPE_MPEG4
) {
1331 pSrcMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pDstProfileLevel
->nPortIndex
];
1332 pDstProfileLevel
->eProfile
= pSrcMpeg4Component
->eProfile
;
1333 pDstProfileLevel
->eLevel
= pSrcMpeg4Component
->eLevel
;
1335 pSrcH263Component
= &pMpeg4Enc
->h263Component
[pDstProfileLevel
->nPortIndex
];
1336 pDstProfileLevel
->eProfile
= pSrcH263Component
->eProfile
;
1337 pDstProfileLevel
->eLevel
= pSrcH263Component
->eLevel
;
1341 case OMX_IndexParamVideoErrorCorrection
:
1343 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1344 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= NULL
;
1345 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1347 ret
= Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1348 if (ret
!= OMX_ErrorNone
) {
1352 if (pDstErrorCorrectionType
->nPortIndex
!= OUTPUT_PORT_INDEX
) {
1353 ret
= OMX_ErrorBadPortIndex
;
1357 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1358 pSrcErrorCorrectionType
= &pMpeg4Enc
->errorCorrectionType
[OUTPUT_PORT_INDEX
];
1360 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1361 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1362 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1363 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1364 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1368 ret
= Exynos_OMX_VideoEncodeGetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1377 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SetParameter(
1378 OMX_IN OMX_HANDLETYPE hComponent
,
1379 OMX_IN OMX_INDEXTYPE nIndex
,
1380 OMX_IN OMX_PTR pComponentParameterStructure
)
1382 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1383 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1384 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1388 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1389 ret
= OMX_ErrorBadParameter
;
1392 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1393 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1394 if (ret
!= OMX_ErrorNone
) {
1397 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1398 ret
= OMX_ErrorBadParameter
;
1402 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1403 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1404 ret
= OMX_ErrorInvalidState
;
1409 case OMX_IndexParamVideoMpeg4
:
1411 OMX_VIDEO_PARAM_MPEG4TYPE
*pDstMpeg4Component
= NULL
;
1412 OMX_VIDEO_PARAM_MPEG4TYPE
*pSrcMpeg4Component
= (OMX_VIDEO_PARAM_MPEG4TYPE
*)pComponentParameterStructure
;
1413 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1415 ret
= Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1416 if (ret
!= OMX_ErrorNone
) {
1420 if (pSrcMpeg4Component
->nPortIndex
>= ALL_PORT_NUM
) {
1421 ret
= OMX_ErrorBadPortIndex
;
1425 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1426 pDstMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pSrcMpeg4Component
->nPortIndex
];
1428 Exynos_OSAL_Memcpy(pDstMpeg4Component
, pSrcMpeg4Component
, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE
));
1431 case OMX_IndexParamVideoH263
:
1433 OMX_VIDEO_PARAM_H263TYPE
*pDstH263Component
= NULL
;
1434 OMX_VIDEO_PARAM_H263TYPE
*pSrcH263Component
= (OMX_VIDEO_PARAM_H263TYPE
*)pComponentParameterStructure
;
1435 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1437 ret
= Exynos_OMX_Check_SizeVersion(pSrcH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1438 if (ret
!= OMX_ErrorNone
) {
1442 if (pSrcH263Component
->nPortIndex
>= ALL_PORT_NUM
) {
1443 ret
= OMX_ErrorBadPortIndex
;
1447 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1448 pDstH263Component
= &pMpeg4Enc
->h263Component
[pSrcH263Component
->nPortIndex
];
1450 Exynos_OSAL_Memcpy(pDstH263Component
, pSrcH263Component
, sizeof(OMX_VIDEO_PARAM_H263TYPE
));
1453 case OMX_IndexParamStandardComponentRole
:
1455 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1457 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1458 if (ret
!= OMX_ErrorNone
) {
1462 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1463 ret
= OMX_ErrorIncorrectStateOperation
;
1467 if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE
)) {
1468 pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingMPEG4
;
1469 //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4;
1470 } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE
)) {
1471 pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingH263
;
1472 //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263;
1474 ret
= OMX_ErrorBadParameter
;
1479 case OMX_IndexParamVideoProfileLevelCurrent
:
1481 OMX_VIDEO_PARAM_PROFILELEVELTYPE
*pSrcProfileLevel
= (OMX_VIDEO_PARAM_PROFILELEVELTYPE
*)pComponentParameterStructure
;
1482 OMX_VIDEO_PARAM_MPEG4TYPE
*pDstMpeg4Component
= NULL
;
1483 OMX_VIDEO_PARAM_H263TYPE
*pDstH263Component
= NULL
;
1484 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1487 ret
= Exynos_OMX_Check_SizeVersion(pSrcProfileLevel
, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE
));
1488 if (ret
!= OMX_ErrorNone
)
1491 if (pSrcProfileLevel
->nPortIndex
>= ALL_PORT_NUM
) {
1492 ret
= OMX_ErrorBadPortIndex
;
1496 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1497 codecType
= pMpeg4Enc
->hMFCMpeg4Handle
.codecType
;
1498 if (codecType
== CODEC_TYPE_MPEG4
) {
1500 * To do: Check validity of profile & level parameters
1503 pDstMpeg4Component
= &pMpeg4Enc
->mpeg4Component
[pSrcProfileLevel
->nPortIndex
];
1504 pDstMpeg4Component
->eProfile
= pSrcProfileLevel
->eProfile
;
1505 pDstMpeg4Component
->eLevel
= pSrcProfileLevel
->eLevel
;
1508 * To do: Check validity of profile & level parameters
1511 pDstH263Component
= &pMpeg4Enc
->h263Component
[pSrcProfileLevel
->nPortIndex
];
1512 pDstH263Component
->eProfile
= pSrcProfileLevel
->eProfile
;
1513 pDstH263Component
->eLevel
= pSrcProfileLevel
->eLevel
;
1517 case OMX_IndexParamVideoErrorCorrection
:
1519 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1520 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= NULL
;
1521 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1523 ret
= Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1524 if (ret
!= OMX_ErrorNone
) {
1528 if (pSrcErrorCorrectionType
->nPortIndex
!= OUTPUT_PORT_INDEX
) {
1529 ret
= OMX_ErrorBadPortIndex
;
1533 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1534 pDstErrorCorrectionType
= &pMpeg4Enc
->errorCorrectionType
[OUTPUT_PORT_INDEX
];
1536 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1537 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1538 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1539 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1540 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1544 ret
= Exynos_OMX_VideoEncodeSetParameter(hComponent
, nIndex
, pComponentParameterStructure
);
1553 OMX_ERRORTYPE
Exynos_Mpeg4Enc_GetConfig(
1554 OMX_IN OMX_HANDLETYPE hComponent
,
1555 OMX_IN OMX_INDEXTYPE nIndex
,
1556 OMX_IN OMX_PTR pComponentConfigStructure
)
1558 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1559 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1560 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1564 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1565 ret
= OMX_ErrorBadParameter
;
1568 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1569 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1570 if (ret
!= OMX_ErrorNone
) {
1573 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1574 ret
= OMX_ErrorBadParameter
;
1577 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1578 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1579 ret
= OMX_ErrorInvalidState
;
1585 ret
= Exynos_OMX_VideoEncodeGetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1595 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SetConfig(
1596 OMX_IN OMX_HANDLETYPE hComponent
,
1597 OMX_IN OMX_INDEXTYPE nIndex
,
1598 OMX_IN OMX_PTR pComponentConfigStructure
)
1600 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1601 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1602 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1603 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1604 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
1608 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1609 ret
= OMX_ErrorBadParameter
;
1612 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1613 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1614 if (ret
!= OMX_ErrorNone
) {
1617 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1618 ret
= OMX_ErrorBadParameter
;
1621 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1622 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1623 ret
= OMX_ErrorInvalidState
;
1627 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1628 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)pVideoEnc
->hCodecHandle
;
1631 case OMX_IndexConfigVideoIntraPeriod
:
1633 OMX_U32 nPFrames
= (*((OMX_U32
*)pComponentConfigStructure
)) - 1;
1635 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1636 pMpeg4Enc
->mpeg4Component
[OUTPUT_PORT_INDEX
].nPFrames
= nPFrames
;
1638 pMpeg4Enc
->h263Component
[OUTPUT_PORT_INDEX
].nPFrames
= nPFrames
;
1640 ret
= OMX_ErrorNone
;
1644 ret
= Exynos_OMX_VideoEncodeSetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1649 if (ret
== OMX_ErrorNone
)
1650 pVideoEnc
->configChange
= OMX_TRUE
;
1657 OMX_ERRORTYPE
Exynos_Mpeg4Enc_GetExtensionIndex(
1658 OMX_IN OMX_HANDLETYPE hComponent
,
1659 OMX_IN OMX_STRING cParameterName
,
1660 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1662 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1663 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1664 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1668 if (hComponent
== NULL
) {
1669 ret
= OMX_ErrorBadParameter
;
1672 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1673 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1674 if (ret
!= OMX_ErrorNone
) {
1677 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1678 ret
= OMX_ErrorBadParameter
;
1681 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1682 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1683 ret
= OMX_ErrorBadParameter
;
1686 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1687 ret
= OMX_ErrorInvalidState
;
1690 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD
) == 0) {
1691 *pIndexType
= OMX_IndexConfigVideoIntraPeriod
;
1692 ret
= OMX_ErrorNone
;
1694 ret
= Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1703 OMX_ERRORTYPE
Exynos_Mpeg4Enc_ComponentRoleEnum(
1704 OMX_IN OMX_HANDLETYPE hComponent
,
1705 OMX_OUT OMX_U8
*cRole
,
1706 OMX_IN OMX_U32 nIndex
)
1708 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1709 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1710 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1715 if ((hComponent
== NULL
) || (cRole
== NULL
)) {
1716 ret
= OMX_ErrorBadParameter
;
1719 if (nIndex
!= (MAX_COMPONENT_ROLE_NUM
- 1)) { /* supports only one role */
1720 ret
= OMX_ErrorNoMore
;
1723 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1724 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1725 if (ret
!= OMX_ErrorNone
) {
1728 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1729 ret
= OMX_ErrorBadParameter
;
1733 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1734 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1735 ret
= OMX_ErrorInvalidState
;
1739 codecType
= ((EXYNOS_MPEG4ENC_HANDLE
*)(((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
))->hMFCMpeg4Handle
.codecType
;
1740 if (codecType
== CODEC_TYPE_MPEG4
)
1741 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE
);
1743 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE
);
1752 OMX_ERRORTYPE
Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE
*pOMXComponent
)
1754 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1755 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1756 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1757 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1758 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1759 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;;
1760 EXYNOS_MFC_MPEG4ENC_HANDLE
*pMFCMpeg4Handle
= &pMpeg4Enc
->hMFCMpeg4Handle
;
1761 OMX_PTR hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1762 OMX_COLOR_FORMATTYPE eColorFormat
;
1764 ExynosVideoEncOps
*pEncOps
= NULL
;
1765 ExynosVideoEncBufferOps
*pInbufOps
= NULL
;
1766 ExynosVideoEncBufferOps
*pOutbufOps
= NULL
;
1768 CSC_METHOD csc_method
= CSC_METHOD_SW
;
1773 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCSrc
= OMX_FALSE
;
1774 pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
= OMX_FALSE
;
1775 pVideoEnc
->bFirstOutput
= OMX_FALSE
;
1776 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
1777 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1778 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
1780 eColorFormat
= pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
;
1781 if (pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
1782 if (eColorFormat
== OMX_COLOR_FormatAndroidOpaque
) {
1783 pExynosInputPort
->bufferProcessType
= BUFFER_COPY
;
1785 pExynosInputPort
->bufferProcessType
= BUFFER_SHARE
;
1788 pExynosInputPort
->bufferProcessType
= BUFFER_COPY
;
1791 /* Mpeg4/H.263 Codec Open */
1792 ret
= Mpeg4CodecOpen(pMpeg4Enc
);
1793 if (ret
!= OMX_ErrorNone
) {
1797 pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1798 pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1799 pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1801 if ((pExynosInputPort
->bStoreMetaData
!= OMX_TRUE
) &&
1802 (eColorFormat
!= OMX_COLOR_FormatAndroidOpaque
)) {
1803 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1804 OMX_U32 nPlaneSize
[MFC_INPUT_BUFFER_PLANE
] = {0, };
1805 nPlaneSize
[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE
;
1806 nPlaneSize
[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE
;
1808 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->codecSemID
);
1809 Exynos_OSAL_QueueCreate(&pExynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1811 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
, nPlaneSize
);
1812 if (ret
!= OMX_ErrorNone
)
1815 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1816 Exynos_CodecBufferEnqueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
1817 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1821 /* Does not require any actions. */
1825 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1826 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->codecSemID
);
1827 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1828 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1832 /* Does not require any actions. */
1835 pMpeg4Enc
->bSourceStart
= OMX_FALSE
;
1836 Exynos_OSAL_SignalCreate(&pMpeg4Enc
->hSourceStartEvent
);
1837 pMpeg4Enc
->bDestinationStart
= OMX_FALSE
;
1838 Exynos_OSAL_SignalCreate(&pMpeg4Enc
->hDestinationStartEvent
);
1840 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
1841 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
1842 pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
= 0;
1843 pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
= 0;
1845 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
1848 csc_method
= CSC_METHOD_HW
;
1850 pVideoEnc
->csc_handle
= csc_init(csc_method
);
1851 if (pVideoEnc
->csc_handle
== NULL
) {
1852 ret
= OMX_ErrorInsufficientResources
;
1855 pVideoEnc
->csc_set_format
= OMX_FALSE
;
1864 OMX_ERRORTYPE
Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE
*pOMXComponent
)
1866 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1867 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1868 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= ((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
);
1869 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1870 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1871 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1872 OMX_PTR hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1874 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1875 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1876 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1878 int i
= 0, plane
= 0;
1882 if (pVideoEnc
->csc_handle
!= NULL
) {
1883 csc_deinit(pVideoEnc
->csc_handle
);
1884 pVideoEnc
->csc_handle
= NULL
;
1887 Exynos_OSAL_SignalTerminate(pMpeg4Enc
->hDestinationStartEvent
);
1888 pMpeg4Enc
->hDestinationStartEvent
= NULL
;
1889 pMpeg4Enc
->bDestinationStart
= OMX_FALSE
;
1890 Exynos_OSAL_SignalTerminate(pMpeg4Enc
->hSourceStartEvent
);
1891 pMpeg4Enc
->hSourceStartEvent
= NULL
;
1892 pMpeg4Enc
->bSourceStart
= OMX_FALSE
;
1894 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1895 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
1896 Exynos_OSAL_QueueTerminate(&pExynosOutputPort
->codecBufferQ
);
1897 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->codecSemID
);
1898 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1902 /* Does not require any actions. */
1905 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1906 Exynos_Free_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
);
1907 Exynos_OSAL_QueueTerminate(&pExynosInputPort
->codecBufferQ
);
1908 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->codecSemID
);
1909 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1913 /* Does not require any actions. */
1915 Mpeg4CodecClose(pMpeg4Enc
);
1923 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1925 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1926 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1927 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1928 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1929 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
1930 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1931 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1932 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
1933 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
1934 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
1935 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
1936 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1941 if (pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1942 ret
= Mpeg4CodecSrcSetup(pOMXComponent
, pSrcInputData
);
1943 if ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)
1946 if (pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
== OMX_FALSE
) {
1947 ret
= Mpeg4CodecDstSetup(pOMXComponent
);
1950 if (pVideoEnc
->configChange
== OMX_TRUE
) {
1951 if (pMpeg4Enc
->hMFCMpeg4Handle
.codecType
== CODEC_TYPE_MPEG4
)
1952 Change_Mpeg4Enc_Param(pExynosComponent
);
1954 Change_H263Enc_Param(pExynosComponent
);
1956 pVideoEnc
->configChange
= OMX_FALSE
;
1959 if ((pSrcInputData
->dataLen
> 0) ||
1960 ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
1961 OMX_U32 nAllocLen
[MFC_INPUT_BUFFER_PLANE
] = {0, 0};
1962 OMX_U32 pMFCYUVDataSize
[MFC_INPUT_BUFFER_PLANE
] = {NULL
, NULL
};
1963 ExynosVideoPlane planes
[MFC_INPUT_BUFFER_PLANE
];
1966 pExynosComponent
->timeStamp
[pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
] = pSrcInputData
->timeStamp
;
1967 pExynosComponent
->nFlags
[pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
] = pSrcInputData
->nFlags
;
1968 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
);
1969 pEncOps
->Set_FrameTag(hMFCHandle
, pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
);
1970 pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
++;
1971 pMpeg4Enc
->hMFCMpeg4Handle
.indexTimestamp
%= MAX_TIMESTAMP
;
1973 /* queue work for input buffer */
1974 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize
, pSrcInputData
->bufferHeader
);
1975 pMFCYUVDataSize
[0] = pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
1976 pMFCYUVDataSize
[1] = pMFCYUVDataSize
[0] / 2;
1978 #ifdef USE_METADATABUFFERTYPE
1979 nAllocLen
[0] = ALIGN_TO_16B(pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
) *
1980 ALIGN_TO_16B(pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
);
1981 nAllocLen
[1] = ALIGN(nAllocLen
[0] / 2,256);
1983 if ((pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) &&
1984 (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
)) {
1985 codecReturn
= pInbufOps
->ExtensionEnqueue(hMFCHandle
,
1986 (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1987 (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.fd
,
1988 (unsigned int *)nAllocLen
, (unsigned int *)pMFCYUVDataSize
,
1989 MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1991 codecReturn
= pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1992 (unsigned int *)pMFCYUVDataSize
, MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1995 codecReturn
= pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1996 (unsigned int *)pMFCYUVDataSize
, MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1998 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1999 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__
, __LINE__
);
2000 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2003 Mpeg4CodecStart(pOMXComponent
, INPUT_PORT_INDEX
);
2004 if (pMpeg4Enc
->bSourceStart
== OMX_FALSE
) {
2005 pMpeg4Enc
->bSourceStart
= OMX_TRUE
;
2006 Exynos_OSAL_SignalSet(pMpeg4Enc
->hSourceStartEvent
);
2007 Exynos_OSAL_SleepMillisec(0);
2009 if (pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) {
2010 pMpeg4Enc
->bDestinationStart
= OMX_TRUE
;
2011 Exynos_OSAL_SignalSet(pMpeg4Enc
->hDestinationStartEvent
);
2012 Exynos_OSAL_SleepMillisec(0);
2016 ret
= OMX_ErrorNone
;
2024 OMX_ERRORTYPE
Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
2026 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2027 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2028 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2029 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2030 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
2031 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2032 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
2033 ExynosVideoEncBufferOps
*pInbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pInbufOps
;
2034 ExynosVideoBuffer
*pVideoBuffer
;
2035 ExynosVideoBuffer videoBuffer
;
2039 if ((pExynosInputPort
->bStoreMetaData
== OMX_TRUE
) &&
2040 (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
)) {
2041 if (pInbufOps
->ExtensionDequeue(hMFCHandle
, &videoBuffer
) == VIDEO_ERROR_NONE
)
2042 pVideoBuffer
= &videoBuffer
;
2044 pVideoBuffer
= NULL
;
2046 pVideoBuffer
= pInbufOps
->Dequeue(hMFCHandle
);
2049 pSrcOutputData
->dataLen
= 0;
2050 pSrcOutputData
->usedDataLen
= 0;
2051 pSrcOutputData
->remainDataLen
= 0;
2052 pSrcOutputData
->nFlags
= 0;
2053 pSrcOutputData
->timeStamp
= 0;
2055 if (pVideoBuffer
== NULL
) {
2056 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= NULL
;
2057 pSrcOutputData
->allocSize
= 0;
2058 pSrcOutputData
->pPrivate
= NULL
;
2059 pSrcOutputData
->bufferHeader
= NULL
;
2062 for (plane
= 0; plane
< MFC_INPUT_BUFFER_PLANE
; plane
++) {
2063 pSrcOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] = pVideoBuffer
->planes
[plane
].addr
;
2064 pSrcOutputData
->buffer
.multiPlaneBuffer
.fd
[plane
] = pVideoBuffer
->planes
[plane
].fd
;
2066 pSrcOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
+
2067 pVideoBuffer
->planes
[1].allocSize
+
2068 pVideoBuffer
->planes
[2].allocSize
;
2070 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
2072 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
2073 if (pSrcOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] ==
2074 pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]) {
2075 pVideoEnc
->pMFCEncInputBuffer
[i
]->dataSize
= 0;
2076 pSrcOutputData
->pPrivate
= pVideoEnc
->pMFCEncInputBuffer
[i
];
2081 if (i
>= MFC_INPUT_BUFFER_NUM_MAX
) {
2082 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - Lost buffer", __FUNCTION__
, __LINE__
);
2083 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2088 /* For Share Buffer */
2089 pSrcOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
2092 ret
= OMX_ErrorNone
;
2100 OMX_ERRORTYPE
Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2102 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2103 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2104 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2105 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2106 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
2107 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
2108 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
2109 OMX_U32 dataLen
= 0;
2110 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
2114 if (pDstInputData
->buffer
.singlePlaneBuffer
.dataBuffer
== NULL
) {
2115 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to find input buffer");
2116 ret
= OMX_ErrorBadParameter
;
2120 codecReturn
= pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)&pDstInputData
->buffer
.singlePlaneBuffer
.dataBuffer
,
2121 (unsigned int *)&dataLen
, MFC_OUTPUT_BUFFER_PLANE
, pDstInputData
->bufferHeader
);
2123 if (codecReturn
!= VIDEO_ERROR_NONE
) {
2124 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__
, __LINE__
);
2125 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2128 Mpeg4CodecStart(pOMXComponent
, OUTPUT_PORT_INDEX
);
2130 ret
= OMX_ErrorNone
;
2138 OMX_ERRORTYPE
Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2140 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2141 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2142 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2143 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2144 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2145 void *hMFCHandle
= pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
;
2146 ExynosVideoEncOps
*pEncOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pEncOps
;
2147 ExynosVideoEncBufferOps
*pOutbufOps
= pMpeg4Enc
->hMFCMpeg4Handle
.pOutbufOps
;
2148 ExynosVideoBuffer
*pVideoBuffer
;
2149 ExynosVideoFrameStatusType displayStatus
= VIDEO_FRAME_STATUS_UNKNOWN
;
2150 ExynosVideoGeometry bufferGeometry
;
2151 OMX_S32 indexTimestamp
= 0;
2155 if (pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) {
2156 ret
= OMX_ErrorNone
;
2160 if ((pVideoBuffer
= pOutbufOps
->Dequeue(hMFCHandle
)) == NULL
) {
2161 ret
= OMX_ErrorNone
;
2165 pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
++;
2166 pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
%= MAX_TIMESTAMP
;
2168 pDstOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= pVideoBuffer
->planes
[0].addr
;
2169 pDstOutputData
->buffer
.singlePlaneBuffer
.fd
= pVideoBuffer
->planes
[0].fd
;
2170 pDstOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
;
2171 pDstOutputData
->dataLen
= pVideoBuffer
->planes
[0].dataSize
;
2172 pDstOutputData
->remainDataLen
= pVideoBuffer
->planes
[0].dataSize
;
2173 pDstOutputData
->usedDataLen
= 0;
2174 pDstOutputData
->pPrivate
= pVideoBuffer
;
2175 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2177 pDstOutputData
->pPrivate
= NULL
;
2178 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
2179 if (pDstOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
==
2180 pVideoEnc
->pMFCEncOutputBuffer
[i
]->pVirAddr
[0]) {
2181 pDstOutputData
->pPrivate
= pVideoEnc
->pMFCEncOutputBuffer
[i
]->pVirAddr
[0];
2186 if (pDstOutputData
->pPrivate
== NULL
) {
2187 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
2188 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecEncode
;
2193 /* For Share Buffer */
2194 pDstOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
2196 if (pVideoEnc
->bFirstOutput
== OMX_FALSE
) {
2199 /* start header return */
2200 pDstOutputData
->timeStamp
= 0;
2201 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_CODECCONFIG
;
2202 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_ENDOFFRAME
;
2203 pVideoEnc
->bFirstOutput
= OMX_TRUE
;
2205 indexTimestamp
= pEncOps
->Get_FrameTag(pMpeg4Enc
->hMFCMpeg4Handle
.hMFCHandle
);
2206 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
2207 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
];
2208 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pMpeg4Enc
->hMFCMpeg4Handle
.outputIndexTimestamp
];
2210 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
2211 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
2214 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_ENDOFFRAME
;
2215 if (pVideoBuffer
->frameType
== VIDEO_FRAME_I
)
2216 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_SYNCFRAME
;
2219 if ((displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
2220 (((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) &&
2221 (pExynosComponent
->bBehaviorEOS
== OMX_FALSE
))) {
2222 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%x displayStatus:%d, nFlags0x%x", pExynosComponent
, displayStatus
, pDstOutputData
->nFlags
);
2223 pDstOutputData
->remainDataLen
= 0;
2226 if (((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) &&
2227 (pExynosComponent
->bBehaviorEOS
== OMX_TRUE
))
2228 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
2230 ret
= OMX_ErrorNone
;
2238 OMX_ERRORTYPE
Exynos_Mpeg4Enc_srcInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
2240 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2241 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2242 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2243 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2247 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2248 ret
= OMX_ErrorNone
;
2251 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2252 ret
= OMX_ErrorNone
;
2256 ret
= Exynos_Mpeg4Enc_SrcIn(pOMXComponent
, pSrcInputData
);
2257 if (ret
!= OMX_ErrorNone
) {
2258 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__
, __LINE__
);
2259 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2260 pExynosComponent
->callbackData
,
2261 OMX_EventError
, ret
, 0, NULL
);
2270 OMX_ERRORTYPE
Exynos_Mpeg4Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
2272 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2273 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2274 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2275 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2279 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2280 ret
= OMX_ErrorNone
;
2284 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
2285 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2286 ret
= OMX_ErrorNone
;
2290 if ((pMpeg4Enc
->bSourceStart
== OMX_FALSE
) &&
2291 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort
))) {
2292 Exynos_OSAL_SignalWait(pMpeg4Enc
->hSourceStartEvent
, DEF_MAX_WAIT_TIME
);
2293 Exynos_OSAL_SignalReset(pMpeg4Enc
->hSourceStartEvent
);
2296 ret
= Exynos_Mpeg4Enc_SrcOut(pOMXComponent
, pSrcOutputData
);
2297 if ((ret
!= OMX_ErrorNone
) && (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2298 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__
, __LINE__
);
2299 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2300 pExynosComponent
->callbackData
,
2301 OMX_EventError
, ret
, 0, NULL
);
2310 OMX_ERRORTYPE
Exynos_Mpeg4Enc_dstInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2312 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2313 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2314 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2315 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2319 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2320 ret
= OMX_ErrorNone
;
2323 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2324 ret
= OMX_ErrorNone
;
2327 if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
2328 if ((pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) &&
2329 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2330 Exynos_OSAL_SignalWait(pMpeg4Enc
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2331 Exynos_OSAL_SignalReset(pMpeg4Enc
->hDestinationStartEvent
);
2334 if (pMpeg4Enc
->hMFCMpeg4Handle
.bConfiguredMFCDst
== OMX_TRUE
) {
2335 ret
= Exynos_Mpeg4Enc_DstIn(pOMXComponent
, pDstInputData
);
2336 if (ret
!= OMX_ErrorNone
) {
2337 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__
, __LINE__
);
2338 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2339 pExynosComponent
->callbackData
,
2340 OMX_EventError
, ret
, 0, NULL
);
2350 OMX_ERRORTYPE
Exynos_Mpeg4Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2352 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2353 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2354 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2355 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2359 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2360 ret
= OMX_ErrorNone
;
2363 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2364 ret
= OMX_ErrorNone
;
2368 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2369 if ((pMpeg4Enc
->bDestinationStart
== OMX_FALSE
) &&
2370 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2371 Exynos_OSAL_SignalWait(pMpeg4Enc
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2372 Exynos_OSAL_SignalReset(pMpeg4Enc
->hDestinationStartEvent
);
2375 ret
= Exynos_Mpeg4Enc_DstOut(pOMXComponent
, pDstOutputData
);
2376 if ((ret
!= OMX_ErrorNone
) && (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2377 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__
, __LINE__
);
2378 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2379 pExynosComponent
->callbackData
,
2380 OMX_EventError
, ret
, 0, NULL
);
2389 OSCL_EXPORT_REF OMX_ERRORTYPE
Exynos_OMX_ComponentInit(
2390 OMX_HANDLETYPE hComponent
,
2391 OMX_STRING componentName
)
2393 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2394 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2395 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2396 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
2397 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
2398 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
2399 OMX_S32 codecType
= -1;
2404 if ((hComponent
== NULL
) || (componentName
== NULL
)) {
2405 ret
= OMX_ErrorBadParameter
;
2406 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: parameters are null, ret: %X", __FUNCTION__
, ret
);
2409 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC
, componentName
) == 0) {
2410 codecType
= CODEC_TYPE_MPEG4
;
2411 } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC
, componentName
) == 0) {
2412 codecType
= CODEC_TYPE_H263
;
2414 ret
= OMX_ErrorBadParameter
;
2415 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: componentName(%s) error, ret: %X", __FUNCTION__
, componentName
, ret
);
2419 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2420 ret
= Exynos_OMX_VideoEncodeComponentInit(pOMXComponent
);
2421 if (ret
!= OMX_ErrorNone
) {
2422 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__
, ret
);
2425 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2426 pExynosComponent
->codecType
= HW_VIDEO_ENC_CODEC
;
2428 pExynosComponent
->componentName
= (OMX_STRING
)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE
);
2429 if (pExynosComponent
->componentName
== NULL
) {
2430 Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2431 ret
= OMX_ErrorInsufficientResources
;
2432 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: componentName alloc error, ret: %X", __FUNCTION__
, ret
);
2435 Exynos_OSAL_Memset(pExynosComponent
->componentName
, 0, MAX_OMX_COMPONENT_NAME_SIZE
);
2437 pMpeg4Enc
= Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE
));
2438 if (pMpeg4Enc
== NULL
) {
2439 Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2440 ret
= OMX_ErrorInsufficientResources
;
2441 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__
, ret
);
2444 Exynos_OSAL_Memset(pMpeg4Enc
, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE
));
2445 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2446 pVideoEnc
->hCodecHandle
= (OMX_HANDLETYPE
)pMpeg4Enc
;
2447 pMpeg4Enc
->hMFCMpeg4Handle
.codecType
= codecType
;
2449 if (codecType
== CODEC_TYPE_MPEG4
)
2450 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_MPEG4_ENC
);
2452 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_H263_ENC
);
2454 /* Set componentVersion */
2455 pExynosComponent
->componentVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2456 pExynosComponent
->componentVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2457 pExynosComponent
->componentVersion
.s
.nRevision
= REVISION_NUMBER
;
2458 pExynosComponent
->componentVersion
.s
.nStep
= STEP_NUMBER
;
2459 /* Set specVersion */
2460 pExynosComponent
->specVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2461 pExynosComponent
->specVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2462 pExynosComponent
->specVersion
.s
.nRevision
= REVISION_NUMBER
;
2463 pExynosComponent
->specVersion
.s
.nStep
= STEP_NUMBER
;
2466 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2467 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2468 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2469 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
2470 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
2471 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
2472 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
2473 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2474 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2475 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2476 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
2477 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
2478 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2479 pExynosPort
->bufferProcessType
= BUFFER_COPY
;
2480 pExynosPort
->portWayType
= WAY2_PORT
;
2483 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2484 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2485 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2486 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
2487 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
2488 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
2489 if (codecType
== CODEC_TYPE_MPEG4
) {
2490 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingMPEG4
;
2491 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2492 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/mpeg4");
2494 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingH263
;
2495 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2496 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/h263");
2498 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2499 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2500 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
2501 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2502 pExynosPort
->bufferProcessType
= BUFFER_SHARE
;
2503 pExynosPort
->portWayType
= WAY2_PORT
;
2505 if (codecType
== CODEC_TYPE_MPEG4
) {
2506 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
2507 INIT_SET_SIZE_VERSION(&pMpeg4Enc
->mpeg4Component
[i
], OMX_VIDEO_PARAM_MPEG4TYPE
);
2508 pMpeg4Enc
->mpeg4Component
[i
].nPortIndex
= i
;
2509 pMpeg4Enc
->mpeg4Component
[i
].eProfile
= OMX_VIDEO_MPEG4ProfileSimple
;
2510 pMpeg4Enc
->mpeg4Component
[i
].eLevel
= OMX_VIDEO_MPEG4Level4
;
2512 pMpeg4Enc
->mpeg4Component
[i
].nPFrames
= 10;
2513 pMpeg4Enc
->mpeg4Component
[i
].nBFrames
= 0; /* No support for B frames */
2514 pMpeg4Enc
->mpeg4Component
[i
].nMaxPacketSize
= 256; /* Default value */
2515 pMpeg4Enc
->mpeg4Component
[i
].nAllowedPictureTypes
= OMX_VIDEO_PictureTypeI
| OMX_VIDEO_PictureTypeP
;
2516 pMpeg4Enc
->mpeg4Component
[i
].bGov
= OMX_FALSE
;
2520 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
2521 INIT_SET_SIZE_VERSION(&pMpeg4Enc
->h263Component
[i
], OMX_VIDEO_PARAM_H263TYPE
);
2522 pMpeg4Enc
->h263Component
[i
].nPortIndex
= i
;
2523 pMpeg4Enc
->h263Component
[i
].eProfile
= OMX_VIDEO_H263ProfileBaseline
;
2524 pMpeg4Enc
->h263Component
[i
].eLevel
= OMX_VIDEO_H263Level45
;
2526 pMpeg4Enc
->h263Component
[i
].nPFrames
= 20;
2527 pMpeg4Enc
->h263Component
[i
].nBFrames
= 0; /* No support for B frames */
2528 pMpeg4Enc
->h263Component
[i
].bPLUSPTYPEAllowed
= OMX_FALSE
;
2529 pMpeg4Enc
->h263Component
[i
].nAllowedPictureTypes
= OMX_VIDEO_PictureTypeI
| OMX_VIDEO_PictureTypeP
;
2530 pMpeg4Enc
->h263Component
[i
].bForceRoundingTypeToZero
= OMX_TRUE
;
2531 pMpeg4Enc
->h263Component
[i
].nPictureHeaderRepetition
= 0;
2532 pMpeg4Enc
->h263Component
[i
].nGOBHeaderInterval
= 0;
2536 pOMXComponent
->GetParameter
= &Exynos_Mpeg4Enc_GetParameter
;
2537 pOMXComponent
->SetParameter
= &Exynos_Mpeg4Enc_SetParameter
;
2538 pOMXComponent
->GetConfig
= &Exynos_Mpeg4Enc_GetConfig
;
2539 pOMXComponent
->SetConfig
= &Exynos_Mpeg4Enc_SetConfig
;
2540 pOMXComponent
->GetExtensionIndex
= &Exynos_Mpeg4Enc_GetExtensionIndex
;
2541 pOMXComponent
->ComponentRoleEnum
= &Exynos_Mpeg4Enc_ComponentRoleEnum
;
2542 pOMXComponent
->ComponentDeInit
= &Exynos_OMX_ComponentDeinit
;
2544 pExynosComponent
->exynos_codec_componentInit
= &Exynos_Mpeg4Enc_Init
;
2545 pExynosComponent
->exynos_codec_componentTerminate
= &Exynos_Mpeg4Enc_Terminate
;
2547 pVideoEnc
->exynos_codec_srcInputProcess
= &Exynos_Mpeg4Enc_srcInputBufferProcess
;
2548 pVideoEnc
->exynos_codec_srcOutputProcess
= &Exynos_Mpeg4Enc_srcOutputBufferProcess
;
2549 pVideoEnc
->exynos_codec_dstInputProcess
= &Exynos_Mpeg4Enc_dstInputBufferProcess
;
2550 pVideoEnc
->exynos_codec_dstOutputProcess
= &Exynos_Mpeg4Enc_dstOutputBufferProcess
;
2552 pVideoEnc
->exynos_codec_start
= &Mpeg4CodecStart
;
2553 pVideoEnc
->exynos_codec_stop
= &Mpeg4CodecStop
;
2554 pVideoEnc
->exynos_codec_bufferProcessRun
= &Mpeg4CodecOutputBufferProcessRun
;
2555 pVideoEnc
->exynos_codec_enqueueAllBuffer
= &Mpeg4CodecEnqueueAllBuffer
;
2557 pVideoEnc
->exynos_checkInputFrame
= NULL
;
2558 pVideoEnc
->exynos_codec_getCodecInputPrivateData
= &GetCodecInputPrivateData
;
2559 pVideoEnc
->exynos_codec_getCodecOutputPrivateData
= &GetCodecOutputPrivateData
;
2561 pVideoEnc
->hSharedMemory
= Exynos_OSAL_SharedMemory_Open();
2562 if (pVideoEnc
->hSharedMemory
== NULL
) {
2563 Exynos_OSAL_Free(pMpeg4Enc
);
2564 pMpeg4Enc
= ((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2565 Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2566 ret
= OMX_ErrorInsufficientResources
;
2570 pExynosComponent
->currentState
= OMX_StateLoaded
;
2572 ret
= OMX_ErrorNone
;
2580 OMX_ERRORTYPE
Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent
)
2582 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2583 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2584 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2585 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
2586 EXYNOS_MPEG4ENC_HANDLE
*pMpeg4Enc
= NULL
;
2590 if (hComponent
== NULL
) {
2591 ret
= OMX_ErrorBadParameter
;
2594 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2595 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2596 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2598 Exynos_OSAL_SharedMemory_Close(pVideoEnc
->hSharedMemory
);
2600 Exynos_OSAL_Free(pExynosComponent
->componentName
);
2601 pExynosComponent
->componentName
= NULL
;
2603 pMpeg4Enc
= (EXYNOS_MPEG4ENC_HANDLE
*)((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2604 if (pMpeg4Enc
!= NULL
) {
2605 Exynos_OSAL_Free(pMpeg4Enc
);
2606 pMpeg4Enc
= ((EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2609 ret
= Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent
);
2610 if (ret
!= OMX_ErrorNone
) {
2614 ret
= OMX_ErrorNone
;