summaryrefslogtreecommitdiffstats
path: root/libs3cjpeg/JpegEncoder.h
diff options
context:
space:
mode:
authorJeong-Seok Yang <jseok.yang@samsung.com>2010-09-20 23:41:49 -0700
committerMaarten Hooft <mthooft@google.com>2010-09-22 22:46:21 -0700
commit1d7e98b26719cc40cf67bed478c3ef0638c78460 (patch)
tree53410fe2919db6dbd5b3a8f43f7e2161b4c1978e /libs3cjpeg/JpegEncoder.h
parent94e25540e70899a7f1545cb435e090668341e7b1 (diff)
downloaddevice_samsung_crespo-1d7e98b26719cc40cf67bed478c3ef0638c78460.zip
device_samsung_crespo-1d7e98b26719cc40cf67bed478c3ef0638c78460.tar.gz
device_samsung_crespo-1d7e98b26719cc40cf67bed478c3ef0638c78460.tar.bz2
libs3cjpeg: library for using H/W JPEG encoder
Change-Id: I8259d86085cfc866428e5023a990cace9a384836 Signed-off-by: Jeong-Seok Yang <jseok.yang@samsung.com>
Diffstat (limited to 'libs3cjpeg/JpegEncoder.h')
-rw-r--r--libs3cjpeg/JpegEncoder.h238
1 files changed, 238 insertions, 0 deletions
diff --git a/libs3cjpeg/JpegEncoder.h b/libs3cjpeg/JpegEncoder.h
new file mode 100644
index 0000000..d4b36ea
--- /dev/null
+++ b/libs3cjpeg/JpegEncoder.h
@@ -0,0 +1,238 @@
+/*
+ * 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.
+ *
+ * JPEG DRIVER MODULE (JpegEncoder.h)
+ * Author : ge.lee -- initial version
+ * Date : 03 June 2010
+ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
+ */
+#ifndef __JPG_API_H__
+#define __JPG_API_H__
+
+#include <stdint.h>
+#include <sys/ioctl.h>
+
+#include "Exif.h"
+
+namespace android {
+#define MAX_JPG_WIDTH 800
+#define MAX_JPG_HEIGHT 480
+#define MAX_JPG_RESOLUTION (MAX_JPG_WIDTH * MAX_JPG_HEIGHT)
+
+#define MAX_JPG_THUMBNAIL_WIDTH 320
+#define MAX_JPG_THUMBNAIL_HEIGHT 240
+#define MAX_JPG_THUMBNAIL_RESOLUTION (MAX_JPG_THUMBNAIL_WIDTH * \
+ MAX_JPG_THUMBNAIL_HEIGHT)
+
+#define MAX_RGB_WIDTH 800
+#define MAX_RGB_HEIGHT 480
+#define MAX_RGB_RESOLUTION (MAX_RGB_WIDTH * MAX_RGB_HEIGHT)
+
+/*******************************************************************************/
+/* define JPG & image memory */
+/* memory area is 4k(PAGE_SIZE) aligned because of VirtualCopyEx() */
+#define JPG_STREAM_BUF_SIZE \
+ (MAX_JPG_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE
+#define JPG_STREAM_THUMB_BUF_SIZE \
+ (MAX_JPG_THUMBNAIL_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE
+#define JPG_FRAME_BUF_SIZE \
+ ((MAX_JPG_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE
+#define JPG_FRAME_THUMB_BUF_SIZE \
+ ((MAX_JPG_THUMBNAIL_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE
+#define JPG_RGB_BUF_SIZE \
+ ((MAX_RGB_RESOLUTION * 4) / PAGE_SIZE + 1) * PAGE_SIZE
+
+#define JPG_TOTAL_BUF_SIZE (JPG_STREAM_BUF_SIZE + \
+ JPG_STREAM_THUMB_BUF_SIZE + \
+ JPG_FRAME_BUF_SIZE + \
+ JPG_FRAME_THUMB_BUF_SIZE + \
+ JPG_RGB_BUF_SIZE)
+
+#define JPG_MAIN_START 0x00
+#define JPG_THUMB_START JPG_STREAM_BUF_SIZE
+#define IMG_MAIN_START (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE)
+#define IMG_THUMB_START (IMG_MAIN_START + JPG_FRAME_BUF_SIZE)
+/*******************************************************************************/
+
+#define JPG_DRIVER_NAME "/dev/s3c-jpg"
+
+#define JPEG_IOCTL_MAGIC 'J'
+#define IOCTL_JPG_DECODE _IO(JPEG_IOCTL_MAGIC, 1)
+#define IOCTL_JPG_ENCODE _IO(JPEG_IOCTL_MAGIC, 2)
+#define IOCTL_JPG_GET_STRBUF _IO(JPEG_IOCTL_MAGIC, 3)
+#define IOCTL_JPG_GET_FRMBUF _IO(JPEG_IOCTL_MAGIC, 4)
+#define IOCTL_JPG_GET_THUMB_STRBUF _IO(JPEG_IOCTL_MAGIC, 5)
+#define IOCTL_JPG_GET_THUMB_FRMBUF _IO(JPEG_IOCTL_MAGIC, 6)
+#define IOCTL_JPG_GET_PHY_FRMBUF _IO(JPEG_IOCTL_MAGIC, 7)
+#define IOCTL_JPG_GET_PHY_THUMB_FRMBUF _IO(JPEG_IOCTL_MAGIC, 8)
+
+typedef enum {
+ JPEG_SET_ENCODE_WIDTH,
+ JPEG_SET_ENCODE_HEIGHT,
+ JPEG_SET_ENCODE_QUALITY,
+ JPEG_SET_ENCODE_IN_FORMAT,
+ JPEG_SET_SAMPING_MODE,
+ JPEG_SET_THUMBNAIL_WIDTH,
+ JPEG_SET_THUMBNAIL_HEIGHT
+} jpeg_conf;
+
+typedef enum {
+ JPG_FAIL,
+ JPG_SUCCESS,
+ OK_HD_PARSING,
+ ERR_HD_PARSING,
+ OK_ENC_OR_DEC,
+ ERR_ENC_OR_DEC,
+ ERR_UNKNOWN
+} jpg_return_status;
+
+typedef enum {
+ JPG_RGB16,
+ JPG_YCBYCR,
+ JPG_TYPE_UNKNOWN
+} image_type_t;
+
+typedef enum {
+ JPG_444,
+ JPG_422,
+ JPG_420,
+ JPG_400,
+ RESERVED1,
+ RESERVED2,
+ JPG_411,
+ JPG_SAMPLE_UNKNOWN
+} sample_mode_t;
+
+typedef enum {
+ YCBCR_422,
+ YCBCR_420,
+ YCBCR_SAMPLE_UNKNOWN
+} out_mode_t;
+
+typedef enum {
+ JPG_MODESEL_YCBCR = 1,
+ JPG_MODESEL_RGB,
+ JPG_MODESEL_UNKNOWN
+} in_mode_t;
+
+typedef enum {
+ JPG_MAIN,
+ JPG_THUMBNAIL
+} encode_type_t;
+
+typedef enum {
+ JPG_QUALITY_LEVEL_1, /* high */
+ JPG_QUALITY_LEVEL_2,
+ JPG_QUALITY_LEVEL_3,
+ JPG_QUALITY_LEVEL_4 /* low */
+} image_quality_type_t;
+
+typedef struct {
+ sample_mode_t sample_mode;
+ encode_type_t dec_type;
+ out_mode_t out_format;
+ uint32_t width;
+ uint32_t height;
+ uint32_t data_size;
+ uint32_t file_size;
+} jpg_dec_proc_param;
+
+typedef struct {
+ sample_mode_t sample_mode;
+ encode_type_t enc_type;
+ in_mode_t in_format;
+ image_quality_type_t quality;
+ uint32_t width;
+ uint32_t height;
+ uint32_t data_size;
+ uint32_t file_size;
+ uint32_t set_framebuf;
+} jpg_enc_proc_param;
+
+typedef struct {
+ char *in_buf;
+ char *phy_in_buf;
+ int in_buf_size;
+ char *out_buf;
+ char *phy_out_buf;
+ int out_buf_size;
+ char *in_thumb_buf;
+ char *phy_in_thumb_buf;
+ int in_thumb_buf_size;
+ char *out_thumb_buf;
+ char *phy_out_thumb_buf;
+ int out_thumb_buf_size;
+ char *mmapped_addr;
+ jpg_dec_proc_param *dec_param;
+ jpg_enc_proc_param *enc_param;
+ jpg_enc_proc_param *thumb_enc_param;
+} jpg_args;
+
+class JpegEncoder {
+public:
+ JpegEncoder();
+ virtual ~JpegEncoder();
+
+ int openHardware();
+ jpg_return_status setConfig(jpeg_conf type, int32_t value);
+ void *getInBuf(uint64_t size);
+ void *getOutBuf(uint64_t *size);
+ void *getThumbInBuf(uint64_t size);
+ void *getThumbOutBuf(uint64_t *size);
+ jpg_return_status encode(unsigned int *size, exif_attribute_t *exifInfo);
+ jpg_return_status encodeThumbImg(unsigned int *size, bool useMain = true);
+ jpg_return_status makeExif(unsigned char *exifOut,
+ exif_attribute_t *exifIn,
+ unsigned int *size,
+ bool useMainbufForThumb = false);
+
+private:
+ jpg_return_status checkMcu(sample_mode_t sampleMode, uint32_t width, uint32_t height, bool isThumb);
+ bool pad(char *srcBuf, uint32_t srcWidth, uint32_t srcHight,
+ char *dstBuf, uint32_t dstWidth, uint32_t dstHight);
+ bool scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHight,
+ char *dstBuf, uint32_t dstWidth, uint32_t dstHight);
+
+ 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 mDevFd;
+ jpg_args mArgs;
+
+};
+};
+#endif /* __JPG_API_H__ */