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#include "ExynosVideoApi.h"
37
38#define MAX_VIDEO_INPUTBUFFER_NUM    5
39#define MAX_VIDEO_OUTPUTBUFFER_NUM   4
40
41#define DEFAULT_FRAME_WIDTH          176
42#define DEFAULT_FRAME_HEIGHT         144
43
44#define DEFAULT_VIDEO_INPUT_BUFFER_SIZE    (ALIGN_TO_16B(DEFAULT_FRAME_WIDTH) * ALIGN_TO_16B(DEFAULT_FRAME_HEIGHT) + \
45                                                                                ALIGN((ALIGN_TO_16B(DEFAULT_FRAME_WIDTH) * ALIGN_TO_16B(DEFAULT_FRAME_HEIGHT))/2,256))
46#define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE   (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
47
48#define MFC_INPUT_BUFFER_NUM_MAX            3
49#define MFC_OUTPUT_BUFFER_NUM_MAX           4
50
51#define DEFAULT_MFC_INPUT_YBUFFER_SIZE      ALIGN_TO_16B(1920) * ALIGN_TO_16B(1080)
52#define DEFAULT_MFC_INPUT_CBUFFER_SIZE      ALIGN((DEFAULT_MFC_INPUT_YBUFFER_SIZE / 2), 256)
53#define DEFAULT_MFC_OUTPUT_BUFFER_SIZE      1920 * 1080 * 3 / 2
54
55#define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    5
56#define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   1
57
58#define MFC_INPUT_BUFFER_PLANE              2
59#define MFC_OUTPUT_BUFFER_PLANE             1
60
61#define MAX_INPUTBUFFER_NUM_DYNAMIC         0 /* Dynamic number of metadata buffer */
62
63// The largest metadata buffer size advertised
64// when metadata buffer mode is used for video encoding
65#define  MAX_INPUT_METADATA_BUFFER_SIZE (64)
66
67typedef struct
68{
69    void *pAddrY;
70    void *pAddrC;
71} CODEC_ENC_ADDR_INFO;
72
73typedef struct _CODEC_ENC_BUFFER
74{
75    void *pVirAddr[MAX_BUFFER_PLANE];   /* virtual address   */
76    int   bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
77    int   fd[MAX_BUFFER_PLANE];  /* buffer FD */
78    int   dataSize;              /* total data length */
79} CODEC_ENC_BUFFER;
80
81typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT
82{
83    OMX_HANDLETYPE hCodecHandle;
84    OMX_BOOL bFirstFrame;
85    CODEC_ENC_BUFFER *pMFCEncInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
86    CODEC_ENC_BUFFER *pMFCEncOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
87
88    /* Buffer Process */
89    OMX_BOOL       bExitBufferProcessThread;
90    OMX_HANDLETYPE hSrcInputThread;
91    OMX_HANDLETYPE hSrcOutputThread;
92    OMX_HANDLETYPE hDstInputThread;
93    OMX_HANDLETYPE hDstOutputThread;
94
95    /* Shared Memory Handle */
96    OMX_HANDLETYPE hSharedMemory;
97
98    OMX_BOOL configChange;
99    OMX_BOOL IntraRefreshVOP;
100    OMX_VIDEO_CONTROLRATETYPE eControlRate[ALL_PORT_NUM];
101    OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization;
102    OMX_VIDEO_PARAM_INTRAREFRESHTYPE intraRefresh;
103
104    OMX_BOOL bFirstInput;
105    OMX_BOOL bFirstOutput;
106
107    OMX_COLOR_FORMATTYPE ANBColorFormat;
108
109    /* CSC handle */
110    OMX_PTR csc_handle;
111    OMX_U32 csc_set_format;
112
113    OMX_ERRORTYPE (*exynos_codec_srcInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
114    OMX_ERRORTYPE (*exynos_codec_srcOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
115    OMX_ERRORTYPE (*exynos_codec_dstInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
116    OMX_ERRORTYPE (*exynos_codec_dstOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
117
118    OMX_ERRORTYPE (*exynos_codec_start)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
119    OMX_ERRORTYPE (*exynos_codec_stop)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
120    OMX_ERRORTYPE (*exynos_codec_bufferProcessRun)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
121    OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
122
123    int (*exynos_checkInputFrame) (OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag,
124                                   OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
125    OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]);
126    OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr, OMX_U32 *size);
127} EXYNOS_OMX_VIDEOENC_COMPONENT;
128
129#ifdef __cplusplus
130extern "C" {
131#endif
132
133inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent);
134OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex);
135OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
136OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
137
138
139OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent);
140OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent);
141OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent);
142OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent);
143OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
144OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
145
146#ifdef __cplusplus
147}
148#endif
149
150#endif
151