/*
* Copyright Samsung Electronics Co.,LTD.
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef EXYNOS_JPEG_ENCODER_FOR_CAMERA_H_
#define EXYNOS_JPEG_ENCODER_FOR_CAMERA_H_
#include "ExynosExif.h"
#include "ExynosJpegApi.h"
#include <sys/mman.h>
#include "ion.h"
#define JPEG_THUMBNAIL_QUALITY 60
#define EXIF_LIMIT_SIZE 64*1024
//#define JPEG_WA_FOR_PAGEFAULT
#define JPEG_WA_BUFFER_SIZE 64
class ExynosJpegEncoderForCamera {
public :
;
enum ERROR {
ERROR_ALREADY_CREATE = -0x200,
ERROR_CANNOT_CREATE_EXYNOS_JPEG_ENC_HAL,
ERROR_NOT_YET_CREATED,
ERROR_ALREADY_DESTROY,
ERROR_INPUT_DATA_SIZE_TOO_LARGE,
ERROR_OUT_BUFFER_SIZE_TOO_SMALL,
ERROR_EXIFOUT_ALLOC_FAIL,
ERROR_MAKE_EXIF_FAIL,
ERROR_INVALID_SCALING_WIDTH_HEIGHT,
ERROR_CANNOT_CREATE_SEC_THUMB,
ERROR_THUMB_JPEG_SIZE_TOO_SMALL,
ERROR_IMPLEMENT_NOT_YET,
ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
ERROR_CANNOT_OPEN_JPEG_DEVICE,
ERROR_JPEG_DEVICE_ALREADY_CLOSED,
ERROR_JPEG_DEVICE_ALREADY_DESTROY,
ERROR_JPEG_DEVICE_NOT_CREATE_YET,
ERROR_INVALID_COLOR_FORMAT,
ERROR_INVALID_JPEG_FORMAT,
ERROR_JPEG_CONFIG_POINTER_NULL,
ERROR_INVALID_JPEG_CONFIG,
ERROR_IN_BUFFER_CREATE_FAIL,
ERROR_OUT_BUFFER_CREATE_FAIL,
ERROR_EXCUTE_FAIL,
ERROR_JPEG_SIZE_TOO_SMALL,
ERROR_CANNOT_CHANGE_CACHE_SETTING,
ERROR_SIZE_NOT_SET_YET,
ERROR_BUFFR_IS_NULL,
ERROR_BUFFER_TOO_SMALL,
ERROR_GET_SIZE_FAIL,
ERROR_REQBUF_FAIL,
ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
ERROR_MMAP_FAILED,
ERROR_FAIL,
ERROR_NONE = 0
};
ExynosJpegEncoderForCamera();
virtual ~ExynosJpegEncoderForCamera();
bool flagCreate();
int create(void);
int destroy(void);
int setSize(int w, int h);
int setQuality(int quality);
int setColorFormat(int colorFormat);
int setJpegFormat(int jpegFormat);
int updateConfig(void);
int setInBuf(char **buf, int *size);
int setOutBuf(char *buf, int size);
int encode(int *size, exif_attribute_t *exifInfo);
int setThumbnailSize(int w, int h);
int setThumbnailQuality(int quality);
int makeExif(unsigned char *exifOut,
exif_attribute_t *exifIn,
unsigned int *size,
bool useMainbufForThumb = false);
private:
inline void writeExifIfd(unsigned char **pCur,
unsigned short tag,
unsigned short type,
unsigned int count,
uint32_t value);
inline void writeExifIfd(unsigned char **pCur,
unsigned short tag,
unsigned short type,
unsigned int count,
unsigned char *pValue);
inline void writeExifIfd(unsigned char **pCur,
unsigned short tag,
unsigned short type,
unsigned int count,
rational_t *pValue,
unsigned int *offset,
unsigned char *start);
inline void writeExifIfd(unsigned char **pCur,
unsigned short tag,
unsigned short type,
unsigned int count,
unsigned char *pValue,
unsigned int *offset,
unsigned char *start);
int scaleDownYuv422(char **srcBuf, unsigned int srcW, unsigned int srcH,
char **dstBuf, unsigned int dstW, unsigned int dstH);
int scaleDownYuv422_2p(char **srcBuf, unsigned int srcW, unsigned int srcH,
char **dstBuf, unsigned int dstW, unsigned int dstH);
// thumbnail
int encodeThumbnail(unsigned int *size, bool useMain = true);
int allocJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size);
void freeJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size);
bool m_flagCreate;
ExynosJpegEncoder *m_jpegMain;
ExynosJpegEncoder *m_jpegThumb;
char *m_pThumbInputBuffer;
char *m_pThumbOutputBuffer;
#ifdef JPEG_WA_FOR_PAGEFAULT
char *m_pExtInBuf;
char *m_pJpegInputBuffer;
int m_iInBufSize;
#endif // JPEG_WA_FOR_PAGEFAULT
ion_client m_ionJpegClient;
ion_buffer m_ionThumbInBuffer, m_ionThumbOutBuffer;
#ifdef JPEG_WA_FOR_PAGEFAULT
ion_buffer m_ionJpegInBuffer;
#endif // JPEG_WA_FOR_PAGEFAULT
int m_thumbnailW;
int m_thumbnailH;
int m_thumbnailQuality;
};
#endif /* __SEC_JPG_ENC_H__ */