1/*
2 *
3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * @file        Exynos_OMX_Vdec.h
20 * @brief
21 * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
22 *              HyeYeon Chung (hyeon.chung@samsung.com)
23 *              Yunji Kim (yunji.kim@samsung.com)
24 * @version     2.0.0
25 * @history
26 *   2012.02.20 : Create
27 */
28
29#ifndef EXYNOS_OMX_VIDEO_DECODE
30#define EXYNOS_OMX_VIDEO_DECODE
31
32#include "OMX_Component.h"
33#include "Exynos_OMX_Def.h"
34#include "Exynos_OSAL_Queue.h"
35#include "Exynos_OMX_Baseport.h"
36#include "Exynos_OMX_Basecomponent.h"
37#include "ExynosVideoApi.h"
38
39#define MAX_VIDEO_INPUTBUFFER_NUM           5
40#define MAX_VIDEO_OUTPUTBUFFER_NUM          2
41
42#define DEFAULT_FRAME_WIDTH                 176
43#define DEFAULT_FRAME_HEIGHT                144
44
45#define DEFAULT_VIDEO_INPUT_BUFFER_SIZE    (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
46#define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE   (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT * 3) / 2
47
48#define MFC_INPUT_BUFFER_NUM_MAX            3
49#define DEFAULT_MFC_INPUT_BUFFER_SIZE       1920 * 1080 * 3 / 2
50
51#define MFC_OUTPUT_BUFFER_NUM_MAX           16 * 2
52#define DEFAULT_MFC_OUTPUT_YBUFFER_SIZE     1920 * 1080
53#define DEFAULT_MFC_OUTPUT_CBUFFER_SIZE     1920 * 1080 / 2
54
55#define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    1
56#define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   4
57
58#define EXTRA_DPB_NUM                       5
59
60#define MFC_INPUT_BUFFER_PLANE              1
61#define MFC_OUTPUT_BUFFER_PLANE             2
62
63typedef struct
64{
65    void *pAddrY;
66    void *pAddrC;
67} CODEC_DEC_ADDR_INFO;
68
69typedef struct _CODEC_DEC_BUFFER
70{
71    void *pVirAddr[MAX_BUFFER_PLANE];   /* virtual address   */
72    int   bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
73    int   fd[MAX_BUFFER_PLANE];         /* buffer FD */
74    int   dataSize;                     /* total data length */
75} CODEC_DEC_BUFFER;
76
77typedef struct _DECODE_CODEC_EXTRA_BUFFERINFO
78{
79    /* For Decode Output */
80    OMX_U32 imageWidth;
81    OMX_U32 imageHeight;
82    OMX_COLOR_FORMATTYPE ColorFormat;
83} DECODE_CODEC_EXTRA_BUFFERINFO;
84
85typedef struct _EXYNOS_OMX_VIDEODEC_COMPONENT
86{
87    OMX_HANDLETYPE hCodecHandle;
88    OMX_BOOL bThumbnailMode;
89    OMX_BOOL bFirstFrame;
90    CODEC_DEC_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
91    CODEC_DEC_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
92
93    /* Buffer Process */
94    OMX_BOOL       bExitBufferProcessThread;
95    OMX_HANDLETYPE hSrcInputThread;
96    OMX_HANDLETYPE hSrcOutputThread;
97    OMX_HANDLETYPE hDstInputThread;
98    OMX_HANDLETYPE hDstOutputThread;
99
100    /* Shared Memory Handle */
101    OMX_HANDLETYPE hSharedMemory;
102
103    /* For DRM Play */
104    OMX_BOOL bDRMPlayerMode;
105
106    /* CSC handle */
107    OMX_PTR csc_handle;
108    OMX_U32 csc_set_format;
109
110    OMX_ERRORTYPE (*exynos_codec_srcInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
111    OMX_ERRORTYPE (*exynos_codec_srcOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
112    OMX_ERRORTYPE (*exynos_codec_dstInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
113    OMX_ERRORTYPE (*exynos_codec_dstOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
114
115    OMX_ERRORTYPE (*exynos_codec_start)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
116    OMX_ERRORTYPE (*exynos_codec_stop)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
117    OMX_ERRORTYPE (*exynos_codec_bufferProcessRun)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
118    OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
119
120    int (*exynos_checkInputFrame) (OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag,
121                                   OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
122    OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr, OMX_U32 *size);
123    OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]);
124} EXYNOS_OMX_VIDEODEC_COMPONENT;
125
126#ifdef __cplusplus
127extern "C" {
128#endif
129
130int calc_plane(int width, int height);
131inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent);
132OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex);
133OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
134OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
135
136OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent);
137OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent);
138OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent);
139OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent);
140OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
141OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
142
143#ifdef __cplusplus
144}
145#endif
146
147#endif
148