ExynosJpegEncoderForCamera.h revision 54f4971e15c4d5b5aa2074ebbe51b7d7ec2ba303
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 MAX_IMAGE_PLANE_NUM (3)
29
30class ExynosJpegEncoderForCamera {
31public :
32    ;
33    enum ERROR {
34        ERROR_ALREADY_CREATE = -0x200,
35        ERROR_CANNOT_CREATE_EXYNOS_JPEG_ENC_HAL,
36        ERROR_NOT_YET_CREATED,
37        ERROR_ALREADY_DESTROY,
38        ERROR_INPUT_DATA_SIZE_TOO_LARGE,
39        ERROR_OUT_BUFFER_SIZE_TOO_SMALL,
40        ERROR_EXIFOUT_ALLOC_FAIL,
41        ERROR_MAKE_EXIF_FAIL,
42        ERROR_INVALID_SCALING_WIDTH_HEIGHT,
43        ERROR_CANNOT_CREATE_SEC_THUMB,
44        ERROR_THUMB_JPEG_SIZE_TOO_SMALL,
45        ERROR_IMPLEMENT_NOT_YET,
46        ERROR_MEM_ALLOC_FAIL,
47        ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
48        ERROR_CANNOT_OPEN_JPEG_DEVICE,
49        ERROR_JPEG_DEVICE_ALREADY_CLOSED,
50        ERROR_JPEG_DEVICE_ALREADY_DESTROY,
51        ERROR_JPEG_DEVICE_NOT_CREATE_YET,
52        ERROR_INVALID_COLOR_FORMAT,
53        ERROR_INVALID_JPEG_FORMAT,
54        ERROR_JPEG_CONFIG_POINTER_NULL,
55        ERROR_INVALID_JPEG_CONFIG,
56        ERROR_IN_BUFFER_CREATE_FAIL,
57        ERROR_OUT_BUFFER_CREATE_FAIL,
58        ERROR_EXCUTE_FAIL,
59        ERROR_JPEG_SIZE_TOO_SMALL,
60        ERROR_CANNOT_CHANGE_CACHE_SETTING,
61        ERROR_SIZE_NOT_SET_YET,
62        ERROR_BUFFR_IS_NULL,
63        ERROR_BUFFER_TOO_SMALL,
64        ERROR_GET_SIZE_FAIL,
65        ERROR_REQBUF_FAIL,
66        ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
67        ERROR_MMAP_FAILED,
68        ERROR_FAIL,
69        ERROR_NONE = 0
70    };
71
72    ExynosJpegEncoderForCamera();
73    virtual ~ExynosJpegEncoderForCamera();
74
75    bool   flagCreate();
76    int     create(void);
77    int     destroy(void);
78
79    int     setSize(int w, int h);
80    int     setQuality(int quality);
81    int     setColorFormat(int colorFormat);
82    int     setJpegFormat(int jpegFormat);
83
84    int     updateConfig(void);
85
86    int     setInBuf(int *buf, char** vBuf, int *size);
87    int     setOutBuf(int buf, char* vBuf, int size);
88
89    int     encode(int *size, exif_attribute_t *exifInfo);
90
91    int     setThumbnailSize(int w, int h);
92    int     setThumbnailQuality(int quality);
93
94    int     makeExif(unsigned char *exifOut,
95                               exif_attribute_t *exifIn,
96                               unsigned int *size,
97                               bool useMainbufForThumb = false);
98
99private:
100    inline void writeExifIfd(unsigned char **pCur,
101                                         unsigned short tag,
102                                         unsigned short type,
103                                         unsigned int count,
104                                         uint32_t value);
105    inline void writeExifIfd(unsigned char **pCur,
106                                        unsigned short tag,
107                                        unsigned short type,
108                                        unsigned int count,
109                                        unsigned char *pValue);
110    inline void writeExifIfd(unsigned char **pCur,
111                                         unsigned short tag,
112                                         unsigned short type,
113                                         unsigned int count,
114                                         rational_t *pValue,
115                                         unsigned int *offset,
116                                         unsigned char *start);
117    inline void writeExifIfd(unsigned char **pCur,
118                                         unsigned short tag,
119                                         unsigned short type,
120                                         unsigned int count,
121                                         unsigned char *pValue,
122                                         unsigned int *offset,
123                                         unsigned char *start);
124    int     scaleDownYuv422(char **srcBuf, unsigned int srcW, unsigned int srcH,
125                                                char **dstBuf, unsigned int dstW, unsigned int dstH);
126    int     scaleDownYuv422_2p(char **srcBuf, unsigned int srcW, unsigned int srcH,
127                                                        char **dstBuf, unsigned int dstW, unsigned int dstH);
128    // thumbnail
129    int     encodeThumbnail(unsigned int *size, bool useMain = true);
130
131    struct stJpegMem {
132        ion_client ionClient;
133        ion_buffer ionBuffer[MAX_IMAGE_PLANE_NUM];
134        char *pcBuf[MAX_IMAGE_PLANE_NUM];
135        int iSize[MAX_IMAGE_PLANE_NUM];
136    };
137
138    int     createIonClient(ion_client ionClient);
139    int     deleteIonClient(ion_client ionClient);
140    int     allocJpegMemory(struct stJpegMem *pstMem, int iMemoryNum);
141    void    freeJpegMemory(struct stJpegMem *pstMem, int iMemoryNum);
142    void    initJpegMemory(struct stJpegMem *pstMem, int iMemoryNum);
143
144    bool     m_flagCreate;
145
146    ExynosJpegEncoder *m_jpegMain;
147    ExynosJpegEncoder *m_jpegThumb;
148
149    ion_client m_ionJpegClient;
150    struct stJpegMem m_stThumbInBuf;
151    struct stJpegMem m_stThumbOutBuf;
152    struct stJpegMem m_stMainInBuf;
153    struct stJpegMem m_stMainOutBuf;
154
155    int m_thumbnailW;
156    int m_thumbnailH;
157    int m_thumbnailQuality;
158};
159
160#endif /* __SEC_JPG_ENC_H__ */
161