3 * Copyright 2014 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_Vp9dec.c
21 * @author Taehwan Kim (t_h.kim@samsung.com)
22 * SeungBeom Kim (sbcrux.kim@samsung.com)
32 #include "Exynos_OMX_Macros.h"
33 #include "Exynos_OMX_Basecomponent.h"
34 #include "Exynos_OMX_Baseport.h"
35 #include "Exynos_OMX_Vdec.h"
36 #include "Exynos_OMX_VdecControl.h"
37 #include "Exynos_OSAL_ETC.h"
38 #include "Exynos_OSAL_Semaphore.h"
39 #include "Exynos_OSAL_Thread.h"
40 #include "library_register.h"
41 #include "Exynos_OMX_Vp9dec.h"
42 #include "ExynosVideoApi.h"
43 #include "Exynos_OSAL_SharedMemory.h"
44 #include "Exynos_OSAL_Event.h"
46 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
47 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
51 #define EXYNOS_LOG_TAG "EXYNOS_VP9_DEC"
52 //#define EXYNOS_LOG_OFF
53 #include "Exynos_OSAL_Log.h"
55 #define VP9_DEC_NUM_OF_EXTRA_BUFFERS 7
57 //#define FULL_FRAME_SEARCH /* Full frame search not support*/
59 #if 0 /* unused code */
60 static OMX_ERRORTYPE
GetCodecInputPrivateData(OMX_PTR codecBuffer
, OMX_PTR
*pVirtAddr
, OMX_U32
*dataSize
)
62 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
69 static OMX_ERRORTYPE
GetCodecOutputPrivateData(OMX_PTR codecBuffer
, OMX_PTR addr
[], OMX_U32 size
[])
71 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
72 ExynosVideoBuffer
*pCodecBuffer
= NULL
;
74 if (codecBuffer
== NULL
) {
75 ret
= OMX_ErrorBadParameter
;
79 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
82 addr
[0] = pCodecBuffer
->planes
[0].addr
;
83 addr
[1] = pCodecBuffer
->planes
[1].addr
;
84 addr
[2] = pCodecBuffer
->planes
[2].addr
;
88 size
[0] = pCodecBuffer
->planes
[0].allocSize
;
89 size
[1] = pCodecBuffer
->planes
[1].allocSize
;
90 size
[2] = pCodecBuffer
->planes
[2].allocSize
;
97 #if 0 /* unused code */
98 static int Check_VP9_Frame(
102 OMX_BOOL bPreviousFrameEOF
,
103 OMX_BOOL
*pbEndOfFrame
)
105 /* Uncompressed data Chunk comprises a common
106 (for key frames and interframes) 3-byte frame tag that
108 - 1-bit frame type (0 - key frame, 1 - inter frame)
109 - 3-bit version number (0 - 3 are defined as four different
110 profiles with different decoding complexity)
111 - 1-bit show_frame flag ( 0 - current frame not for display,
112 1 - current frame is for dispaly)
113 - 19-bit field - size of the first data partition in bytes
115 Key Frames : frame tag followed by 7 bytes of uncompressed
117 3-bytes : Start code (byte 0: 0x9d,byte 1: 0x01,byte 2: 0x2a)
118 Next 4-bytes: Width & height, Horizontal and vertical scale information
119 16 bits : (2 bits Horizontal Scale << 14) | Width (14 bits)
120 16 bits : (2 bits Vertical Scale << 14) | Height (14 bits)
123 int horizSscale
, vertScale
;
127 *pbEndOfFrame
= OMX_TRUE
;
129 /*Check for Key frame*/
130 if (!(pInputStream
[0] & 0x01)){
131 /* Key Frame Start code*/
132 if (pInputStream
[3] != 0x9d || pInputStream
[4] != 0x01 || pInputStream
[5]!=0x2a) {
133 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, " VP9 Key Frame Start Code not Found");
134 *pbEndOfFrame
= OMX_FALSE
;
136 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, " VP9 Found Key Frame Start Code");
137 width
= (pInputStream
[6] | (pInputStream
[7] << 8)) & 0x3fff;
138 horizSscale
= pInputStream
[7] >> 6;
139 height
= (pInputStream
[8] | (pInputStream
[9] << 8)) & 0x3fff;
140 vertScale
= pInputStream
[9] >> 6;
141 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "width = %d, height = %d, horizSscale = %d, vertScale = %d", width
, height
, horizSscale
, vertScale
);
145 return (int)buffSize
;
149 OMX_BOOL
Check_VP9_StartCode(
150 OMX_U8
*pInputStream
,
153 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "buffer: %p, streamSize: %d", pInputStream
, streamSize
);
154 if (streamSize
< 3) {
161 OMX_BOOL
CheckFormatHWSupport(
162 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
,
163 OMX_COLOR_FORMATTYPE eColorFormat
)
165 OMX_BOOL ret
= OMX_FALSE
;
166 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
167 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
168 EXYNOS_OMX_BASEPORT
*pOutputPort
= NULL
;
169 ExynosVideoColorFormatType eVideoFormat
= VIDEO_CODING_UNKNOWN
;
174 if (pExynosComponent
== NULL
)
177 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
178 if (pVideoDec
== NULL
)
181 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
184 pOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
186 eVideoFormat
= (ExynosVideoColorFormatType
)Exynos_OSAL_OMX2VideoFormat(eColorFormat
, pOutputPort
->ePlaneType
);
188 for (i
= 0; i
< VIDEO_COLORFORMAT_MAX
; i
++) {
189 if (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.supportFormat
[i
] == VIDEO_COLORFORMAT_UNKNOWN
)
192 if (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.supportFormat
[i
] == eVideoFormat
) {
202 OMX_ERRORTYPE
VP9CodecOpen(EXYNOS_VP9DEC_HANDLE
*pVp9Dec
, ExynosVideoInstInfo
*pVideoInstInfo
)
204 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
205 ExynosVideoDecOps
*pDecOps
= NULL
;
206 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
207 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
211 if (pVp9Dec
== NULL
) {
212 ret
= OMX_ErrorBadParameter
;
213 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
217 /* alloc ops structure */
218 pDecOps
= (ExynosVideoDecOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps
));
219 pInbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
220 pOutbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
222 if ((pDecOps
== NULL
) || (pInbufOps
== NULL
) || (pOutbufOps
== NULL
)) {
223 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate decoder ops buffer");
224 ret
= OMX_ErrorInsufficientResources
;
228 pVp9Dec
->hMFCVp9Handle
.pDecOps
= pDecOps
;
229 pVp9Dec
->hMFCVp9Handle
.pInbufOps
= pInbufOps
;
230 pVp9Dec
->hMFCVp9Handle
.pOutbufOps
= pOutbufOps
;
232 /* function pointer mapping */
233 pDecOps
->nSize
= sizeof(ExynosVideoDecOps
);
234 pInbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
235 pOutbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
237 Exynos_Video_Register_Decoder(pDecOps
, pInbufOps
, pOutbufOps
);
239 /* check mandatory functions for decoder ops */
240 if ((pDecOps
->Init
== NULL
) || (pDecOps
->Finalize
== NULL
) ||
241 (pDecOps
->Get_ActualBufferCount
== NULL
) || (pDecOps
->Set_FrameTag
== NULL
) ||
242 (pDecOps
->Get_FrameTag
== NULL
)) {
243 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
244 ret
= OMX_ErrorInsufficientResources
;
248 /* check mandatory functions for buffer ops */
249 if ((pInbufOps
->Setup
== NULL
) || (pOutbufOps
->Setup
== NULL
) ||
250 (pInbufOps
->Run
== NULL
) || (pOutbufOps
->Run
== NULL
) ||
251 (pInbufOps
->Stop
== NULL
) || (pOutbufOps
->Stop
== NULL
) ||
252 (pInbufOps
->Enqueue
== NULL
) || (pOutbufOps
->Enqueue
== NULL
) ||
253 (pInbufOps
->Dequeue
== NULL
) || (pOutbufOps
->Dequeue
== NULL
)) {
254 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
255 ret
= OMX_ErrorInsufficientResources
;
259 /* alloc context, open, querycap */
261 pVideoInstInfo
->nMemoryType
= V4L2_MEMORY_DMABUF
;
263 pVideoInstInfo
->nMemoryType
= V4L2_MEMORY_USERPTR
;
265 pVp9Dec
->hMFCVp9Handle
.hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.pDecOps
->Init(pVideoInstInfo
);
266 if (pVp9Dec
->hMFCVp9Handle
.hMFCHandle
== NULL
) {
267 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate context buffer");
268 ret
= OMX_ErrorInsufficientResources
;
275 if (ret
!= OMX_ErrorNone
) {
276 if (pDecOps
!= NULL
) {
277 Exynos_OSAL_Free(pDecOps
);
278 pVp9Dec
->hMFCVp9Handle
.pDecOps
= NULL
;
280 if (pInbufOps
!= NULL
) {
281 Exynos_OSAL_Free(pInbufOps
);
282 pVp9Dec
->hMFCVp9Handle
.pInbufOps
= NULL
;
284 if (pOutbufOps
!= NULL
) {
285 Exynos_OSAL_Free(pOutbufOps
);
286 pVp9Dec
->hMFCVp9Handle
.pOutbufOps
= NULL
;
295 OMX_ERRORTYPE
VP9CodecClose(EXYNOS_VP9DEC_HANDLE
*pVp9Dec
)
297 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
298 void *hMFCHandle
= NULL
;
299 ExynosVideoDecOps
*pDecOps
= NULL
;
300 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
301 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
305 if (pVp9Dec
== NULL
) {
306 ret
= OMX_ErrorBadParameter
;
310 hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
311 pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
312 pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
313 pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
315 if (hMFCHandle
!= NULL
) {
316 pDecOps
->Finalize(hMFCHandle
);
317 pVp9Dec
->hMFCVp9Handle
.hMFCHandle
= NULL
;
320 /* Unregister function pointers */
321 Exynos_Video_Unregister_Decoder(pDecOps
, pInbufOps
, pOutbufOps
);
323 if (pOutbufOps
!= NULL
) {
324 Exynos_OSAL_Free(pOutbufOps
);
325 pVp9Dec
->hMFCVp9Handle
.pOutbufOps
= NULL
;
327 if (pInbufOps
!= NULL
) {
328 Exynos_OSAL_Free(pInbufOps
);
329 pVp9Dec
->hMFCVp9Handle
.pInbufOps
= NULL
;
331 if (pDecOps
!= NULL
) {
332 Exynos_OSAL_Free(pDecOps
);
333 pVp9Dec
->hMFCVp9Handle
.pDecOps
= NULL
;
344 OMX_ERRORTYPE
VP9CodecStart(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
346 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
347 void *hMFCHandle
= NULL
;
348 ExynosVideoDecOps
*pDecOps
= NULL
;
349 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
350 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
351 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
352 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
356 if (pOMXComponent
== NULL
) {
357 ret
= OMX_ErrorBadParameter
;
361 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
362 if (pVideoDec
== NULL
) {
363 ret
= OMX_ErrorBadParameter
;
367 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
368 if (pVp9Dec
== NULL
) {
369 ret
= OMX_ErrorBadParameter
;
373 hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
374 pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
375 pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
376 pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
378 if (nPortIndex
== INPUT_PORT_INDEX
)
379 pInbufOps
->Run(hMFCHandle
);
380 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
381 pOutbufOps
->Run(hMFCHandle
);
391 OMX_ERRORTYPE
VP9CodecStop(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
393 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
394 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
395 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
396 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
397 void *hMFCHandle
= NULL
;
398 ExynosVideoDecOps
*pDecOps
= NULL
;
399 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
400 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
404 if (pOMXComponent
== NULL
) {
405 ret
= OMX_ErrorBadParameter
;
409 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
410 if (pExynosComponent
== NULL
) {
411 ret
= OMX_ErrorBadParameter
;
415 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
416 if (pVideoDec
== NULL
) {
417 ret
= OMX_ErrorBadParameter
;
421 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
422 if (pVp9Dec
== NULL
) {
423 ret
= OMX_ErrorBadParameter
;
427 hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
428 pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
429 pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
430 pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
432 if ((nPortIndex
== INPUT_PORT_INDEX
) && (pInbufOps
!= NULL
)) {
433 pInbufOps
->Stop(hMFCHandle
);
434 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) && (pOutbufOps
!= NULL
)) {
435 EXYNOS_OMX_BASEPORT
*pOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
437 pOutbufOps
->Stop(hMFCHandle
);
439 if ((pOutputPort
->bufferProcessType
& BUFFER_SHARE
) &&
440 (pOutputPort
->bDynamicDPBMode
== OMX_TRUE
))
441 pOutbufOps
->Clear_RegisteredBuffer(hMFCHandle
);
452 OMX_ERRORTYPE
VP9CodecOutputBufferProcessRun(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
454 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
455 void *hMFCHandle
= NULL
;
456 ExynosVideoDecOps
*pDecOps
= NULL
;
457 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
458 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
459 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
460 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
464 if (pOMXComponent
== NULL
) {
465 ret
= OMX_ErrorBadParameter
;
469 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
470 if (pVideoDec
== NULL
) {
471 ret
= OMX_ErrorBadParameter
;
474 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
475 if (pVp9Dec
== NULL
) {
476 ret
= OMX_ErrorBadParameter
;
480 hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
481 pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
482 pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
483 pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
485 if (nPortIndex
== INPUT_PORT_INDEX
) {
486 if (pVp9Dec
->bSourceStart
== OMX_FALSE
) {
487 Exynos_OSAL_SignalSet(pVp9Dec
->hSourceStartEvent
);
488 Exynos_OSAL_SleepMillisec(0);
492 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
493 if (pVp9Dec
->bDestinationStart
== OMX_FALSE
) {
494 Exynos_OSAL_SignalSet(pVp9Dec
->hDestinationStartEvent
);
495 Exynos_OSAL_SleepMillisec(0);
507 OMX_ERRORTYPE
VP9CodecRegistCodecBuffers(
508 OMX_COMPONENTTYPE
*pOMXComponent
,
512 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
513 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
514 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
515 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
516 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
517 CODEC_DEC_BUFFER
**ppCodecBuffer
= NULL
;
518 ExynosVideoDecBufferOps
*pBufOps
= NULL
;
519 ExynosVideoPlane
*pPlanes
= NULL
;
526 if (nPortIndex
== INPUT_PORT_INDEX
) {
527 ppCodecBuffer
= &(pVideoDec
->pMFCDecInputBuffer
[0]);
528 pBufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
530 ppCodecBuffer
= &(pVideoDec
->pMFCDecOutputBuffer
[0]);
531 pBufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
534 nPlaneCnt
= Exynos_GetPlaneFromPort(&pExynosComponent
->pExynosPort
[nPortIndex
]);
535 pPlanes
= (ExynosVideoPlane
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane
) * nPlaneCnt
);
536 if (pPlanes
== NULL
) {
537 ret
= OMX_ErrorInsufficientResources
;
541 /* Register buffer */
542 for (i
= 0; i
< nBufferCnt
; i
++) {
543 for (j
= 0; j
< nPlaneCnt
; j
++) {
544 pPlanes
[j
].addr
= ppCodecBuffer
[i
]->pVirAddr
[j
];
545 pPlanes
[j
].fd
= ppCodecBuffer
[i
]->fd
[j
];
546 pPlanes
[j
].allocSize
= ppCodecBuffer
[i
]->bufferSize
[j
];
549 if (pBufOps
->Register(hMFCHandle
, pPlanes
, nPlaneCnt
) != VIDEO_ERROR_NONE
) {
550 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "PORT[%d]: Failed to Register buffer", nPortIndex
);
551 ret
= OMX_ErrorInsufficientResources
;
552 Exynos_OSAL_Free(pPlanes
);
557 Exynos_OSAL_Free(pPlanes
);
567 OMX_ERRORTYPE
Vp9CodecReconfigAllBuffers(
568 OMX_COMPONENTTYPE
*pOMXComponent
,
571 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
572 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
573 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
574 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
575 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
576 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
577 ExynosVideoDecBufferOps
*pBufferOps
= NULL
;
581 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
582 (pVp9Dec
->bSourceStart
== OMX_TRUE
)) {
583 ret
= OMX_ErrorNotImplemented
;
585 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
586 (pVp9Dec
->bDestinationStart
== OMX_TRUE
)) {
587 pBufferOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
589 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
590 /**********************************/
591 /* Codec Buffer Free & Unregister */
592 /**********************************/
593 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
594 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
595 pBufferOps
->Clear_RegisteredBuffer(hMFCHandle
);
596 pBufferOps
->Cleanup_Buffer(hMFCHandle
);
598 /******************************************************/
599 /* V4L2 Destnation Setup for DPB Buffer Number Change */
600 /******************************************************/
601 ret
= VP9CodecDstSetup(pOMXComponent
);
602 if (ret
!= OMX_ErrorNone
) {
603 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed to VP9CodecDstSetup(0x%x)", __func__
, __LINE__
, ret
);
607 pVideoDec
->bReconfigDPB
= OMX_FALSE
;
608 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
609 /**********************************/
610 /* Codec Buffer Unregister */
611 /**********************************/
612 pBufferOps
->Clear_RegisteredBuffer(hMFCHandle
);
613 pBufferOps
->Cleanup_Buffer(hMFCHandle
);
616 Exynos_ResolutionUpdate(pOMXComponent
);
618 ret
= OMX_ErrorBadParameter
;
628 OMX_ERRORTYPE
VP9CodecEnQueueAllBuffer(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
630 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
631 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
632 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
633 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
634 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
635 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
636 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
639 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
640 ExynosVideoDecBufferOps
*pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
641 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
645 if ((nPortIndex
!= INPUT_PORT_INDEX
) && (nPortIndex
!= OUTPUT_PORT_INDEX
)) {
646 ret
= OMX_ErrorBadPortIndex
;
650 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
651 (pVp9Dec
->bSourceStart
== OMX_TRUE
)) {
652 Exynos_CodecBufferReset(pExynosComponent
, INPUT_PORT_INDEX
);
654 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
655 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]);
656 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]->pVirAddr
[0]);
658 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
661 pInbufOps
->Clear_Queue(hMFCHandle
);
662 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
663 (pVp9Dec
->bDestinationStart
== OMX_TRUE
)) {
664 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
666 for (i
= 0; i
< pVp9Dec
->hMFCVp9Handle
.maxDPBNum
; i
++) {
667 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecOutputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecOutputBuffer
[i
]);
668 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecOutputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[0]);
670 Exynos_CodecBufferEnQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, pVideoDec
->pMFCDecOutputBuffer
[i
]);
672 pOutbufOps
->Clear_Queue(hMFCHandle
);
681 OMX_ERRORTYPE
Vp9CodecCheckResolution(OMX_COMPONENTTYPE
*pOMXComponent
)
683 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
684 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
685 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
686 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
687 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
688 EXYNOS_OMX_BASEPORT
*pInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
689 EXYNOS_OMX_BASEPORT
*pOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
690 EXYNOS_OMX_EXCEPTION_STATE eOutputExcepState
= pOutputPort
->exceptionFlag
;
692 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
693 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
694 ExynosVideoGeometry codecOutbufConf
;
696 OMX_CONFIG_RECTTYPE
*pCropRectangle
= &(pOutputPort
->cropRectangle
);
697 OMX_PARAM_PORTDEFINITIONTYPE
*pInputPortDefinition
= &(pInputPort
->portDefinition
);
698 OMX_PARAM_PORTDEFINITIONTYPE
*pOutputPortDefinition
= &(pOutputPort
->portDefinition
);
705 Exynos_OSAL_Memset(&codecOutbufConf
, 0, sizeof(ExynosVideoGeometry
));
706 if (pOutbufOps
->Get_Geometry(hMFCHandle
, &codecOutbufConf
) != VIDEO_ERROR_NONE
) {
707 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to get geometry");
708 ret
= OMX_ErrorHardware
;
713 maxDPBNum
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
714 if (pVideoDec
->bThumbnailMode
== OMX_FALSE
)
715 maxDPBNum
+= EXTRA_DPB_NUM
;
717 if ((codecOutbufConf
.nFrameWidth
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
) ||
718 (codecOutbufConf
.nFrameHeight
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
) ||
719 (codecOutbufConf
.nStride
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nStride
) ||
720 #if 0 // TODO: check posibility
721 (codecOutbufConf
.eColorFormat
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.eColorFormat
) ||
722 (codecOutbufConf
.eFilledDataType
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.eFilledDataType
) ||
723 (codecOutbufConf
.bInterlaced
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.bInterlaced
) ||
725 (maxDPBNum
!= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
)) {
726 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] DRC: W(%d), H(%d) -> W(%d), H(%d)",
727 pExynosComponent
, __FUNCTION__
,
728 codecOutbufConf
.nFrameWidth
,
729 codecOutbufConf
.nFrameHeight
,
730 pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
,
731 pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
);
732 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] DRC: DPB(%d), FORMAT(0x%x), TYPE(0x%x) -> DPB(%d), FORMAT(0x%x), TYPE(0x%x)",
733 pExynosComponent
, __FUNCTION__
,
734 maxDPBNum
, codecOutbufConf
.eColorFormat
, codecOutbufConf
.eFilledDataType
,
735 pVp9Dec
->hMFCVp9Handle
.maxDPBNum
,
736 pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.eColorFormat
,
737 pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.eFilledDataType
);
739 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
740 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
741 pInputPortDefinition
->format
.video
.nStride
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
742 pInputPortDefinition
->format
.video
.nSliceHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
744 if (pOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
745 pOutputPortDefinition
->nBufferCountActual
= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
;
746 pOutputPortDefinition
->nBufferCountMin
= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
;
749 Exynos_UpdateFrameSize(pOMXComponent
);
751 if (eOutputExcepState
== GENERAL_STATE
) {
752 pOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
754 /** Send Port Settings changed call back **/
755 (*(pExynosComponent
->pCallbacks
->EventHandler
))
757 pExynosComponent
->callbackData
,
758 OMX_EventPortSettingsChanged
, /* The command was completed */
759 OMX_DirOutput
, /* This is the port index */
765 if ((codecOutbufConf
.cropRect
.nTop
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nTop
) ||
766 (codecOutbufConf
.cropRect
.nLeft
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nLeft
) ||
767 (codecOutbufConf
.cropRect
.nWidth
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nWidth
) ||
768 (codecOutbufConf
.cropRect
.nHeight
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nHeight
)) {
769 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] CROP: W(%d), H(%d) -> W(%d), H(%d)",
770 pExynosComponent
, __FUNCTION__
,
771 codecOutbufConf
.cropRect
.nWidth
,
772 codecOutbufConf
.cropRect
.nHeight
,
773 pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nWidth
,
774 pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nHeight
);
776 pCropRectangle
->nTop
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nTop
;
777 pCropRectangle
->nLeft
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nLeft
;
778 pCropRectangle
->nWidth
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nWidth
;
779 pCropRectangle
->nHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nHeight
;
781 /** Send crop info call back **/
782 (*(pExynosComponent
->pCallbacks
->EventHandler
))
784 pExynosComponent
->callbackData
,
785 OMX_EventPortSettingsChanged
, /* The command was completed */
786 OMX_DirOutput
, /* This is the port index */
787 OMX_IndexConfigCommonOutputCrop
,
791 Exynos_OSAL_Memcpy(&pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
, &codecOutbufConf
, sizeof(codecOutbufConf
));
792 pVp9Dec
->hMFCVp9Handle
.maxDPBNum
= maxDPBNum
;
802 OMX_ERRORTYPE
Vp9CodecUpdateResolution(OMX_COMPONENTTYPE
*pOMXComponent
)
804 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
805 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
806 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
807 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
808 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
809 EXYNOS_OMX_BASEPORT
*pInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
810 EXYNOS_OMX_BASEPORT
*pOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
811 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
812 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
814 OMX_CONFIG_RECTTYPE
*pCropRectangle
= NULL
;
815 OMX_PARAM_PORTDEFINITIONTYPE
*pInputPortDefinition
= NULL
;
816 OMX_PARAM_PORTDEFINITIONTYPE
*pOutputPortDefinition
= NULL
;
820 /* get geometry for output */
821 Exynos_OSAL_Memset(&pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
, 0, sizeof(ExynosVideoGeometry
));
822 if (pOutbufOps
->Get_Geometry(hMFCHandle
, &pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
) != VIDEO_ERROR_NONE
) {
823 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to get geometry for parsed header info");
824 ret
= OMX_ErrorCorruptedHeader
;
829 pVp9Dec
->hMFCVp9Handle
.maxDPBNum
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
830 #if 0 /* no needs EXTRA_DPB, it was confirmed codec team */
831 if (pVideoDec
->bThumbnailMode
== OMX_FALSE
)
832 pVp9Dec
->hMFCVp9Handle
.maxDPBNum
+= EXTRA_DPB_NUM
;
834 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] Vp9CodecSetup maxDPBNum: %d", pExynosComponent
, __FUNCTION__
, pVp9Dec
->hMFCVp9Handle
.maxDPBNum
);
836 pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCSrc
= OMX_TRUE
;
838 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
) {
839 pCropRectangle
= &(pOutputPort
->cropRectangle
);
840 pInputPortDefinition
= &(pInputPort
->portDefinition
);
841 pOutputPortDefinition
= &(pOutputPort
->portDefinition
);
843 pCropRectangle
= &(pOutputPort
->newCropRectangle
);
844 pInputPortDefinition
= &(pInputPort
->newPortDefinition
);
845 pOutputPortDefinition
= &(pOutputPort
->newPortDefinition
);
848 pCropRectangle
->nTop
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nTop
;
849 pCropRectangle
->nLeft
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nLeft
;
850 pCropRectangle
->nWidth
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nWidth
;
851 pCropRectangle
->nHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nHeight
;
853 if (pOutputPort
->bufferProcessType
& BUFFER_COPY
) {
854 if ((pVideoDec
->bReconfigDPB
) ||
855 (pInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
) ||
856 (pInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
)) {
857 pOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
859 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
860 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
861 pInputPortDefinition
->format
.video
.nStride
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
862 pInputPortDefinition
->format
.video
.nSliceHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
864 pOutputPortDefinition
->nBufferCountActual
= pOutputPort
->portDefinition
.nBufferCountActual
;
865 pOutputPortDefinition
->nBufferCountMin
= pOutputPort
->portDefinition
.nBufferCountMin
;
867 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
)
868 Exynos_UpdateFrameSize(pOMXComponent
);
870 /** Send Port Settings changed call back **/
871 (*(pExynosComponent
->pCallbacks
->EventHandler
))
873 pExynosComponent
->callbackData
,
874 OMX_EventPortSettingsChanged
, /* The command was completed */
875 OMX_DirOutput
, /* This is the port index */
879 } else if (pOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
880 if ((pVideoDec
->bReconfigDPB
) ||
881 (pInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
) ||
882 (pInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
) ||
883 ((OMX_S32
)pOutputPort
->portDefinition
.nBufferCountActual
!= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
)) {
884 pOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
886 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
887 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
888 pInputPortDefinition
->format
.video
.nStride
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
889 pInputPortDefinition
->format
.video
.nSliceHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
891 pOutputPortDefinition
->nBufferCountActual
= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
;
892 pOutputPortDefinition
->nBufferCountMin
= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
;
894 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
)
895 Exynos_UpdateFrameSize(pOMXComponent
);
897 /** Send Port Settings changed call back **/
898 (*(pExynosComponent
->pCallbacks
->EventHandler
))
900 pExynosComponent
->callbackData
,
901 OMX_EventPortSettingsChanged
, /* The command was completed */
902 OMX_DirOutput
, /* This is the port index */
908 if ((pVideoDec
->bReconfigDPB
!= OMX_TRUE
) &&
909 ((pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nWidth
) ||
910 (pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
!= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.cropRect
.nHeight
))) {
912 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
913 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
914 pInputPortDefinition
->format
.video
.nStride
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameWidth
;
915 pInputPortDefinition
->format
.video
.nSliceHeight
= pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nFrameHeight
;
917 Exynos_UpdateFrameSize(pOMXComponent
);
919 /** Send crop info call back **/
920 (*(pExynosComponent
->pCallbacks
->EventHandler
))
922 pExynosComponent
->callbackData
,
923 OMX_EventPortSettingsChanged
, /* The command was completed */
924 OMX_DirOutput
, /* This is the port index */
925 OMX_IndexConfigCommonOutputCrop
,
937 OMX_ERRORTYPE
VP9CodecSrcSetup(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
939 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
940 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
941 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
942 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
943 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
944 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
945 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
946 OMX_COLOR_FORMATTYPE eOutputFormat
= pExynosOutputPort
->portDefinition
.format
.video
.eColorFormat
;
947 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
949 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
950 ExynosVideoDecBufferOps
*pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
951 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
952 ExynosVideoGeometry bufferConf
;
954 unsigned int nAllocLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
955 unsigned int nDataLen
[MAX_BUFFER_PLANE
] = {oneFrameSize
, 0, 0};
956 OMX_U32 nInBufferCnt
= 0;
957 OMX_BOOL bSupportFormat
= OMX_FALSE
;
962 if ((oneFrameSize
<= 0) && (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
963 BYPASS_BUFFER_INFO
*pBufferInfo
= (BYPASS_BUFFER_INFO
*)Exynos_OSAL_Malloc(sizeof(BYPASS_BUFFER_INFO
));
964 if (pBufferInfo
== NULL
) {
965 ret
= OMX_ErrorInsufficientResources
;
969 pBufferInfo
->nFlags
= pSrcInputData
->nFlags
;
970 pBufferInfo
->timeStamp
= pSrcInputData
->timeStamp
;
971 ret
= Exynos_OSAL_Queue(&pVp9Dec
->bypassBufferInfoQ
, (void *)pBufferInfo
);
972 Exynos_OSAL_SignalSet(pVp9Dec
->hDestinationStartEvent
);
978 if (pVideoDec
->bThumbnailMode
== OMX_TRUE
)
979 pDecOps
->Set_IFrameDecoding(hMFCHandle
);
981 if ((pDecOps
->Enable_DTSMode
!= NULL
) &&
982 (pVideoDec
->bDTSMode
== OMX_TRUE
))
983 pDecOps
->Enable_DTSMode(hMFCHandle
);
985 /* input buffer info */
986 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
987 bufferConf
.eCompressionFormat
= VIDEO_CODING_VP9
;
988 pInbufOps
->Set_Shareable(hMFCHandle
);
989 if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
990 bufferConf
.nSizeImage
= pExynosInputPort
->portDefinition
.nBufferSize
;
991 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
992 bufferConf
.nSizeImage
= DEFAULT_MFC_INPUT_BUFFER_SIZE
;
994 bufferConf
.nPlaneCnt
= Exynos_GetPlaneFromPort(pExynosInputPort
);
995 nInBufferCnt
= MAX_INPUTBUFFER_NUM_DYNAMIC
;
997 /* should be done before prepare input buffer */
998 if (pInbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
999 ret
= OMX_ErrorInsufficientResources
;
1003 /* set input buffer geometry */
1004 if (pInbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
1005 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
1006 ret
= OMX_ErrorInsufficientResources
;
1010 /* setup input buffer */
1011 if (pInbufOps
->Setup(hMFCHandle
, nInBufferCnt
) != VIDEO_ERROR_NONE
) {
1012 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup input buffer");
1013 ret
= OMX_ErrorInsufficientResources
;
1017 /* set output geometry */
1018 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
1020 bSupportFormat
= CheckFormatHWSupport(pExynosComponent
, eOutputFormat
);
1021 if (bSupportFormat
== OMX_TRUE
) { /* supported by H/W */
1022 if ((pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bDualDPBSupport
== VIDEO_TRUE
) &&
1023 (eOutputFormat
!= (OMX_COLOR_FORMATTYPE
)OMX_SEC_COLOR_FormatNV12Tiled
)) {
1024 /* Needs to eanble DualDPB feature */
1025 if (pDecOps
->Enable_DualDPBMode(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1026 ret
= OMX_ErrorHardware
;
1030 bufferConf
.eColorFormat
= Exynos_OSAL_OMX2VideoFormat(eOutputFormat
, pExynosOutputPort
->ePlaneType
);
1031 Exynos_SetPlaneToPort(pExynosOutputPort
, Exynos_OSAL_GetPlaneCount(eOutputFormat
, pExynosOutputPort
->ePlaneType
));
1033 OMX_COLOR_FORMATTYPE eCheckFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1034 bSupportFormat
= CheckFormatHWSupport(pExynosComponent
, eCheckFormat
);
1035 if (bSupportFormat
!= OMX_TRUE
) {
1036 eCheckFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1037 bSupportFormat
= CheckFormatHWSupport(pExynosComponent
, eCheckFormat
);
1039 if (bSupportFormat
== OMX_TRUE
) { /* supported by CSC(NV12T/NV12 -> format) */
1040 bufferConf
.eColorFormat
= Exynos_OSAL_OMX2VideoFormat(eCheckFormat
, pExynosOutputPort
->ePlaneType
);
1041 Exynos_SetPlaneToPort(pExynosOutputPort
, Exynos_OSAL_GetPlaneCount(eCheckFormat
, pExynosOutputPort
->ePlaneType
));
1043 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not support this format (0x%x)", eOutputFormat
);
1044 ret
= OMX_ErrorNotImplemented
;
1049 pVp9Dec
->hMFCVp9Handle
.MFCOutputColorType
= bufferConf
.eColorFormat
;
1050 bufferConf
.nPlaneCnt
= Exynos_GetPlaneFromPort(pExynosOutputPort
);
1051 if (pOutbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
1052 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for output buffer");
1053 ret
= OMX_ErrorInsufficientResources
;
1057 /* input buffer enqueue for header parsing */
1058 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] Header Size: %d", pExynosComponent
, __FUNCTION__
, oneFrameSize
);
1059 if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
)
1060 nAllocLen
[0] = pSrcInputData
->bufferHeader
->nAllocLen
;
1061 else if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
)
1062 nAllocLen
[0] = DEFAULT_MFC_INPUT_BUFFER_SIZE
;
1064 /* set buffer process type */
1065 if (pDecOps
->Set_BufferProcessType(hMFCHandle
, pExynosOutputPort
->bufferProcessType
) != VIDEO_ERROR_NONE
) {
1066 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set buffer process type(not supported)");
1069 if (pInbufOps
->ExtensionEnqueue(hMFCHandle
,
1070 (void **)pSrcInputData
->multiPlaneBuffer
.dataBuffer
,
1071 (int *)pSrcInputData
->multiPlaneBuffer
.fd
,
1074 Exynos_GetPlaneFromPort(pExynosInputPort
),
1075 pSrcInputData
->bufferHeader
) != VIDEO_ERROR_NONE
) {
1076 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to enqueue input buffer for header parsing");
1077 // ret = OMX_ErrorInsufficientResources;
1078 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecInit
;
1082 /* start header parsing */
1083 if (pInbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1084 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run input buffer for header parsing");
1085 ret
= OMX_ErrorCodecInit
;
1089 ret
= Vp9CodecUpdateResolution(pOMXComponent
);
1090 if (((EXYNOS_OMX_ERRORTYPE
)ret
== OMX_ErrorCorruptedHeader
) &&
1091 (pExynosComponent
->codecType
!= HW_VIDEO_DEC_SECURE_CODEC
) &&
1092 (oneFrameSize
>= 8))
1093 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "CorruptedHeader Info : %02x %02x %02x %02x %02x %02x %02x %02x ...",
1094 *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0]) , *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 1),
1095 *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 2), *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 3),
1096 *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 4), *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 5),
1097 *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 6), *((OMX_U8
*)pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0] + 7));
1098 if (ret
!= OMX_ErrorNone
) {
1099 VP9CodecStop(pOMXComponent
, INPUT_PORT_INDEX
);
1100 pInbufOps
->Cleanup_Buffer(hMFCHandle
);
1104 Exynos_OSAL_SleepMillisec(0);
1105 ret
= OMX_ErrorInputDataDecodeYet
;
1106 VP9CodecStop(pOMXComponent
, INPUT_PORT_INDEX
);
1114 OMX_ERRORTYPE
VP9CodecDstSetup(OMX_COMPONENTTYPE
*pOMXComponent
)
1116 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1117 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1118 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1119 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1120 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
1121 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1122 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1124 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
1125 ExynosVideoDecBufferOps
*pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
1126 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
1128 int i
, nOutbufs
, nPlaneCnt
;
1130 unsigned int nAllocLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1131 unsigned int nDataLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1135 nPlaneCnt
= Exynos_GetPlaneFromPort(pExynosOutputPort
);
1136 for (i
= 0; i
< nPlaneCnt
; i
++)
1137 nAllocLen
[i
] = pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nAlignPlaneSize
[i
];
1139 if (pExynosOutputPort
->bDynamicDPBMode
== OMX_TRUE
) {
1140 if (pDecOps
->Enable_DynamicDPB(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1141 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to enable Dynamic DPB");
1142 ret
= OMX_ErrorHardware
;
1147 pOutbufOps
->Set_Shareable(hMFCHandle
);
1149 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1150 /* should be done before prepare output buffer */
1151 if (pOutbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1152 ret
= OMX_ErrorInsufficientResources
;
1156 if (pExynosOutputPort
->bDynamicDPBMode
== OMX_FALSE
) {
1158 nOutbufs
= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
;
1159 if (pOutbufOps
->Setup(hMFCHandle
, nOutbufs
) != VIDEO_ERROR_NONE
) {
1160 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1161 ret
= OMX_ErrorInsufficientResources
;
1165 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, nOutbufs
, nAllocLen
);
1166 if (ret
!= OMX_ErrorNone
)
1169 /* Register output buffer */
1170 ret
= VP9CodecRegistCodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, nOutbufs
);
1171 if (ret
!= OMX_ErrorNone
)
1174 /* Enqueue output buffer */
1175 for (i
= 0; i
< nOutbufs
; i
++)
1176 pOutbufOps
->Enqueue(hMFCHandle
,
1177 (void **)pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
,
1182 if (pOutbufOps
->Setup(hMFCHandle
, MAX_OUTPUTBUFFER_NUM_DYNAMIC
) != VIDEO_ERROR_NONE
) {
1183 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1184 ret
= OMX_ErrorInsufficientResources
;
1189 nOutbufs
= pVp9Dec
->hMFCVp9Handle
.maxDPBNum
;
1190 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, nOutbufs
, nAllocLen
);
1191 if (ret
!= OMX_ErrorNone
)
1194 /* without Register output buffer */
1196 /* Enqueue output buffer */
1197 for (i
= 0; i
< nOutbufs
; i
++) {
1198 pOutbufOps
->ExtensionEnqueue(hMFCHandle
,
1199 (void **)pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
,
1200 (int *)pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
,
1201 pVideoDec
->pMFCDecOutputBuffer
[i
]->bufferSize
,
1208 if (pOutbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1209 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run output buffer");
1210 ret
= OMX_ErrorInsufficientResources
;
1213 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1215 if (pExynosOutputPort
->bDynamicDPBMode
== OMX_FALSE
) {
1216 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
1219 Exynos_OSAL_Memset((OMX_PTR
)planes
, 0, sizeof(ExynosVideoPlane
) * MAX_BUFFER_PLANE
);
1222 nOutbufs
= pExynosOutputPort
->portDefinition
.nBufferCountActual
;
1223 if (pOutbufOps
->Setup(hMFCHandle
, nOutbufs
) != VIDEO_ERROR_NONE
) {
1224 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1225 ret
= OMX_ErrorInsufficientResources
;
1229 if ((pExynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) &&
1230 (pExynosOutputPort
->bStoreMetaData
== OMX_FALSE
)) {
1231 for (i
= 0; i
< pExynosOutputPort
->assignedBufferNum
; i
++) {
1232 for (plane
= 0; plane
< nPlaneCnt
; plane
++) {
1233 planes
[plane
].fd
= pExynosOutputPort
->extendBufferHeader
[i
].buf_fd
[plane
];
1234 planes
[plane
].addr
= pExynosOutputPort
->extendBufferHeader
[i
].pYUVBuf
[plane
];
1235 planes
[plane
].allocSize
= nAllocLen
[plane
];
1238 if (pOutbufOps
->Register(hMFCHandle
, planes
, nPlaneCnt
) != VIDEO_ERROR_NONE
) {
1239 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register output buffer");
1240 ret
= OMX_ErrorInsufficientResources
;
1243 pOutbufOps
->Enqueue(hMFCHandle
,
1244 (void **)pExynosOutputPort
->extendBufferHeader
[i
].pYUVBuf
,
1250 if (pOutbufOps
->Apply_RegisteredBuffer(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1251 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Apply output buffer");
1252 ret
= OMX_ErrorHardware
;
1259 ret
= OMX_ErrorNotImplemented
;
1264 nOutbufs
= MAX_OUTPUTBUFFER_NUM_DYNAMIC
;
1265 if (pOutbufOps
->Setup(hMFCHandle
, nOutbufs
) != VIDEO_ERROR_NONE
) {
1266 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1267 ret
= OMX_ErrorInsufficientResources
;
1271 if ((pExynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) &&
1272 (pExynosOutputPort
->bStoreMetaData
== OMX_FALSE
)) {
1276 ret
= OMX_ErrorNotImplemented
;
1284 ret
= OMX_ErrorNotImplemented
;
1289 pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCDst
= OMX_TRUE
;
1291 ret
= OMX_ErrorNone
;
1299 OMX_ERRORTYPE
Exynos_VP9Dec_GetParameter(
1300 OMX_IN OMX_HANDLETYPE hComponent
,
1301 OMX_IN OMX_INDEXTYPE nParamIndex
,
1302 OMX_INOUT OMX_PTR pComponentParameterStructure
)
1304 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1305 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1306 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1310 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1311 ret
= OMX_ErrorBadParameter
;
1314 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1315 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1316 if (ret
!= OMX_ErrorNone
) {
1319 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1320 ret
= OMX_ErrorBadParameter
;
1324 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1325 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1326 ret
= OMX_ErrorInvalidState
;
1330 switch (nParamIndex
) {
1331 case OMX_IndexParamStandardComponentRole
:
1333 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1334 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1335 if (ret
!= OMX_ErrorNone
) {
1339 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_VP9_DEC_ROLE
);
1342 case OMX_IndexParamVideoErrorCorrection
:
1344 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1345 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= NULL
;
1346 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
1348 ret
= Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1349 if (ret
!= OMX_ErrorNone
) {
1353 if (pDstErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
1354 ret
= OMX_ErrorBadPortIndex
;
1358 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1359 pSrcErrorCorrectionType
= &pVp9Dec
->errorCorrectionType
[INPUT_PORT_INDEX
];
1361 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1362 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1363 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1364 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1365 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1369 ret
= Exynos_OMX_VideoDecodeGetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1378 OMX_ERRORTYPE
Exynos_VP9Dec_SetParameter(
1379 OMX_IN OMX_HANDLETYPE hComponent
,
1380 OMX_IN OMX_INDEXTYPE nIndex
,
1381 OMX_IN OMX_PTR pComponentParameterStructure
)
1383 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1384 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1385 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1389 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1390 ret
= OMX_ErrorBadParameter
;
1393 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1394 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1395 if (ret
!= OMX_ErrorNone
) {
1398 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1399 ret
= OMX_ErrorBadParameter
;
1403 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1404 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1405 ret
= OMX_ErrorInvalidState
;
1410 case OMX_IndexParamStandardComponentRole
:
1412 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1414 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1415 if (ret
!= OMX_ErrorNone
) {
1419 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1420 ret
= OMX_ErrorIncorrectStateOperation
;
1424 if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_VP9_DEC_ROLE
)) {
1425 pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingVP9
;
1427 ret
= OMX_ErrorBadParameter
;
1432 case OMX_IndexParamVideoErrorCorrection
:
1434 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1435 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= NULL
;
1436 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
1438 ret
= Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1439 if (ret
!= OMX_ErrorNone
) {
1443 if (pSrcErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
1444 ret
= OMX_ErrorBadPortIndex
;
1448 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1449 pDstErrorCorrectionType
= &pVp9Dec
->errorCorrectionType
[INPUT_PORT_INDEX
];
1451 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1452 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1453 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1454 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1455 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1459 ret
= Exynos_OMX_VideoDecodeSetParameter(hComponent
, nIndex
, pComponentParameterStructure
);
1468 OMX_ERRORTYPE
Exynos_VP9Dec_GetConfig(
1469 OMX_HANDLETYPE hComponent
,
1470 OMX_INDEXTYPE nIndex
,
1471 OMX_PTR pComponentConfigStructure
)
1473 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1474 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1475 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1479 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1480 ret
= OMX_ErrorBadParameter
;
1483 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1484 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1485 if (ret
!= OMX_ErrorNone
) {
1488 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1489 ret
= OMX_ErrorBadParameter
;
1492 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1493 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1494 ret
= OMX_ErrorInvalidState
;
1499 case OMX_IndexConfigCommonOutputCrop
:
1501 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
1502 OMX_CONFIG_RECTTYPE
*pSrcRectType
= NULL
;
1503 OMX_CONFIG_RECTTYPE
*pDstRectType
= NULL
;
1505 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1507 if (pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1508 ret
= OMX_ErrorNotReady
;
1512 pDstRectType
= (OMX_CONFIG_RECTTYPE
*)pComponentConfigStructure
;
1514 if ((pDstRectType
->nPortIndex
!= INPUT_PORT_INDEX
) &&
1515 (pDstRectType
->nPortIndex
!= OUTPUT_PORT_INDEX
)) {
1516 ret
= OMX_ErrorBadPortIndex
;
1520 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[pDstRectType
->nPortIndex
];
1522 pSrcRectType
= &(pExynosPort
->cropRectangle
);
1524 pDstRectType
->nTop
= pSrcRectType
->nTop
;
1525 pDstRectType
->nLeft
= pSrcRectType
->nLeft
;
1526 pDstRectType
->nHeight
= pSrcRectType
->nHeight
;
1527 pDstRectType
->nWidth
= pSrcRectType
->nWidth
;
1531 ret
= Exynos_OMX_VideoDecodeGetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1541 OMX_ERRORTYPE
Exynos_VP9Dec_SetConfig(
1542 OMX_HANDLETYPE hComponent
,
1543 OMX_INDEXTYPE nIndex
,
1544 OMX_PTR pComponentConfigStructure
)
1546 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1547 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1548 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1552 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1553 ret
= OMX_ErrorBadParameter
;
1556 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1557 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1558 if (ret
!= OMX_ErrorNone
) {
1561 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1562 ret
= OMX_ErrorBadParameter
;
1565 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1566 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1567 ret
= OMX_ErrorInvalidState
;
1573 ret
= Exynos_OMX_VideoDecodeSetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1583 OMX_ERRORTYPE
Exynos_VP9Dec_GetExtensionIndex(
1584 OMX_IN OMX_HANDLETYPE hComponent
,
1585 OMX_IN OMX_STRING cParameterName
,
1586 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1588 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1589 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1590 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1594 if (hComponent
== NULL
) {
1595 ret
= OMX_ErrorBadParameter
;
1598 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1599 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1600 if (ret
!= OMX_ErrorNone
) {
1603 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1604 ret
= OMX_ErrorBadParameter
;
1607 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1608 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1609 ret
= OMX_ErrorBadParameter
;
1612 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1613 ret
= OMX_ErrorInvalidState
;
1617 ret
= Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1625 OMX_ERRORTYPE
Exynos_VP9Dec_ComponentRoleEnum(
1626 OMX_HANDLETYPE hComponent
,
1630 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1631 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1632 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1636 if ((hComponent
== NULL
) || (cRole
== NULL
)) {
1637 ret
= OMX_ErrorBadParameter
;
1640 if (nIndex
== (MAX_COMPONENT_ROLE_NUM
-1)) {
1641 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_VP9_DEC_ROLE
);
1642 ret
= OMX_ErrorNone
;
1644 ret
= OMX_ErrorNoMore
;
1654 OMX_ERRORTYPE
Exynos_VP9Dec_Init(OMX_COMPONENTTYPE
*pOMXComponent
)
1656 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1657 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1658 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1659 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1660 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1661 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1662 OMX_PTR hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
1664 ExynosVideoDecOps
*pDecOps
= NULL
;
1665 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
1666 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
1667 ExynosVideoInstInfo
*pVideoInstInfo
= &(pVp9Dec
->hMFCVp9Handle
.videoInstInfo
);
1669 CSC_METHOD csc_method
= CSC_METHOD_SW
;
1674 pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCSrc
= OMX_FALSE
;
1675 pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCDst
= OMX_FALSE
;
1676 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
1677 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1678 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
1679 pVideoDec
->bDiscardCSDError
= OMX_FALSE
;
1681 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] CodecOpen W: %d H:%d Bitrate:%d FPS:%d", pExynosComponent
, __FUNCTION__
,
1682 pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
,
1683 pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
,
1684 pExynosInputPort
->portDefinition
.format
.video
.nBitrate
,
1685 pExynosInputPort
->portDefinition
.format
.video
.xFramerate
);
1687 pVideoInstInfo
->nSize
= sizeof(ExynosVideoInstInfo
);
1688 pVideoInstInfo
->nWidth
= pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
1689 pVideoInstInfo
->nHeight
= pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
1690 pVideoInstInfo
->nBitrate
= pExynosInputPort
->portDefinition
.format
.video
.nBitrate
;
1691 pVideoInstInfo
->xFramerate
= pExynosInputPort
->portDefinition
.format
.video
.xFramerate
;
1693 /* VP9 Codec Open */
1694 ret
= VP9CodecOpen(pVp9Dec
, pVideoInstInfo
);
1695 if (ret
!= OMX_ErrorNone
) {
1699 pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
1700 pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
1701 pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
1703 Exynos_SetPlaneToPort(pExynosInputPort
, MFC_DEFAULT_INPUT_BUFFER_PLANE
);
1704 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1705 unsigned int nAllocLen
[MAX_BUFFER_PLANE
] = {DEFAULT_MFC_INPUT_BUFFER_SIZE
, 0, 0};
1706 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->codecSemID
);
1707 Exynos_OSAL_QueueCreate(&pExynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1708 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
, nAllocLen
);
1709 if (ret
!= OMX_ErrorNone
)
1712 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1713 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
1714 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1718 /* Does not require any actions. */
1721 Exynos_SetPlaneToPort(pExynosOutputPort
, MFC_DEFAULT_OUTPUT_BUFFER_PLANE
);
1722 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1723 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->codecSemID
);
1724 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1725 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1729 /* Does not require any actions. */
1732 pVp9Dec
->bSourceStart
= OMX_FALSE
;
1733 Exynos_OSAL_SignalCreate(&pVp9Dec
->hSourceStartEvent
);
1734 pVp9Dec
->bDestinationStart
= OMX_FALSE
;
1735 Exynos_OSAL_SignalCreate(&pVp9Dec
->hDestinationStartEvent
);
1737 INIT_ARRAY_TO_VAL(pExynosComponent
->timeStamp
, DEFAULT_TIMESTAMP_VAL
, MAX_TIMESTAMP
);
1738 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
1739 pVp9Dec
->hMFCVp9Handle
.indexTimestamp
= 0;
1740 pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
= 0;
1742 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
1744 Exynos_OSAL_QueueCreate(&pVp9Dec
->bypassBufferInfoQ
, QUEUE_ELEMENTS
);
1747 csc_method
= CSC_METHOD_HW
;
1749 pVideoDec
->csc_handle
= csc_init(csc_method
);
1750 if (pVideoDec
->csc_handle
== NULL
) {
1751 ret
= OMX_ErrorInsufficientResources
;
1754 pVideoDec
->csc_set_format
= OMX_FALSE
;
1763 OMX_ERRORTYPE
Exynos_VP9Dec_Terminate(OMX_COMPONENTTYPE
*pOMXComponent
)
1765 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1766 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1767 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1768 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1769 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1770 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1771 OMX_PTR hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
1773 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
1774 ExynosVideoDecBufferOps
*pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
1775 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
1781 if (pVideoDec
->csc_handle
!= NULL
) {
1782 csc_deinit(pVideoDec
->csc_handle
);
1783 pVideoDec
->csc_handle
= NULL
;
1786 Exynos_OSAL_QueueTerminate(&pVp9Dec
->bypassBufferInfoQ
);
1788 Exynos_OSAL_SignalTerminate(pVp9Dec
->hDestinationStartEvent
);
1789 pVp9Dec
->hDestinationStartEvent
= NULL
;
1790 pVp9Dec
->bDestinationStart
= OMX_FALSE
;
1791 Exynos_OSAL_SignalTerminate(pVp9Dec
->hSourceStartEvent
);
1792 pVp9Dec
->hSourceStartEvent
= NULL
;
1793 pVp9Dec
->bSourceStart
= OMX_FALSE
;
1795 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1796 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
1797 Exynos_OSAL_QueueTerminate(&pExynosOutputPort
->codecBufferQ
);
1798 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->codecSemID
);
1799 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1803 /* Does not require any actions. */
1806 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1807 Exynos_Free_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
);
1808 Exynos_OSAL_QueueTerminate(&pExynosInputPort
->codecBufferQ
);
1809 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->codecSemID
);
1810 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1814 /* Does not require any actions. */
1816 VP9CodecClose(pVp9Dec
);
1818 Exynos_ResetAllPortConfig(pOMXComponent
);
1826 OMX_ERRORTYPE
Exynos_VP9Dec_SrcIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1828 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1829 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1830 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1831 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1832 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
1833 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1834 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1835 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
1837 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
1838 ExynosVideoDecBufferOps
*pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
1839 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
1840 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1842 OMX_BUFFERHEADERTYPE tempBufferHeader
;
1843 void *pPrivate
= NULL
;
1845 unsigned int nAllocLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1846 unsigned int nDataLen
[MAX_BUFFER_PLANE
] = {oneFrameSize
, 0, 0};
1847 OMX_BOOL bInStartCode
= OMX_FALSE
;
1852 if (pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1853 ret
= VP9CodecSrcSetup(pOMXComponent
, pSrcInputData
);
1857 if ((pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCDst
== OMX_FALSE
) &&
1858 (pVideoDec
->bForceHeaderParsing
== OMX_FALSE
)) {
1859 ret
= VP9CodecDstSetup(pOMXComponent
);
1860 if (ret
!= OMX_ErrorNone
) {
1861 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed to VP9CodecDstSetup(0x%x)", __func__
, __LINE__
, ret
);
1866 if (((bInStartCode
= Check_VP9_StartCode(pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0], oneFrameSize
)) == OMX_TRUE
) ||
1867 ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
1868 pExynosComponent
->timeStamp
[pVp9Dec
->hMFCVp9Handle
.indexTimestamp
] = pSrcInputData
->timeStamp
;
1869 pExynosComponent
->nFlags
[pVp9Dec
->hMFCVp9Handle
.indexTimestamp
] = pSrcInputData
->nFlags
;
1870 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x, oneFrameSize: %d", pExynosComponent
, __FUNCTION__
,
1871 pSrcInputData
->timeStamp
, pSrcInputData
->timeStamp
/ 1E6
, pVp9Dec
->hMFCVp9Handle
.indexTimestamp
, pSrcInputData
->nFlags
, oneFrameSize
);
1872 pDecOps
->Set_FrameTag(hMFCHandle
, pVp9Dec
->hMFCVp9Handle
.indexTimestamp
);
1873 pVp9Dec
->hMFCVp9Handle
.indexTimestamp
++;
1874 pVp9Dec
->hMFCVp9Handle
.indexTimestamp
%= MAX_TIMESTAMP
;
1876 if ((pVideoDec
->bQosChanged
== OMX_TRUE
) &&
1877 (pDecOps
->Set_QosRatio
!= NULL
)) {
1878 pDecOps
->Set_QosRatio(hMFCHandle
, pVideoDec
->nQosRatio
);
1879 pVideoDec
->bQosChanged
= OMX_FALSE
;
1882 #ifdef PERFORMANCE_DEBUG
1883 Exynos_OSAL_V4L2CountIncrease(pExynosInputPort
->hBufferCount
, pSrcInputData
->bufferHeader
, INPUT_PORT_INDEX
);
1886 /* queue work for input buffer */
1887 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "[%p][%s] bufferHeader: 0x%x, dataBuffer: 0x%x", pExynosComponent
, __FUNCTION__
, pSrcInputData
->bufferHeader
, pSrcInputData
->multiPlaneBuffer
.dataBuffer
[0]);
1889 if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
)
1890 nAllocLen
[0] = pSrcInputData
->bufferHeader
->nAllocLen
;
1891 else if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
)
1892 nAllocLen
[0] = DEFAULT_MFC_INPUT_BUFFER_SIZE
;
1894 if (pExynosInputPort
->bufferProcessType
== BUFFER_COPY
) {
1895 tempBufferHeader
.nFlags
= pSrcInputData
->nFlags
;
1896 tempBufferHeader
.nTimeStamp
= pSrcInputData
->timeStamp
;
1897 pPrivate
= (void *)&tempBufferHeader
;
1899 pPrivate
= (void *)pSrcInputData
->bufferHeader
;
1901 codecReturn
= pInbufOps
->ExtensionEnqueue(hMFCHandle
,
1902 (void **)pSrcInputData
->multiPlaneBuffer
.dataBuffer
,
1903 (int *)pSrcInputData
->multiPlaneBuffer
.fd
,
1906 Exynos_GetPlaneFromPort(pExynosInputPort
),
1908 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1909 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1910 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1913 VP9CodecStart(pOMXComponent
, INPUT_PORT_INDEX
);
1914 if (pVp9Dec
->bSourceStart
== OMX_FALSE
) {
1915 pVp9Dec
->bSourceStart
= OMX_TRUE
;
1916 Exynos_OSAL_SignalSet(pVp9Dec
->hSourceStartEvent
);
1917 Exynos_OSAL_SleepMillisec(0);
1919 if (pVp9Dec
->bDestinationStart
== OMX_FALSE
) {
1920 pVp9Dec
->bDestinationStart
= OMX_TRUE
;
1921 Exynos_OSAL_SignalSet(pVp9Dec
->hDestinationStartEvent
);
1922 Exynos_OSAL_SleepMillisec(0);
1924 } else if (bInStartCode
== OMX_FALSE
) {
1925 ret
= OMX_ErrorCorruptedFrame
;
1929 ret
= OMX_ErrorNone
;
1937 OMX_ERRORTYPE
Exynos_VP9Dec_SrcOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1939 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1940 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1941 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1942 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1943 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
1944 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1945 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
1946 ExynosVideoDecBufferOps
*pInbufOps
= pVp9Dec
->hMFCVp9Handle
.pInbufOps
;
1947 ExynosVideoBuffer
*pVideoBuffer
;
1948 ExynosVideoBuffer videoBuffer
;
1952 if (pInbufOps
->ExtensionDequeue(hMFCHandle
, &videoBuffer
) == VIDEO_ERROR_NONE
)
1953 pVideoBuffer
= &videoBuffer
;
1955 pVideoBuffer
= NULL
;
1957 pSrcOutputData
->dataLen
= 0;
1958 pSrcOutputData
->usedDataLen
= 0;
1959 pSrcOutputData
->remainDataLen
= 0;
1960 pSrcOutputData
->nFlags
= 0;
1961 pSrcOutputData
->timeStamp
= 0;
1962 pSrcOutputData
->bufferHeader
= NULL
;
1964 if (pVideoBuffer
== NULL
) {
1965 pSrcOutputData
->multiPlaneBuffer
.dataBuffer
[0] = NULL
;
1966 pSrcOutputData
->allocSize
= 0;
1967 pSrcOutputData
->pPrivate
= NULL
;
1969 pSrcOutputData
->multiPlaneBuffer
.dataBuffer
[0] = pVideoBuffer
->planes
[0].addr
;
1970 pSrcOutputData
->multiPlaneBuffer
.fd
[0] = pVideoBuffer
->planes
[0].fd
;
1971 pSrcOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
;
1973 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1975 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
1976 if (pSrcOutputData
->multiPlaneBuffer
.dataBuffer
[0] ==
1977 pVideoDec
->pMFCDecInputBuffer
[i
]->pVirAddr
[0]) {
1978 pVideoDec
->pMFCDecInputBuffer
[i
]->dataSize
= 0;
1979 pSrcOutputData
->pPrivate
= pVideoDec
->pMFCDecInputBuffer
[i
];
1984 if (i
>= MFC_INPUT_BUFFER_NUM_MAX
) {
1985 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
1986 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1991 /* For Share Buffer */
1992 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
)
1993 pSrcOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1995 #ifdef PERFORMANCE_DEBUG
1996 Exynos_OSAL_V4L2CountDecrease(pExynosInputPort
->hBufferCount
, pSrcOutputData
->bufferHeader
, INPUT_PORT_INDEX
);
2000 ret
= OMX_ErrorNone
;
2008 OMX_ERRORTYPE
Exynos_VP9Dec_DstIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2010 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2011 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2012 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2013 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2014 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
2015 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2017 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
2018 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
2019 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
2021 unsigned int nAllocLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
2022 unsigned int nDataLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
2027 if (pDstInputData
->multiPlaneBuffer
.dataBuffer
[0] == NULL
) {
2028 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to find input buffer");
2029 ret
= OMX_ErrorBadParameter
;
2033 nPlaneCnt
= Exynos_GetPlaneFromPort(pExynosOutputPort
);
2034 for (i
= 0; i
< nPlaneCnt
; i
++) {
2035 nAllocLen
[i
] = pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
.nAlignPlaneSize
[i
];
2037 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "[%p][%s] : %d => ADDR[%d]: 0x%x", pExynosComponent
, __FUNCTION__
, __LINE__
, i
,
2038 pDstInputData
->multiPlaneBuffer
.dataBuffer
[i
]);
2041 if ((pVideoDec
->bReconfigDPB
== OMX_TRUE
) &&
2042 (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) &&
2043 (pExynosOutputPort
->exceptionFlag
== GENERAL_STATE
)) {
2044 ret
= VP9CodecDstSetup(pOMXComponent
);
2045 if (ret
!= OMX_ErrorNone
) {
2046 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: %d: Failed to VP9CodecDstSetup(0x%x)", __func__
, __LINE__
, ret
);
2049 pVideoDec
->bReconfigDPB
= OMX_FALSE
;
2052 #ifdef PERFORMANCE_DEBUG
2053 Exynos_OSAL_V4L2CountIncrease(pExynosOutputPort
->hBufferCount
, pDstInputData
->bufferHeader
, OUTPUT_PORT_INDEX
);
2056 if (pExynosOutputPort
->bDynamicDPBMode
== OMX_FALSE
) {
2057 codecReturn
= pOutbufOps
->Enqueue(hMFCHandle
,
2058 (void **)pDstInputData
->multiPlaneBuffer
.dataBuffer
,
2061 pDstInputData
->bufferHeader
);
2063 codecReturn
= pOutbufOps
->ExtensionEnqueue(hMFCHandle
,
2064 (void **)pDstInputData
->multiPlaneBuffer
.dataBuffer
,
2065 (int *)pDstInputData
->multiPlaneBuffer
.fd
,
2069 pDstInputData
->bufferHeader
);
2072 if (codecReturn
!= VIDEO_ERROR_NONE
) {
2073 if (codecReturn
!= VIDEO_ERROR_WRONGBUFFERSIZE
) {
2074 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
2075 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
2079 VP9CodecStart(pOMXComponent
, OUTPUT_PORT_INDEX
);
2081 ret
= OMX_ErrorNone
;
2089 OMX_ERRORTYPE
Exynos_VP9Dec_DstOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2091 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2092 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2093 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2094 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2095 void *hMFCHandle
= pVp9Dec
->hMFCVp9Handle
.hMFCHandle
;
2096 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2097 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2098 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
2100 ExynosVideoDecOps
*pDecOps
= pVp9Dec
->hMFCVp9Handle
.pDecOps
;
2101 ExynosVideoDecBufferOps
*pOutbufOps
= pVp9Dec
->hMFCVp9Handle
.pOutbufOps
;
2102 ExynosVideoBuffer
*pVideoBuffer
= NULL
;
2103 ExynosVideoBuffer videoBuffer
;
2104 ExynosVideoFrameStatusType displayStatus
= VIDEO_FRAME_STATUS_UNKNOWN
;
2105 ExynosVideoGeometry
*bufferGeometry
= NULL
;
2106 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
2108 OMX_S32 indexTimestamp
= 0;
2109 int plane
, nPlaneCnt
;
2113 if (pVp9Dec
->bDestinationStart
== OMX_FALSE
) {
2114 ret
= OMX_ErrorNone
;
2119 if (pExynosOutputPort
->bDynamicDPBMode
== OMX_FALSE
) {
2120 pVideoBuffer
= pOutbufOps
->Dequeue(hMFCHandle
);
2121 if (pVideoBuffer
== (ExynosVideoBuffer
*)VIDEO_ERROR_DQBUF_EIO
) {
2122 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "HW is not available");
2123 ret
= OMX_ErrorHardware
;
2127 if (pVideoBuffer
== NULL
) {
2128 ret
= OMX_ErrorNone
;
2132 Exynos_OSAL_Memset(&videoBuffer
, 0, sizeof(ExynosVideoBuffer
));
2134 codecReturn
= pOutbufOps
->ExtensionDequeue(hMFCHandle
, &videoBuffer
);
2135 if (codecReturn
== VIDEO_ERROR_NONE
) {
2136 pVideoBuffer
= &videoBuffer
;
2137 } else if (codecReturn
== VIDEO_ERROR_DQBUF_EIO
) {
2138 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "HW is not available");
2139 pVideoBuffer
= NULL
;
2140 ret
= OMX_ErrorHardware
;
2143 pVideoBuffer
= NULL
;
2144 ret
= OMX_ErrorNone
;
2149 displayStatus
= pVideoBuffer
->displayStatus
;
2150 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "[%p][%s] displayStatus: 0x%x", pExynosComponent
, __FUNCTION__
, displayStatus
);
2152 if ((displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_DECODING
) ||
2153 (displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_ONLY
) ||
2154 (displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
2155 (displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) ||
2156 (displayStatus
== VIDEO_FRAME_STATUS_LAST_FRAME
) ||
2157 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2158 ret
= OMX_ErrorNone
;
2163 if ((pVideoDec
->bThumbnailMode
== OMX_FALSE
) &&
2164 (displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
)) {
2165 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
) {
2166 pExynosOutputPort
->exceptionFlag
= NEED_PORT_FLUSH
;
2167 pVideoDec
->bReconfigDPB
= OMX_TRUE
;
2168 Vp9CodecUpdateResolution(pOMXComponent
);
2169 pVideoDec
->csc_set_format
= OMX_FALSE
;
2171 ret
= OMX_ErrorNone
;
2175 pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
++;
2176 pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
%= MAX_TIMESTAMP
;
2178 pDstOutputData
->allocSize
= pDstOutputData
->dataLen
= 0;
2179 nPlaneCnt
= Exynos_GetPlaneFromPort(pExynosOutputPort
);
2180 for (plane
= 0; plane
< nPlaneCnt
; plane
++) {
2181 pDstOutputData
->multiPlaneBuffer
.dataBuffer
[plane
] = pVideoBuffer
->planes
[plane
].addr
;
2182 pDstOutputData
->multiPlaneBuffer
.fd
[plane
] = pVideoBuffer
->planes
[plane
].fd
;
2183 pDstOutputData
->allocSize
+= pVideoBuffer
->planes
[plane
].allocSize
;
2184 pDstOutputData
->dataLen
+= pVideoBuffer
->planes
[plane
].dataSize
;
2186 pDstOutputData
->usedDataLen
= 0;
2187 pDstOutputData
->pPrivate
= pVideoBuffer
;
2188 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2190 pDstOutputData
->pPrivate
= NULL
;
2191 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
2192 if (pDstOutputData
->multiPlaneBuffer
.dataBuffer
[0] ==
2193 pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[0]) {
2194 pDstOutputData
->pPrivate
= pVideoDec
->pMFCDecOutputBuffer
[i
];
2199 if (pDstOutputData
->pPrivate
== NULL
) {
2200 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
2201 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
2206 /* For Share Buffer */
2207 pDstOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
2209 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)pDstOutputData
->extInfo
;
2210 bufferGeometry
= &pVp9Dec
->hMFCVp9Handle
.codecOutbufConf
;
2211 pBufferInfo
->imageWidth
= bufferGeometry
->nFrameWidth
;
2212 pBufferInfo
->imageHeight
= bufferGeometry
->nFrameHeight
;
2213 pBufferInfo
->imageStride
= bufferGeometry
->nStride
;
2214 pBufferInfo
->ColorFormat
= Exynos_OSAL_Video2OMXFormat((int)bufferGeometry
->eColorFormat
);
2215 Exynos_OSAL_Memcpy(&pBufferInfo
->PDSB
, &pVideoBuffer
->PDSB
, sizeof(PrivateDataShareBuffer
));
2217 indexTimestamp
= pDecOps
->Get_FrameTag(hMFCHandle
);
2218 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] out indexTimestamp: %d", pExynosComponent
, __FUNCTION__
, indexTimestamp
);
2219 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
2220 if ((pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
!= OMX_TRUE
) &&
2221 (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
!= OMX_TRUE
)) {
2222 if (indexTimestamp
== INDEX_AFTER_EOS
) {
2223 pDstOutputData
->timeStamp
= 0x00;
2224 pDstOutputData
->nFlags
= 0x00;
2226 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
];
2227 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
];
2228 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] missing out indexTimestamp: %d", pExynosComponent
, __FUNCTION__
, indexTimestamp
);
2231 pDstOutputData
->timeStamp
= 0x00;
2232 pDstOutputData
->nFlags
= 0x00;
2235 /* For timestamp correction. if mfc support frametype detect */
2236 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] disp_pic_frame_type: %d", pExynosComponent
, __FUNCTION__
, pVideoBuffer
->frameType
);
2238 /* NEED TIMESTAMP REORDER */
2239 if (pVideoDec
->bDTSMode
== OMX_TRUE
) {
2240 if ((pVideoBuffer
->frameType
& VIDEO_FRAME_I
) ||
2241 ((pVideoBuffer
->frameType
& VIDEO_FRAME_OTHERS
) &&
2242 ((pExynosComponent
->nFlags
[indexTimestamp
] & OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) ||
2243 (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
== OMX_TRUE
))
2244 pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
= indexTimestamp
;
2246 indexTimestamp
= pVp9Dec
->hMFCVp9Handle
.outputIndexTimestamp
;
2249 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
2250 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
] | OMX_BUFFERFLAG_ENDOFFRAME
;
2252 if (pVideoBuffer
->frameType
& VIDEO_FRAME_I
)
2253 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_SYNCFRAME
;
2255 if (pVideoBuffer
->frameType
& VIDEO_FRAME_CORRUPT
)
2256 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_DATACORRUPT
;
2258 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] output timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pExynosComponent
, __FUNCTION__
,
2259 pDstOutputData
->timeStamp
, pDstOutputData
->timeStamp
/ 1E6
, indexTimestamp
, pDstOutputData
->nFlags
);
2262 #ifdef PERFORMANCE_DEBUG
2263 if (pDstOutputData
->bufferHeader
!= NULL
) {
2264 pDstOutputData
->bufferHeader
->nTimeStamp
= pDstOutputData
->timeStamp
;
2265 Exynos_OSAL_V4L2CountDecrease(pExynosOutputPort
->hBufferCount
, pDstOutputData
->bufferHeader
, OUTPUT_PORT_INDEX
);
2269 if (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bLastFrameSupport
== VIDEO_FALSE
) {
2270 if ((!(pVideoBuffer
->frameType
& VIDEO_FRAME_B
)) &&
2271 (pExynosComponent
->bSaveFlagEOS
== OMX_TRUE
)) {
2272 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_EOS
;
2275 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "[%p][%s] displayStatus:%d, nFlags0x%x", pExynosComponent
, __FUNCTION__
, displayStatus
, pDstOutputData
->nFlags
);
2276 if (displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) {
2277 pDstOutputData
->remainDataLen
= 0;
2279 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
2280 if (indexTimestamp
!= INDEX_AFTER_EOS
)
2281 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "[%p][%s] indexTimestamp(%d) is wrong", pExynosComponent
, __FUNCTION__
, indexTimestamp
);
2282 pDstOutputData
->timeStamp
= 0x00;
2283 pDstOutputData
->nFlags
= 0x00;
2287 if ((pExynosComponent
->nFlags
[indexTimestamp
] & OMX_BUFFERFLAG_EOS
) ||
2288 (pExynosComponent
->bSaveFlagEOS
== OMX_TRUE
)) {
2289 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_EOS
;
2290 pExynosComponent
->nFlags
[indexTimestamp
] &= (~OMX_BUFFERFLAG_EOS
);
2292 } else if ((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
2293 pDstOutputData
->remainDataLen
= 0;
2295 if (pExynosComponent
->bBehaviorEOS
== OMX_TRUE
) {
2296 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
2298 if (!(pVideoBuffer
->frameType
& VIDEO_FRAME_B
)) {
2299 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
2301 pExynosComponent
->bSaveFlagEOS
= OMX_TRUE
;
2302 pDstOutputData
->nFlags
&= (~OMX_BUFFERFLAG_EOS
);
2306 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
2309 if ((displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) ||
2310 (displayStatus
== VIDEO_FRAME_STATUS_LAST_FRAME
) ||
2311 ((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
2312 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] displayStatus:%d, nFlags0x%x", pExynosComponent
, __FUNCTION__
, displayStatus
, pDstOutputData
->nFlags
);
2313 pDstOutputData
->remainDataLen
= 0;
2315 if (pExynosComponent
->bBehaviorEOS
== OMX_TRUE
) {
2316 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
2318 if (displayStatus
!= VIDEO_FRAME_STATUS_LAST_FRAME
) {
2319 pDstOutputData
->nFlags
&= (~OMX_BUFFERFLAG_EOS
);
2321 pDstOutputData
->nFlags
|= OMX_BUFFERFLAG_EOS
;
2322 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
2326 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
2330 ret
= OMX_ErrorNone
;
2338 OMX_ERRORTYPE
Exynos_VP9Dec_srcInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
2340 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2341 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2342 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2343 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2347 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2348 ret
= OMX_ErrorNone
;
2351 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2352 ret
= OMX_ErrorNone
;
2356 ret
= Exynos_VP9Dec_SrcIn(pOMXComponent
, pSrcInputData
);
2357 if ((ret
!= OMX_ErrorNone
) &&
2358 ((EXYNOS_OMX_ERRORTYPE
)ret
!= OMX_ErrorInputDataDecodeYet
) &&
2359 ((EXYNOS_OMX_ERRORTYPE
)ret
!= OMX_ErrorCorruptedFrame
)) {
2361 if (((EXYNOS_OMX_ERRORTYPE
)ret
== OMX_ErrorCorruptedHeader
) &&
2362 (pVideoDec
->bDiscardCSDError
== OMX_TRUE
)) {
2366 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2367 pExynosComponent
->callbackData
,
2368 OMX_EventError
, ret
, 0, NULL
);
2377 OMX_ERRORTYPE
Exynos_VP9Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
2379 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2380 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2381 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2382 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2383 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2387 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2388 ret
= OMX_ErrorNone
;
2392 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
2393 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2394 ret
= OMX_ErrorNone
;
2398 if ((pVp9Dec
->bSourceStart
== OMX_FALSE
) &&
2399 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort
))) {
2400 Exynos_OSAL_SignalWait(pVp9Dec
->hSourceStartEvent
, DEF_MAX_WAIT_TIME
);
2401 if (pVideoDec
->bExitBufferProcessThread
)
2404 Exynos_OSAL_SignalReset(pVp9Dec
->hSourceStartEvent
);
2407 ret
= Exynos_VP9Dec_SrcOut(pOMXComponent
, pSrcOutputData
);
2408 if ((ret
!= OMX_ErrorNone
) &&
2409 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2410 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2411 pExynosComponent
->callbackData
,
2412 OMX_EventError
, ret
, 0, NULL
);
2421 OMX_ERRORTYPE
Exynos_VP9Dec_dstInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2423 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2424 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2425 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2426 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2427 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2431 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2432 ret
= OMX_ErrorNone
;
2435 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2436 if (pExynosComponent
->currentState
== OMX_StatePause
)
2437 ret
= OMX_ErrorOutputBufferUseYet
;
2439 ret
= OMX_ErrorNone
;
2442 if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
2443 if ((pVp9Dec
->bDestinationStart
== OMX_FALSE
) &&
2444 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2445 Exynos_OSAL_SignalWait(pVp9Dec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2446 if (pVideoDec
->bExitBufferProcessThread
)
2449 Exynos_OSAL_SignalReset(pVp9Dec
->hDestinationStartEvent
);
2451 if (Exynos_OSAL_GetElemNum(&pVp9Dec
->bypassBufferInfoQ
) > 0) {
2452 BYPASS_BUFFER_INFO
*pBufferInfo
= (BYPASS_BUFFER_INFO
*)Exynos_OSAL_Dequeue(&pVp9Dec
->bypassBufferInfoQ
);
2453 if (pBufferInfo
== NULL
) {
2454 ret
= OMX_ErrorUndefined
;
2458 pDstInputData
->bufferHeader
->nFlags
= pBufferInfo
->nFlags
;
2459 pDstInputData
->bufferHeader
->nTimeStamp
= pBufferInfo
->timeStamp
;
2460 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pDstInputData
->bufferHeader
);
2461 Exynos_OSAL_Free(pBufferInfo
);
2463 ret
= OMX_ErrorNone
;
2467 if (pVp9Dec
->hMFCVp9Handle
.bConfiguredMFCDst
== OMX_TRUE
) {
2468 ret
= Exynos_VP9Dec_DstIn(pOMXComponent
, pDstInputData
);
2469 if (ret
!= OMX_ErrorNone
) {
2470 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2471 pExynosComponent
->callbackData
,
2472 OMX_EventError
, ret
, 0, NULL
);
2482 OMX_ERRORTYPE
Exynos_VP9Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2484 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2485 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2486 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2487 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2488 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2492 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2493 ret
= OMX_ErrorNone
;
2496 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2497 ret
= OMX_ErrorNone
;
2501 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2502 if ((pVp9Dec
->bDestinationStart
== OMX_FALSE
) &&
2503 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2504 Exynos_OSAL_SignalWait(pVp9Dec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2505 if (pVideoDec
->bExitBufferProcessThread
)
2508 Exynos_OSAL_SignalReset(pVp9Dec
->hDestinationStartEvent
);
2510 if (Exynos_OSAL_GetElemNum(&pVp9Dec
->bypassBufferInfoQ
) > 0) {
2511 EXYNOS_OMX_DATABUFFER
*dstOutputUseBuffer
= &pExynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
2512 OMX_BUFFERHEADERTYPE
*pOMXBuffer
= NULL
;
2513 BYPASS_BUFFER_INFO
*pBufferInfo
= NULL
;
2515 if (dstOutputUseBuffer
->dataValid
== OMX_FALSE
) {
2516 pOMXBuffer
= Exynos_OutputBufferGetQueue_Direct(pExynosComponent
);
2517 if (pOMXBuffer
== NULL
) {
2518 ret
= OMX_ErrorUndefined
;
2522 pOMXBuffer
= dstOutputUseBuffer
->bufferHeader
;
2525 pBufferInfo
= Exynos_OSAL_Dequeue(&pVp9Dec
->bypassBufferInfoQ
);
2526 if (pBufferInfo
== NULL
) {
2527 ret
= OMX_ErrorUndefined
;
2531 pOMXBuffer
->nFlags
= pBufferInfo
->nFlags
;
2532 pOMXBuffer
->nTimeStamp
= pBufferInfo
->timeStamp
;
2533 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pOMXBuffer
);
2534 Exynos_OSAL_Free(pBufferInfo
);
2536 dstOutputUseBuffer
->dataValid
= OMX_FALSE
;
2538 ret
= OMX_ErrorNone
;
2542 ret
= Exynos_VP9Dec_DstOut(pOMXComponent
, pDstOutputData
);
2543 if ((ret
!= OMX_ErrorNone
) &&
2544 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2545 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2546 pExynosComponent
->callbackData
,
2547 OMX_EventError
, ret
, 0, NULL
);
2556 OSCL_EXPORT_REF OMX_ERRORTYPE
Exynos_OMX_ComponentInit(
2557 OMX_HANDLETYPE hComponent
,
2558 OMX_STRING componentName
)
2560 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2561 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2562 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2563 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
2564 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
2565 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
2568 Exynos_OSAL_Get_Log_Property(); // For debuging
2571 if ((hComponent
== NULL
) || (componentName
== NULL
)) {
2572 ret
= OMX_ErrorBadParameter
;
2573 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
2576 if ((Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP9_DEC
, componentName
) != 0) &&
2577 (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP9_CUSTOM_DEC
, componentName
) != 0)) {
2578 ret
= OMX_ErrorBadParameter
;
2579 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName
, __LINE__
);
2583 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2584 ret
= Exynos_OMX_VideoDecodeComponentInit(pOMXComponent
);
2585 if (ret
!= OMX_ErrorNone
) {
2586 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
2589 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2590 pExynosComponent
->codecType
= HW_VIDEO_DEC_CODEC
;
2592 pExynosComponent
->componentName
= (OMX_STRING
)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE
);
2593 if (pExynosComponent
->componentName
== NULL
) {
2594 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2595 ret
= OMX_ErrorInsufficientResources
;
2596 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2599 Exynos_OSAL_Memset(pExynosComponent
->componentName
, 0, MAX_OMX_COMPONENT_NAME_SIZE
);
2601 pVp9Dec
= Exynos_OSAL_Malloc(sizeof(EXYNOS_VP9DEC_HANDLE
));
2602 if (pVp9Dec
== NULL
) {
2603 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2604 ret
= OMX_ErrorInsufficientResources
;
2605 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2608 Exynos_OSAL_Memset(pVp9Dec
, 0, sizeof(EXYNOS_VP9DEC_HANDLE
));
2609 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2610 pVideoDec
->hCodecHandle
= (OMX_HANDLETYPE
)pVp9Dec
;
2611 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, componentName
);
2613 /* Set componentVersion */
2614 pExynosComponent
->componentVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2615 pExynosComponent
->componentVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2616 pExynosComponent
->componentVersion
.s
.nRevision
= REVISION_NUMBER
;
2617 pExynosComponent
->componentVersion
.s
.nStep
= STEP_NUMBER
;
2618 /* Set specVersion */
2619 pExynosComponent
->specVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2620 pExynosComponent
->specVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2621 pExynosComponent
->specVersion
.s
.nRevision
= REVISION_NUMBER
;
2622 pExynosComponent
->specVersion
.s
.nStep
= STEP_NUMBER
;
2625 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2626 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2627 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2628 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
2629 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
2630 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
2631 if (IS_CUSTOM_COMPONENT(pExynosComponent
->componentName
) == OMX_TRUE
)
2632 pExynosPort
->portDefinition
.nBufferSize
= CUSTOM_DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
2634 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingVP9
;
2635 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2636 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/x-vnd.on2.vp9");
2637 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2638 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2639 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
2640 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2641 pExynosPort
->bufferProcessType
= BUFFER_SHARE
;
2642 pExynosPort
->portWayType
= WAY2_PORT
;
2643 pExynosPort
->ePlaneType
= PLANE_SINGLE
;
2646 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2647 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2648 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2649 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
2650 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
2651 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
2652 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
2653 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2654 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
2655 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2656 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2657 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
2658 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2659 pExynosPort
->bufferProcessType
= BUFFER_COPY
| BUFFER_ANBSHARE
;
2660 pExynosPort
->portWayType
= WAY2_PORT
;
2661 pExynosPort
->ePlaneType
= PLANE_MULTIPLE
;
2663 pOMXComponent
->GetParameter
= &Exynos_VP9Dec_GetParameter
;
2664 pOMXComponent
->SetParameter
= &Exynos_VP9Dec_SetParameter
;
2665 pOMXComponent
->GetConfig
= &Exynos_VP9Dec_GetConfig
;
2666 pOMXComponent
->SetConfig
= &Exynos_VP9Dec_SetConfig
;
2667 pOMXComponent
->GetExtensionIndex
= &Exynos_VP9Dec_GetExtensionIndex
;
2668 pOMXComponent
->ComponentRoleEnum
= &Exynos_VP9Dec_ComponentRoleEnum
;
2669 pOMXComponent
->ComponentDeInit
= &Exynos_OMX_ComponentDeinit
;
2671 pExynosComponent
->exynos_codec_componentInit
= &Exynos_VP9Dec_Init
;
2672 pExynosComponent
->exynos_codec_componentTerminate
= &Exynos_VP9Dec_Terminate
;
2674 pVideoDec
->exynos_codec_srcInputProcess
= &Exynos_VP9Dec_srcInputBufferProcess
;
2675 pVideoDec
->exynos_codec_srcOutputProcess
= &Exynos_VP9Dec_srcOutputBufferProcess
;
2676 pVideoDec
->exynos_codec_dstInputProcess
= &Exynos_VP9Dec_dstInputBufferProcess
;
2677 pVideoDec
->exynos_codec_dstOutputProcess
= &Exynos_VP9Dec_dstOutputBufferProcess
;
2679 pVideoDec
->exynos_codec_start
= &VP9CodecStart
;
2680 pVideoDec
->exynos_codec_stop
= &VP9CodecStop
;
2681 pVideoDec
->exynos_codec_bufferProcessRun
= &VP9CodecOutputBufferProcessRun
;
2682 pVideoDec
->exynos_codec_enqueueAllBuffer
= &VP9CodecEnQueueAllBuffer
;
2684 #if 0 /* unused code */
2685 pVideoDec
->exynos_checkInputFrame
= &Check_VP9_Frame
;
2686 pVideoDec
->exynos_codec_getCodecInputPrivateData
= &GetCodecInputPrivateData
;
2689 pVideoDec
->exynos_codec_getCodecOutputPrivateData
= &GetCodecOutputPrivateData
;
2690 pVideoDec
->exynos_codec_reconfigAllBuffers
= &Vp9CodecReconfigAllBuffers
;
2692 pVideoDec
->exynos_codec_checkFormatSupport
= &CheckFormatHWSupport
;
2693 pVideoDec
->exynos_codec_checkResolutionChange
= &Vp9CodecCheckResolution
;
2695 pVideoDec
->hSharedMemory
= Exynos_OSAL_SharedMemory_Open();
2696 if (pVideoDec
->hSharedMemory
== NULL
) {
2697 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2698 Exynos_OSAL_Free(pVp9Dec
);
2699 pVp9Dec
= ((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2700 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2701 ret
= OMX_ErrorInsufficientResources
;
2705 pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.eCodecType
= VIDEO_CODING_VP9
;
2706 if (pExynosComponent
->codecType
== HW_VIDEO_DEC_SECURE_CODEC
)
2707 pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.eSecurityType
= VIDEO_SECURE
;
2709 pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.eSecurityType
= VIDEO_NORMAL
;
2711 if (Exynos_Video_GetInstInfo(&(pVp9Dec
->hMFCVp9Handle
.videoInstInfo
), VIDEO_TRUE
/* dec */) != VIDEO_ERROR_NONE
) {
2712 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "[%p][%s]: Exynos_Video_GetInstInfo is failed", pExynosComponent
, __FUNCTION__
);
2713 Exynos_OSAL_Free(pVp9Dec
);
2714 pVp9Dec
= ((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2715 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2716 ret
= OMX_ErrorInsufficientResources
;
2720 Exynos_OSAL_Log(EXYNOS_LOG_ESSENTIAL
, "[%p][%s] GetInstInfo for dec %d %d %d %d", pExynosComponent
, __FUNCTION__
,
2721 (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bDualDPBSupport
),
2722 (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bDynamicDPBSupport
),
2723 (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bLastFrameSupport
),
2724 (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bSkypeSupport
));
2726 if (pVp9Dec
->hMFCVp9Handle
.videoInstInfo
.specificInfo
.dec
.bDynamicDPBSupport
== VIDEO_TRUE
)
2727 pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bDynamicDPBMode
= OMX_TRUE
;
2729 Exynos_Output_SetSupportFormat(pExynosComponent
);
2731 pExynosComponent
->currentState
= OMX_StateLoaded
;
2733 ret
= OMX_ErrorNone
;
2741 OMX_ERRORTYPE
Exynos_OMX_ComponentDeinit(
2742 OMX_HANDLETYPE hComponent
)
2744 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2745 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2746 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2747 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
2748 EXYNOS_VP9DEC_HANDLE
*pVp9Dec
= NULL
;
2752 if (hComponent
== NULL
) {
2753 ret
= OMX_ErrorBadParameter
;
2756 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2757 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2758 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2760 Exynos_OSAL_SharedMemory_Close(pVideoDec
->hSharedMemory
);
2762 Exynos_OSAL_Free(pExynosComponent
->componentName
);
2763 pExynosComponent
->componentName
= NULL
;
2765 pVp9Dec
= (EXYNOS_VP9DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2766 if (pVp9Dec
!= NULL
) {
2767 Exynos_OSAL_Free(pVp9Dec
);
2768 pVp9Dec
= pVideoDec
->hCodecHandle
= NULL
;
2771 ret
= Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2772 if (ret
!= OMX_ErrorNone
) {
2776 ret
= OMX_ErrorNone
;