Home | History | Annotate | Download | only in libcamera
      1 /*
      2 **
      3 ** Copyright 2008, The Android Open Source Project
      4 ** Copyright 2010, Samsung Electronics Co. LTD
      5 **
      6 ** Licensed under the Apache License, Version 2.0 (the "License");
      7 ** you may not use this file except in compliance with the License.
      8 ** You may obtain a copy of the License at
      9 **
     10 **     http://www.apache.org/licenses/LICENSE-2.0
     11 **
     12 ** Unless required by applicable law or agreed to in writing, software
     13 ** distributed under the License is distributed on an "AS IS" BASIS,
     14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15 ** See the License for the specific language governing permissions and
     16 ** limitations under the License.
     17 */
     18 
     19 #ifndef ANDROID_HARDWARE_CAMERA_SEC_H
     20 #define ANDROID_HARDWARE_CAMERA_SEC_H
     21 
     22 #include <stdio.h>
     23 #include <string.h>
     24 #include <stdlib.h>
     25 
     26 #include <fcntl.h>
     27 #include <unistd.h>
     28 #include <errno.h>
     29 #include <signal.h>
     30 #include <sys/mman.h>
     31 #include <sys/time.h>
     32 #include <sys/ioctl.h>
     33 #include <sys/poll.h>
     34 #include <sys/stat.h>
     35 
     36 #include <utils/RefBase.h>
     37 #include <linux/videodev2.h>
     38 #include <videodev2_samsung.h>
     39 
     40 #include <utils/String8.h>
     41 
     42 #include "JpegEncoder.h"
     43 
     44 namespace android {
     45 
     46 #define ENABLE_ESD_PREVIEW_CHECK
     47 
     48 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
     49 #define LOG_CAMERA LOGD
     50 #define LOG_CAMERA_PREVIEW LOGD
     51 
     52 #define LOG_TIME_DEFINE(n) \
     53     struct timeval time_start_##n, time_stop_##n; unsigned long log_time_##n = 0;
     54 
     55 #define LOG_TIME_START(n) \
     56     gettimeofday(&time_start_##n, NULL);
     57 
     58 #define LOG_TIME_END(n) \
     59     gettimeofday(&time_stop_##n, NULL); log_time_##n = measure_time(&time_start_##n, &time_stop_##n);
     60 
     61 #define LOG_TIME(n) \
     62     log_time_##n
     63 
     64 #else
     65 #define LOG_CAMERA(...)
     66 #define LOG_CAMERA_PREVIEW(...)
     67 #define LOG_TIME_DEFINE(n)
     68 #define LOG_TIME_START(n)
     69 #define LOG_TIME_END(n)
     70 #define LOG_TIME(n)
     71 #endif
     72 
     73 #define JOIN(x, y) JOIN_AGAIN(x, y)
     74 #define JOIN_AGAIN(x, y) x ## y
     75 
     76 #define FRONT_CAM VGA
     77 #define BACK_CAM S5K4ECGX
     78 
     79 #if !defined (FRONT_CAM) || !defined(BACK_CAM)
     80 #error "Please define the Camera module"
     81 #endif
     82 
     83 #define S5K4ECGX_PREVIEW_WIDTH            720
     84 #define S5K4ECGX_PREVIEW_HEIGHT           480
     85 #define S5K4ECGX_SNAPSHOT_WIDTH           2560
     86 #define S5K4ECGX_SNAPSHOT_HEIGHT          1920
     87 
     88 #define S5K4ECGX_POSTVIEW_WIDTH           640
     89 #define S5K4ECGX_POSTVIEW_WIDE_WIDTH      800
     90 #define S5K4ECGX_POSTVIEW_HEIGHT          480
     91 #define S5K4ECGX_POSTVIEW_BPP             16
     92 
     93 #define S5K4ECGX_THUMBNAIL_WIDTH          320
     94 #define S5K4ECGX_THUMBNAIL_HEIGHT         240
     95 #define S5K4ECGX_THUMBNAIL_BPP            16
     96 
     97 /* focal length of 3.43mm */
     98 #define S5K4ECGX_FOCAL_LENGTH             343
     99 
    100 #define VGA_PREVIEW_WIDTH               640
    101 #define VGA_PREVIEW_HEIGHT              480
    102 #define VGA_SNAPSHOT_WIDTH              640
    103 #define VGA_SNAPSHOT_HEIGHT             480
    104 
    105 #define VGA_THUMBNAIL_WIDTH             160
    106 #define VGA_THUMBNAIL_HEIGHT            120
    107 #define VGA_THUMBNAIL_BPP               16
    108 
    109 /* focal length of 0.9mm */
    110 #define VGA_FOCAL_LENGTH                90
    111 
    112 #define MAX_BACK_CAMERA_PREVIEW_WIDTH       JOIN(BACK_CAM,_PREVIEW_WIDTH)
    113 #define MAX_BACK_CAMERA_PREVIEW_HEIGHT      JOIN(BACK_CAM,_PREVIEW_HEIGHT)
    114 #define MAX_BACK_CAMERA_SNAPSHOT_WIDTH      JOIN(BACK_CAM,_SNAPSHOT_WIDTH)
    115 #define MAX_BACK_CAMERA_SNAPSHOT_HEIGHT     JOIN(BACK_CAM,_SNAPSHOT_HEIGHT)
    116 #define BACK_CAMERA_POSTVIEW_WIDTH          JOIN(BACK_CAM,_POSTVIEW_WIDTH)
    117 #define BACK_CAMERA_POSTVIEW_WIDE_WIDTH     JOIN(BACK_CAM,_POSTVIEW_WIDE_WIDTH)
    118 #define BACK_CAMERA_POSTVIEW_HEIGHT         JOIN(BACK_CAM,_POSTVIEW_HEIGHT)
    119 #define BACK_CAMERA_POSTVIEW_BPP            JOIN(BACK_CAM,_POSTVIEW_BPP)
    120 #define BACK_CAMERA_THUMBNAIL_WIDTH         JOIN(BACK_CAM,_THUMBNAIL_WIDTH)
    121 #define BACK_CAMERA_THUMBNAIL_HEIGHT        JOIN(BACK_CAM,_THUMBNAIL_HEIGHT)
    122 #define BACK_CAMERA_THUMBNAIL_BPP           JOIN(BACK_CAM,_THUMBNAIL_BPP)
    123 
    124 #define BACK_CAMERA_FOCAL_LENGTH            JOIN(BACK_CAM,_FOCAL_LENGTH)
    125 
    126 #define MAX_FRONT_CAMERA_PREVIEW_WIDTH      JOIN(FRONT_CAM,_PREVIEW_WIDTH)
    127 #define MAX_FRONT_CAMERA_PREVIEW_HEIGHT     JOIN(FRONT_CAM,_PREVIEW_HEIGHT)
    128 #define MAX_FRONT_CAMERA_SNAPSHOT_WIDTH     JOIN(FRONT_CAM,_SNAPSHOT_WIDTH)
    129 #define MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT    JOIN(FRONT_CAM,_SNAPSHOT_HEIGHT)
    130 
    131 #define FRONT_CAMERA_THUMBNAIL_WIDTH        JOIN(FRONT_CAM,_THUMBNAIL_WIDTH)
    132 #define FRONT_CAMERA_THUMBNAIL_HEIGHT       JOIN(FRONT_CAM,_THUMBNAIL_HEIGHT)
    133 #define FRONT_CAMERA_THUMBNAIL_BPP          JOIN(FRONT_CAM,_THUMBNAIL_BPP)
    134 #define FRONT_CAMERA_FOCAL_LENGTH           JOIN(FRONT_CAM,_FOCAL_LENGTH)
    135 
    136 #define DEFAULT_JPEG_THUMBNAIL_WIDTH        256
    137 #define DEFAULT_JPEG_THUMBNAIL_HEIGHT       192
    138 
    139 #define CAMERA_DEV_NAME   "/dev/video0"
    140 #define CAMERA_DEV_NAME2  "/dev/video2"
    141 
    142 #define CAMERA_DEV_NAME_TEMP "/data/videotmp_000"
    143 #define CAMERA_DEV_NAME2_TEMP "/data/videotemp_002"
    144 
    145 
    146 #define BPP             2
    147 #define MIN(x, y)       (((x) < (y)) ? (x) : (y))
    148 #define MAX_BUFFERS     9 // 11
    149 
    150 #define FIRST_AF_SEARCH_COUNT 80
    151 #define SECOND_AF_SEARCH_COUNT 80
    152 #define AF_PROGRESS 0x01
    153 #define AF_SUCCESS 0x02
    154 #define AF_DELAY 50000
    155 
    156 /*
    157  * V 4 L 2   F I M C   E X T E N S I O N S
    158  *
    159  */
    160 #define V4L2_CID_ROTATION                   (V4L2_CID_PRIVATE_BASE + 0)
    161 #define V4L2_CID_PADDR_Y                    (V4L2_CID_PRIVATE_BASE + 1)
    162 #define V4L2_CID_PADDR_CB                   (V4L2_CID_PRIVATE_BASE + 2)
    163 #define V4L2_CID_PADDR_CR                   (V4L2_CID_PRIVATE_BASE + 3)
    164 #define V4L2_CID_PADDR_CBCR                 (V4L2_CID_PRIVATE_BASE + 4)
    165 #define V4L2_CID_STREAM_PAUSE               (V4L2_CID_PRIVATE_BASE + 53)
    166 
    167 #define V4L2_CID_CAM_JPEG_MAIN_SIZE         (V4L2_CID_PRIVATE_BASE + 32)
    168 #define V4L2_CID_CAM_JPEG_MAIN_OFFSET       (V4L2_CID_PRIVATE_BASE + 33)
    169 #define V4L2_CID_CAM_JPEG_THUMB_SIZE        (V4L2_CID_PRIVATE_BASE + 34)
    170 #define V4L2_CID_CAM_JPEG_THUMB_OFFSET      (V4L2_CID_PRIVATE_BASE + 35)
    171 #define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET   (V4L2_CID_PRIVATE_BASE + 36)
    172 #define V4L2_CID_CAM_JPEG_QUALITY           (V4L2_CID_PRIVATE_BASE + 37)
    173 
    174 #define TPATTERN_COLORBAR           1
    175 #define TPATTERN_HORIZONTAL         2
    176 #define TPATTERN_VERTICAL           3
    177 
    178 #define V4L2_PIX_FMT_YVYU           v4l2_fourcc('Y', 'V', 'Y', 'U')
    179 
    180 /* FOURCC for FIMC specific */
    181 #define V4L2_PIX_FMT_VYUY           v4l2_fourcc('V', 'Y', 'U', 'Y')
    182 #define V4L2_PIX_FMT_NV16           v4l2_fourcc('N', 'V', '1', '6')
    183 #define V4L2_PIX_FMT_NV61           v4l2_fourcc('N', 'V', '6', '1')
    184 #define V4L2_PIX_FMT_NV12T          v4l2_fourcc('T', 'V', '1', '2')
    185 /*
    186  * U S E R   D E F I N E D   T Y P E S
    187  *
    188  */
    189 
    190 struct fimc_buffer {
    191     void    *start;
    192     size_t  length;
    193 };
    194 
    195 struct yuv_fmt_list {
    196     const char  *name;
    197     const char  *desc;
    198     unsigned int    fmt;
    199     int     depth;
    200     int     planes;
    201 };
    202 
    203 //s1 [Apply factory standard]
    204 struct camsensor_date_info {
    205     unsigned int year;
    206     unsigned int month;
    207     unsigned int date;
    208 };
    209 
    210 class SecCamera : public virtual RefBase {
    211 public:
    212 
    213     enum CAMERA_ID {
    214         CAMERA_ID_BACK  = 0,
    215         CAMERA_ID_FRONT = 1,
    216     };
    217 
    218     enum JPEG_QUALITY {
    219         JPEG_QUALITY_ECONOMY    = 0,
    220         JPEG_QUALITY_NORMAL     = 50,
    221         JPEG_QUALITY_SUPERFINE  = 100,
    222         JPEG_QUALITY_MAX,
    223     };
    224 
    225     enum OBJECT_TRACKING {
    226         OBJECT_TRACKING_OFF,
    227         OBJECT_TRACKING_ON,
    228         OBJECT_TRACKING_MAX,
    229     };
    230 
    231     /*VT call*/
    232     enum VT_MODE {
    233         VT_MODE_OFF,
    234         VT_MODE_ON,
    235         VT_MODE_MAX,
    236     };
    237 
    238     /*Camera sensor mode - Camcorder fix fps*/
    239     enum SENSOR_MODE {
    240         SENSOR_MODE_CAMERA,
    241         SENSOR_MODE_MOVIE,
    242     };
    243 
    244     /*Camera Shot mode*/
    245     enum SHOT_MODE {
    246         SHOT_MODE_SINGLE        = 0,
    247         SHOT_MODE_CONTINUOUS    = 1,
    248         SHOT_MODE_PANORAMA      = 2,
    249         SHOT_MODE_SMILE         = 3,
    250         SHOT_MODE_SELF          = 6,
    251     };
    252 
    253     enum CHK_DATALINE {
    254         CHK_DATALINE_OFF,
    255         CHK_DATALINE_ON,
    256         CHK_DATALINE_MAX,
    257     };
    258 
    259     int m_touch_af_start_stop;
    260 
    261     struct gps_info_latiude {
    262         unsigned int    north_south;
    263         unsigned int    dgree;
    264         unsigned int    minute;
    265         unsigned int    second;
    266     } gpsInfoLatitude;
    267     struct gps_info_longitude {
    268         unsigned int    east_west;
    269         unsigned int    dgree;
    270         unsigned int    minute;
    271         unsigned int    second;
    272     } gpsInfoLongitude;
    273     struct gps_info_altitude {
    274         unsigned int    plus_minus;
    275         unsigned int    dgree;
    276         unsigned int    minute;
    277         unsigned int    second;
    278     } gpsInfoAltitude;
    279 
    280     SecCamera();
    281     virtual ~SecCamera();
    282 
    283     static SecCamera* createInstance(void)
    284     {
    285         static SecCamera singleton;
    286         return &singleton;
    287     }
    288     status_t dump(int fd);
    289 
    290     int             getCameraId(void);
    291 
    292     int             startPreview(void);
    293     int             stopPreview(void);
    294 
    295     int             startRecord(void);
    296     int             stopRecord(void);
    297     int             getRecordFrame(void);
    298     int             releaseRecordFrame(int index);
    299     unsigned int    getRecPhyAddrY(int);
    300     unsigned int    getRecPhyAddrC(int);
    301 
    302     int             getPreview(void);
    303     int             setPreviewSize(int width, int height, int pixel_format);
    304     int             getPreviewSize(int *width, int *height, int *frame_size);
    305     int             getPreviewMaxSize(int *width, int *height);
    306     int             getPreviewPixelFormat(void);
    307     int             setPreviewImage(int index, unsigned char *buffer, int size);
    308 
    309     int             setSnapshotSize(int width, int height);
    310     int             getSnapshotSize(int *width, int *height, int *frame_size);
    311     int             getSnapshotMaxSize(int *width, int *height);
    312     int             setSnapshotPixelFormat(int pixel_format);
    313     int             getSnapshotPixelFormat(void);
    314 
    315     unsigned char*  getJpeg(unsigned char *snapshot_data, int snapshot_size, int *size);
    316     unsigned char*  yuv2Jpeg(unsigned char *raw_data, int raw_size,
    317                                 int *jpeg_size,
    318                                 int width, int height, int pixel_format);
    319 
    320     int             setJpegThumbnailSize(int width, int height);
    321     int             getJpegThumbnailSize(int *width, int *height);
    322 
    323     int             setAutofocus(void);
    324     int             zoomIn(void);
    325     int             zoomOut(void);
    326 
    327     int             SetRotate(int angle);
    328     int             getRotate(void);
    329 
    330     int             setVerticalMirror(void);
    331     int             setHorizontalMirror(void);
    332 
    333     int             setWhiteBalance(int white_balance);
    334     int             getWhiteBalance(void);
    335 
    336     int             setBrightness(int brightness);
    337     int             getBrightness(void);
    338 
    339     int             setImageEffect(int image_effect);
    340     int             getImageEffect(void);
    341 
    342     int             setSceneMode(int scene_mode);
    343     int             getSceneMode(void);
    344 
    345     int             setFlashMode(int flash_mode);
    346     int             getFlashMode(void);
    347 
    348     int             setMetering(int metering_value);
    349     int             getMetering(void);
    350 
    351     int             setISO(int iso_value);
    352     int             getISO(void);
    353 
    354     int             setContrast(int contrast_value);
    355     int             getContrast(void);
    356 
    357     int             setSaturation(int saturation_value);
    358     int             getSaturation(void);
    359 
    360     int             setSharpness(int sharpness_value);
    361     int             getSharpness(void);
    362 
    363     int             setWDR(int wdr_value);
    364     int             getWDR(void);
    365 
    366     int             setAntiShake(int anti_shake);
    367     int             getAntiShake(void);
    368 
    369     int             setJpegQuality(int jpeg_qality);
    370     int             getJpegQuality(void);
    371 
    372     int             setZoom(int zoom_level);
    373     int             getZoom(void);
    374 
    375     int             setObjectTracking(int object_tracking);
    376     int             getObjectTracking(void);
    377     int             getObjectTrackingStatus(void);
    378 
    379     int             setSmartAuto(int smart_auto);
    380     int             getSmartAuto(void);
    381     int             getAutosceneStatus(void);
    382 
    383     int             setBeautyShot(int beauty_shot);
    384     int             getBeautyShot(void);
    385 
    386     int             setVintageMode(int vintage_mode);
    387     int             getVintageMode(void);
    388 
    389     int             setFocusMode(int focus_mode);
    390     int             getFocusMode(void);
    391 
    392     int             setFaceDetect(int face_detect);
    393     int             getFaceDetect(void);
    394 
    395     int             setGPSLatitude(const char *gps_latitude);
    396     int             setGPSLongitude(const char *gps_longitude);
    397     int             setGPSAltitude(const char *gps_altitude);
    398     int             setGPSTimeStamp(const char *gps_timestamp);
    399     int             setGPSProcessingMethod(const char *gps_timestamp);
    400     int             cancelAutofocus(void);
    401     int             setFaceDetectLockUnlock(int facedetect_lockunlock);
    402     int             setObjectPosition(int x, int y);
    403     int             setObjectTrackingStartStop(int start_stop);
    404     int             setTouchAFStartStop(int start_stop);
    405     int             setCAFStatus(int on_off);
    406     int             getAutoFocusResult(void);
    407     int             setAntiBanding(int anti_banding);
    408     int             getPostview(void);
    409     int             setRecordingSize(int width, int height);
    410     int             setGamma(int gamma);
    411     int             setSlowAE(int slow_ae);
    412     int             setExifOrientationInfo(int orientationInfo);
    413     int             setBatchReflection(void);
    414     int             setSnapshotCmd(void);
    415     int             endSnapshot(void);
    416     int             setCameraSensorReset(void);
    417     int             setSensorMode(int sensor_mode); /* Camcorder fix fps */
    418     int             setShotMode(int shot_mode);     /* Shot mode */
    419     /*VT call*/
    420     int             setVTmode(int vtmode);
    421     int             getVTmode(void);
    422     int             setBlur(int blur_level);
    423     int             getBlur(void);
    424     int             setDataLineCheck(int chk_dataline);
    425     int             getDataLineCheck(void);
    426     int             setDataLineCheckStop(void);
    427     int             setDefultIMEI(int imei);
    428     int             getDefultIMEI(void);
    429     const __u8*     getCameraSensorName(void);
    430     int             previewPoll(bool preview);
    431 #ifdef ENABLE_ESD_PREVIEW_CHECK
    432     int             getCameraSensorESDStatus(void);
    433 #endif // ENABLE_ESD_PREVIEW_CHECK
    434 
    435     int setFrameRate(int frame_rate);
    436     unsigned char*  getJpeg(int*, unsigned int*);
    437     int             getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
    438                                         unsigned int *output_size);
    439     int             getExif(unsigned char *pExifDst, unsigned char *pThumbSrc);
    440 
    441     void            getPostViewConfig(int*, int*, int*);
    442     void            getThumbnailConfig(int *width, int *height, int *size);
    443 
    444     int             getPostViewOffset(void);
    445     int             getCameraFd(void);
    446     int             getJpegFd(void);
    447     void            SetJpgAddr(unsigned char *addr);
    448     unsigned int    getPhyAddrY(int);
    449     unsigned int    getPhyAddrC(int);
    450     void            pausePreview();
    451     int             initCamera(int index);
    452     void            DeinitCamera();
    453     static void     setJpegRatio(double ratio)
    454     {
    455         if((ratio < 0) || (ratio > 1))
    456             return;
    457 
    458         jpeg_ratio = ratio;
    459     }
    460 
    461     static double   getJpegRatio()
    462     {
    463         return jpeg_ratio;
    464     }
    465 
    466     static void     setInterleaveDataSize(int x)
    467     {
    468         interleaveDataSize = x;
    469     }
    470 
    471     static int      getInterleaveDataSize()
    472     {
    473         return interleaveDataSize;
    474     }
    475 
    476     static void     setJpegLineLength(int x)
    477     {
    478         jpegLineLength = x;
    479     }
    480 
    481     static int      getJpegLineLength()
    482     {
    483         return jpegLineLength;
    484     }
    485 
    486 
    487 private:
    488     v4l2_streamparm m_streamparm;
    489     struct sec_cam_parm   *m_params;
    490     int             m_flag_init;
    491 
    492     int             m_camera_id;
    493 
    494     int             m_cam_fd;
    495 
    496     int             m_cam_fd2;
    497     struct pollfd   m_events_c2;
    498     int             m_flag_record_start;
    499 
    500     int             m_preview_v4lformat;
    501     int             m_preview_width;
    502     int             m_preview_height;
    503     int             m_preview_max_width;
    504     int             m_preview_max_height;
    505 
    506     int             m_snapshot_v4lformat;
    507     int             m_snapshot_width;
    508     int             m_snapshot_height;
    509     int             m_snapshot_max_width;
    510     int             m_snapshot_max_height;
    511 
    512     int             m_angle;
    513     int             m_anti_banding;
    514     int             m_wdr;
    515     int             m_anti_shake;
    516     int             m_zoom_level;
    517     int             m_object_tracking;
    518     int             m_smart_auto;
    519     int             m_beauty_shot;
    520     int             m_vintage_mode;
    521     int             m_face_detect;
    522     int             m_object_tracking_start_stop;
    523     int             m_recording_width;
    524     int             m_recording_height;
    525     bool            m_gps_enabled;
    526     long            m_gps_latitude;  /* degrees * 1e7 */
    527     long            m_gps_longitude; /* degrees * 1e7 */
    528     long            m_gps_altitude;  /* metres * 100 */
    529     long            m_gps_timestamp;
    530     int             m_vtmode;
    531     int             m_sensor_mode; /*Camcorder fix fps */
    532     int             m_shot_mode; /* Shot mode */
    533     int             m_exif_orientation;
    534     int             m_blur_level;
    535     int             m_chk_dataline;
    536     int             m_video_gamma;
    537     int             m_slow_ae;
    538     int             m_caf_on_off;
    539     int             m_default_imei;
    540     int             m_camera_af_flag;
    541 
    542     int             m_flag_camera_start;
    543 
    544     int             m_jpeg_fd;
    545     int             m_jpeg_thumbnail_width;
    546     int             m_jpeg_thumbnail_height;
    547     int             m_jpeg_quality;
    548 
    549     int             m_postview_offset;
    550 
    551 #ifdef ENABLE_ESD_PREVIEW_CHECK
    552     int             m_esd_check_count;
    553 #endif // ENABLE_ESD_PREVIEW_CHECK
    554 
    555     exif_attribute_t mExifInfo;
    556 
    557     struct fimc_buffer m_capture_buf;
    558     struct pollfd   m_events_c;
    559 
    560     inline int      m_frameSize(int format, int width, int height);
    561 
    562     void            setExifChangedAttribute();
    563     void            setExifFixedAttribute();
    564     void            resetCamera();
    565 
    566     static double   jpeg_ratio;
    567     static int      interleaveDataSize;
    568     static int      jpegLineLength;
    569 };
    570 
    571 extern unsigned long measure_time(struct timeval *start, struct timeval *stop);
    572 
    573 }; // namespace android
    574 
    575 #endif // ANDROID_HARDWARE_CAMERA_SEC_H
    576