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 * JPEG DRIVER MODULE (JpegEncoder.h) 18 * Author : ge.lee -- initial version 19 * Date : 03 June 2010 20 * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL 21 */ 22 #ifndef __JPG_API_H__ 23 #define __JPG_API_H__ 24 25 #include <stdint.h> 26 #include <sys/ioctl.h> 27 28 #include "Exif.h" 29 30 namespace android { 31 #define MAX_JPG_WIDTH 800 32 #define MAX_JPG_HEIGHT 480 33 #define MAX_JPG_RESOLUTION (MAX_JPG_WIDTH * MAX_JPG_HEIGHT) 34 35 #define MAX_JPG_THUMBNAIL_WIDTH 320 36 #define MAX_JPG_THUMBNAIL_HEIGHT 240 37 #define MAX_JPG_THUMBNAIL_RESOLUTION (MAX_JPG_THUMBNAIL_WIDTH * \ 38 MAX_JPG_THUMBNAIL_HEIGHT) 39 40 #define MAX_RGB_WIDTH 800 41 #define MAX_RGB_HEIGHT 480 42 #define MAX_RGB_RESOLUTION (MAX_RGB_WIDTH * MAX_RGB_HEIGHT) 43 44 /*******************************************************************************/ 45 /* define JPG & image memory */ 46 /* memory area is 4k(PAGE_SIZE) aligned because of VirtualCopyEx() */ 47 #define JPG_STREAM_BUF_SIZE \ 48 (MAX_JPG_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE 49 #define JPG_STREAM_THUMB_BUF_SIZE \ 50 (MAX_JPG_THUMBNAIL_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE 51 #define JPG_FRAME_BUF_SIZE \ 52 ((MAX_JPG_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE 53 #define JPG_FRAME_THUMB_BUF_SIZE \ 54 ((MAX_JPG_THUMBNAIL_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE 55 #define JPG_RGB_BUF_SIZE \ 56 ((MAX_RGB_RESOLUTION * 4) / PAGE_SIZE + 1) * PAGE_SIZE 57 58 #define JPG_TOTAL_BUF_SIZE (JPG_STREAM_BUF_SIZE + \ 59 JPG_STREAM_THUMB_BUF_SIZE + \ 60 JPG_FRAME_BUF_SIZE + \ 61 JPG_FRAME_THUMB_BUF_SIZE + \ 62 JPG_RGB_BUF_SIZE) 63 64 #define JPG_MAIN_START 0x00 65 #define JPG_THUMB_START JPG_STREAM_BUF_SIZE 66 #define IMG_MAIN_START (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE) 67 #define IMG_THUMB_START (IMG_MAIN_START + JPG_FRAME_BUF_SIZE) 68 /*******************************************************************************/ 69 70 #define JPG_DRIVER_NAME "/dev/s3c-jpg" 71 72 #define JPEG_IOCTL_MAGIC 'J' 73 #define IOCTL_JPG_DECODE _IO(JPEG_IOCTL_MAGIC, 1) 74 #define IOCTL_JPG_ENCODE _IO(JPEG_IOCTL_MAGIC, 2) 75 #define IOCTL_JPG_GET_STRBUF _IO(JPEG_IOCTL_MAGIC, 3) 76 #define IOCTL_JPG_GET_FRMBUF _IO(JPEG_IOCTL_MAGIC, 4) 77 #define IOCTL_JPG_GET_THUMB_STRBUF _IO(JPEG_IOCTL_MAGIC, 5) 78 #define IOCTL_JPG_GET_THUMB_FRMBUF _IO(JPEG_IOCTL_MAGIC, 6) 79 #define IOCTL_JPG_GET_PHY_FRMBUF _IO(JPEG_IOCTL_MAGIC, 7) 80 #define IOCTL_JPG_GET_PHY_THUMB_FRMBUF _IO(JPEG_IOCTL_MAGIC, 8) 81 82 typedef enum { 83 JPEG_SET_ENCODE_WIDTH, 84 JPEG_SET_ENCODE_HEIGHT, 85 JPEG_SET_ENCODE_QUALITY, 86 JPEG_SET_ENCODE_IN_FORMAT, 87 JPEG_SET_SAMPING_MODE, 88 JPEG_SET_THUMBNAIL_WIDTH, 89 JPEG_SET_THUMBNAIL_HEIGHT 90 } jpeg_conf; 91 92 typedef enum { 93 JPG_FAIL, 94 JPG_SUCCESS, 95 OK_HD_PARSING, 96 ERR_HD_PARSING, 97 OK_ENC_OR_DEC, 98 ERR_ENC_OR_DEC, 99 ERR_UNKNOWN 100 } jpg_return_status; 101 102 typedef enum { 103 JPG_RGB16, 104 JPG_YCBYCR, 105 JPG_TYPE_UNKNOWN 106 } image_type_t; 107 108 typedef enum { 109 JPG_444, 110 JPG_422, 111 JPG_420, 112 JPG_400, 113 RESERVED1, 114 RESERVED2, 115 JPG_411, 116 JPG_SAMPLE_UNKNOWN 117 } sample_mode_t; 118 119 typedef enum { 120 YCBCR_422, 121 YCBCR_420, 122 YCBCR_SAMPLE_UNKNOWN 123 } out_mode_t; 124 125 typedef enum { 126 JPG_MODESEL_YCBCR = 1, 127 JPG_MODESEL_RGB, 128 JPG_MODESEL_UNKNOWN 129 } in_mode_t; 130 131 typedef enum { 132 JPG_MAIN, 133 JPG_THUMBNAIL 134 } encode_type_t; 135 136 typedef enum { 137 JPG_QUALITY_LEVEL_1, /* high */ 138 JPG_QUALITY_LEVEL_2, 139 JPG_QUALITY_LEVEL_3, 140 JPG_QUALITY_LEVEL_4 /* low */ 141 } image_quality_type_t; 142 143 typedef struct { 144 sample_mode_t sample_mode; 145 encode_type_t dec_type; 146 out_mode_t out_format; 147 uint32_t width; 148 uint32_t height; 149 uint32_t data_size; 150 uint32_t file_size; 151 } jpg_dec_proc_param; 152 153 typedef struct { 154 sample_mode_t sample_mode; 155 encode_type_t enc_type; 156 in_mode_t in_format; 157 image_quality_type_t quality; 158 uint32_t width; 159 uint32_t height; 160 uint32_t data_size; 161 uint32_t file_size; 162 uint32_t set_framebuf; 163 } jpg_enc_proc_param; 164 165 typedef struct { 166 char *in_buf; 167 char *phy_in_buf; 168 int in_buf_size; 169 char *out_buf; 170 char *phy_out_buf; 171 int out_buf_size; 172 char *in_thumb_buf; 173 char *phy_in_thumb_buf; 174 int in_thumb_buf_size; 175 char *out_thumb_buf; 176 char *phy_out_thumb_buf; 177 int out_thumb_buf_size; 178 char *mmapped_addr; 179 jpg_dec_proc_param *dec_param; 180 jpg_enc_proc_param *enc_param; 181 jpg_enc_proc_param *thumb_enc_param; 182 } jpg_args; 183 184 class JpegEncoder { 185 public: 186 JpegEncoder(); 187 virtual ~JpegEncoder(); 188 189 int openHardware(); 190 jpg_return_status setConfig(jpeg_conf type, int32_t value); 191 void *getInBuf(uint64_t size); 192 void *getOutBuf(uint64_t *size); 193 void *getThumbInBuf(uint64_t size); 194 void *getThumbOutBuf(uint64_t *size); 195 jpg_return_status encode(unsigned int *size, exif_attribute_t *exifInfo); 196 jpg_return_status encodeThumbImg(unsigned int *size, bool useMain = true); 197 jpg_return_status makeExif(unsigned char *exifOut, 198 exif_attribute_t *exifIn, 199 unsigned int *size, 200 bool useMainbufForThumb = false); 201 202 private: 203 jpg_return_status checkMcu(sample_mode_t sampleMode, uint32_t width, uint32_t height, bool isThumb); 204 bool pad(char *srcBuf, uint32_t srcWidth, uint32_t srcHight, 205 char *dstBuf, uint32_t dstWidth, uint32_t dstHight); 206 bool scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHight, 207 char *dstBuf, uint32_t dstWidth, uint32_t dstHight); 208 209 inline void writeExifIfd(unsigned char **pCur, 210 unsigned short tag, 211 unsigned short type, 212 unsigned int count, 213 uint32_t value); 214 inline void writeExifIfd(unsigned char **pCur, 215 unsigned short tag, 216 unsigned short type, 217 unsigned int count, 218 unsigned char *pValue); 219 inline void writeExifIfd(unsigned char **pCur, 220 unsigned short tag, 221 unsigned short type, 222 unsigned int count, 223 rational_t *pValue, 224 unsigned int *offset, 225 unsigned char *start); 226 inline void writeExifIfd(unsigned char **pCur, 227 unsigned short tag, 228 unsigned short type, 229 unsigned int count, 230 unsigned char *pValue, 231 unsigned int *offset, 232 unsigned char *start); 233 int mDevFd; 234 jpg_args mArgs; 235 236 bool available; 237 238 }; 239 }; 240 #endif /* __JPG_API_H__ */ 241