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_Venc.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * Yunji Kim (yunji.kim@samsung.com)
31 #include "Exynos_OMX_Macros.h"
32 #include "Exynos_OSAL_Event.h"
33 #include "Exynos_OMX_Venc.h"
34 #include "Exynos_OMX_VencControl.h"
35 #include "Exynos_OMX_Basecomponent.h"
36 #include "Exynos_OSAL_Thread.h"
37 #include "Exynos_OSAL_Semaphore.h"
38 #include "Exynos_OSAL_SharedMemory.h"
39 #include "Exynos_OSAL_Mutex.h"
40 #include "Exynos_OSAL_ETC.h"
41 #include "ExynosVideoApi.h"
44 #ifdef USE_STOREMETADATA
45 #include "Exynos_OSAL_Android.h"
49 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_ENC"
50 #define EXYNOS_LOG_OFF
51 //#define EXYNOS_TRACE_ON
52 #include "Exynos_OSAL_Log.h"
55 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE
*pOMXComponent
)
57 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
58 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
59 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
61 if ((exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
!=
62 exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
) ||
63 (exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
!=
64 exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
)) {
65 OMX_U32 width
= 0, height
= 0;
67 exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
=
68 exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
69 exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
=
70 exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
71 width
= exynosOutputPort
->portDefinition
.format
.video
.nStride
=
72 exynosInputPort
->portDefinition
.format
.video
.nStride
;
73 height
= exynosOutputPort
->portDefinition
.format
.video
.nSliceHeight
=
74 exynosInputPort
->portDefinition
.format
.video
.nSliceHeight
;
77 exynosOutputPort
->portDefinition
.nBufferSize
= (width
* height
* 3) / 2;
83 void Exynos_Free_CodecBuffers(
84 OMX_COMPONENTTYPE
*pOMXComponent
,
87 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
88 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
89 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
90 CODEC_ENC_BUFFER
**ppCodecBuffer
= NULL
;
92 OMX_U32 nPlaneCnt
= 0;
97 if (nPortIndex
== INPUT_PORT_INDEX
) {
98 ppCodecBuffer
= &(pVideoEnc
->pMFCEncInputBuffer
[0]);
99 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
101 ppCodecBuffer
= &(pVideoEnc
->pMFCEncOutputBuffer
[0]);
102 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
105 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
106 if (ppCodecBuffer
[i
] != NULL
) {
107 for (j
= 0; j
< nPlaneCnt
; j
++) {
108 if (ppCodecBuffer
[i
]->pVirAddr
[j
] != NULL
)
109 Exynos_OSAL_SharedMemory_Free(pVideoEnc
->hSharedMemory
, ppCodecBuffer
[i
]->pVirAddr
[j
]);
112 Exynos_OSAL_Free(ppCodecBuffer
[i
]);
113 ppCodecBuffer
[i
] = NULL
;
120 OMX_ERRORTYPE
Exynos_Allocate_CodecBuffers(
121 OMX_COMPONENTTYPE
*pOMXComponent
,
124 OMX_U32 nPlaneSize
[MFC_OUTPUT_BUFFER_PLANE
])
126 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
127 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
128 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
129 MEMORY_TYPE eMemoryType
= NORMAL_MEMORY
;
130 CODEC_ENC_BUFFER
**ppCodecBuffer
= NULL
;
132 OMX_U32 nPlaneCnt
= 0;
137 if (nPortIndex
== INPUT_PORT_INDEX
) {
138 ppCodecBuffer
= &(pVideoEnc
->pMFCEncInputBuffer
[0]);
139 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
141 ppCodecBuffer
= &(pVideoEnc
->pMFCEncOutputBuffer
[0]);
142 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
145 for (i
= 0; i
< nBufferCnt
; i
++) {
146 ppCodecBuffer
[i
] = (CODEC_ENC_BUFFER
*)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER
));
147 if (ppCodecBuffer
[i
] == NULL
) {
148 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Alloc codec buffer");
149 ret
= OMX_ErrorInsufficientResources
;
152 Exynos_OSAL_Memset(ppCodecBuffer
[i
], 0, sizeof(CODEC_ENC_BUFFER
));
154 for (j
= 0; j
< nPlaneCnt
; j
++) {
155 ppCodecBuffer
[i
]->pVirAddr
[j
] =
156 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc
->hSharedMemory
, nPlaneSize
[j
], eMemoryType
);
157 if (ppCodecBuffer
[i
]->pVirAddr
[j
] == NULL
) {
158 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Alloc plane");
159 ret
= OMX_ErrorInsufficientResources
;
163 ppCodecBuffer
[i
]->fd
[j
] =
164 Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, ppCodecBuffer
[i
]->pVirAddr
[j
]);
165 ppCodecBuffer
[i
]->bufferSize
[j
] = nPlaneSize
[j
];
166 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "PORT[%d]: pMFCCodecBuffer[%d]->pVirAddr[%d]: 0x%x", nPortIndex
, i
, j
, ppCodecBuffer
[i
]->pVirAddr
[j
]);
169 ppCodecBuffer
[i
]->dataSize
= 0;
172 return OMX_ErrorNone
;
175 Exynos_Free_CodecBuffers(pOMXComponent
, nPortIndex
);
182 OMX_BOOL
Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
)
184 OMX_BOOL ret
= OMX_FALSE
;
186 if ((pExynosComponent
->currentState
== OMX_StateExecuting
) &&
187 (pExynosComponent
->pExynosPort
[nPortIndex
].portState
== OMX_StateIdle
) &&
188 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
189 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateIdleToExecuting
)) {
198 OMX_ERRORTYPE
Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_PTR codecBuffer
, EXYNOS_OMX_DATA
*pData
)
200 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
201 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
202 CODEC_ENC_BUFFER
*pInputCodecBuffer
= (CODEC_ENC_BUFFER
*)codecBuffer
;
204 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] = pInputCodecBuffer
->pVirAddr
[0];
205 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[1] = pInputCodecBuffer
->pVirAddr
[1];
206 pData
->buffer
.multiPlaneBuffer
.fd
[0] = pInputCodecBuffer
->fd
[0];
207 pData
->buffer
.multiPlaneBuffer
.fd
[1] = pInputCodecBuffer
->fd
[1];
208 pData
->allocSize
= pInputCodecBuffer
->bufferSize
[0] + pInputCodecBuffer
->bufferSize
[1];
209 pData
->dataLen
= pInputCodecBuffer
->dataSize
;
210 pData
->usedDataLen
= 0;
211 pData
->remainDataLen
= pInputCodecBuffer
->dataSize
;
214 pData
->timeStamp
= 0;
215 pData
->pPrivate
= codecBuffer
;
216 pData
->bufferHeader
= NULL
;
221 OMX_ERRORTYPE
Exynos_Output_CodecBufferToData(
222 CODEC_ENC_BUFFER
*pCodecBuffer
,
223 EXYNOS_OMX_DATA
*pData
)
225 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
227 pData
->buffer
.singlePlaneBuffer
.dataBuffer
= pCodecBuffer
->pVirAddr
[0];
228 pData
->buffer
.singlePlaneBuffer
.fd
= pCodecBuffer
->fd
[0];
229 pData
->allocSize
= pCodecBuffer
->bufferSize
[0];
231 pData
->usedDataLen
= 0;
232 pData
->remainDataLen
= 0;
235 pData
->timeStamp
= 0;
236 pData
->pPrivate
= pCodecBuffer
;
237 pData
->bufferHeader
= NULL
;
242 void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
)
244 EXYNOS_OMX_BASEPORT
*exynosOMXInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
245 EXYNOS_OMX_BASEPORT
*exynosOMXOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
246 EXYNOS_OMX_BASEPORT
*exynosOMXPort
= NULL
;
250 exynosOMXPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
252 if (((pExynosComponent
->currentState
== OMX_StatePause
) ||
253 (pExynosComponent
->currentState
== OMX_StateIdle
) ||
254 (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateLoadedToIdle
) ||
255 (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateExecutingToIdle
)) &&
256 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateIdleToLoaded
) &&
257 (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort
))) {
258 Exynos_OSAL_SignalWait(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
, DEF_MAX_WAIT_TIME
);
259 Exynos_OSAL_SignalReset(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
);
267 OMX_BOOL
Exynos_CSC_InputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*srcInputData
)
269 OMX_BOOL ret
= OMX_FALSE
;
270 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
271 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
272 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
273 EXYNOS_OMX_DATABUFFER
*inputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
274 OMX_U32 nFrameWidth
= exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
275 OMX_U32 nFrameHeight
= exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
276 OMX_COLOR_FORMATTYPE eColorFormat
= exynosInputPort
->portDefinition
.format
.video
.eColorFormat
;
277 OMX_BYTE checkInputStream
= NULL
;
278 OMX_BOOL flagEOS
= OMX_FALSE
;
282 checkInputStream
= inputUseBuffer
->bufferHeader
->pBuffer
;
284 CODEC_ENC_BUFFER
*codecInputBuffer
= (CODEC_ENC_BUFFER
*)srcInputData
->pPrivate
;
285 codecInputBuffer
->dataSize
= ((nFrameWidth
* nFrameHeight
) * 3) / 2;
287 unsigned int csc_src_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar
);
288 unsigned int csc_dst_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar
);
289 CSC_METHOD csc_method
= CSC_METHOD_SW
;
290 unsigned int cacheable
= 1;
292 unsigned char *pSrcBuf
[3] = {NULL
, };
293 unsigned char *pDstBuf
[3] = {NULL
, };
295 CSC_ERRORCODE cscRet
= CSC_ErrorNone
;
297 pSrcBuf
[0] = checkInputStream
;
298 pSrcBuf
[1] = checkInputStream
+ (nFrameWidth
* nFrameHeight
);
299 pSrcBuf
[2] = checkInputStream
+ (((nFrameWidth
* nFrameHeight
) * 5) / 4);
301 pDstBuf
[0] = srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0];
302 pDstBuf
[1] = srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[1];
303 pDstBuf
[2] = srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2];
305 #ifdef USE_METADATABUFFERTYPE
306 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
308 /* kMetadataBufferTypeGrallocSource */
309 if (exynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
310 /* ARGB8888 converted to YUV420SemiPlanar */
311 csc_src_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_Format32bitARGB8888
);
312 csc_dst_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar
);
314 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)inputUseBuffer
->bufferHeader
->pBuffer
, ppBuf
);
315 if (eColorFormat
== OMX_COLOR_FormatAndroidOpaque
) {
316 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
320 ret
= Exynos_OSAL_LockANBHandle((OMX_U32
)ppBuf
[0], nFrameWidth
, nFrameHeight
, OMX_COLOR_FormatAndroidOpaque
, planes
);
321 if (ret
!= OMX_ErrorNone
) {
322 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: Exynos_OSAL_LockANBHandle() failed", __FUNCTION__
);
327 imageSize
= nFrameWidth
* nFrameHeight
* 3; /* RGB888 */
329 #ifdef USE_GSC_RGB_ENCODER
330 if (pVideoEnc
->csc_set_format
== OMX_FALSE
) {
331 cscRet
= csc_set_method(pVideoEnc
->csc_handle
, CSC_METHOD_HW
);
332 if (cscRet
!= CSC_ErrorNone
) {
340 csc_get_method(pVideoEnc
->csc_handle
, &csc_method
);
341 if (csc_method
== CSC_METHOD_HW
)
342 pSrcBuf
[0] = (unsigned char *)planes
[0].fd
;
345 pSrcBuf
[0] = planes
[0].addr
;
353 csc_get_method(pVideoEnc
->csc_handle
, &csc_method
);
354 if (csc_method
== CSC_METHOD_HW
) {
355 pSrcBuf
[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, checkInputStream
);
361 switch (eColorFormat
) {
362 case OMX_COLOR_FormatYUV420Planar
:
363 /* YUV420Planar converted to YUV420Semiplanar (interleaved UV plane) as per MFC spec.*/
364 csc_src_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420Planar
);
365 csc_dst_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar
);
367 case OMX_COLOR_FormatYUV420SemiPlanar
:
368 case OMX_SEC_COLOR_FormatNV12Tiled
:
369 case OMX_SEC_COLOR_FormatNV21Linear
:
370 /* Just copied to MFC input buffer */
371 csc_src_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar
);
372 csc_dst_color_format
= omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar
);
380 if (csc_method
== CSC_METHOD_HW
) {
381 pDstBuf
[0] = srcInputData
->buffer
.multiPlaneBuffer
.fd
[0];
382 pDstBuf
[1] = srcInputData
->buffer
.multiPlaneBuffer
.fd
[1];
383 pDstBuf
[2] = srcInputData
->buffer
.multiPlaneBuffer
.fd
[2];
388 pVideoEnc
->csc_handle
, /* handle */
389 nFrameWidth
, /* width */
390 nFrameHeight
, /* height */
393 nFrameWidth
, /* crop_width */
394 nFrameHeight
, /* crop_height */
395 csc_src_color_format
, /* color_format */
396 cacheable
); /* cacheable */
398 pVideoEnc
->csc_handle
, /* handle */
399 nFrameWidth
, /* width */
400 nFrameHeight
, /* height */
403 nFrameWidth
, /* crop_width */
404 nFrameHeight
, /* crop_height */
405 csc_dst_color_format
, /* color_format */
406 cacheable
); /* cacheable */
408 pVideoEnc
->csc_handle
, /* handle */
410 CSC_MEMORY_DMABUF
); /* YUV Addr or FD */
412 pVideoEnc
->csc_handle
, /* handle */
414 CSC_MEMORY_DMABUF
); /* YUV Addr or FD */
415 cscRet
= csc_convert(pVideoEnc
->csc_handle
);
416 if (cscRet
!= CSC_ErrorNone
)
421 #ifdef USE_METADATABUFFERTYPE
422 if (exynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
423 Exynos_OSAL_UnlockANBHandle((OMX_U32
)ppBuf
[0]);
435 OMX_BOOL
Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*srcInputData
)
437 OMX_BOOL ret
= OMX_FALSE
;
438 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
439 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
440 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
441 EXYNOS_OMX_DATABUFFER
*inputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
442 OMX_U32 nFrameWidth
= exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
443 OMX_U32 nFrameHeight
= exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
444 OMX_COLOR_FORMATTYPE eColorFormat
= exynosInputPort
->portDefinition
.format
.video
.eColorFormat
;
445 OMX_U32 copySize
= 0;
446 OMX_BYTE checkInputStream
= NULL
;
447 OMX_U32 checkInputStreamLen
= 0;
448 OMX_BOOL flagEOS
= OMX_FALSE
;
452 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
453 if ((srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] == NULL
) ||
454 (srcInputData
->pPrivate
== NULL
)) {
460 if (inputUseBuffer
->dataValid
== OMX_TRUE
) {
461 if (exynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
462 Exynos_Shared_BufferToData(inputUseBuffer
, srcInputData
, ONE_PLANE
);
463 #ifdef USE_METADATABUFFERTYPE
464 if (exynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
465 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
466 OMX_PTR allocSize
[MAX_BUFFER_PLANE
];
469 if (eColorFormat
== OMX_COLOR_FormatAndroidOpaque
) {
470 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)inputUseBuffer
->bufferHeader
->pBuffer
, ppBuf
);
471 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
473 Exynos_OSAL_LockANBHandle((OMX_U32
)ppBuf
[0], nFrameWidth
, nFrameHeight
, OMX_COLOR_FormatYUV420SemiPlanar
, planes
);
475 srcInputData
->buffer
.multiPlaneBuffer
.fd
[0] = planes
[0].fd
;
476 srcInputData
->buffer
.multiPlaneBuffer
.fd
[1] = planes
[1].fd
;
477 allocSize
[0] = nFrameWidth
* nFrameHeight
;
478 allocSize
[1] = nFrameWidth
* nFrameHeight
>> 1;
480 for (plane
= 0; plane
< MFC_INPUT_BUFFER_PLANE
; plane
++) {
481 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] =
482 Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc
->hSharedMemory
, srcInputData
->buffer
.multiPlaneBuffer
.fd
[plane
]);
483 if(srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] == NULL
) {
484 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] =
485 Exynos_OSAL_SharedMemory_Map(pVideoEnc
->hSharedMemory
, allocSize
[plane
], srcInputData
->buffer
.multiPlaneBuffer
.fd
[plane
]);
488 /* input buffers are 2 plane. */
489 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2] = NULL
;
490 srcInputData
->buffer
.multiPlaneBuffer
.fd
[2] = -1;
491 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__
, __LINE__
, (unsigned int)ppBuf
[0], (unsigned int)ppBuf
[0]);
493 /* kMetadataBufferTypeCameraSource */
494 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)inputUseBuffer
->bufferHeader
->pBuffer
, ppBuf
);
495 #ifndef USE_USERPTR_CAMERA_INPUT
497 srcInputData
->buffer
.multiPlaneBuffer
.fd
[0] = ppBuf
[0];
498 srcInputData
->buffer
.multiPlaneBuffer
.fd
[1] = ppBuf
[1];
499 allocSize
[0] = nFrameWidth
* nFrameHeight
;
500 allocSize
[1] = nFrameWidth
* nFrameHeight
>> 1;
502 for (plane
= 0; plane
< MFC_INPUT_BUFFER_PLANE
; plane
++) {
503 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] =
504 Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc
->hSharedMemory
, srcInputData
->buffer
.multiPlaneBuffer
.fd
[plane
]);
505 if(srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] == NULL
) {
506 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] =
507 Exynos_OSAL_SharedMemory_Map(pVideoEnc
->hSharedMemory
, allocSize
[plane
], srcInputData
->buffer
.multiPlaneBuffer
.fd
[plane
]);
510 /* input buffers are 2 plane. */
511 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2] = NULL
;
512 srcInputData
->buffer
.multiPlaneBuffer
.fd
[2] = -1;
514 for (plane
= 0; plane
< MFC_INPUT_BUFFER_PLANE
; plane
++) {
515 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] = ppBuf
[plane
];
517 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2] = NULL
;
520 for (plane
= 0; plane
< MFC_INPUT_BUFFER_PLANE
; plane
++) {
521 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] = ppBuf
[plane
];
523 srcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2] = NULL
;
525 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__
, __LINE__
, (unsigned int)ppBuf
[0], (unsigned int)ppBuf
[1]);
529 /* reset dataBuffer */
530 Exynos_ResetDataBuffer(inputUseBuffer
);
531 } else if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
532 checkInputStream
= inputUseBuffer
->bufferHeader
->pBuffer
+ inputUseBuffer
->usedDataLen
;
533 checkInputStreamLen
= inputUseBuffer
->remainDataLen
;
535 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
537 if (checkInputStreamLen
== 0) {
538 inputUseBuffer
->nFlags
|= OMX_BUFFERFLAG_EOS
;
542 copySize
= checkInputStreamLen
;
543 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "exynos_checkInputFrame : OMX_TRUE");
545 if (((srcInputData
->allocSize
) - (srcInputData
->dataLen
)) >= copySize
) {
546 ret
= Exynos_CSC_InputData(pOMXComponent
, srcInputData
);
547 if (ret
== OMX_FALSE
)
550 inputUseBuffer
->dataLen
-= copySize
;
551 inputUseBuffer
->remainDataLen
-= copySize
;
552 inputUseBuffer
->usedDataLen
+= copySize
;
554 srcInputData
->dataLen
+= copySize
;
555 srcInputData
->remainDataLen
+= copySize
;
557 srcInputData
->timeStamp
= inputUseBuffer
->timeStamp
;
558 srcInputData
->nFlags
= inputUseBuffer
->nFlags
;
559 srcInputData
->bufferHeader
= inputUseBuffer
->bufferHeader
;
561 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "input codec buffer is smaller than decoded input data size Out Length");
562 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
563 pExynosComponent
->callbackData
,
564 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
568 if (((exynosInputPort
->bStoreMetaData
== OMX_TRUE
) && (eColorFormat
== OMX_COLOR_FormatAndroidOpaque
)) ||
569 (exynosInputPort
->bStoreMetaData
== OMX_FALSE
)) {
570 Exynos_InputBufferReturn(pOMXComponent
);
572 inputUseBuffer
->dataValid
= OMX_TRUE
;
576 if ((srcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
577 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "bSaveFlagEOS : OMX_TRUE");
578 srcInputData
->dataLen
= 0;
579 srcInputData
->remainDataLen
= 0;
580 pExynosComponent
->bSaveFlagEOS
= OMX_TRUE
;
583 if (pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
== OMX_TRUE
) {
584 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_TRUE
;
585 pExynosComponent
->checkTimeStamp
.startTimeStamp
= srcInputData
->timeStamp
;
586 pExynosComponent
->checkTimeStamp
.nStartFlags
= srcInputData
->nFlags
;
587 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
588 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "first frame timestamp after seeking %lld us (%.2f secs)",
589 srcInputData
->timeStamp
, srcInputData
->timeStamp
/ 1E6
);
602 OMX_BOOL
Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*dstOutputData
)
604 OMX_BOOL ret
= OMX_FALSE
;
605 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
606 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
607 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
608 OMX_U32 copySize
= 0;
612 if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
613 if (Exynos_Shared_DataToBuffer(dstOutputData
, outputUseBuffer
) == OMX_ErrorNone
)
614 outputUseBuffer
->dataValid
= OMX_TRUE
;
617 if (outputUseBuffer
->dataValid
== OMX_TRUE
) {
618 if (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
== OMX_TRUE
) {
619 if (pExynosComponent
->checkTimeStamp
.startTimeStamp
== dstOutputData
->timeStamp
){
620 pExynosComponent
->checkTimeStamp
.startTimeStamp
= -19761123;
621 pExynosComponent
->checkTimeStamp
.nStartFlags
= 0x0;
622 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
623 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
625 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "garbage frame drop after flush");
629 } else if (pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
== OMX_TRUE
) {
631 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "input buffer has not come after flush.");
635 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
636 if (dstOutputData
->remainDataLen
<= (outputUseBuffer
->allocSize
- outputUseBuffer
->dataLen
)) {
637 copySize
= dstOutputData
->remainDataLen
;
639 Exynos_OSAL_Memcpy((outputUseBuffer
->bufferHeader
->pBuffer
+ outputUseBuffer
->dataLen
),
640 (dstOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
+ dstOutputData
->usedDataLen
),
642 outputUseBuffer
->dataLen
+= copySize
;
643 outputUseBuffer
->remainDataLen
+= copySize
;
644 outputUseBuffer
->nFlags
= dstOutputData
->nFlags
;
645 outputUseBuffer
->timeStamp
= dstOutputData
->timeStamp
;
649 if ((outputUseBuffer
->remainDataLen
> 0) ||
650 (outputUseBuffer
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
651 Exynos_OutputBufferReturn(pOMXComponent
);
654 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "output buffer is smaller than encoded data size Out Length");
655 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
656 pExynosComponent
->callbackData
,
657 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
660 } else if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
661 if ((outputUseBuffer
->remainDataLen
> 0) ||
662 ((outputUseBuffer
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) ||
663 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)))
664 Exynos_OutputBufferReturn(pOMXComponent
);
676 #ifdef USE_METADATABUFFERTYPE
677 OMX_ERRORTYPE
Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent
)
679 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
680 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
681 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
682 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
683 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
684 EXYNOS_OMX_DATABUFFER
*srcInputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
685 EXYNOS_OMX_DATA
*pSrcInputData
= &exynosInputPort
->processData
;
686 OMX_COLOR_FORMATTYPE eColorFormat
= exynosInputPort
->portDefinition
.format
.video
.eColorFormat
;
689 OMX_PTR ppBuf
[MAX_BUFFER_PLANE
];
692 /* kMetadataBufferTypeGrallocSource */
693 if (exynosInputPort
->bStoreMetaData
== OMX_TRUE
) {
694 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE
)srcInputUseBuffer
->bufferHeader
->pBuffer
, ppBuf
);
695 if (eColorFormat
== OMX_COLOR_FormatAndroidOpaque
) {
696 pVideoEnc
->ANBColorFormat
= Exynos_OSAL_GetANBColorFormat(ppBuf
[0]);
697 if ((pVideoEnc
->ANBColorFormat
== OMX_COLOR_FormatYUV420SemiPlanar
) ||
698 (pVideoEnc
->ANBColorFormat
== OMX_SEC_COLOR_FormatNV12Tiled
)) {
699 exynosInputPort
->bufferProcessType
= BUFFER_SHARE
;
701 exynosInputPort
->bufferProcessType
= BUFFER_COPY
;
704 if ((exynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
705 Exynos_OSAL_SemaphoreCreate(&exynosInputPort
->codecSemID
);
706 Exynos_OSAL_QueueCreate(&exynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
708 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
709 pVideoEnc
->pMFCEncInputBuffer
[i
] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER
));
710 /* Use ION Allocator */
712 pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc
->hSharedMemory
, DEFAULT_MFC_INPUT_YBUFFER_SIZE
, NORMAL_MEMORY
);
713 pVideoEnc
->pMFCEncInputBuffer
[i
]->fd
[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]);
714 pVideoEnc
->pMFCEncInputBuffer
[i
]->bufferSize
[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE
;
716 pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc
->hSharedMemory
, DEFAULT_MFC_INPUT_CBUFFER_SIZE
, NORMAL_MEMORY
);
717 pVideoEnc
->pMFCEncInputBuffer
[i
]->fd
[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc
->hSharedMemory
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[1]);
718 pVideoEnc
->pMFCEncInputBuffer
[i
]->bufferSize
[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE
;
720 pVideoEnc
->pMFCEncInputBuffer
[i
]->dataSize
= 0;
722 if ((pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0] == NULL
) ||
723 (pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[1] == NULL
)) {
724 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Fail input buffer");
725 ret
= OMX_ErrorInsufficientResources
;
729 /* MFC input buffers are 1 plane. */
730 pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[2] = NULL
;
731 pVideoEnc
->pMFCEncInputBuffer
[i
]->fd
[2] = -1;
732 pVideoEnc
->pMFCEncInputBuffer
[i
]->bufferSize
[2] = 0;
734 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
735 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[0]);
736 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i
, pVideoEnc
->pMFCEncInputBuffer
[i
]->pVirAddr
[1]);
738 Exynos_CodecBufferEnqueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoEnc
->pMFCEncInputBuffer
[i
]);
740 } else if (exynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
744 /* Does not require any actions. */
756 OMX_ERRORTYPE
Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent
)
758 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
759 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
760 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
761 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
762 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
763 EXYNOS_OMX_DATABUFFER
*srcInputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
764 EXYNOS_OMX_DATA
*pSrcInputData
= &exynosInputPort
->processData
;
765 OMX_BOOL bCheckInputData
= OMX_FALSE
;
766 OMX_BOOL bValidCodecData
= OMX_FALSE
;
770 while (!pVideoEnc
->bExitBufferProcessThread
) {
771 Exynos_OSAL_SleepMillisec(0);
772 Exynos_Wait_ProcessPause(pExynosComponent
, INPUT_PORT_INDEX
);
774 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) &&
775 (!pVideoEnc
->bExitBufferProcessThread
)) {
776 Exynos_OSAL_SleepMillisec(0);
778 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
))
780 if (exynosInputPort
->portState
!= OMX_StateIdle
)
783 Exynos_OSAL_MutexLock(srcInputUseBuffer
->bufferMutex
);
784 if (pVideoEnc
->bFirstInput
== OMX_FALSE
) {
785 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
787 if ((pSrcInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] == NULL
) || (pSrcInputData
->pPrivate
== NULL
)) {
788 Exynos_CodecBufferDequeue(pExynosComponent
, INPUT_PORT_INDEX
, &codecBuffer
);
789 if (codecBuffer
!= NULL
) {
790 Exynos_Input_CodecBufferToData(pExynosComponent
, codecBuffer
, pSrcInputData
);
792 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
797 if (srcInputUseBuffer
->dataValid
== OMX_TRUE
) {
798 bCheckInputData
= Exynos_Preprocessor_InputData(pOMXComponent
, pSrcInputData
);
800 bCheckInputData
= OMX_FALSE
;
803 if ((bCheckInputData
== OMX_FALSE
) &&
804 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort
))) {
805 ret
= Exynos_InputBufferGetQueue(pExynosComponent
);
806 #ifdef USE_METADATABUFFERTYPE
807 if ((pVideoEnc
->bFirstInput
== OMX_TRUE
) &&
808 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort
))) {
809 Exynos_OMX_ExtensionSetup(hComponent
);
810 pVideoEnc
->bFirstInput
= OMX_FALSE
;
813 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
817 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
)) {
818 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
822 ret
= pVideoEnc
->exynos_codec_srcInputProcess(pOMXComponent
, pSrcInputData
);
823 Exynos_ResetCodecData(pSrcInputData
);
824 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
825 if (ret
== OMX_ErrorCodecInit
)
826 pVideoEnc
->bExitBufferProcessThread
= OMX_TRUE
;
837 OMX_ERRORTYPE
Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent
)
839 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
840 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
841 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
842 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
843 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
844 EXYNOS_OMX_DATABUFFER
*srcOutputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
845 EXYNOS_OMX_DATA srcOutputData
;
849 while (!pVideoEnc
->bExitBufferProcessThread
) {
850 Exynos_OSAL_SleepMillisec(0);
852 while (!pVideoEnc
->bExitBufferProcessThread
) {
853 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
854 if (Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
) == OMX_FALSE
)
857 Exynos_OSAL_SleepMillisec(0);
859 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
))
862 Exynos_OSAL_MutexLock(srcOutputUseBuffer
->bufferMutex
);
863 ret
= pVideoEnc
->exynos_codec_srcOutputProcess(pOMXComponent
, &srcOutputData
);
865 if (ret
== OMX_ErrorNone
) {
866 if (exynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
868 codecBuffer
= srcOutputData
.pPrivate
;
869 if (codecBuffer
!= NULL
)
870 Exynos_CodecBufferEnqueue(pExynosComponent
, INPUT_PORT_INDEX
, codecBuffer
);
872 if (exynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
873 Exynos_Shared_DataToBuffer(&srcOutputData
, srcOutputUseBuffer
);
874 Exynos_InputBufferReturn(pOMXComponent
);
876 Exynos_ResetCodecData(&srcOutputData
);
878 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer
->bufferMutex
);
889 OMX_ERRORTYPE
Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent
)
891 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
892 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
893 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
894 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
895 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
896 EXYNOS_OMX_DATABUFFER
*dstInputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
897 EXYNOS_OMX_DATA dstInputData
;
901 while (!pVideoEnc
->bExitBufferProcessThread
) {
902 Exynos_OSAL_SleepMillisec(0);
904 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) &&
905 (!pVideoEnc
->bExitBufferProcessThread
)) {
906 Exynos_OSAL_SleepMillisec(0);
908 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) ||
909 (!CHECK_PORT_POPULATED(exynosOutputPort
)))
911 if (exynosOutputPort
->portState
!= OMX_StateIdle
)
914 Exynos_OSAL_MutexLock(dstInputUseBuffer
->bufferMutex
);
915 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
916 CODEC_ENC_BUFFER
*pCodecBuffer
= NULL
;
917 ret
= Exynos_CodecBufferDequeue(pExynosComponent
, OUTPUT_PORT_INDEX
, (OMX_PTR
*)&pCodecBuffer
);
918 if (ret
!= OMX_ErrorNone
) {
919 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
922 Exynos_Output_CodecBufferToData(pCodecBuffer
, &dstInputData
);
925 if (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
926 if ((dstInputUseBuffer
->dataValid
!= OMX_TRUE
) &&
927 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
928 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
929 if (ret
!= OMX_ErrorNone
) {
930 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
933 Exynos_Shared_BufferToData(dstInputUseBuffer
, &dstInputData
, ONE_PLANE
);
934 Exynos_ResetDataBuffer(dstInputUseBuffer
);
938 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) {
939 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
942 ret
= pVideoEnc
->exynos_codec_dstInputProcess(pOMXComponent
, &dstInputData
);
944 Exynos_ResetCodecData(&dstInputData
);
945 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
956 OMX_ERRORTYPE
Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent
)
958 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
959 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
960 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
961 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
962 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
963 EXYNOS_OMX_DATABUFFER
*dstOutputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
964 EXYNOS_OMX_DATA
*pDstOutputData
= &exynosOutputPort
->processData
;
968 while (!pVideoEnc
->bExitBufferProcessThread
) {
969 Exynos_OSAL_SleepMillisec(0);
970 Exynos_Wait_ProcessPause(pExynosComponent
, OUTPUT_PORT_INDEX
);
972 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) &&
973 (!pVideoEnc
->bExitBufferProcessThread
)) {
974 Exynos_OSAL_SleepMillisec(0);
976 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))
979 Exynos_OSAL_MutexLock(dstOutputUseBuffer
->bufferMutex
);
980 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
981 if ((dstOutputUseBuffer
->dataValid
!= OMX_TRUE
) &&
982 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
983 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
984 if (ret
!= OMX_ErrorNone
) {
985 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer
->bufferMutex
);
991 if ((dstOutputUseBuffer
->dataValid
== OMX_TRUE
) ||
992 (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
))
993 ret
= pVideoEnc
->exynos_codec_dstOutputProcess(pOMXComponent
, pDstOutputData
);
995 if (((ret
== OMX_ErrorNone
) && (dstOutputUseBuffer
->dataValid
== OMX_TRUE
)) ||
996 (exynosOutputPort
->bufferProcessType
& BUFFER_SHARE
)) {
997 Exynos_Postprocess_OutputData(pOMXComponent
, pDstOutputData
);
1000 if (exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1001 if (pDstOutputData
->pPrivate
!= NULL
) {
1002 Exynos_CodecBufferEnqueue(pExynosComponent
, OUTPUT_PORT_INDEX
, pDstOutputData
->pPrivate
);
1003 pDstOutputData
->pPrivate
= NULL
;
1007 /* reset outputData */
1008 Exynos_ResetCodecData(pDstOutputData
);
1009 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer
->bufferMutex
);
1020 static OMX_ERRORTYPE
Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData
)
1022 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1023 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1024 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1025 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1029 if (threadData
== NULL
) {
1030 ret
= OMX_ErrorBadParameter
;
1033 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1034 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1035 if (ret
!= OMX_ErrorNone
) {
1038 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1039 Exynos_OMX_SrcInputBufferProcess(pOMXComponent
);
1041 Exynos_OSAL_ThreadExit(NULL
);
1049 static OMX_ERRORTYPE
Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData
)
1051 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1052 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1053 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1054 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1058 if (threadData
== NULL
) {
1059 ret
= OMX_ErrorBadParameter
;
1062 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1063 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1064 if (ret
!= OMX_ErrorNone
) {
1067 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1068 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent
);
1070 Exynos_OSAL_ThreadExit(NULL
);
1078 static OMX_ERRORTYPE
Exynos_OMX_DstInputProcessThread(OMX_PTR threadData
)
1080 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1081 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1082 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1083 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1087 if (threadData
== NULL
) {
1088 ret
= OMX_ErrorBadParameter
;
1091 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1092 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1093 if (ret
!= OMX_ErrorNone
) {
1096 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1097 Exynos_OMX_DstInputBufferProcess(pOMXComponent
);
1099 Exynos_OSAL_ThreadExit(NULL
);
1107 static OMX_ERRORTYPE
Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData
)
1109 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1110 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1111 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1112 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1116 if (threadData
== NULL
) {
1117 ret
= OMX_ErrorBadParameter
;
1120 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1121 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1122 if (ret
!= OMX_ErrorNone
) {
1125 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1126 Exynos_OMX_DstOutputBufferProcess(pOMXComponent
);
1128 Exynos_OSAL_ThreadExit(NULL
);
1136 OMX_ERRORTYPE
Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent
)
1138 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1139 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1140 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1141 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1145 pVideoEnc
->bExitBufferProcessThread
= OMX_FALSE
;
1147 ret
= Exynos_OSAL_ThreadCreate(&pVideoEnc
->hDstOutputThread
,
1148 Exynos_OMX_DstOutputProcessThread
,
1150 if (ret
== OMX_ErrorNone
)
1151 ret
= Exynos_OSAL_ThreadCreate(&pVideoEnc
->hSrcOutputThread
,
1152 Exynos_OMX_SrcOutputProcessThread
,
1154 if (ret
== OMX_ErrorNone
)
1155 ret
= Exynos_OSAL_ThreadCreate(&pVideoEnc
->hDstInputThread
,
1156 Exynos_OMX_DstInputProcessThread
,
1158 if (ret
== OMX_ErrorNone
)
1159 ret
= Exynos_OSAL_ThreadCreate(&pVideoEnc
->hSrcInputThread
,
1160 Exynos_OMX_SrcInputProcessThread
,
1169 OMX_ERRORTYPE
Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent
)
1171 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1172 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1173 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1174 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1175 OMX_S32 countValue
= 0;
1180 pVideoEnc
->bExitBufferProcessThread
= OMX_TRUE
;
1182 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].bufferSemID
, &countValue
);
1183 if (countValue
== 0)
1184 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].bufferSemID
);
1185 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].codecSemID
, &countValue
);
1186 if (countValue
== 0)
1187 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].codecSemID
);
1188 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].pauseEvent
);
1189 Exynos_OSAL_ThreadTerminate(pVideoEnc
->hSrcInputThread
);
1190 pVideoEnc
->hSrcInputThread
= NULL
;
1192 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bufferSemID
, &countValue
);
1193 if (countValue
== 0)
1194 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bufferSemID
);
1195 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].codecSemID
, &countValue
);
1196 if (countValue
== 0)
1197 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].codecSemID
);
1198 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].pauseEvent
);
1199 Exynos_OSAL_ThreadTerminate(pVideoEnc
->hDstInputThread
);
1200 pVideoEnc
->hDstInputThread
= NULL
;
1202 pVideoEnc
->exynos_codec_stop(pOMXComponent
, INPUT_PORT_INDEX
);
1203 pVideoEnc
->exynos_codec_bufferProcessRun(pOMXComponent
, INPUT_PORT_INDEX
);
1204 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].pauseEvent
);
1205 Exynos_OSAL_ThreadTerminate(pVideoEnc
->hSrcOutputThread
);
1206 pVideoEnc
->hSrcOutputThread
= NULL
;
1208 pVideoEnc
->exynos_codec_stop(pOMXComponent
, OUTPUT_PORT_INDEX
);
1209 pVideoEnc
->exynos_codec_bufferProcessRun(pOMXComponent
, INPUT_PORT_INDEX
);
1210 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].pauseEvent
);
1211 Exynos_OSAL_ThreadTerminate(pVideoEnc
->hDstOutputThread
);
1212 pVideoEnc
->hDstOutputThread
= NULL
;
1220 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent
)
1222 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1223 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1224 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1225 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1226 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1230 if (hComponent
== NULL
) {
1231 ret
= OMX_ErrorBadParameter
;
1234 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1235 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1236 if (ret
!= OMX_ErrorNone
) {
1237 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1241 ret
= Exynos_OMX_BaseComponent_Constructor(pOMXComponent
);
1242 if (ret
!= OMX_ErrorNone
) {
1243 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1247 ret
= Exynos_OMX_Port_Constructor(pOMXComponent
);
1248 if (ret
!= OMX_ErrorNone
) {
1249 Exynos_OMX_BaseComponent_Destructor(pOMXComponent
);
1250 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1254 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1256 pVideoEnc
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEOENC_COMPONENT
));
1257 if (pVideoEnc
== NULL
) {
1258 Exynos_OMX_BaseComponent_Destructor(pOMXComponent
);
1259 ret
= OMX_ErrorInsufficientResources
;
1260 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
1264 Exynos_OSAL_Memset(pVideoEnc
, 0, sizeof(EXYNOS_OMX_VIDEOENC_COMPONENT
));
1265 pExynosComponent
->hComponentHandle
= (OMX_HANDLETYPE
)pVideoEnc
;
1267 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1269 pVideoEnc
->bFirstInput
= OMX_FALSE
;
1270 pVideoEnc
->bFirstOutput
= OMX_FALSE
;
1271 pVideoEnc
->configChange
= OMX_FALSE
;
1272 pVideoEnc
->quantization
.nQpI
= 4; // I frame quantization parameter
1273 pVideoEnc
->quantization
.nQpP
= 5; // P frame quantization parameter
1274 pVideoEnc
->quantization
.nQpB
= 5; // B frame quantization parameter
1276 pExynosComponent
->bMultiThreadProcess
= OMX_TRUE
;
1279 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1280 pExynosPort
->portDefinition
.nBufferCountActual
= MAX_VIDEO_INPUTBUFFER_NUM
;
1281 pExynosPort
->portDefinition
.nBufferCountMin
= MAX_VIDEO_INPUTBUFFER_NUM
;
1282 pExynosPort
->portDefinition
.nBufferSize
= 0;
1283 pExynosPort
->portDefinition
.eDomain
= OMX_PortDomainVideo
;
1285 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE
);
1286 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1287 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1288 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1289 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1291 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= 0;
1292 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= 0;
1293 pExynosPort
->portDefinition
.format
.video
.nStride
= 0;
1294 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1295 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
1296 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
1297 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1298 pExynosPort
->portDefinition
.format
.video
.pNativeWindow
= NULL
;
1299 pVideoEnc
->eControlRate
[INPUT_PORT_INDEX
] = OMX_Video_ControlRateDisable
;
1301 pExynosPort
->bStoreMetaData
= OMX_FALSE
;
1304 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1305 pExynosPort
->portDefinition
.nBufferCountActual
= MAX_VIDEO_OUTPUTBUFFER_NUM
;
1306 pExynosPort
->portDefinition
.nBufferCountMin
= MAX_VIDEO_OUTPUTBUFFER_NUM
;
1307 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
1308 pExynosPort
->portDefinition
.eDomain
= OMX_PortDomainVideo
;
1310 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE
);
1311 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1312 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1313 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1314 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1316 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= 0;
1317 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= 0;
1318 pExynosPort
->portDefinition
.format
.video
.nStride
= 0;
1319 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1320 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
1321 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
1322 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1323 pExynosPort
->portDefinition
.format
.video
.pNativeWindow
= NULL
;
1324 pVideoEnc
->eControlRate
[OUTPUT_PORT_INDEX
] = OMX_Video_ControlRateDisable
;
1326 pOMXComponent
->UseBuffer
= &Exynos_OMX_UseBuffer
;
1327 pOMXComponent
->AllocateBuffer
= &Exynos_OMX_AllocateBuffer
;
1328 pOMXComponent
->FreeBuffer
= &Exynos_OMX_FreeBuffer
;
1329 pOMXComponent
->ComponentTunnelRequest
= &Exynos_OMX_ComponentTunnelRequest
;
1331 pExynosComponent
->exynos_AllocateTunnelBuffer
= &Exynos_OMX_AllocateTunnelBuffer
;
1332 pExynosComponent
->exynos_FreeTunnelBuffer
= &Exynos_OMX_FreeTunnelBuffer
;
1333 pExynosComponent
->exynos_BufferProcessCreate
= &Exynos_OMX_BufferProcess_Create
;
1334 pExynosComponent
->exynos_BufferProcessTerminate
= &Exynos_OMX_BufferProcess_Terminate
;
1335 pExynosComponent
->exynos_BufferFlush
= &Exynos_OMX_BufferFlush
;
1343 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent
)
1345 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1346 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1347 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1348 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1349 EXYNOS_OMX_VIDEOENC_COMPONENT
*pVideoEnc
= NULL
;
1354 if (hComponent
== NULL
) {
1355 ret
= OMX_ErrorBadParameter
;
1358 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1359 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1360 if (ret
!= OMX_ErrorNone
) {
1364 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1365 ret
= OMX_ErrorBadParameter
;
1368 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1370 pVideoEnc
= (EXYNOS_OMX_VIDEOENC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1372 Exynos_OSAL_Free(pVideoEnc
);
1373 pExynosComponent
->hComponentHandle
= pVideoEnc
= NULL
;
1375 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
1376 pExynosPort
= &pExynosComponent
->pExynosPort
[i
];
1377 Exynos_OSAL_Free(pExynosPort
->portDefinition
.format
.video
.cMIMEType
);
1378 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= NULL
;
1381 ret
= Exynos_OMX_Port_Destructor(pOMXComponent
);
1383 ret
= Exynos_OMX_BaseComponent_Destructor(hComponent
);