1dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang/*
2dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * Copyright Samsung Electronics Co.,LTD.
3dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * Copyright (C) 2010 The Android Open Source Project
4dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang *
5dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * Licensed under the Apache License, Version 2.0 (the "License");
6dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * you may not use this file except in compliance with the License.
7dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * You may obtain a copy of the License at
8dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang *
9dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang *     http://www.apache.org/licenses/LICENSE-2.0
10dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang *
11dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * Unless required by applicable law or agreed to in writing, software
12dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * distributed under the License is distributed on an "AS IS" BASIS,
13dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * See the License for the specific language governing permissions and
15dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang * limitations under the License.
16dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang */
17dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
18dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#ifndef EXYNOS_JPEG_ENCODER_FOR_CAMERA_H_
19dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#define EXYNOS_JPEG_ENCODER_FOR_CAMERA_H_
20dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
21dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#include "ExynosExif.h"
22dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
23dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#include "ExynosJpegApi.h"
24dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
25dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#include <sys/mman.h>
26dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#include "ion.h"
27dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
28dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#define MAX_IMAGE_PLANE_NUM (3)
29dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
30dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kangclass ExynosJpegEncoderForCamera {
31dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kangpublic :
32dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    ;
33dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    enum ERROR {
34dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_ALREADY_CREATE = -0x200,
35dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_CANNOT_CREATE_EXYNOS_JPEG_ENC_HAL,
36dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_NOT_YET_CREATED,
37dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_ALREADY_DESTROY,
38dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_INPUT_DATA_SIZE_TOO_LARGE,
39dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_OUT_BUFFER_SIZE_TOO_SMALL,
40dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_EXIFOUT_ALLOC_FAIL,
41dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_MAKE_EXIF_FAIL,
42dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_INVALID_SCALING_WIDTH_HEIGHT,
43dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_CANNOT_CREATE_SEC_THUMB,
44dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_THUMB_JPEG_SIZE_TOO_SMALL,
45dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_IMPLEMENT_NOT_YET,
46dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_MEM_ALLOC_FAIL,
47dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
48dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_CANNOT_OPEN_JPEG_DEVICE,
49dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_JPEG_DEVICE_ALREADY_CLOSED,
50dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_JPEG_DEVICE_ALREADY_DESTROY,
51dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_JPEG_DEVICE_NOT_CREATE_YET,
52dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_INVALID_COLOR_FORMAT,
53dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_INVALID_JPEG_FORMAT,
54dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_JPEG_CONFIG_POINTER_NULL,
55dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_INVALID_JPEG_CONFIG,
56dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_IN_BUFFER_CREATE_FAIL,
57dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_OUT_BUFFER_CREATE_FAIL,
58dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_EXCUTE_FAIL,
59dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_JPEG_SIZE_TOO_SMALL,
60dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_CANNOT_CHANGE_CACHE_SETTING,
61dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_SIZE_NOT_SET_YET,
62dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_BUFFR_IS_NULL,
63dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_BUFFER_TOO_SMALL,
64dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_GET_SIZE_FAIL,
65dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_REQBUF_FAIL,
66dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
67dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_MMAP_FAILED,
68dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_FAIL,
69dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ERROR_NONE = 0
70dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    };
71dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
72dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    ExynosJpegEncoderForCamera();
73dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    virtual ~ExynosJpegEncoderForCamera();
74dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
75dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    bool   flagCreate();
76dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     create(void);
77dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     destroy(void);
78dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
79dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     setSize(int w, int h);
80dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     setQuality(int quality);
81dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     setColorFormat(int colorFormat);
82dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     setJpegFormat(int jpegFormat);
83dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
84dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     updateConfig(void);
85dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
8654f4971e15c4d5b5aa2074ebbe51b7d7ec2ba303Sungjoong Kang    int     setInBuf(int *buf, char** vBuf, int *size);
8754f4971e15c4d5b5aa2074ebbe51b7d7ec2ba303Sungjoong Kang    int     setOutBuf(int buf, char* vBuf, int size);
88dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
89dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     encode(int *size, exif_attribute_t *exifInfo);
90dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
91dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     setThumbnailSize(int w, int h);
92dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     setThumbnailQuality(int quality);
93dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
94dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     makeExif(unsigned char *exifOut,
95dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                               exif_attribute_t *exifIn,
96dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                               unsigned int *size,
97dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                               bool useMainbufForThumb = false);
98dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
99dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kangprivate:
100dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    inline void writeExifIfd(unsigned char **pCur,
101dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned short tag,
102dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned short type,
103dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned int count,
104dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         uint32_t value);
105dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    inline void writeExifIfd(unsigned char **pCur,
106dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                        unsigned short tag,
107dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                        unsigned short type,
108dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                        unsigned int count,
109dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                        unsigned char *pValue);
110dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    inline void writeExifIfd(unsigned char **pCur,
111dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned short tag,
112dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned short type,
113dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned int count,
114dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         rational_t *pValue,
115dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned int *offset,
116dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned char *start);
117dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    inline void writeExifIfd(unsigned char **pCur,
118dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned short tag,
119dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned short type,
120dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned int count,
121dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned char *pValue,
122dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned int *offset,
123dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                         unsigned char *start);
124dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     scaleDownYuv422(char **srcBuf, unsigned int srcW, unsigned int srcH,
125dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                                char **dstBuf, unsigned int dstW, unsigned int dstH);
126dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     scaleDownYuv422_2p(char **srcBuf, unsigned int srcW, unsigned int srcH,
127dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang                                                        char **dstBuf, unsigned int dstW, unsigned int dstH);
128dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    // thumbnail
129dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     encodeThumbnail(unsigned int *size, bool useMain = true);
130dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
131dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    struct stJpegMem {
132dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ion_client ionClient;
133dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        ion_buffer ionBuffer[MAX_IMAGE_PLANE_NUM];
134dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        char *pcBuf[MAX_IMAGE_PLANE_NUM];
135dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang        int iSize[MAX_IMAGE_PLANE_NUM];
136dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    };
137dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
138dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     createIonClient(ion_client ionClient);
139dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     deleteIonClient(ion_client ionClient);
140dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int     allocJpegMemory(struct stJpegMem *pstMem, int iMemoryNum);
141dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    void    freeJpegMemory(struct stJpegMem *pstMem, int iMemoryNum);
142dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    void    initJpegMemory(struct stJpegMem *pstMem, int iMemoryNum);
143dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
144dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    bool     m_flagCreate;
145dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
146dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    ExynosJpegEncoder *m_jpegMain;
147dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    ExynosJpegEncoder *m_jpegThumb;
148dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
149dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    ion_client m_ionJpegClient;
150dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    struct stJpegMem m_stThumbInBuf;
151dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    struct stJpegMem m_stThumbOutBuf;
15254f4971e15c4d5b5aa2074ebbe51b7d7ec2ba303Sungjoong Kang    struct stJpegMem m_stMainInBuf;
15354f4971e15c4d5b5aa2074ebbe51b7d7ec2ba303Sungjoong Kang    struct stJpegMem m_stMainOutBuf;
154dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
155dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int m_thumbnailW;
156dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int m_thumbnailH;
157dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang    int m_thumbnailQuality;
158dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang};
159dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang
160dda1e8f815a458a28fd3939177a004ad0fac0291Sungjoong Kang#endif /* __SEC_JPG_ENC_H__ */
161