4cdba1486b88826837ce52389d88f50447a8616f
[platform/adaptation/ap_samsung/libomxil-e3250-v4l2.git] / openmax / component / video / enc / Exynos_OMX_Venc.h
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_Venc.h
20  * @brief
21  * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
22  *              Yunji Kim (yunji.kim@samsung.com)
23  * @version     2.0.0
24  * @history
25  *   2012.02.20 : Create
26  */
27
28 #ifndef EXYNOS_OMX_VIDEO_ENCODE
29 #define EXYNOS_OMX_VIDEO_ENCODE
30
31 #include "OMX_Component.h"
32 #include "Exynos_OMX_Def.h"
33 #include "Exynos_OSAL_Queue.h"
34 #include "Exynos_OMX_Baseport.h"
35 #include "Exynos_OMX_Basecomponent.h"
36
37 #define MAX_VIDEO_INPUTBUFFER_NUM    5
38 #define MAX_VIDEO_OUTPUTBUFFER_NUM   4
39
40 #define DEFAULT_FRAME_WIDTH          176
41 #define DEFAULT_FRAME_HEIGHT         144
42
43 #define DEFAULT_VIDEO_INPUT_BUFFER_SIZE    (ALIGN_TO_16B(DEFAULT_FRAME_WIDTH) * ALIGN_TO_16B(DEFAULT_FRAME_HEIGHT) + \
44                                                                                 ALIGN((ALIGN_TO_16B(DEFAULT_FRAME_WIDTH) * ALIGN_TO_16B(DEFAULT_FRAME_HEIGHT))/2,256))
45 #define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE   (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
46
47 #define MFC_INPUT_BUFFER_NUM_MAX            3
48 #define MFC_OUTPUT_BUFFER_NUM_MAX           4
49
50 #define DEFAULT_MFC_INPUT_YBUFFER_SIZE      ALIGN_TO_16B(1920) * ALIGN_TO_16B(1080)
51 #define DEFAULT_MFC_INPUT_CBUFFER_SIZE      ALIGN((DEFAULT_MFC_INPUT_YBUFFER_SIZE / 2), 256)
52 #define DEFAULT_MFC_OUTPUT_BUFFER_SIZE      1920 * 1080 * 3 / 2
53
54 #define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    7
55 #define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   1
56
57 #define MFC_INPUT_BUFFER_PLANE              2
58 #define MFC_OUTPUT_BUFFER_PLANE             1
59
60 #ifdef SLP_PLATFORM
61 /* FIXME: for camera slow motion 12 buffer and eos issue, we increase this value */
62 /* FIXME: for trim small resolution video. dec + enc case */
63 #define MAX_CAMERA_INPUTBUFFER_NUM          25 /* number of metadata buffer */
64 #else
65 #define MAX_CAMERA_INPUTBUFFER_NUM          12 /* number of metadata buffer */
66 #endif
67
68
69 // The largest metadata buffer size advertised
70 // when metadata buffer mode is used for video encoding
71 #define  MAX_INPUT_METADATA_BUFFER_SIZE (64)
72
73 typedef struct
74 {
75     void *pAddrY;
76     void *pAddrC;
77 } CODEC_ENC_ADDR_INFO;
78
79 typedef struct _CODEC_ENC_BUFFER
80 {
81     void *pVirAddr[MAX_BUFFER_PLANE];   /* virtual address   */
82     int   bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
83     int   fd[MAX_BUFFER_PLANE];  /* buffer FD */
84     int   dataSize;              /* total data length */
85 } CODEC_ENC_BUFFER;
86
87 typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT
88 {
89     OMX_HANDLETYPE hCodecHandle;
90     OMX_BOOL bFirstFrame;
91     CODEC_ENC_BUFFER *pMFCEncInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
92     CODEC_ENC_BUFFER *pMFCEncOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
93
94     /* Buffer Process */
95     OMX_BOOL       bExitBufferProcessThread;
96     OMX_HANDLETYPE hSrcInputThread;
97     OMX_HANDLETYPE hSrcOutputThread;
98     OMX_HANDLETYPE hDstInputThread;
99     OMX_HANDLETYPE hDstOutputThread;
100
101     /* Shared Memory Handle */
102     OMX_HANDLETYPE hSharedMemory;
103
104     OMX_BOOL configChange;
105     OMX_BOOL IntraRefreshVOP;
106     OMX_VIDEO_CONTROLRATETYPE eControlRate[ALL_PORT_NUM];
107     OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization;
108
109     OMX_BOOL bFirstOutput;
110     OMX_BOOL bSharedOutputFD;
111
112     /* CSC handle */
113     OMX_PTR csc_handle;
114     OMX_U32 csc_set_format;
115
116     OMX_ERRORTYPE (*exynos_codec_srcInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
117     OMX_ERRORTYPE (*exynos_codec_srcOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
118     OMX_ERRORTYPE (*exynos_codec_dstInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
119     OMX_ERRORTYPE (*exynos_codec_dstOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
120
121     OMX_ERRORTYPE (*exynos_codec_start)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
122     OMX_ERRORTYPE (*exynos_codec_stop)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
123     OMX_ERRORTYPE (*exynos_codec_bufferProcessRun)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
124     OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
125
126     int (*exynos_checkInputFrame) (OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag,
127                                    OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
128     OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]);
129     OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr, OMX_U32 *size);
130 } EXYNOS_OMX_VIDEOENC_COMPONENT;
131
132 #ifdef __cplusplus
133 extern "C" {
134 #endif
135
136 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent);
137 OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex);
138 OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
139 OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
140
141
142 OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent);
143 OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent);
144 OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent);
145 OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent);
146 OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
147 OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
148
149 #ifdef __cplusplus
150 }
151 #endif
152
153 #endif