3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OMX_Venc.h
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * Yunji Kim (yunji.kim@samsung.com)
28 #ifndef EXYNOS_OMX_VIDEO_ENCODE
29 #define EXYNOS_OMX_VIDEO_ENCODE
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"
37 #define MAX_VIDEO_INPUTBUFFER_NUM 5
38 #define MAX_VIDEO_OUTPUTBUFFER_NUM 4
40 #define DEFAULT_FRAME_WIDTH 176
41 #define DEFAULT_FRAME_HEIGHT 144
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
47 #define MFC_INPUT_BUFFER_NUM_MAX 3
48 #define MFC_OUTPUT_BUFFER_NUM_MAX 4
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
54 #ifdef USE_ENCODER_RGBINPUT_SUPPORT
55 #define INPUT_PORT_SUPPORTFORMAT_NUM_MAX 8
57 #define INPUT_PORT_SUPPORTFORMAT_NUM_MAX 5
59 #define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX 1
61 #define MFC_DEFAULT_INPUT_BUFFER_PLANE 2
62 #define MFC_DEFAULT_OUTPUT_BUFFER_PLANE 1
64 #define MAX_INPUTBUFFER_NUM_DYNAMIC 0 /* Dynamic number of metadata buffer */
65 #define MAX_OUTPUTBUFFER_NUM_DYNAMIC 0 /* Dynamic number of metadata buffer */
67 // The largest metadata buffer size advertised
68 // when metadata buffer mode is used for video encoding
69 #define MAX_INPUT_METADATA_BUFFER_SIZE (64)
75 } CODEC_ENC_ADDR_INFO
;
77 typedef struct _BYPASS_BUFFER_INFO
83 typedef struct _CODEC_ENC_BUFFER
85 void *pVirAddr
[MAX_BUFFER_PLANE
]; /* virtual address */
86 int bufferSize
[MAX_BUFFER_PLANE
]; /* buffer alloc size */
87 int fd
[MAX_BUFFER_PLANE
]; /* buffer FD */
88 int dataSize
; /* total data length */
91 typedef struct _ENCODE_CODEC_EXTRA_BUFFERINFO
93 /* For Encode Input */
94 OMX_COLOR_FORMATTYPE eColorFormat
;
95 } ENCODE_CODEC_EXTRA_BUFFERINFO
;
97 typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT
99 OMX_HANDLETYPE hCodecHandle
;
100 OMX_BOOL bFirstFrame
;
101 OMX_BOOL bQosChanged
;
103 OMX_U32 nInbufSpareSize
;
104 CODEC_ENC_BUFFER
*pMFCEncInputBuffer
[MFC_INPUT_BUFFER_NUM_MAX
];
105 CODEC_ENC_BUFFER
*pMFCEncOutputBuffer
[MFC_OUTPUT_BUFFER_NUM_MAX
];
108 OMX_BOOL bExitBufferProcessThread
;
109 OMX_HANDLETYPE hSrcInputThread
;
110 OMX_HANDLETYPE hSrcOutputThread
;
111 OMX_HANDLETYPE hDstInputThread
;
112 OMX_HANDLETYPE hDstOutputThread
;
114 /* Shared Memory Handle */
115 OMX_HANDLETYPE hSharedMemory
;
118 OMX_BOOL bDRMPlayerMode
;
120 OMX_BOOL configChange
;
121 OMX_BOOL IntraRefreshVOP
;
122 OMX_VIDEO_CONTROLRATETYPE eControlRate
[ALL_PORT_NUM
];
123 OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization
;
124 OMX_VIDEO_PARAM_INTRAREFRESHTYPE intraRefresh
;
126 OMX_BOOL bFirstInput
;
127 OMX_BOOL bFirstOutput
;
129 OMX_COLOR_FORMATTYPE ANBColorFormat
;
130 OMX_BOOL bRGBSupport
;
134 OMX_U32 csc_set_format
;
136 OMX_ERRORTYPE (*exynos_codec_srcInputProcess
) (OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pInputData
);
137 OMX_ERRORTYPE (*exynos_codec_srcOutputProcess
) (OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pInputData
);
138 OMX_ERRORTYPE (*exynos_codec_dstInputProcess
) (OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pOutputData
);
139 OMX_ERRORTYPE (*exynos_codec_dstOutputProcess
) (OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pOutputData
);
141 OMX_ERRORTYPE (*exynos_codec_start
)(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
);
142 OMX_ERRORTYPE (*exynos_codec_stop
)(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
);
143 OMX_ERRORTYPE (*exynos_codec_bufferProcessRun
)(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
);
144 OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer
)(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
);
146 int (*exynos_checkInputFrame
) (OMX_U8
*pInputStream
, OMX_U32 buffSize
, OMX_U32 flag
,
147 OMX_BOOL bPreviousFrameEOF
, OMX_BOOL
*pbEndOfFrame
);
148 OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData
) (OMX_PTR codecBuffer
, OMX_PTR addr
[], OMX_U32 size
[]);
149 OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData
) (OMX_PTR codecBuffer
, OMX_PTR addr
, OMX_U32
*size
);
150 } EXYNOS_OMX_VIDEOENC_COMPONENT
;
156 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE
*pOMXComponent
);
157 OMX_BOOL
Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
);
158 OMX_ERRORTYPE
Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_PTR codecBuffer
, EXYNOS_OMX_DATA
*pData
);
159 OMX_ERRORTYPE
Exynos_Output_CodecBufferToData(CODEC_ENC_BUFFER
*pCodecBuffer
, EXYNOS_OMX_DATA
*pData
);
162 OMX_ERRORTYPE
Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent
);
163 OMX_ERRORTYPE
Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent
);
164 OMX_ERRORTYPE
Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent
);
165 OMX_ERRORTYPE
Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent
);
166 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent
);
167 OMX_ERRORTYPE
Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent
);
169 void Exynos_Free_CodecBuffers(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
);