diff options
Diffstat (limited to 'exynos4/hal/libcamera/SecCamera.h')
-rw-r--r-- | exynos4/hal/libcamera/SecCamera.h | 695 |
1 files changed, 695 insertions, 0 deletions
diff --git a/exynos4/hal/libcamera/SecCamera.h b/exynos4/hal/libcamera/SecCamera.h new file mode 100644 index 0000000..fc30fc4 --- /dev/null +++ b/exynos4/hal/libcamera/SecCamera.h @@ -0,0 +1,695 @@ +/* +** +** Copyright 2008, The Android Open Source Project +** Copyright 2010, Samsung Electronics Co. LTD +** +** 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 ANDROID_HARDWARE_CAMERA_SEC_H +#define ANDROID_HARDWARE_CAMERA_SEC_H + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <signal.h> +#include <sys/mman.h> +#include <sys/time.h> +#include <sys/ioctl.h> +#include <sys/poll.h> +#include <sys/stat.h> + +#include <utils/RefBase.h> +#include <hardware/camera.h> +#include <videodev2.h> +#include <videodev2_samsung.h> +#include "sec_utils_v4l2.h" + +#include "SecBuffer.h" + +#include <utils/String8.h> + +#ifdef SAMSUNG_EXYNOS4210 +#include "jpeg_api.h" +#endif + +#ifdef SAMSUNG_EXYNOS4x12 +#include "jpeg_hal.h" +#endif + +#include "Exif.h" +namespace android { + +//#define ENABLE_ESD_PREVIEW_CHECK +//#define ZERO_SHUTTER_LAG +#define VIDEO_SNAPSHOT + +#if defined VIDEO_SNAPSHOT +#define ZERO_SHUTTER_LAG +#endif + +#define USE_FACE_DETECTION +//#define USE_TOUCH_AF + +#if defined(LOG_NDEBUG) && (LOG_NDEBUG == 0) +#define LOG_CAMERA LOGD +#define LOG_CAMERA_PREVIEW LOGD + +#define LOG_TIME_DEFINE(n) \ + struct timeval time_start_##n, time_stop_##n; unsigned long log_time_##n = 0; + +#define LOG_TIME_START(n) \ + gettimeofday(&time_start_##n, NULL); + +#define LOG_TIME_END(n) \ + gettimeofday(&time_stop_##n, NULL); log_time_##n = measure_time_camera(&time_start_##n, &time_stop_##n); + +#define LOG_TIME(n) \ + log_time_##n + +#else +#define LOG_CAMERA(...) +#define LOG_CAMERA_PREVIEW(...) +#define LOG_TIME_DEFINE(n) +#define LOG_TIME_START(n) +#define LOG_TIME_END(n) +#define LOG_TIME(n) +#endif + +#define FRM_RATIO(w, h) ((w)*10/(h)) +#define SIZE_4K (1 << 12) + +#define JOIN(x, y) JOIN_AGAIN(x, y) +#define JOIN_AGAIN(x, y) x ## y + +#define FRONT_CAM S5K6A3 +#define BACK_CAM M5MO + +#if !defined (FRONT_CAM) || !defined(BACK_CAM) +#error "Please define the Camera module" +#endif + +#define M5MO_PREVIEW_WIDTH 640 +#define M5MO_PREVIEW_HEIGHT 480 +#define M5MO_SNAPSHOT_WIDTH 3264 +#define M5MO_SNAPSHOT_HEIGHT 2448 + +#define M5MO_THUMBNAIL_WIDTH 320 +#define M5MO_THUMBNAIL_HEIGHT 240 +#define M5MO_THUMBNAIL_BPP 16 + +#define M5MO_FPS 30 + +/* focal length of 3.43mm */ +#define M5MO_FOCAL_LENGTH 343 + +#define S5K6A3_PREVIEW_WIDTH 480 +#define S5K6A3_PREVIEW_HEIGHT 480 +#define S5K6A3_SNAPSHOT_WIDTH 1392 +#define S5K6A3_SNAPSHOT_HEIGHT 1392 + +#define S5K6A3_THUMBNAIL_WIDTH 160 +#define S5K6A3_THUMBNAIL_HEIGHT 120 +#define S5K6A3_THUMBNAIL_BPP 16 + +#define S5K6A3_FPS 30 + +/* focal length of 0.9mm */ +#define S5K6A3_FOCAL_LENGTH 90 + +#define MAX_BACK_CAMERA_PREVIEW_WIDTH JOIN(BACK_CAM,_PREVIEW_WIDTH) +#define MAX_BACK_CAMERA_PREVIEW_HEIGHT JOIN(BACK_CAM,_PREVIEW_HEIGHT) +#define MAX_BACK_CAMERA_SNAPSHOT_WIDTH JOIN(BACK_CAM,_SNAPSHOT_WIDTH) +#define MAX_BACK_CAMERA_SNAPSHOT_HEIGHT JOIN(BACK_CAM,_SNAPSHOT_HEIGHT) + +#define BACK_CAMERA_THUMBNAIL_WIDTH JOIN(BACK_CAM,_THUMBNAIL_WIDTH) +#define BACK_CAMERA_THUMBNAIL_HEIGHT JOIN(BACK_CAM,_THUMBNAIL_HEIGHT) +#define BACK_CAMERA_THUMBNAIL_BPP JOIN(BACK_CAM,_THUMBNAIL_BPP) + +#define BACK_CAMERA_FPS JOIN(BACK_CAM,_FPS) + +#define BACK_CAMERA_FOCAL_LENGTH JOIN(BACK_CAM,_FOCAL_LENGTH) + +#define MAX_FRONT_CAMERA_PREVIEW_WIDTH JOIN(FRONT_CAM,_PREVIEW_WIDTH) +#define MAX_FRONT_CAMERA_PREVIEW_HEIGHT JOIN(FRONT_CAM,_PREVIEW_HEIGHT) +#define MAX_FRONT_CAMERA_SNAPSHOT_WIDTH JOIN(FRONT_CAM,_SNAPSHOT_WIDTH) +#define MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT JOIN(FRONT_CAM,_SNAPSHOT_HEIGHT) + +#define FRONT_CAMERA_THUMBNAIL_WIDTH JOIN(FRONT_CAM,_THUMBNAIL_WIDTH) +#define FRONT_CAMERA_THUMBNAIL_HEIGHT JOIN(FRONT_CAM,_THUMBNAIL_HEIGHT) +#define FRONT_CAMERA_THUMBNAIL_BPP JOIN(FRONT_CAM,_THUMBNAIL_BPP) + +#define FRONT_CAMERA_FPS JOIN(FRONT_CAM,_FPS) + +#define FRONT_CAMERA_FOCAL_LENGTH JOIN(FRONT_CAM,_FOCAL_LENGTH) + +#define DEFAULT_JPEG_THUMBNAIL_WIDTH 256 +#define DEFAULT_JPEG_THUMBNAIL_HEIGHT 192 + +#ifdef BOARD_USE_V4L2 +#define CAMERA_DEV_NAME "/dev/video1" +#else +#define CAMERA_DEV_NAME "/dev/video0" +#endif + +#ifdef SAMSUNG_EXYNOS4210 +#define CAMERA_DEV_NAME3 "/dev/video2" +#endif + +#ifdef SAMSUNG_EXYNOS4x12 +#ifdef BOARD_USE_V4L2 +#define CAMERA_DEV_NAME3 "/dev/video3" +#else +#define CAMERA_DEV_NAME3 "/dev/video1" +#endif +#ifdef ZERO_SHUTTER_LAG +#define CAMERA_DEV_NAME2 "/dev/video2" +#endif +#endif + +#define CAMERA_DEV_NAME_TEMP "/data/videotmp_000" +#define CAMERA_DEV_NAME2_TEMP "/data/videotemp_002" + + +#define BPP 2 +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#define MAX_BUFFERS 8 + +#ifdef ZERO_SHUTTER_LAG +#define CAP_BUFFERS 8 +#else +#define CAP_BUFFERS 1 +#endif + +#ifdef BOARD_USE_V4L2 +#define MAX_PLANES (3) +#define V4L2_BUF_TYPE V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE +#else +#define MAX_PLANES (1) +#define V4L2_BUF_TYPE V4L2_BUF_TYPE_VIDEO_CAPTURE +#endif + +#ifdef BOARD_USE_V4L2_ION +#define V4L2_MEMORY_TYPE V4L2_MEMORY_USERPTR +#define RECORD_PIX_FMT V4L2_PIX_FMT_NV12M +#define PREVIEW_NUM_PLANE (3) +#define RECORD_NUM_PLANE (2) +#else +#define V4L2_MEMORY_TYPE V4L2_MEMORY_MMAP +#define RECORD_PIX_FMT V4L2_PIX_FMT_NV12 +#define PREVIEW_NUM_PLANE (1) +#define RECORD_NUM_PLANE (1) +#endif + +/* + * V 4 L 2 F I M C E X T E N S I O N S + * + */ +#define V4L2_CID_ROTATION (V4L2_CID_PRIVATE_BASE + 0) +#define V4L2_CID_PADDR_Y (V4L2_CID_PRIVATE_BASE + 1) +#define V4L2_CID_PADDR_CB (V4L2_CID_PRIVATE_BASE + 2) +#define V4L2_CID_PADDR_CR (V4L2_CID_PRIVATE_BASE + 3) +#define V4L2_CID_PADDR_CBCR (V4L2_CID_PRIVATE_BASE + 4) +#define V4L2_CID_STREAM_PAUSE (V4L2_CID_PRIVATE_BASE + 53) + +#define V4L2_CID_CAM_JPEG_MAIN_SIZE (V4L2_CID_PRIVATE_BASE + 32) +#define V4L2_CID_CAM_JPEG_MAIN_OFFSET (V4L2_CID_PRIVATE_BASE + 33) +#define V4L2_CID_CAM_JPEG_THUMB_SIZE (V4L2_CID_PRIVATE_BASE + 34) +#define V4L2_CID_CAM_JPEG_THUMB_OFFSET (V4L2_CID_PRIVATE_BASE + 35) +#define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET (V4L2_CID_PRIVATE_BASE + 36) +#define V4L2_CID_CAM_JPEG_QUALITY (V4L2_CID_PRIVATE_BASE + 37) + +#define TPATTERN_COLORBAR 1 +#define TPATTERN_HORIZONTAL 2 +#define TPATTERN_VERTICAL 3 + +#define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U') + +/* FOURCC for FIMC specific */ +#define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y') +#define V4L2_PIX_FMT_NV16 v4l2_fourcc('N', 'V', '1', '6') +#define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1') +#define V4L2_PIX_FMT_NV12T v4l2_fourcc('T', 'V', '1', '2') +/* + * U S E R D E F I N E D T Y P E S + * + */ +#define PREVIEW_MODE 1 +#define CAPTURE_MODE 2 +#define RECORD_MODE 3 + +struct yuv_fmt_list { + const char *name; + const char *desc; + unsigned int fmt; + int depth; + int planes; +}; + +struct camsensor_date_info { + unsigned int year; + unsigned int month; + unsigned int date; +}; + +class SecCamera : public virtual RefBase { +public: + + enum CAMERA_ID { + CAMERA_ID_BACK = 0, + CAMERA_ID_FRONT = 1, + }; + + enum JPEG_QUALITY { + JPEG_QUALITY_ECONOMY = 0, + JPEG_QUALITY_NORMAL = 50, + JPEG_QUALITY_SUPERFINE = 100, + JPEG_QUALITY_MAX, + }; + + enum OBJECT_TRACKING { + OBJECT_TRACKING_OFF, + OBJECT_TRACKING_ON, + OBJECT_TRACKING_MAX, + }; + + /*VT call*/ + enum VT_MODE { + VT_MODE_OFF, + VT_MODE_ON, + VT_MODE_MAX, + }; + + /*Camera sensor mode - Camcorder fix fps*/ + enum SENSOR_MODE { + SENSOR_MODE_CAMERA, + SENSOR_MODE_MOVIE, + }; + + /*Camera Shot mode*/ + enum SHOT_MODE { + SHOT_MODE_SINGLE = 0, + SHOT_MODE_CONTINUOUS = 1, + SHOT_MODE_PANORAMA = 2, + SHOT_MODE_SMILE = 3, + SHOT_MODE_SELF = 6, + }; + + enum CHK_DATALINE { + CHK_DATALINE_OFF, + CHK_DATALINE_ON, + CHK_DATALINE_MAX, + }; + + enum CAM_MODE { + PREVIEW = 0, + PICTURE = 1, + RECORDING = 2, + }; + + int m_touch_af_start_stop; + + SecCamera(); + virtual ~SecCamera(); + + static SecCamera* createInstance(void) + { + static SecCamera singleton; + return &singleton; + } + status_t dump(int fd); + + bool CreateCamera(int index); + bool DestroyCamera(void); + int getCameraId(void); + void initParameters(int index); + int setMode(int recording_en); + + int startPreview(void); + int stopPreview(void); + int getPreviewState(void) + { + return m_preview_state; + } + void clearPreviewState(void) + { + m_preview_state = 0; + } + + int startSnapshot(SecBuffer *yuv_buf); + int stopSnapshot(void); + int getSnapshot(void); + int setSnapshotFrame(int index); + + int startRecord(bool recordHint); + int stopRecord(void); + int setPreviewFrame(int index); + int getRecordFrame(void); + int releaseRecordFrame(int index); + int getRecordAddr(int index, SecBuffer *buffer); + + int getPreview(camera_frame_metadata_t *facedata); + int setPreviewSize(int width, int height, int pixel_format); + int getPreviewSize(int *width, int *height, int *frame_size); + int getPreviewMaxSize(int *width, int *height); + int getPreviewPixelFormat(void); + int setPreviewImage(int index, unsigned char *buffer, int size); + + int setVideosnapshotSize(int width, int height); + int getVideosnapshotSize(int *width, int *height, int *frame_size); + int setSnapshotSize(int width, int height); + int getSnapshotSize(int *width, int *height, int *frame_size); + int getSnapshotMaxSize(int *width, int *height); + int setSnapshotPixelFormat(int pixel_format); + int getSnapshotPixelFormat(void); + + unsigned char* getJpeg(unsigned char *snapshot_data, int snapshot_size, int *size); + unsigned char* yuv2Jpeg(unsigned char *raw_data, int raw_size, + int *jpeg_size, + int width, int height, int pixel_format); + + int setJpegThumbnailSize(int width, int height); + int getJpegThumbnailSize(int *width, int *height); + + int setJpegThumbnailQuality(int jpeg_thumbnail_quality); + int getJpegThumbnailQuality(void); + + int initSetParams(void); + + int setAutofocus(void); + int setTouchAF(void); + + int SetRotate(int angle); + int getRotate(void); + + int setVerticalMirror(void); + int setHorizontalMirror(void); + + int setWhiteBalance(int white_balance); + int getWhiteBalance(void); + + int setBrightness(int brightness); + int getBrightness(void); + + int setExposure(int exposure); + int getExposure(void); + + int setImageEffect(int image_effect); + int getImageEffect(void); + + int setSceneMode(int scene_mode); + int getSceneMode(void); + + int setFlashMode(int flash_mode); + int getFlashMode(void); + + int setMetering(int metering_value); + int getMetering(void); + + int setAutoExposureLock(int toggle); + int setAutoWhiteBalanceLock(int toggle); + + int setISO(int iso_value); + int getISO(void); + + int setContrast(int contrast_value); + int getContrast(void); + + int setSaturation(int saturation_value); + int getSaturation(void); + + int setSharpness(int sharpness_value); + int getSharpness(void); + + int setHue(int hue_value); + int getHue(void); + + int setWDR(int wdr_value); + int getWDR(void); + + int setAntiShake(int anti_shake); + int getAntiShake(void); + + int setJpegQuality(int jpeg_qality); + int getJpegQuality(void); + + int setZoom(int zoom_level); + int getZoom(void); + + int setObjectTracking(int object_tracking); + int getObjectTracking(void); + int getObjectTrackingStatus(void); + + int setSmartAuto(int smart_auto); + int getSmartAuto(void); + int getAutosceneStatus(void); + + int setBeautyShot(int beauty_shot); + int getBeautyShot(void); + + int setVintageMode(int vintage_mode); + int getVintageMode(void); + + int setFocusMode(int focus_mode); + int getFocusMode(void); + + int setFaceDetect(int face_detect); + int getFaceDetect(void); + + int setGPSLatitude(const char *gps_latitude); + int setGPSLongitude(const char *gps_longitude); + int setGPSAltitude(const char *gps_altitude); + int setGPSTimeStamp(const char *gps_timestamp); + int setGPSProcessingMethod(const char *gps_timestamp); + int cancelAutofocus(void); + int setFaceDetectLockUnlock(int facedetect_lockunlock); + int setObjectPosition(int x, int y); + int setObjectTrackingStartStop(int start_stop); + int setTouchAFStartStop(int start_stop); + int setCAFStatus(int on_off); + int getAutoFocusResult(void); + int setAntiBanding(int anti_banding); + int getPostview(void); + int setRecordingSize(int width, int height); + int getRecordingSize(int *width, int *height); + int setGamma(int gamma); + int setSlowAE(int slow_ae); + int setExifOrientationInfo(int orientationInfo); + int setBatchReflection(void); + int setSnapshotCmd(void); + int endSnapshot(void); + int setCameraSensorReset(void); + int setSensorMode(int sensor_mode); /* Camcorder fix fps */ + int setShotMode(int shot_mode); /* Shot mode */ + int setDataLineCheck(int chk_dataline); + int getDataLineCheck(void); + int setDataLineCheckStop(void); + int setDefultIMEI(int imei); + int getDefultIMEI(void); + const __u8* getCameraSensorName(void); + bool getUseInternalISP(void); +#ifdef ENABLE_ESD_PREVIEW_CHECK + int getCameraSensorESDStatus(void); +#endif // ENABLE_ESD_PREVIEW_CHECK + + int setFrameRate(int frame_rate); + unsigned char* getJpeg(int *jpeg_size, + int *thumb_size, + unsigned int *thumb_addr, + unsigned int *phyaddr); + int getSnapshotAndJpeg(SecBuffer *yuv_buf, + int index, + unsigned char *jpeg_buf, + int *output_size); + int getExif(unsigned char *pExifDst, unsigned char *pThumbSrc, int thumbSize); + + void getPostViewConfig(int*, int*, int*); + void getThumbnailConfig(int *width, int *height, int *size); + + int getPostViewOffset(void); + int getCameraFd(enum CAM_MODE); + int getJpegFd(void); + void SetJpgAddr(unsigned char *addr); + int getPreviewAddr(int index, SecBuffer *buffer); + int getCaptureAddr(int index, SecBuffer *buffer); +#ifdef BOARD_USE_V4L2_ION + void setUserBufferAddr(void *ptr, int index, int mode); +#endif + static void setJpegRatio(double ratio) + { + if((ratio < 0) || (ratio > 1)) + return; + + jpeg_ratio = ratio; + } + + static double getJpegRatio() + { + return jpeg_ratio; + } + + static void setInterleaveDataSize(int x) + { + interleaveDataSize = x; + } + + static int getInterleaveDataSize() + { + return interleaveDataSize; + } + + static void setJpegLineLength(int x) + { + jpegLineLength = x; + } + + static int getJpegLineLength() + { + return jpegLineLength; + } + +private: + v4l2_streamparm m_streamparm; + struct sec_cam_parm *m_params; + int m_flagCreate; + int m_preview_state; + int m_snapshot_state; + int m_camera_id; + bool m_camera_use_ISP; + + int m_cam_fd; + struct pollfd m_events_c; + + int m_cam_fd2; + int m_cap_fd; + struct pollfd m_events_c2; + + int m_cam_fd3; + int m_rec_fd; + struct pollfd m_events_c3; + int m_flag_record_start; + + int m_preview_v4lformat; + int m_preview_width; + int m_preview_height; + int m_preview_max_width; + int m_preview_max_height; + + int m_snapshot_v4lformat; + int m_snapshot_width; + int m_snapshot_height; + int m_snapshot_max_width; + int m_snapshot_max_height; + + int m_num_capbuf; + int m_videosnapshot_width; + int m_videosnapshot_height; + + int m_angle; + int m_anti_banding; + int m_wdr; + int m_anti_shake; + int m_zoom_level; + int m_object_tracking; + int m_smart_auto; + int m_beauty_shot; + int m_vintage_mode; + int m_face_detect; + int m_object_tracking_start_stop; + int m_recording_en; + bool m_record_hint; + int m_recording_width; + int m_recording_height; + long m_gps_latitude; + long m_gps_longitude; + long m_gps_altitude; + long m_gps_timestamp; + int m_sensor_mode; /*Camcorder fix fps */ + int m_shot_mode; /* Shot mode */ + int m_exif_orientation; + int m_chk_dataline; + int m_video_gamma; + int m_slow_ae; + int m_camera_af_flag; + int m_auto_focus_state; + + int m_flag_camera_create; + int m_flag_camera_start; + + int m_jpeg_fd; + int m_jpeg_thumbnail_width; + int m_jpeg_thumbnail_height; + int m_jpeg_thumbnail_quality; + int m_jpeg_quality; + + int m_postview_offset; + +#ifdef ENABLE_ESD_PREVIEW_CHECK + int m_esd_check_count; +#endif // ENABLE_ESD_PREVIEW_CHECK + + exif_attribute_t mExifInfo; + + struct SecBuffer m_capture_buf[CAP_BUFFERS]; + struct SecBuffer m_buffers_preview[MAX_BUFFERS]; + struct SecBuffer m_buffers_record[MAX_BUFFERS]; + + 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); + + void setExifChangedAttribute(); + void setExifFixedAttribute(); + int makeExif (unsigned char *exifOut, + unsigned char *thumb_buf, + unsigned int thumb_size, + exif_attribute_t *exifInfo, + unsigned int *size, + bool useMainbufForThumb); + void resetCamera(); + + static double jpeg_ratio; + static int interleaveDataSize; + static int jpegLineLength; +}; + +extern unsigned long measure_time_camera(struct timeval *start, struct timeval *stop); + +}; // namespace android + +#endif // ANDROID_HARDWARE_CAMERA_SEC_H |