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