1/*
2 * Copyright Samsung Electronics Co.,LTD.
3 * Copyright (C) 2011 The Android Open Source Project
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_JPEG_BASE_H__
19#define __EXYNOS_JPEG_BASE_H__
20
21#include <linux/videodev2.h>
22#include "videodev2_exynos_media.h"
23
24#define JPEG_CACHE_OFF (0)
25#define JPEG_CACHE_ON (1)
26#define KERNEL_33_JPEG_API (1)
27
28class ExynosJpegBase {
29public:
30    ;
31    #define JPEG_MAX_PLANE_CNT          (3)
32    ExynosJpegBase();
33    virtual ~ExynosJpegBase();
34
35    enum ERROR_JPEG_HAL {
36        ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
37        ERROR_INVALID_JPEG_MODE,
38        ERROR_CANNOT_OPEN_JPEG_DEVICE,
39        ERROR_JPEG_DEVICE_ALREADY_CLOSED,
40        ERROR_JPEG_DEVICE_ALREADY_DESTROY,
41        ERROR_JPEG_DEVICE_NOT_CREATE_YET,
42        ERROR_INVALID_COLOR_FORMAT,
43        ERROR_INVALID_JPEG_FORMAT,
44        ERROR_INVALID_IMAGE_SIZE,
45        ERROR_JPEG_CONFIG_POINTER_NULL,
46        ERROR_INVALID_JPEG_CONFIG,
47        ERROR_IN_BUFFER_CREATE_FAIL,
48        ERROR_OUT_BUFFER_CREATE_FAIL,
49        ERROR_EXCUTE_FAIL,
50        ERROR_JPEG_SIZE_TOO_SMALL,
51        ERROR_CANNOT_CHANGE_CACHE_SETTING,
52        ERROR_SIZE_NOT_SET_YET,
53        ERROR_BUFFR_IS_NULL,
54        ERROR_BUFFER_TOO_SMALL,
55        ERROR_GET_SIZE_FAIL,
56        ERROR_BUF_NOT_SET_YET,
57        ERROR_REQBUF_FAIL,
58        ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
59        ERROR_MMAP_FAILED,
60        ERROR_FAIL,
61        ERROR_NONE = 0
62    };
63
64    enum MODE {
65        MODE_ENCODE = 0,
66        MODE_DECODE
67    };
68
69    struct BUFFER{
70        int     numOfPlanes;
71        int     addr[JPEG_MAX_PLANE_CNT];
72        int     size[JPEG_MAX_PLANE_CNT];
73    };
74
75    struct BUF_INFO{
76        int                 numOfPlanes;
77        enum v4l2_memory    memory;
78        enum v4l2_buf_type  buf_type;
79        int                 reserved[4];
80    };
81
82    struct PIX_FMT{
83        int in_fmt;
84        int out_fmt;
85        int reserved[4];
86    };
87
88    struct CONFIG{
89        int               mode;
90        int               enc_qual;
91
92        int               width;
93        int               height;
94        int               scaled_width;
95        int               scaled_height;
96
97        int               numOfPlanes;
98
99        int               sizeJpeg;
100
101        union {
102            PIX_FMT enc_fmt;
103            PIX_FMT dec_fmt;
104        } pix;
105
106        int              reserved[8];
107    };
108
109    int setSize(int iW, int iH);
110    int setCache(int iValue);
111    void *getJpegConfig(void);
112
113protected:
114    // variables
115    bool t_bFlagCreate;
116    bool t_bFlagCreateInBuf;
117    bool t_bFlagCreateOutBuf;
118    bool t_bFlagExcute;
119
120    int t_iPlaneNum;
121
122    int t_iJpegFd;
123    struct CONFIG t_stJpegConfig;
124    struct BUFFER t_stJpegInbuf;
125    struct BUFFER t_stJpegOutbuf;
126
127    //functions
128    int t_v4l2Querycap(int iFd);
129    int t_v4l2SetJpegcomp(int iFd, int iQuality);
130    int t_v4l2SetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig);
131    int t_v4l2GetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig);
132    int t_v4l2Reqbufs(int iFd, int iBufCount, struct BUF_INFO *pstBufInfo);
133    int t_v4l2Qbuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf);
134    int t_v4l2Dqbuf(int iFd, enum v4l2_buf_type eType, enum v4l2_memory eMemory, int iNumPlanes);
135    int t_v4l2StreamOn(int iFd, enum v4l2_buf_type eType);
136    int t_v4l2StreamOff(int iFd, enum v4l2_buf_type eType);
137    int t_v4l2SetCtrl(int iFd, int iCid, int iValue);
138    int t_v4l2GetCtrl(int iFd, int iCid);
139
140    int create(enum MODE eMode);
141    int destroy(int iInBufs, int iOutBufs);
142    int setJpegConfig(enum MODE eMode, void *pConfig);
143    int setColorFormat(enum MODE eMode, int iV4l2ColorFormat);
144    int setJpegFormat(enum MODE eMode, int iV4l2JpegFormat);
145    int setColorBufSize(enum MODE eMode, int *piBufSize, int iSize);
146    int setColorBufSize(int iFormat, int *piBufSize, int iSize, int width, int height);
147    int getBuf(bool bCreateBuf, struct BUFFER *pstBuf, int *piBuf, int *iBufSize, int iSize, int iPlaneNum);
148    int setBuf(struct BUFFER *pstBuf, int *piBuf, int *iSize, int iPlaneNum);
149    int updateConfig(enum MODE eMode, int iInBufs, int iOutBufs, int iInBufPlanes, int iOutBufPlanes);
150    int execute(int iInBufPlanes, int iOutBufPlanes);
151};
152
153//! ExynosJpegEncoder class
154/*!
155 * \ingroup Exynos
156 */
157class ExynosJpegEncoder : public ExynosJpegBase {
158public:
159    ;
160    ExynosJpegEncoder();
161    virtual ~ExynosJpegEncoder();
162
163    enum QUALITY {
164        QUALITY_LEVEL_1 = 0,    /* high */
165        QUALITY_LEVEL_2,
166        QUALITY_LEVEL_3,
167        QUALITY_LEVEL_4,        /* low */
168    };
169
170    int     create(void);
171    int     destroy(void);
172
173    int     setJpegConfig(void* pConfig);
174
175    int     getInBuf(int *piBuf, int *piInputSize, int iSize);
176    int     getOutBuf(int *piBuf, int *piOutputSize);
177
178    int     setInBuf(int *piBuf, int *iSize);
179    int     setOutBuf(int iBuf, int iSize);
180
181    int     getSize(int *piWidth, int *piHeight);
182    int     getColorFormat(void);
183    int     setColorFormat(int iV4l2ColorFormat);
184    int     setJpegFormat(int iV4l2JpegFormat);
185    int     setColorBufSize(int *piBufSize, int iSize);
186    int     updateConfig(void);
187
188    int     setQuality(int iQuality);
189    int     getJpegSize(void);
190
191    int     encode(void);
192};
193
194//! ExynosJpegDecoder class
195/*!
196 * \ingroup Exynos
197 */
198class ExynosJpegDecoder : public ExynosJpegBase {
199public:
200    ;
201    ExynosJpegDecoder();
202    virtual ~ExynosJpegDecoder();
203
204    int     create(void);
205    int     destroy(void);
206
207    int     setJpegConfig(void* pConfig);
208
209    int     getInBuf(int *piBuf, int *piInputSize);
210    int     getOutBuf(int *picBuf, int *piOutputSize, int iSize);
211
212    int     setInBuf(int iBuf, int iSize);
213    int     setOutBuf(int *piBuf, int *iSize);
214
215    int     getSize(int *piWidth, int *piHeight);
216    int     setColorFormat(int iV4l2ColorFormat);
217    int     setJpegFormat(int iV4l2JpegFormat);
218    int     updateConfig(void);
219
220    int setScaledSize(int iW, int iH);
221    int setJpegSize(int iJpegSize);
222
223    int  decode(void);
224#ifdef WA_BLOCKING_ARTIFACT
225private:
226    void reduceBlockingArtifact(unsigned char *addr, int iColor, int width, int height);
227#endif
228};
229
230#endif /* __EXYNOS_JPEG_BASE_H__ */
231