blob: 21bd4756829546f3660d3d5e7f31e8fe8085e132 [file] [log] [blame]
/*
**
** 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_exynos_camera.h>
#include <videodev2_exynos_media.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