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#ifndef _EXYNOS_VIDEO_API_H_
19#define _EXYNOS_VIDEO_API_H_
20
21#include "exynos_v4l2.h"
22
23/* Fixed */
24#define VIDEO_BUFFER_MAX_PLANES 3
25#define VIDEO_BUFFER_MAX_NUM    32
26
27typedef enum _ExynosVideoBoolType {
28    VIDEO_FALSE = 0,
29    VIDEO_TRUE  = 1,
30} ExynosVideoBoolType;
31
32typedef enum _ExynosVideoErrorType {
33    VIDEO_ERROR_NONE      =  1,
34    VIDEO_ERROR_BADPARAM  = -1,
35    VIDEO_ERROR_OPENFAIL  = -2,
36    VIDEO_ERROR_NOMEM     = -3,
37    VIDEO_ERROR_APIFAIL   = -4,
38    VIDEO_ERROR_MAPFAIL   = -5,
39    VIDEO_ERROR_NOBUFFERS = -6,
40    VIDEO_ERROR_POLL      = -7,
41    VIDEO_ERROR_WRONGBUFFERSIZE = -8,
42} ExynosVideoErrorType;
43
44typedef enum _ExynosVideoCodingType {
45    VIDEO_CODING_UNKNOWN = 0,
46    VIDEO_CODING_MPEG2,
47    VIDEO_CODING_H263,
48    VIDEO_CODING_MPEG4,
49    VIDEO_CODING_VC1,
50    VIDEO_CODING_VC1_RCV,
51    VIDEO_CODING_AVC,
52    VIDEO_CODING_MVC,
53    VIDEO_CODING_VP8,
54    VIDEO_CODING_RESERVED,
55} ExynosVideoCodingType;
56
57typedef enum _ExynosVideoColorFormatType {
58    VIDEO_COLORFORMAT_UNKNOWN = 0,
59    VIDEO_COLORFORMAT_NV12,
60    VIDEO_COLORFORMAT_NV21,
61    VIDEO_COLORFORMAT_NV12_TILED,
62    VIDEO_COLORFORMAT_RESERVED,
63} ExynosVideoColorFormatType;
64
65typedef enum _ExynosVideoFrameType {
66    VIDEO_FRAME_NOT_CODED = 0,
67    VIDEO_FRAME_I,
68    VIDEO_FRAME_P,
69    VIDEO_FRAME_B,
70    VIDEO_FRAME_SKIPPED,
71    VIDEO_FRAME_OTHERS,
72} ExynosVideoFrameType;
73
74typedef enum _ExynosVideoFrameStatusType {
75    VIDEO_FRAME_STATUS_UNKNOWN = 0,
76    VIDEO_FRAME_STATUS_DECODING_ONLY,
77    VIDEO_FRAME_STATUS_DISPLAY_DECODING,
78    VIDEO_FRAME_STATUS_DISPLAY_ONLY,
79    VIDEO_FRAME_STATUS_DECODING_FINISHED,
80    VIDEO_FRAME_STATUS_CHANGE_RESOL,
81} ExynosVideoFrameStatusType;
82
83typedef enum _ExynosVideoFrameSkipMode {
84    VIDEO_FRAME_SKIP_DISABLED = 0,
85    VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT,
86    VIDEO_FRAME_SKIP_MODE_BUF_LIMIT,
87} ExynosVideoFrameSkipMode;
88
89typedef struct _ExynosVideoRect {
90    unsigned int nTop;
91    unsigned int nLeft;
92    unsigned int nWidth;
93    unsigned int nHeight;
94} ExynosVideoRect;
95
96typedef struct _ExynosVideoGeometry {
97    unsigned int               nFrameWidth;
98    unsigned int               nFrameHeight;
99    unsigned int               nSizeImage;
100    ExynosVideoRect            cropRect;
101    ExynosVideoCodingType      eCompressionFormat;
102    ExynosVideoColorFormatType eColorFormat;
103} ExynosVideoGeometry;
104
105typedef struct _ExynosVideoPlane {
106    void          *addr;
107    unsigned int   allocSize;
108    unsigned int   dataSize;
109    unsigned long  offset;
110    int            fd;
111} ExynosVideoPlane;
112
113typedef struct _ReleaseDPB {
114    int fd;
115    int fd1;
116    int fd2;
117} ReleaseDPB;
118
119typedef struct _PrivateDataShareBuffer {
120    int index;
121    ReleaseDPB dpbFD[VIDEO_BUFFER_MAX_NUM];
122}PrivateDataShareBuffer;
123
124typedef struct _ExynosVideoBuffer {
125    ExynosVideoPlane            planes[VIDEO_BUFFER_MAX_PLANES];
126    ExynosVideoGeometry        *pGeometry;
127    ExynosVideoFrameStatusType  displayStatus;
128    ExynosVideoFrameType        frameType;
129    ExynosVideoBoolType         bQueued;
130    ExynosVideoBoolType         bSlotUsed;
131    ExynosVideoBoolType         bRegistered;
132    void                       *pPrivate;
133    PrivateDataShareBuffer      PDSB;
134    int                         nIndexUseCnt;
135} ExynosVideoBuffer;
136
137typedef struct _ExynosVideoFramePacking{
138    int           available;
139    unsigned int  arrangement_id;
140    int           arrangement_cancel_flag;
141    unsigned char arrangement_type;
142    int           quincunx_sampling_flag;
143    unsigned char content_interpretation_type;
144    int           spatial_flipping_flag;
145    int           frame0_flipped_flag;
146    int           field_views_flag;
147    int           current_frame_is_frame0_flag;
148    unsigned char frame0_grid_pos_x;
149    unsigned char frame0_grid_pos_y;
150    unsigned char frame1_grid_pos_x;
151    unsigned char frame1_grid_pos_y;
152} ExynosVideoFramePacking;
153
154typedef struct _ExynosVideoEncInitParam{
155    /* Initial parameters */
156    ExynosVideoFrameSkipMode FrameSkip; /* [IN] frame skip mode */
157    int FMO;
158    int ASO;
159}ExynosVideoEncInitParam;
160
161typedef struct _ExynosVideoEncCommonParam{
162    /* common parameters */
163    int SourceWidth;                    /* [IN] width of video to be encoded */
164    int SourceHeight;                   /* [IN] height of video to be encoded */
165    int IDRPeriod;                      /* [IN] GOP number(interval of I-frame) */
166    int SliceMode;                      /* [IN] Multi slice mode */
167    int RandomIntraMBRefresh;           /* [IN] cyclic intra refresh */
168    int EnableFRMRateControl;           /* [IN] frame based rate control enable */
169    int EnableMBRateControl;            /* [IN] Enable macroblock-level rate control */
170    int Bitrate;                        /* [IN] rate control parameter(bit rate) */
171    int FrameQp;                        /* [IN] The quantization parameter of the frame */
172    int FrameQp_P;                      /* [IN] The quantization parameter of the P frame */
173    int QSCodeMax;                      /* [IN] Maximum Quantization value */
174    int QSCodeMin;                      /* [IN] Minimum Quantization value */
175    int CBRPeriodRf;                    /* [IN] Reaction coefficient parameter for rate control */
176    int PadControlOn;                   /* [IN] Enable padding control */
177    int LumaPadVal;                     /* [IN] Luma pel value used to fill padding area */
178    int CbPadVal;                       /* [IN] CB pel value used to fill padding area */
179    int CrPadVal;                       /* [IN] CR pel value used to fill padding area */
180    int FrameMap;                       /* [IN] Encoding input mode(tile mode or linear mode) */
181}ExynosVideoEncCommonParam;
182
183typedef struct _ExynosVideoEncH264Param{
184    /* H.264 specific parameters */
185    int ProfileIDC;                     /* [IN] profile */
186    int LevelIDC;                       /* [IN] level */
187    int FrameQp_B;                      /* [IN] The quantization parameter of the B frame */
188    int FrameRate;                      /* [IN] rate control parameter(frame rate) */
189    int SliceArgument;                  /* [IN] MB number or byte number */
190    int NumberBFrames;                  /* [IN] The number of consecutive B frame inserted */
191    int NumberReferenceFrames;          /* [IN] The number of reference pictures used */
192    int NumberRefForPframes;            /* [IN] The number of reference pictures used for encoding P pictures */
193    int LoopFilterDisable;              /* [IN] disable the loop filter */
194    int LoopFilterAlphaC0Offset;        /* [IN] Alpha & C0 offset for H.264 loop filter */
195    int LoopFilterBetaOffset;           /* [IN] Beta offset for H.264 loop filter */
196    int SymbolMode;                     /* [IN] The mode of entropy coding(CABAC, CAVLC) */
197    int PictureInterlace;               /* [IN] Enables the interlace mode */
198    int Transform8x8Mode;               /* [IN] Allow 8x8 transform(This is allowed only for high profile) */
199    int DarkDisable;                    /* [IN] Disable adaptive rate control on dark region */
200    int SmoothDisable;                  /* [IN] Disable adaptive rate control on smooth region */
201    int StaticDisable;                  /* [IN] Disable adaptive rate control on static region */
202    int ActivityDisable;                /* [IN] Disable adaptive rate control on high activity region */
203} ExynosVideoEncH264Param;
204
205typedef struct _ExynosVideoEncMpeg4Param {
206    /* MPEG4 specific parameters */
207    int ProfileIDC;                     /* [IN] profile */
208    int LevelIDC;                       /* [IN] level */
209    int FrameQp_B;                      /* [IN] The quantization parameter of the B frame */
210    int TimeIncreamentRes;              /* [IN] frame rate */
211    int VopTimeIncreament;              /* [IN] frame rate */
212    int SliceArgument;                  /* [IN] MB number or byte number */
213    int NumberBFrames;                  /* [IN] The number of consecutive B frame inserted */
214    int DisableQpelME;                  /* [IN] disable quarter-pixel motion estimation */
215} ExynosVideoEncMpeg4Param;
216
217typedef struct _ExynosVideoEncH263Param {
218    /* H.263 specific parameters */
219    int FrameRate;                      /* [IN] rate control parameter(frame rate) */
220} ExynosVideoEncH263Param;
221
222typedef union _ExynosVideoEncCodecParam {
223    ExynosVideoEncH264Param     h264;
224    ExynosVideoEncMpeg4Param    mpeg4;
225    ExynosVideoEncH263Param     h263;
226} ExynosVideoEncCodecParam;
227
228typedef struct _ExynosVideoEncParam {
229    ExynosVideoCodingType       eCompressionFormat;
230    ExynosVideoEncInitParam     initParam;
231    ExynosVideoEncCommonParam   commonParam;
232    ExynosVideoEncCodecParam    codecParam;
233} ExynosVideoEncParam;
234
235typedef struct _ExynosVideoDecOps {
236    unsigned int            nSize;
237
238    void *                (*Init)(int nMemoryType);
239    ExynosVideoErrorType  (*Finalize)(void *pHandle);
240
241    /* Add new ops at the end of structure, no order change */
242    ExynosVideoErrorType  (*Set_FrameTag)(void *pHandle, int frameTag);
243    int                   (*Get_FrameTag)(void *pHandle);
244    int                   (*Get_ActualBufferCount)(void *pHandle);
245    ExynosVideoErrorType  (*Set_DisplayDelay)(void *pHandle, int delay);
246    ExynosVideoErrorType  (*Set_IFrameDecoding)(void *pHandle);
247    ExynosVideoErrorType  (*Enable_PackedPB)(void *pHandle);
248    ExynosVideoErrorType  (*Enable_LoopFilter)(void *pHandle);
249    ExynosVideoErrorType  (*Enable_SliceMode)(void *pHandle);
250    ExynosVideoErrorType  (*Enable_SEIParsing)(void *pHandle);
251    ExynosVideoErrorType  (*Get_FramePackingInfo)(void *pHandle, ExynosVideoFramePacking *pFramepacking);
252} ExynosVideoDecOps;
253
254typedef struct _ExynosVideoEncOps {
255    unsigned int           nSize;
256    void *               (*Init)(int nMemoryType);
257    ExynosVideoErrorType (*Finalize)(void *pHandle);
258
259    /* Add new ops at the end of structure, no order change */
260    ExynosVideoErrorType (*Set_EncParam)(void *pHandle, ExynosVideoEncParam*encParam);
261    ExynosVideoErrorType (*Set_FrameTag)(void *pHandle, int frameTag);
262    int (*Get_FrameTag)(void *pHandle);
263    ExynosVideoErrorType (*Set_FrameType)(void *pHandle, int frameType);
264    ExynosVideoErrorType (*Set_FrameRate)(void *pHandle, int frameRate);
265    ExynosVideoErrorType (*Set_BitRate)(void *pHandle, int bitRate);
266    ExynosVideoErrorType (*Set_FrameSkip)(void *pHandle, int frameSkip);
267    ExynosVideoErrorType (*Set_IDRPeriod)(void *pHandle, int period);
268    ExynosVideoErrorType (*Enable_PrependSpsPpsToIdr)(void *pHandle);
269} ExynosVideoEncOps;
270
271typedef struct _ExynosVideoDecBufferOps {
272    unsigned int            nSize;
273
274    /* Add new ops at the end of structure, no order change */
275    ExynosVideoErrorType  (*Enable_Cacheable)(void *pHandle);
276    ExynosVideoErrorType  (*Set_Shareable)(void *pHandle);
277    ExynosVideoErrorType  (*Get_Buffer)(void *pHandle, int nIndex, ExynosVideoBuffer **pBuffer);
278    ExynosVideoErrorType  (*Set_Geometry)(void *pHandle, ExynosVideoGeometry *bufferConf);
279    ExynosVideoErrorType  (*Get_Geometry)(void *pHandle, ExynosVideoGeometry *bufferConf);
280    ExynosVideoErrorType  (*Setup)(void *pHandle, unsigned int nBufferCount);
281    ExynosVideoErrorType  (*Run)(void *pHandle);
282    ExynosVideoErrorType  (*Stop)(void *pHandle);
283    ExynosVideoErrorType  (*Enqueue)(void *pHandle, unsigned char *pBuffer[], unsigned int dataSize[], int nPlanes, void *pPrivate);
284    ExynosVideoErrorType  (*Enqueue_All)(void *pHandle);
285    ExynosVideoBuffer *   (*Dequeue)(void *pHandle);
286    ExynosVideoErrorType  (*Register)(void *pHandle, ExynosVideoPlane *planes, int nPlanes);
287    ExynosVideoErrorType  (*Clear_RegisteredBuffer)(void *pHandle);
288    ExynosVideoErrorType  (*Clear_Queue)(void *pHandle);
289    ExynosVideoErrorType  (*Cleanup_Buffer)(void *pHandle);
290    ExynosVideoErrorType  (*ExtensionEnqueue)(void *pHandle, unsigned char *pBuffer[], unsigned int *pFd[], unsigned int allocLen[], unsigned int dataSize[], int nPlanes, void *pPrivate);
291    ExynosVideoErrorType  (*ExtensionDequeue)(void *pHandle, ExynosVideoBuffer *pVideoBuffer);
292    ExynosVideoErrorType  (*Enable_DynamicDPB)(void *pHandle);
293} ExynosVideoDecBufferOps;
294
295typedef struct _ExynosVideoEncBufferOps {
296    unsigned int            nSize;
297
298    /* Add new ops at the end of structure, no order change */
299    ExynosVideoErrorType  (*Enable_Cacheable)(void *pHandle);
300    ExynosVideoErrorType  (*Set_Shareable)(void *pHandle);
301    ExynosVideoErrorType  (*Get_Buffer)(void *pHandle, int nIndex, ExynosVideoBuffer **pBuffer);
302    ExynosVideoErrorType  (*Set_Geometry)(void *pHandle, ExynosVideoGeometry *bufferConf);
303    ExynosVideoErrorType  (*Get_Geometry)(void *pHandle, ExynosVideoGeometry *bufferConf);
304    ExynosVideoErrorType  (*Setup)(void *pHandle, unsigned int nBufferCount);
305    ExynosVideoErrorType  (*Run)(void *pHandle);
306    ExynosVideoErrorType  (*Stop)(void *pHandle);
307    ExynosVideoErrorType  (*Enqueue)(void *pHandle, unsigned char *pBuffer[], unsigned int dataSize[], int nPlanes, void *pPrivate);
308    ExynosVideoErrorType  (*Enqueue_All)(void *pHandle);
309    ExynosVideoBuffer *   (*Dequeue)(void *pHandle);
310    ExynosVideoErrorType  (*Register)(void *pHandle, ExynosVideoPlane *planes, int nPlanes);
311    ExynosVideoErrorType  (*Clear_RegisteredBuffer)(void *pHandle);
312    ExynosVideoErrorType  (*Clear_Queue)(void *pHandle);
313    ExynosVideoErrorType  (*ExtensionEnqueue)(void *pHandle, unsigned char *pBuffer[], unsigned int *pFd[], unsigned int allocLen[], unsigned int dataSize[], int nPlanes, void *pPrivate);
314    ExynosVideoErrorType  (*ExtensionDequeue)(void *pHandle, ExynosVideoBuffer *pVideoBuffer);
315} ExynosVideoEncBufferOps;
316
317int Exynos_Video_Register_Decoder(
318    ExynosVideoDecOps       *pDecOps,
319    ExynosVideoDecBufferOps *pInbufOps,
320    ExynosVideoDecBufferOps *pOutbufOps);
321
322int Exynos_Video_Register_Encoder(
323    ExynosVideoEncOps       *pEncOps,
324    ExynosVideoEncBufferOps *pInbufOps,
325    ExynosVideoEncBufferOps *pOutbufOps);
326
327#endif /* _EXYNOS_VIDEO_API_H_ */
328