Home | History | Annotate | Download | only in libcamera2
      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 
     30 class ExynosJpegEncoderForCamera {
     31 public :
     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 
     99 private:
    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