1/*
2 * Copyright Samsung Electronics Co.,LTD.
3 * Copyright (C) 2010 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_ENCODER_FOR_CAMERA_H_
19#define EXYNOS_JPEG_ENCODER_FOR_CAMERA_H_
20
21#include "ExynosExif.h"
22
23#include "ExynosJpegApi.h"
24
25#include <sys/mman.h>
26#include "ion.h"
27
28#define JPEG_THUMBNAIL_QUALITY 60
29#define EXIF_LIMIT_SIZE 64*1024
30//#define JPEG_WA_FOR_PAGEFAULT
31#define JPEG_WA_BUFFER_SIZE 64
32
33class ExynosJpegEncoderForCamera {
34public :
35    ;
36    enum ERROR {
37        ERROR_ALREADY_CREATE = -0x200,
38        ERROR_CANNOT_CREATE_EXYNOS_JPEG_ENC_HAL,
39        ERROR_NOT_YET_CREATED,
40        ERROR_ALREADY_DESTROY,
41        ERROR_INPUT_DATA_SIZE_TOO_LARGE,
42        ERROR_OUT_BUFFER_SIZE_TOO_SMALL,
43        ERROR_EXIFOUT_ALLOC_FAIL,
44        ERROR_MAKE_EXIF_FAIL,
45        ERROR_INVALID_SCALING_WIDTH_HEIGHT,
46        ERROR_CANNOT_CREATE_SEC_THUMB,
47        ERROR_THUMB_JPEG_SIZE_TOO_SMALL,
48        ERROR_IMPLEMENT_NOT_YET,
49        ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
50        ERROR_CANNOT_OPEN_JPEG_DEVICE,
51        ERROR_JPEG_DEVICE_ALREADY_CLOSED,
52        ERROR_JPEG_DEVICE_ALREADY_DESTROY,
53        ERROR_JPEG_DEVICE_NOT_CREATE_YET,
54        ERROR_INVALID_COLOR_FORMAT,
55        ERROR_INVALID_JPEG_FORMAT,
56        ERROR_JPEG_CONFIG_POINTER_NULL,
57        ERROR_INVALID_JPEG_CONFIG,
58        ERROR_IN_BUFFER_CREATE_FAIL,
59        ERROR_OUT_BUFFER_CREATE_FAIL,
60        ERROR_EXCUTE_FAIL,
61        ERROR_JPEG_SIZE_TOO_SMALL,
62        ERROR_CANNOT_CHANGE_CACHE_SETTING,
63        ERROR_SIZE_NOT_SET_YET,
64        ERROR_BUFFR_IS_NULL,
65        ERROR_BUFFER_TOO_SMALL,
66        ERROR_GET_SIZE_FAIL,
67        ERROR_REQBUF_FAIL,
68        ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
69        ERROR_MMAP_FAILED,
70        ERROR_FAIL,
71        ERROR_NONE = 0
72    };
73
74    ExynosJpegEncoderForCamera();
75    virtual ~ExynosJpegEncoderForCamera();
76
77    bool   flagCreate();
78    int     create(void);
79    int     destroy(void);
80
81    int     setSize(int w, int h);
82    int     setQuality(int quality);
83    int     setColorFormat(int colorFormat);
84    int     setJpegFormat(int jpegFormat);
85
86    int     updateConfig(void);
87
88    int     setInBuf(char **buf, int *size);
89    int     setOutBuf(char *buf, int size);
90
91    int     encode(int *size, exif_attribute_t *exifInfo);
92
93    int     setThumbnailSize(int w, int h);
94    int     setThumbnailQuality(int quality);
95
96    int     makeExif(unsigned char *exifOut,
97                               exif_attribute_t *exifIn,
98                               unsigned int *size,
99                               bool useMainbufForThumb = false);
100
101private:
102    inline void writeExifIfd(unsigned char **pCur,
103                                         unsigned short tag,
104                                         unsigned short type,
105                                         unsigned int count,
106                                         uint32_t value);
107    inline void writeExifIfd(unsigned char **pCur,
108                                        unsigned short tag,
109                                        unsigned short type,
110                                        unsigned int count,
111                                        unsigned char *pValue);
112    inline void writeExifIfd(unsigned char **pCur,
113                                         unsigned short tag,
114                                         unsigned short type,
115                                         unsigned int count,
116                                         rational_t *pValue,
117                                         unsigned int *offset,
118                                         unsigned char *start);
119    inline void writeExifIfd(unsigned char **pCur,
120                                         unsigned short tag,
121                                         unsigned short type,
122                                         unsigned int count,
123                                         unsigned char *pValue,
124                                         unsigned int *offset,
125                                         unsigned char *start);
126    int     scaleDownYuv422(char **srcBuf, unsigned int srcW, unsigned int srcH,
127                                                char **dstBuf, unsigned int dstW, unsigned int dstH);
128    int     scaleDownYuv422_2p(char **srcBuf, unsigned int srcW, unsigned int srcH,
129                                                        char **dstBuf, unsigned int dstW, unsigned int dstH);
130    // thumbnail
131    int     encodeThumbnail(unsigned int *size, bool useMain = true);
132
133    int     allocJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size);
134    void    freeJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size);
135
136    bool     m_flagCreate;
137
138    ExynosJpegEncoder *m_jpegMain;
139    ExynosJpegEncoder *m_jpegThumb;
140
141    char *m_pThumbInputBuffer;
142    char *m_pThumbOutputBuffer;
143#ifdef JPEG_WA_FOR_PAGEFAULT
144    char *m_pExtInBuf;
145    char *m_pJpegInputBuffer;
146    int m_iInBufSize;
147#endif // JPEG_WA_FOR_PAGEFAULT
148    ion_client m_ionJpegClient;
149    ion_buffer m_ionThumbInBuffer, m_ionThumbOutBuffer;
150#ifdef JPEG_WA_FOR_PAGEFAULT
151    ion_buffer m_ionJpegInBuffer;
152#endif // JPEG_WA_FOR_PAGEFAULT
153
154    int m_thumbnailW;
155    int m_thumbnailH;
156    int m_thumbnailQuality;
157};
158
159#endif /* __SEC_JPG_ENC_H__ */
160