Home | History | Annotate | Download | only in libcamera
      1 /*
      2  * Copyright 2008, The Android Open Source Project
      3  * Copyright 2010, Samsung Electronics Co. LTD
      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 
     18 /*
     19 ************************************
     20 * Filename: SecCamera.cpp
     21 * Author:   Sachin P. Kamat
     22 * Purpose:  This file interacts with the Camera and JPEG drivers.
     23 *************************************
     24 */
     25 
     26 //#define LOG_NDEBUG 0
     27 #define LOG_TAG "SecCamera"
     28 
     29 #include <utils/Log.h>
     30 
     31 #include <math.h>
     32 #include <string.h>
     33 #include <stdlib.h>
     34 #include <sys/poll.h>
     35 #include "SecCamera.h"
     36 #include "cutils/properties.h"
     37 
     38 using namespace android;
     39 
     40 #define CHECK(return_value)                                          \
     41     if (return_value < 0) {                                          \
     42         LOGE("%s::%d fail. errno: %s, m_camera_id = %d\n",           \
     43              __func__, __LINE__, strerror(errno), m_camera_id);      \
     44         return -1;                                                   \
     45     }
     46 
     47 
     48 #define CHECK_PTR(return_value)                                      \
     49     if (return_value < 0) {                                          \
     50         LOGE("%s::%d fail, errno: %s, m_camera_id = %d\n",           \
     51              __func__,__LINE__, strerror(errno), m_camera_id);       \
     52         return NULL;                                                 \
     53     }
     54 
     55 #define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
     56 #define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
     57 #define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
     58 
     59 namespace android {
     60 
     61 // ======================================================================
     62 // Camera controls
     63 
     64 static struct timeval time_start;
     65 static struct timeval time_stop;
     66 
     67 unsigned long measure_time(struct timeval *start, struct timeval *stop)
     68 {
     69     unsigned long sec, usec, time;
     70 
     71     sec = stop->tv_sec - start->tv_sec;
     72 
     73     if (stop->tv_usec >= start->tv_usec) {
     74         usec = stop->tv_usec - start->tv_usec;
     75     } else {
     76         usec = stop->tv_usec + 1000000 - start->tv_usec;
     77         sec--;
     78     }
     79 
     80     time = (sec * 1000000) + usec;
     81 
     82     return time;
     83 }
     84 
     85 static int get_pixel_depth(unsigned int fmt)
     86 {
     87     int depth = 0;
     88 
     89     switch (fmt) {
     90     case V4L2_PIX_FMT_NV12:
     91         depth = 12;
     92         break;
     93     case V4L2_PIX_FMT_NV12T:
     94         depth = 12;
     95         break;
     96     case V4L2_PIX_FMT_NV21:
     97         depth = 12;
     98         break;
     99     case V4L2_PIX_FMT_YUV420:
    100         depth = 12;
    101         break;
    102 
    103     case V4L2_PIX_FMT_RGB565:
    104     case V4L2_PIX_FMT_YUYV:
    105     case V4L2_PIX_FMT_YVYU:
    106     case V4L2_PIX_FMT_UYVY:
    107     case V4L2_PIX_FMT_VYUY:
    108     case V4L2_PIX_FMT_NV16:
    109     case V4L2_PIX_FMT_NV61:
    110     case V4L2_PIX_FMT_YUV422P:
    111         depth = 16;
    112         break;
    113 
    114     case V4L2_PIX_FMT_RGB32:
    115         depth = 32;
    116         break;
    117     }
    118 
    119     return depth;
    120 }
    121 
    122 #define ALIGN_W(x)      (((x) + 0x7F) & (~0x7F))    // Set as multiple of 128
    123 #define ALIGN_H(x)      (((x) + 0x1F) & (~0x1F))    // Set as multiple of 32
    124 #define ALIGN_BUF(x)    (((x) + 0x1FFF)& (~0x1FFF)) // Set as multiple of 8K
    125 
    126 static int fimc_poll(struct pollfd *events)
    127 {
    128     int ret;
    129 
    130     /* 10 second delay is because sensor can take a long time
    131      * to do auto focus and capture in dark settings
    132      */
    133     ret = poll(events, 1, 10000);
    134     if (ret < 0) {
    135         LOGE("ERR(%s):poll error\n", __func__);
    136         return ret;
    137     }
    138 
    139     if (ret == 0) {
    140         LOGE("ERR(%s):No data in 10 secs..\n", __func__);
    141         return ret;
    142     }
    143 
    144     return ret;
    145 }
    146 
    147 int SecCamera::previewPoll(bool preview)
    148 {
    149     int ret;
    150 
    151     if (preview) {
    152 #ifdef ENABLE_ESD_PREVIEW_CHECK
    153         int status = 0;
    154 
    155         if (!(++m_esd_check_count % 60)) {
    156             status = getCameraSensorESDStatus();
    157             m_esd_check_count = 0;
    158             if (status) {
    159                LOGE("ERR(%s) ESD status(%d)", __func__, status);
    160                return status;
    161             }
    162         }
    163 #endif
    164 
    165         ret = poll(&m_events_c, 1, 1000);
    166     } else {
    167         ret = poll(&m_events_c2, 1, 1000);
    168     }
    169 
    170     if (ret < 0) {
    171         LOGE("ERR(%s):poll error\n", __func__);
    172         return ret;
    173     }
    174 
    175     if (ret == 0) {
    176         LOGE("ERR(%s):No data in 1 secs.. Camera Device Reset \n", __func__);
    177         return ret;
    178     }
    179 
    180     return ret;
    181 }
    182 
    183 static int fimc_v4l2_querycap(int fp)
    184 {
    185     struct v4l2_capability cap;
    186     int ret = 0;
    187 
    188     ret = ioctl(fp, VIDIOC_QUERYCAP, &cap);
    189 
    190     if (ret < 0) {
    191         LOGE("ERR(%s):VIDIOC_QUERYCAP failed\n", __func__);
    192         return -1;
    193     }
    194 
    195     if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
    196         LOGE("ERR(%s):no capture devices\n", __func__);
    197         return -1;
    198     }
    199 
    200     return ret;
    201 }
    202 
    203 static const __u8* fimc_v4l2_enuminput(int fp, int index)
    204 {
    205     static struct v4l2_input input;
    206 
    207     input.index = index;
    208     if (ioctl(fp, VIDIOC_ENUMINPUT, &input) != 0) {
    209         LOGE("ERR(%s):No matching index found\n", __func__);
    210         return NULL;
    211     }
    212     LOGI("Name of input channel[%d] is %s\n", input.index, input.name);
    213 
    214     return input.name;
    215 }
    216 
    217 
    218 static int fimc_v4l2_s_input(int fp, int index)
    219 {
    220     struct v4l2_input input;
    221     int ret;
    222 
    223     input.index = index;
    224 
    225     ret = ioctl(fp, VIDIOC_S_INPUT, &input);
    226     if (ret < 0) {
    227         LOGE("ERR(%s):VIDIOC_S_INPUT failed\n", __func__);
    228         return ret;
    229     }
    230 
    231     return ret;
    232 }
    233 
    234 static int fimc_v4l2_s_fmt(int fp, int width, int height, unsigned int fmt, int flag_capture)
    235 {
    236     struct v4l2_format v4l2_fmt;
    237     struct v4l2_pix_format pixfmt;
    238     int ret;
    239 
    240     v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    241 
    242     memset(&pixfmt, 0, sizeof(pixfmt));
    243 
    244     pixfmt.width = width;
    245     pixfmt.height = height;
    246     pixfmt.pixelformat = fmt;
    247 
    248     pixfmt.sizeimage = (width * height * get_pixel_depth(fmt)) / 8;
    249 
    250     pixfmt.field = V4L2_FIELD_NONE;
    251 
    252     v4l2_fmt.fmt.pix = pixfmt;
    253 
    254     /* Set up for capture */
    255     ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt);
    256     if (ret < 0) {
    257         LOGE("ERR(%s):VIDIOC_S_FMT failed\n", __func__);
    258         return -1;
    259     }
    260 
    261     return 0;
    262 }
    263 
    264 static int fimc_v4l2_s_fmt_cap(int fp, int width, int height, unsigned int fmt)
    265 {
    266     struct v4l2_format v4l2_fmt;
    267     struct v4l2_pix_format pixfmt;
    268     int ret;
    269 
    270     memset(&pixfmt, 0, sizeof(pixfmt));
    271 
    272     v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    273 
    274     pixfmt.width = width;
    275     pixfmt.height = height;
    276     pixfmt.pixelformat = fmt;
    277     if (fmt == V4L2_PIX_FMT_JPEG) {
    278         pixfmt.colorspace = V4L2_COLORSPACE_JPEG;
    279     }
    280 
    281     pixfmt.sizeimage = (width * height * get_pixel_depth(fmt)) / 8;
    282 
    283     v4l2_fmt.fmt.pix = pixfmt;
    284 
    285     //LOGE("ori_w %d, ori_h %d, w %d, h %d\n", width, height, v4l2_fmt.fmt.pix.width, v4l2_fmt.fmt.pix.height);
    286 
    287     /* Set up for capture */
    288     ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt);
    289     if (ret < 0) {
    290         LOGE("ERR(%s):VIDIOC_S_FMT failed\n", __func__);
    291         return ret;
    292     }
    293 
    294     return ret;
    295 }
    296 
    297 static int fimc_v4l2_enum_fmt(int fp, unsigned int fmt)
    298 {
    299     struct v4l2_fmtdesc fmtdesc;
    300     int found = 0;
    301 
    302     fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    303     fmtdesc.index = 0;
    304 
    305     while (ioctl(fp, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
    306         if (fmtdesc.pixelformat == fmt) {
    307             LOGV("passed fmt = %#x found pixel format[%d]: %s\n", fmt, fmtdesc.index, fmtdesc.description);
    308             found = 1;
    309             break;
    310         }
    311 
    312         fmtdesc.index++;
    313     }
    314 
    315     if (!found) {
    316         LOGE("unsupported pixel format\n");
    317         return -1;
    318     }
    319 
    320     return 0;
    321 }
    322 
    323 static int fimc_v4l2_reqbufs(int fp, enum v4l2_buf_type type, int nr_bufs)
    324 {
    325     struct v4l2_requestbuffers req;
    326     int ret;
    327 
    328     req.count = nr_bufs;
    329     req.type = type;
    330     req.memory = V4L2_MEMORY_MMAP;
    331 
    332     ret = ioctl(fp, VIDIOC_REQBUFS, &req);
    333     if (ret < 0) {
    334         LOGE("ERR(%s):VIDIOC_REQBUFS failed\n", __func__);
    335         return -1;
    336     }
    337 
    338     return req.count;
    339 }
    340 
    341 static int fimc_v4l2_querybuf(int fp, struct fimc_buffer *buffer, enum v4l2_buf_type type)
    342 {
    343     struct v4l2_buffer v4l2_buf;
    344     int ret;
    345 
    346     LOGI("%s :", __func__);
    347 
    348     v4l2_buf.type = type;
    349     v4l2_buf.memory = V4L2_MEMORY_MMAP;
    350     v4l2_buf.index = 0;
    351 
    352     ret = ioctl(fp , VIDIOC_QUERYBUF, &v4l2_buf);
    353     if (ret < 0) {
    354         LOGE("ERR(%s):VIDIOC_QUERYBUF failed\n", __func__);
    355         return -1;
    356     }
    357 
    358     buffer->length = v4l2_buf.length;
    359     if ((buffer->start = (char *)mmap(0, v4l2_buf.length,
    360                                          PROT_READ | PROT_WRITE, MAP_SHARED,
    361                                          fp, v4l2_buf.m.offset)) < 0) {
    362          LOGE("%s %d] mmap() failed\n",__func__, __LINE__);
    363          return -1;
    364     }
    365 
    366     LOGI("%s: buffer->start = %p v4l2_buf.length = %d",
    367          __func__, buffer->start, v4l2_buf.length);
    368 
    369     return 0;
    370 }
    371 
    372 static int fimc_v4l2_streamon(int fp)
    373 {
    374     enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    375     int ret;
    376 
    377     ret = ioctl(fp, VIDIOC_STREAMON, &type);
    378     if (ret < 0) {
    379         LOGE("ERR(%s):VIDIOC_STREAMON failed\n", __func__);
    380         return ret;
    381     }
    382 
    383     return ret;
    384 }
    385 
    386 static int fimc_v4l2_streamoff(int fp)
    387 {
    388     enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    389     int ret;
    390 
    391     LOGV("%s :", __func__);
    392     ret = ioctl(fp, VIDIOC_STREAMOFF, &type);
    393     if (ret < 0) {
    394         LOGE("ERR(%s):VIDIOC_STREAMOFF failed\n", __func__);
    395         return ret;
    396     }
    397 
    398     return ret;
    399 }
    400 
    401 static int fimc_v4l2_qbuf(int fp, int index)
    402 {
    403     struct v4l2_buffer v4l2_buf;
    404     int ret;
    405 
    406     v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    407     v4l2_buf.memory = V4L2_MEMORY_MMAP;
    408     v4l2_buf.index = index;
    409 
    410     ret = ioctl(fp, VIDIOC_QBUF, &v4l2_buf);
    411     if (ret < 0) {
    412         LOGE("ERR(%s):VIDIOC_QBUF failed\n", __func__);
    413         return ret;
    414     }
    415 
    416     return 0;
    417 }
    418 
    419 static int fimc_v4l2_dqbuf(int fp)
    420 {
    421     struct v4l2_buffer v4l2_buf;
    422     int ret;
    423 
    424     v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    425     v4l2_buf.memory = V4L2_MEMORY_MMAP;
    426 
    427     ret = ioctl(fp, VIDIOC_DQBUF, &v4l2_buf);
    428     if (ret < 0) {
    429         LOGE("ERR(%s):VIDIOC_DQBUF failed, dropped frame\n", __func__);
    430         return ret;
    431     }
    432 
    433     return v4l2_buf.index;
    434 }
    435 
    436 static int fimc_v4l2_g_ctrl(int fp, unsigned int id)
    437 {
    438     struct v4l2_control ctrl;
    439     int ret;
    440 
    441     ctrl.id = id;
    442 
    443     ret = ioctl(fp, VIDIOC_G_CTRL, &ctrl);
    444     if (ret < 0) {
    445         LOGE("ERR(%s): VIDIOC_G_CTRL(id = 0x%x (%d)) failed, ret = %d\n",
    446              __func__, id, id-V4L2_CID_PRIVATE_BASE, ret);
    447         return ret;
    448     }
    449 
    450     return ctrl.value;
    451 }
    452 
    453 static int fimc_v4l2_s_ctrl(int fp, unsigned int id, unsigned int value)
    454 {
    455     struct v4l2_control ctrl;
    456     int ret;
    457 
    458     ctrl.id = id;
    459     ctrl.value = value;
    460 
    461     ret = ioctl(fp, VIDIOC_S_CTRL, &ctrl);
    462     if (ret < 0) {
    463         LOGE("ERR(%s):VIDIOC_S_CTRL(id = %#x (%d), value = %d) failed ret = %d\n",
    464              __func__, id, id-V4L2_CID_PRIVATE_BASE, value, ret);
    465 
    466         return ret;
    467     }
    468 
    469     return ctrl.value;
    470 }
    471 
    472 static int fimc_v4l2_s_ext_ctrl(int fp, unsigned int id, void *value)
    473 {
    474     struct v4l2_ext_controls ctrls;
    475     struct v4l2_ext_control ctrl;
    476     int ret;
    477 
    478     ctrl.id = id;
    479     ctrl.reserved = value;
    480 
    481     ctrls.ctrl_class = V4L2_CTRL_CLASS_CAMERA;
    482     ctrls.count = 1;
    483     ctrls.controls = &ctrl;
    484 
    485     ret = ioctl(fp, VIDIOC_S_EXT_CTRLS, &ctrls);
    486     if (ret < 0)
    487         LOGE("ERR(%s):VIDIOC_S_EXT_CTRLS failed\n", __func__);
    488 
    489     return ret;
    490 }
    491 
    492 static int fimc_v4l2_g_parm(int fp, struct v4l2_streamparm *streamparm)
    493 {
    494     int ret;
    495 
    496     streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    497 
    498     ret = ioctl(fp, VIDIOC_G_PARM, streamparm);
    499     if (ret < 0) {
    500         LOGE("ERR(%s):VIDIOC_G_PARM failed\n", __func__);
    501         return -1;
    502     }
    503 
    504     LOGV("%s : timeperframe: numerator %d, denominator %d\n", __func__,
    505             streamparm->parm.capture.timeperframe.numerator,
    506             streamparm->parm.capture.timeperframe.denominator);
    507 
    508     return 0;
    509 }
    510 
    511 static int fimc_v4l2_s_parm(int fp, struct v4l2_streamparm *streamparm)
    512 {
    513     int ret;
    514 
    515     streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    516 
    517     ret = ioctl(fp, VIDIOC_S_PARM, streamparm);
    518     if (ret < 0) {
    519         LOGE("ERR(%s):VIDIOC_S_PARM failed\n", __func__);
    520         return ret;
    521     }
    522 
    523     return 0;
    524 }
    525 
    526 // ======================================================================
    527 // Constructor & Destructor
    528 
    529 SecCamera::SecCamera() :
    530             m_flag_init(0),
    531             m_camera_id(CAMERA_ID_BACK),
    532             m_cam_fd(-1),
    533             m_cam_fd2(-1),
    534             m_preview_v4lformat(V4L2_PIX_FMT_NV21),
    535             m_preview_width      (0),
    536             m_preview_height     (0),
    537             m_preview_max_width  (MAX_BACK_CAMERA_PREVIEW_WIDTH),
    538             m_preview_max_height (MAX_BACK_CAMERA_PREVIEW_HEIGHT),
    539             m_snapshot_v4lformat(-1),
    540             m_snapshot_width      (0),
    541             m_snapshot_height     (0),
    542             m_snapshot_max_width  (MAX_BACK_CAMERA_SNAPSHOT_WIDTH),
    543             m_snapshot_max_height (MAX_BACK_CAMERA_SNAPSHOT_HEIGHT),
    544             m_angle(-1),
    545             m_anti_banding(-1),
    546             m_wdr(-1),
    547             m_anti_shake(-1),
    548             m_zoom_level(-1),
    549             m_object_tracking(-1),
    550             m_smart_auto(-1),
    551             m_beauty_shot(-1),
    552             m_vintage_mode(-1),
    553             m_face_detect(-1),
    554             m_gps_enabled(false),
    555             m_gps_latitude(-1),
    556             m_gps_longitude(-1),
    557             m_gps_altitude(-1),
    558             m_gps_timestamp(-1),
    559             m_vtmode(0),
    560             m_sensor_mode(-1),
    561             m_shot_mode(-1),
    562             m_exif_orientation(-1),
    563             m_blur_level(-1),
    564             m_chk_dataline(-1),
    565             m_video_gamma(-1),
    566             m_slow_ae(-1),
    567             m_camera_af_flag(-1),
    568             m_flag_camera_start(0),
    569             m_jpeg_thumbnail_width (0),
    570             m_jpeg_thumbnail_height(0),
    571             m_jpeg_quality(100)
    572 #ifdef ENABLE_ESD_PREVIEW_CHECK
    573             ,
    574             m_esd_check_count(0)
    575 #endif // ENABLE_ESD_PREVIEW_CHECK
    576 {
    577     m_params = (struct sec_cam_parm*)&m_streamparm.parm.raw_data;
    578     struct v4l2_captureparm capture;
    579     m_params->capture.timeperframe.numerator = 1;
    580     m_params->capture.timeperframe.denominator = 0;
    581     m_params->contrast = -1;
    582     m_params->effects = -1;
    583     m_params->brightness = -1;
    584     m_params->flash_mode = -1;
    585     m_params->focus_mode = -1;
    586     m_params->iso = -1;
    587     m_params->metering = -1;
    588     m_params->saturation = -1;
    589     m_params->scene_mode = -1;
    590     m_params->sharpness = -1;
    591     m_params->white_balance = -1;
    592 
    593     memset(&m_capture_buf, 0, sizeof(m_capture_buf));
    594 
    595     LOGV("%s :", __func__);
    596 }
    597 
    598 SecCamera::~SecCamera()
    599 {
    600     LOGV("%s :", __func__);
    601 }
    602 
    603 int SecCamera::initCamera(int index)
    604 {
    605     LOGV("%s :", __func__);
    606     int ret = 0;
    607 
    608     if (!m_flag_init) {
    609         /* Arun C
    610          * Reset the lense position only during camera starts; don't do
    611          * reset between shot to shot
    612          */
    613         m_camera_af_flag = -1;
    614 
    615         m_cam_fd = open(CAMERA_DEV_NAME, O_RDWR);
    616         if (m_cam_fd < 0) {
    617             LOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME, strerror(errno));
    618             return -1;
    619         }
    620         LOGV("%s: open(%s) --> m_cam_fd %d", __FUNCTION__, CAMERA_DEV_NAME, m_cam_fd);
    621 
    622         LOGE("initCamera: m_cam_fd(%d), m_jpeg_fd(%d)", m_cam_fd, m_jpeg_fd);
    623 
    624         ret = fimc_v4l2_querycap(m_cam_fd);
    625         CHECK(ret);
    626         if (!fimc_v4l2_enuminput(m_cam_fd, index))
    627             return -1;
    628         ret = fimc_v4l2_s_input(m_cam_fd, index);
    629         CHECK(ret);
    630 
    631         m_cam_fd2 = open(CAMERA_DEV_NAME2, O_RDWR);
    632         LOGV("%s: open(%s) --> m_cam_fd2 = %d", __FUNCTION__, CAMERA_DEV_NAME2, m_cam_fd2);
    633         if (m_cam_fd2 < 0) {
    634             LOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME2, strerror(errno));
    635             return -1;
    636         }
    637 
    638         LOGE("initCamera: m_cam_fd2(%d)", m_cam_fd2);
    639 
    640         ret = fimc_v4l2_querycap(m_cam_fd2);
    641         CHECK(ret);
    642         if (!fimc_v4l2_enuminput(m_cam_fd2, index))
    643             return -1;
    644         ret = fimc_v4l2_s_input(m_cam_fd2, index);
    645         CHECK(ret);
    646 
    647         m_camera_id = index;
    648 
    649         switch (m_camera_id) {
    650         case CAMERA_ID_FRONT:
    651             m_preview_max_width   = MAX_FRONT_CAMERA_PREVIEW_WIDTH;
    652             m_preview_max_height  = MAX_FRONT_CAMERA_PREVIEW_HEIGHT;
    653             m_snapshot_max_width  = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
    654             m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
    655             break;
    656 
    657         case CAMERA_ID_BACK:
    658             m_preview_max_width   = MAX_BACK_CAMERA_PREVIEW_WIDTH;
    659             m_preview_max_height  = MAX_BACK_CAMERA_PREVIEW_HEIGHT;
    660             m_snapshot_max_width  = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
    661             m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
    662             break;
    663         }
    664 
    665         setExifFixedAttribute();
    666 
    667         m_flag_init = 1;
    668         LOGI("%s : initialized", __FUNCTION__);
    669     }
    670     return 0;
    671 }
    672 
    673 void SecCamera::resetCamera()
    674 {
    675     LOGV("%s :", __func__);
    676     DeinitCamera();
    677     initCamera(m_camera_id);
    678 }
    679 
    680 void SecCamera::DeinitCamera()
    681 {
    682     LOGV("%s :", __func__);
    683 
    684     if (m_flag_init) {
    685 
    686         stopRecord();
    687 
    688         /* close m_cam_fd after stopRecord() because stopRecord()
    689          * uses m_cam_fd to change frame rate
    690          */
    691         LOGI("DeinitCamera: m_cam_fd(%d)", m_cam_fd);
    692         if (m_cam_fd > -1) {
    693             close(m_cam_fd);
    694             m_cam_fd = -1;
    695         }
    696 
    697         LOGI("DeinitCamera: m_cam_fd2(%d)", m_cam_fd2);
    698         if (m_cam_fd2 > -1) {
    699             close(m_cam_fd2);
    700             m_cam_fd2 = -1;
    701         }
    702 
    703         m_flag_init = 0;
    704     }
    705     else LOGI("%s : already deinitialized", __FUNCTION__);
    706 }
    707 
    708 
    709 int SecCamera::getCameraFd(void)
    710 {
    711     return m_cam_fd;
    712 }
    713 
    714 // ======================================================================
    715 // Preview
    716 
    717 int SecCamera::startPreview(void)
    718 {
    719     v4l2_streamparm streamparm;
    720     struct sec_cam_parm *parms;
    721     parms = (struct sec_cam_parm*)&streamparm.parm.raw_data;
    722     LOGV("%s :", __func__);
    723 
    724     // aleady started
    725     if (m_flag_camera_start > 0) {
    726         LOGE("ERR(%s):Preview was already started\n", __func__);
    727         return 0;
    728     }
    729 
    730     if (m_cam_fd <= 0) {
    731         LOGE("ERR(%s):Camera was closed\n", __func__);
    732         return -1;
    733     }
    734 
    735     memset(&m_events_c, 0, sizeof(m_events_c));
    736     m_events_c.fd = m_cam_fd;
    737     m_events_c.events = POLLIN | POLLERR;
    738 
    739     /* enum_fmt, s_fmt sample */
    740     int ret = fimc_v4l2_enum_fmt(m_cam_fd,m_preview_v4lformat);
    741     CHECK(ret);
    742     ret = fimc_v4l2_s_fmt(m_cam_fd, m_preview_width,m_preview_height,m_preview_v4lformat, 0);
    743     CHECK(ret);
    744 
    745     ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
    746     CHECK(ret);
    747 
    748     LOGV("%s : m_preview_width: %d m_preview_height: %d m_angle: %d\n",
    749             __func__, m_preview_width, m_preview_height, m_angle);
    750 
    751     ret = fimc_v4l2_s_ctrl(m_cam_fd,
    752                            V4L2_CID_CAMERA_CHECK_DATALINE, m_chk_dataline);
    753     CHECK(ret);
    754 
    755     if (m_camera_id == CAMERA_ID_FRONT) {
    756         /* VT mode setting */
    757         ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_VT_MODE, m_vtmode);
    758         CHECK(ret);
    759     }
    760 
    761     /* start with all buffers in queue */
    762     for (int i = 0; i < MAX_BUFFERS; i++) {
    763         ret = fimc_v4l2_qbuf(m_cam_fd, i);
    764         CHECK(ret);
    765     }
    766 
    767     ret = fimc_v4l2_streamon(m_cam_fd);
    768     CHECK(ret);
    769 
    770     m_flag_camera_start = 1;
    771 
    772     ret = fimc_v4l2_s_parm(m_cam_fd, &m_streamparm);
    773     CHECK(ret);
    774 
    775     if (m_camera_id == CAMERA_ID_FRONT) {
    776         /* Blur setting */
    777         LOGV("m_blur_level = %d", m_blur_level);
    778         ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_VGA_BLUR,
    779                                m_blur_level);
    780         CHECK(ret);
    781     }
    782 
    783     // It is a delay for a new frame, not to show the previous bigger ugly picture frame.
    784     ret = fimc_poll(&m_events_c);
    785     CHECK(ret);
    786     ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_RETURN_FOCUS, 0);
    787     CHECK(ret);
    788 
    789     LOGV("%s: got the first frame of the preview\n", __func__);
    790 
    791     return 0;
    792 }
    793 
    794 int SecCamera::stopPreview(void)
    795 {
    796     int ret;
    797 
    798     LOGV("%s :", __func__);
    799 
    800     if (m_flag_camera_start == 0) {
    801         LOGW("%s: doing nothing because m_flag_camera_start is zero", __func__);
    802         return 0;
    803     }
    804 
    805     if (m_params->flash_mode == FLASH_MODE_TORCH)
    806         setFlashMode(FLASH_MODE_OFF);
    807 
    808     if (m_cam_fd <= 0) {
    809         LOGE("ERR(%s):Camera was closed\n", __func__);
    810         return -1;
    811     }
    812 
    813     ret = fimc_v4l2_streamoff(m_cam_fd);
    814     CHECK(ret);
    815 
    816     m_flag_camera_start = 0;
    817 
    818     return ret;
    819 }
    820 
    821 //Recording
    822 int SecCamera::startRecord(void)
    823 {
    824     int ret, i;
    825 
    826     LOGV("%s :", __func__);
    827 
    828     // aleady started
    829     if (m_flag_record_start > 0) {
    830         LOGE("ERR(%s):Preview was already started\n", __func__);
    831         return 0;
    832     }
    833 
    834     if (m_cam_fd2 <= 0) {
    835         LOGE("ERR(%s):Camera was closed\n", __func__);
    836         return -1;
    837     }
    838 
    839     /* enum_fmt, s_fmt sample */
    840     ret = fimc_v4l2_enum_fmt(m_cam_fd2, V4L2_PIX_FMT_NV12T);
    841     CHECK(ret);
    842 
    843     LOGI("%s: m_recording_width = %d, m_recording_height = %d\n",
    844          __func__, m_recording_width, m_recording_height);
    845 
    846     ret = fimc_v4l2_s_fmt(m_cam_fd2, m_recording_width,
    847                           m_recording_height, V4L2_PIX_FMT_NV12T, 0);
    848     CHECK(ret);
    849 
    850     ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
    851                             m_params->capture.timeperframe.denominator);
    852     CHECK(ret);
    853 
    854     ret = fimc_v4l2_reqbufs(m_cam_fd2, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
    855     CHECK(ret);
    856 
    857     /* start with all buffers in queue */
    858     for (i = 0; i < MAX_BUFFERS; i++) {
    859         ret = fimc_v4l2_qbuf(m_cam_fd2, i);
    860         CHECK(ret);
    861     }
    862 
    863     ret = fimc_v4l2_streamon(m_cam_fd2);
    864     CHECK(ret);
    865 
    866     // Get and throw away the first frame since it is often garbled.
    867     memset(&m_events_c2, 0, sizeof(m_events_c2));
    868     m_events_c2.fd = m_cam_fd2;
    869     m_events_c2.events = POLLIN | POLLERR;
    870     ret = fimc_poll(&m_events_c2);
    871     CHECK(ret);
    872 
    873     m_flag_record_start = 1;
    874 
    875     return 0;
    876 }
    877 
    878 int SecCamera::stopRecord(void)
    879 {
    880     int ret;
    881 
    882     LOGV("%s :", __func__);
    883 
    884     if (m_flag_record_start == 0) {
    885         LOGW("%s: doing nothing because m_flag_record_start is zero", __func__);
    886         return 0;
    887     }
    888 
    889     if (m_cam_fd2 <= 0) {
    890         LOGE("ERR(%s):Camera was closed\n", __func__);
    891         return -1;
    892     }
    893 
    894     m_flag_record_start = 0;
    895 
    896     ret = fimc_v4l2_streamoff(m_cam_fd2);
    897     CHECK(ret);
    898 
    899     ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
    900                             FRAME_RATE_AUTO);
    901     CHECK(ret);
    902 
    903     return 0;
    904 }
    905 
    906 unsigned int SecCamera::getRecPhyAddrY(int index)
    907 {
    908     unsigned int addr_y;
    909 
    910     addr_y = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_Y, index);
    911     CHECK((int)addr_y);
    912     return addr_y;
    913 }
    914 
    915 unsigned int SecCamera::getRecPhyAddrC(int index)
    916 {
    917     unsigned int addr_c;
    918 
    919     addr_c = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_CBCR, index);
    920     CHECK((int)addr_c);
    921     return addr_c;
    922 }
    923 
    924 unsigned int SecCamera::getPhyAddrY(int index)
    925 {
    926     unsigned int addr_y;
    927 
    928     addr_y = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_Y, index);
    929     CHECK((int)addr_y);
    930     return addr_y;
    931 }
    932 
    933 unsigned int SecCamera::getPhyAddrC(int index)
    934 {
    935     unsigned int addr_c;
    936 
    937     addr_c = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_CBCR, index);
    938     CHECK((int)addr_c);
    939     return addr_c;
    940 }
    941 
    942 void SecCamera::pausePreview()
    943 {
    944     fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
    945 }
    946 
    947 int SecCamera::getPreview()
    948 {
    949     int index;
    950     int ret;
    951 
    952     if (m_flag_camera_start == 0 || previewPoll(true) == 0) {
    953         LOGE("ERR(%s):Start Camera Device Reset \n", __func__);
    954         /* GAUDI Project([arun.c (at) samsung.com]) 2010.05.20. [Implemented ESD code] */
    955         /*
    956          * When there is no data for more than 1 second from the camera we inform
    957          * the FIMC driver by calling fimc_v4l2_s_input() with a special value = 1000
    958          * FIMC driver identify that there is something wrong with the camera
    959          * and it restarts the sensor.
    960          */
    961         stopPreview();
    962         /* Reset Only Camera Device */
    963         ret = fimc_v4l2_querycap(m_cam_fd);
    964         CHECK(ret);
    965         if (fimc_v4l2_enuminput(m_cam_fd, m_camera_id))
    966             return -1;
    967         ret = fimc_v4l2_s_input(m_cam_fd, 1000);
    968         CHECK(ret);
    969         ret = startPreview();
    970         if (ret < 0) {
    971             LOGE("ERR(%s): startPreview() return %d\n", __func__, ret);
    972             return 0;
    973         }
    974     }
    975 
    976     index = fimc_v4l2_dqbuf(m_cam_fd);
    977     if (!(0 <= index && index < MAX_BUFFERS)) {
    978         LOGE("ERR(%s):wrong index = %d\n", __func__, index);
    979         return -1;
    980     }
    981 
    982     ret = fimc_v4l2_qbuf(m_cam_fd, index);
    983     CHECK(ret);
    984 
    985     return index;
    986 }
    987 
    988 int SecCamera::getRecordFrame()
    989 {
    990     if (m_flag_record_start == 0) {
    991         LOGE("%s: m_flag_record_start is 0", __func__);
    992         return -1;
    993     }
    994 
    995     previewPoll(false);
    996     return fimc_v4l2_dqbuf(m_cam_fd2);
    997 }
    998 
    999 int SecCamera::releaseRecordFrame(int index)
   1000 {
   1001     if (!m_flag_record_start) {
   1002         /* this can happen when recording frames are returned after
   1003          * the recording is stopped at the driver level.  we don't
   1004          * need to return the buffers in this case and we've seen
   1005          * cases where fimc could crash if we called qbuf and it
   1006          * wasn't expecting it.
   1007          */
   1008         LOGI("%s: recording not in progress, ignoring", __func__);
   1009         return 0;
   1010     }
   1011 
   1012     return fimc_v4l2_qbuf(m_cam_fd2, index);
   1013 }
   1014 
   1015 int SecCamera::setPreviewSize(int width, int height, int pixel_format)
   1016 {
   1017     LOGV("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format);
   1018 
   1019     int v4lpixelformat = pixel_format;
   1020 
   1021 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
   1022     if (v4lpixelformat == V4L2_PIX_FMT_YUV420)
   1023         LOGV("PreviewFormat:V4L2_PIX_FMT_YUV420");
   1024     else if (v4lpixelformat == V4L2_PIX_FMT_NV12)
   1025         LOGV("PreviewFormat:V4L2_PIX_FMT_NV12");
   1026     else if (v4lpixelformat == V4L2_PIX_FMT_NV12T)
   1027         LOGV("PreviewFormat:V4L2_PIX_FMT_NV12T");
   1028     else if (v4lpixelformat == V4L2_PIX_FMT_NV21)
   1029         LOGV("PreviewFormat:V4L2_PIX_FMT_NV21");
   1030     else if (v4lpixelformat == V4L2_PIX_FMT_YUV422P)
   1031         LOGV("PreviewFormat:V4L2_PIX_FMT_YUV422P");
   1032     else if (v4lpixelformat == V4L2_PIX_FMT_YUYV)
   1033         LOGV("PreviewFormat:V4L2_PIX_FMT_YUYV");
   1034     else if (v4lpixelformat == V4L2_PIX_FMT_RGB565)
   1035         LOGV("PreviewFormat:V4L2_PIX_FMT_RGB565");
   1036     else
   1037         LOGV("PreviewFormat:UnknownFormat");
   1038 #endif
   1039     m_preview_width  = width;
   1040     m_preview_height = height;
   1041     m_preview_v4lformat = v4lpixelformat;
   1042 
   1043     return 0;
   1044 }
   1045 
   1046 int SecCamera::getPreviewSize(int *width, int *height, int *frame_size)
   1047 {
   1048     *width  = m_preview_width;
   1049     *height = m_preview_height;
   1050     *frame_size = m_frameSize(m_preview_v4lformat, m_preview_width, m_preview_height);
   1051 
   1052     return 0;
   1053 }
   1054 
   1055 int SecCamera::getPreviewMaxSize(int *width, int *height)
   1056 {
   1057     *width  = m_preview_max_width;
   1058     *height = m_preview_max_height;
   1059 
   1060     return 0;
   1061 }
   1062 
   1063 int SecCamera::getPreviewPixelFormat(void)
   1064 {
   1065     return m_preview_v4lformat;
   1066 }
   1067 
   1068 
   1069 // ======================================================================
   1070 // Snapshot
   1071 /*
   1072  * Devide getJpeg() as two funcs, setSnapshotCmd() & getJpeg() because of the shutter sound timing.
   1073  * Here, just send the capture cmd to camera ISP to start JPEG capture.
   1074  */
   1075 int SecCamera::setSnapshotCmd(void)
   1076 {
   1077     LOGV("%s :", __func__);
   1078 
   1079     int ret = 0;
   1080 
   1081     LOG_TIME_DEFINE(0)
   1082     LOG_TIME_DEFINE(1)
   1083 
   1084     if (m_cam_fd <= 0) {
   1085         LOGE("ERR(%s):Camera was closed\n", __func__);
   1086         return 0;
   1087     }
   1088 
   1089     if (m_flag_camera_start > 0) {
   1090         LOG_TIME_START(0)
   1091         LOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
   1092         stopPreview();
   1093         LOG_TIME_END(0)
   1094     }
   1095 
   1096     memset(&m_events_c, 0, sizeof(m_events_c));
   1097     m_events_c.fd = m_cam_fd;
   1098     m_events_c.events = POLLIN | POLLERR;
   1099 
   1100     LOG_TIME_START(1) // prepare
   1101     int nframe = 1;
   1102 
   1103     ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
   1104     CHECK(ret);
   1105     ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, V4L2_PIX_FMT_JPEG);
   1106     CHECK(ret);
   1107     ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
   1108     CHECK(ret);
   1109     ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1110     CHECK(ret);
   1111 
   1112     ret = fimc_v4l2_qbuf(m_cam_fd, 0);
   1113     CHECK(ret);
   1114 
   1115     ret = fimc_v4l2_streamon(m_cam_fd);
   1116     CHECK(ret);
   1117     LOG_TIME_END(1)
   1118 
   1119     return 0;
   1120 }
   1121 
   1122 int SecCamera::endSnapshot(void)
   1123 {
   1124     int ret;
   1125 
   1126     LOGI("%s :", __func__);
   1127     if (m_capture_buf.start) {
   1128         munmap(m_capture_buf.start, m_capture_buf.length);
   1129         LOGI("munmap():virt. addr %p size = %d\n",
   1130              m_capture_buf.start, m_capture_buf.length);
   1131         m_capture_buf.start = NULL;
   1132         m_capture_buf.length = 0;
   1133     }
   1134     return 0;
   1135 }
   1136 
   1137 /*
   1138  * Set Jpeg quality & exif info and get JPEG data from camera ISP
   1139  */
   1140 unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr)
   1141 {
   1142     LOGV("%s :", __func__);
   1143 
   1144     int index, ret = 0;
   1145     unsigned char *addr;
   1146 
   1147     LOG_TIME_DEFINE(2)
   1148 
   1149     // capture
   1150     ret = fimc_poll(&m_events_c);
   1151     CHECK_PTR(ret);
   1152     index = fimc_v4l2_dqbuf(m_cam_fd);
   1153     if (index != 0) {
   1154         LOGE("ERR(%s):wrong index = %d\n", __func__, index);
   1155         return NULL;
   1156     }
   1157 
   1158     *jpeg_size = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_SIZE);
   1159     CHECK_PTR(*jpeg_size);
   1160 
   1161     int main_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_OFFSET);
   1162     CHECK_PTR(main_offset);
   1163     m_postview_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET);
   1164     CHECK_PTR(m_postview_offset);
   1165 
   1166     ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
   1167     CHECK_PTR(ret);
   1168     LOGV("\nsnapshot dqueued buffer = %d snapshot_width = %d snapshot_height = %d, size = %d\n\n",
   1169             index, m_snapshot_width, m_snapshot_height, *jpeg_size);
   1170 
   1171     addr = (unsigned char*)(m_capture_buf.start) + main_offset;
   1172     *phyaddr = getPhyAddrY(index) + m_postview_offset;
   1173 
   1174     LOG_TIME_START(2) // post
   1175     ret = fimc_v4l2_streamoff(m_cam_fd);
   1176     CHECK_PTR(ret);
   1177     LOG_TIME_END(2)
   1178 
   1179     return addr;
   1180 }
   1181 
   1182 int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc)
   1183 {
   1184     JpegEncoder jpgEnc;
   1185 
   1186     LOGV("%s : m_jpeg_thumbnail_width = %d, height = %d",
   1187          __func__, m_jpeg_thumbnail_width, m_jpeg_thumbnail_height);
   1188     if ((m_jpeg_thumbnail_width > 0) && (m_jpeg_thumbnail_height > 0)) {
   1189         int inFormat = JPG_MODESEL_YCBCR;
   1190         int outFormat = JPG_422;
   1191         switch (m_snapshot_v4lformat) {
   1192         case V4L2_PIX_FMT_NV12:
   1193         case V4L2_PIX_FMT_NV21:
   1194         case V4L2_PIX_FMT_NV12T:
   1195         case V4L2_PIX_FMT_YUV420:
   1196             outFormat = JPG_420;
   1197             break;
   1198         case V4L2_PIX_FMT_YUYV:
   1199         case V4L2_PIX_FMT_UYVY:
   1200         case V4L2_PIX_FMT_YUV422P:
   1201             outFormat = JPG_422;
   1202             break;
   1203         }
   1204 
   1205         if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
   1206             return -1;
   1207 
   1208         if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
   1209             return -1;
   1210 
   1211         if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_2) != JPG_SUCCESS)
   1212             return -1;
   1213 
   1214         int thumbWidth, thumbHeight, thumbSrcSize;
   1215         getThumbnailConfig(&thumbWidth, &thumbHeight, &thumbSrcSize);
   1216         if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, thumbWidth) != JPG_SUCCESS)
   1217             return -1;
   1218 
   1219         if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, thumbHeight) != JPG_SUCCESS)
   1220             return -1;
   1221 
   1222         char *pInBuf = (char *)jpgEnc.getInBuf(thumbSrcSize);
   1223         if (pInBuf == NULL)
   1224             return -1;
   1225         memcpy(pInBuf, pThumbSrc, thumbSrcSize);
   1226 
   1227         unsigned int thumbSize;
   1228 
   1229         jpgEnc.encode(&thumbSize, NULL);
   1230 
   1231         LOGV("%s : enableThumb set to true", __func__);
   1232         mExifInfo.enableThumb = true;
   1233     } else {
   1234         LOGV("%s : enableThumb set to false", __func__);
   1235         mExifInfo.enableThumb = false;
   1236     }
   1237 
   1238     unsigned int exifSize;
   1239 
   1240     setExifChangedAttribute();
   1241 
   1242     LOGV("%s: calling jpgEnc.makeExif, mExifInfo.width set to %d, height to %d\n",
   1243          __func__, mExifInfo.width, mExifInfo.height);
   1244 
   1245     jpgEnc.makeExif(pExifDst, &mExifInfo, &exifSize, true);
   1246 
   1247     return exifSize;
   1248 }
   1249 
   1250 void SecCamera::getPostViewConfig(int *width, int *height, int *size)
   1251 {
   1252     if (m_preview_width == 1024) {
   1253         *width = BACK_CAMERA_POSTVIEW_WIDE_WIDTH;
   1254         *height = BACK_CAMERA_POSTVIEW_HEIGHT;
   1255         *size = BACK_CAMERA_POSTVIEW_WIDE_WIDTH * BACK_CAMERA_POSTVIEW_HEIGHT * BACK_CAMERA_POSTVIEW_BPP / 8;
   1256     } else {
   1257         *width = BACK_CAMERA_POSTVIEW_WIDTH;
   1258         *height = BACK_CAMERA_POSTVIEW_HEIGHT;
   1259         *size = BACK_CAMERA_POSTVIEW_WIDTH * BACK_CAMERA_POSTVIEW_HEIGHT * BACK_CAMERA_POSTVIEW_BPP / 8;
   1260     }
   1261     LOGV("[5B] m_preview_width : %d, mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",
   1262             m_preview_width, *width, *height, *size);
   1263 }
   1264 
   1265 void SecCamera::getThumbnailConfig(int *width, int *height, int *size)
   1266 {
   1267     if (m_camera_id == CAMERA_ID_BACK) {
   1268         *width  = BACK_CAMERA_THUMBNAIL_WIDTH;
   1269         *height = BACK_CAMERA_THUMBNAIL_HEIGHT;
   1270         *size   = BACK_CAMERA_THUMBNAIL_WIDTH * BACK_CAMERA_THUMBNAIL_HEIGHT
   1271                     * BACK_CAMERA_THUMBNAIL_BPP / 8;
   1272     } else {
   1273         *width  = FRONT_CAMERA_THUMBNAIL_WIDTH;
   1274         *height = FRONT_CAMERA_THUMBNAIL_HEIGHT;
   1275         *size   = FRONT_CAMERA_THUMBNAIL_WIDTH * FRONT_CAMERA_THUMBNAIL_HEIGHT
   1276                     * FRONT_CAMERA_THUMBNAIL_BPP / 8;
   1277     }
   1278 }
   1279 
   1280 int SecCamera::getPostViewOffset(void)
   1281 {
   1282     return m_postview_offset;
   1283 }
   1284 
   1285 int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
   1286                                             unsigned int *output_size)
   1287 {
   1288     LOGV("%s :", __func__);
   1289 
   1290     int index;
   1291     //unsigned int addr;
   1292     unsigned char *addr;
   1293     int ret = 0;
   1294 
   1295     LOG_TIME_DEFINE(0)
   1296     LOG_TIME_DEFINE(1)
   1297     LOG_TIME_DEFINE(2)
   1298     LOG_TIME_DEFINE(3)
   1299     LOG_TIME_DEFINE(4)
   1300     LOG_TIME_DEFINE(5)
   1301 
   1302     //fimc_v4l2_streamoff(m_cam_fd); [zzangdol] remove - it is separate in HWInterface with camera_id
   1303 
   1304     if (m_cam_fd <= 0) {
   1305         LOGE("ERR(%s):Camera was closed\n", __func__);
   1306         return -1;
   1307     }
   1308 
   1309     if (m_flag_camera_start > 0) {
   1310         LOG_TIME_START(0)
   1311         LOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
   1312         stopPreview();
   1313         LOG_TIME_END(0)
   1314     }
   1315 
   1316     memset(&m_events_c, 0, sizeof(m_events_c));
   1317     m_events_c.fd = m_cam_fd;
   1318     m_events_c.events = POLLIN | POLLERR;
   1319 
   1320 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
   1321     if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
   1322         LOGV("SnapshotFormat:V4L2_PIX_FMT_YUV420");
   1323     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
   1324         LOGV("SnapshotFormat:V4L2_PIX_FMT_NV12");
   1325     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
   1326         LOGV("SnapshotFormat:V4L2_PIX_FMT_NV12T");
   1327     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
   1328         LOGV("SnapshotFormat:V4L2_PIX_FMT_NV21");
   1329     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
   1330         LOGV("SnapshotFormat:V4L2_PIX_FMT_YUV422P");
   1331     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
   1332         LOGV("SnapshotFormat:V4L2_PIX_FMT_YUYV");
   1333     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
   1334         LOGV("SnapshotFormat:V4L2_PIX_FMT_UYVY");
   1335     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
   1336         LOGV("SnapshotFormat:V4L2_PIX_FMT_RGB565");
   1337     else
   1338         LOGV("SnapshotFormat:UnknownFormat");
   1339 #endif
   1340 
   1341     LOG_TIME_START(1) // prepare
   1342     int nframe = 1;
   1343 
   1344     ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
   1345     CHECK(ret);
   1346     ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat);
   1347     CHECK(ret);
   1348     ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
   1349     CHECK(ret);
   1350     ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1351     CHECK(ret);
   1352 
   1353     ret = fimc_v4l2_qbuf(m_cam_fd, 0);
   1354     CHECK(ret);
   1355 
   1356     ret = fimc_v4l2_streamon(m_cam_fd);
   1357     CHECK(ret);
   1358     LOG_TIME_END(1)
   1359 
   1360     LOG_TIME_START(2) // capture
   1361     fimc_poll(&m_events_c);
   1362     index = fimc_v4l2_dqbuf(m_cam_fd);
   1363     fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
   1364     LOGV("\nsnapshot dequeued buffer = %d snapshot_width = %d snapshot_height = %d\n\n",
   1365             index, m_snapshot_width, m_snapshot_height);
   1366 
   1367     LOG_TIME_END(2)
   1368 
   1369     LOGI("%s : calling memcpy from m_capture_buf", __func__);
   1370     memcpy(yuv_buf, (unsigned char*)m_capture_buf.start, m_snapshot_width * m_snapshot_height * 2);
   1371     LOG_TIME_START(5) // post
   1372     fimc_v4l2_streamoff(m_cam_fd);
   1373     LOG_TIME_END(5)
   1374 
   1375     LOG_CAMERA("getSnapshotAndJpeg intervals : stopPreview(%lu), prepare(%lu),"
   1376                 " capture(%lu), memcpy(%lu), yuv2Jpeg(%lu), post(%lu)  us",
   1377                     LOG_TIME(0), LOG_TIME(1), LOG_TIME(2), LOG_TIME(3), LOG_TIME(4), LOG_TIME(5));
   1378     /* JPEG encoding */
   1379     JpegEncoder jpgEnc;
   1380     int inFormat = JPG_MODESEL_YCBCR;
   1381     int outFormat = JPG_422;
   1382 
   1383     switch (m_snapshot_v4lformat) {
   1384     case V4L2_PIX_FMT_NV12:
   1385     case V4L2_PIX_FMT_NV21:
   1386     case V4L2_PIX_FMT_NV12T:
   1387     case V4L2_PIX_FMT_YUV420:
   1388         outFormat = JPG_420;
   1389         break;
   1390     case V4L2_PIX_FMT_YUYV:
   1391     case V4L2_PIX_FMT_UYVY:
   1392     case V4L2_PIX_FMT_YUV422P:
   1393     default:
   1394         outFormat = JPG_422;
   1395         break;
   1396     }
   1397 
   1398     if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
   1399         LOGE("[JPEG_SET_ENCODE_IN_FORMAT] Error\n");
   1400 
   1401     if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
   1402         LOGE("[JPEG_SET_SAMPING_MODE] Error\n");
   1403 
   1404     image_quality_type_t jpegQuality;
   1405     if (m_jpeg_quality >= 90)
   1406         jpegQuality = JPG_QUALITY_LEVEL_1;
   1407     else if (m_jpeg_quality >= 80)
   1408         jpegQuality = JPG_QUALITY_LEVEL_2;
   1409     else if (m_jpeg_quality >= 70)
   1410         jpegQuality = JPG_QUALITY_LEVEL_3;
   1411     else
   1412         jpegQuality = JPG_QUALITY_LEVEL_4;
   1413 
   1414     if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, jpegQuality) != JPG_SUCCESS)
   1415         LOGE("[JPEG_SET_ENCODE_QUALITY] Error\n");
   1416     if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, m_snapshot_width) != JPG_SUCCESS)
   1417         LOGE("[JPEG_SET_ENCODE_WIDTH] Error\n");
   1418 
   1419     if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, m_snapshot_height) != JPG_SUCCESS)
   1420         LOGE("[JPEG_SET_ENCODE_HEIGHT] Error\n");
   1421 
   1422     unsigned int snapshot_size = m_snapshot_width * m_snapshot_height * 2;
   1423     unsigned char *pInBuf = (unsigned char *)jpgEnc.getInBuf(snapshot_size);
   1424 
   1425     if (pInBuf == NULL) {
   1426         LOGE("JPEG input buffer is NULL!!\n");
   1427         return -1;
   1428     }
   1429     memcpy(pInBuf, yuv_buf, snapshot_size);
   1430 
   1431     setExifChangedAttribute();
   1432     jpgEnc.encode(output_size, NULL);
   1433 
   1434     uint64_t outbuf_size;
   1435     unsigned char *pOutBuf = (unsigned char *)jpgEnc.getOutBuf(&outbuf_size);
   1436 
   1437     if (pOutBuf == NULL) {
   1438         LOGE("JPEG output buffer is NULL!!\n");
   1439         return -1;
   1440     }
   1441 
   1442     memcpy(jpeg_buf, pOutBuf, outbuf_size);
   1443 
   1444     return 0;
   1445 }
   1446 
   1447 
   1448 int SecCamera::setSnapshotSize(int width, int height)
   1449 {
   1450     LOGV("%s(width(%d), height(%d))", __func__, width, height);
   1451 
   1452     m_snapshot_width  = width;
   1453     m_snapshot_height = height;
   1454 
   1455     return 0;
   1456 }
   1457 
   1458 int SecCamera::getSnapshotSize(int *width, int *height, int *frame_size)
   1459 {
   1460     *width  = m_snapshot_width;
   1461     *height = m_snapshot_height;
   1462 
   1463     int frame = 0;
   1464 
   1465     frame = m_frameSize(m_snapshot_v4lformat, m_snapshot_width, m_snapshot_height);
   1466 
   1467     // set it big.
   1468     if (frame == 0)
   1469         frame = m_snapshot_width * m_snapshot_height * BPP;
   1470 
   1471     *frame_size = frame;
   1472 
   1473     return 0;
   1474 }
   1475 
   1476 int SecCamera::getSnapshotMaxSize(int *width, int *height)
   1477 {
   1478     switch (m_camera_id) {
   1479     case CAMERA_ID_FRONT:
   1480         m_snapshot_max_width  = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
   1481         m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
   1482         break;
   1483 
   1484     default:
   1485     case CAMERA_ID_BACK:
   1486         m_snapshot_max_width  = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
   1487         m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
   1488         break;
   1489     }
   1490 
   1491     *width  = m_snapshot_max_width;
   1492     *height = m_snapshot_max_height;
   1493 
   1494     return 0;
   1495 }
   1496 
   1497 int SecCamera::setSnapshotPixelFormat(int pixel_format)
   1498 {
   1499     int v4lpixelformat= pixel_format;
   1500 
   1501     if (m_snapshot_v4lformat != v4lpixelformat) {
   1502         m_snapshot_v4lformat = v4lpixelformat;
   1503     }
   1504 
   1505 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
   1506     if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
   1507         LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV420", __func__);
   1508     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
   1509         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__);
   1510     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
   1511         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__);
   1512     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
   1513         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__);
   1514     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
   1515         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__);
   1516     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
   1517         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__);
   1518     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
   1519         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__);
   1520     else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
   1521         LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__);
   1522     else
   1523         LOGD("SnapshotFormat:UnknownFormat");
   1524 #endif
   1525     return 0;
   1526 }
   1527 
   1528 int SecCamera::getSnapshotPixelFormat(void)
   1529 {
   1530     return m_snapshot_v4lformat;
   1531 }
   1532 
   1533 // ======================================================================
   1534 // Settings
   1535 
   1536 int SecCamera::getCameraId(void)
   1537 {
   1538     return m_camera_id;
   1539 }
   1540 
   1541 // -----------------------------------
   1542 
   1543 int SecCamera::setAutofocus(void)
   1544 {
   1545     LOGV("%s :", __func__);
   1546 
   1547     if (m_cam_fd <= 0) {
   1548         LOGE("ERR(%s):Camera was closed\n", __func__);
   1549         return -1;
   1550     }
   1551 
   1552     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_ON) < 0) {
   1553             LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
   1554         return -1;
   1555     }
   1556 
   1557     return 0;
   1558 }
   1559 
   1560 int SecCamera::getAutoFocusResult(void)
   1561 {
   1562     int af_result, count, ret;
   1563 
   1564     for (count = 0; count < FIRST_AF_SEARCH_COUNT; count++) {
   1565         ret = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT_FIRST);
   1566         if (ret != AF_PROGRESS)
   1567             break;
   1568         usleep(AF_DELAY);
   1569     }
   1570     if ((count >= FIRST_AF_SEARCH_COUNT) || (ret != AF_SUCCESS)) {
   1571         LOGV("%s : 1st AF timed out, failed, or was canceled", __func__);
   1572         af_result = 0;
   1573         goto finish_auto_focus;
   1574     }
   1575 
   1576     for (count = 0; count < SECOND_AF_SEARCH_COUNT; count++) {
   1577         ret = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT_SECOND);
   1578         /* low byte is garbage.  done when high byte is 0x0 */
   1579         if (!(ret & 0xff00))
   1580             break;
   1581         usleep(AF_DELAY);
   1582     }
   1583     if (count >= SECOND_AF_SEARCH_COUNT) {
   1584         LOGV("%s : 2nd AF timed out, failed, or was canceled", __func__);
   1585         af_result = 0;
   1586         goto finish_auto_focus;
   1587     }
   1588 
   1589     af_result = 1;
   1590     LOGV("%s : AF was successful, returning %d", __func__, af_result);
   1591 
   1592 finish_auto_focus:
   1593     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FINISH_AUTO_FOCUS, 0) < 0) {
   1594         LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_PRE_FLASH", __func__);
   1595         return -1;
   1596     }
   1597     return af_result;
   1598 }
   1599 
   1600 int SecCamera::cancelAutofocus(void)
   1601 {
   1602     LOGV("%s :", __func__);
   1603 
   1604     if (m_cam_fd <= 0) {
   1605         LOGE("ERR(%s):Camera was closed\n", __func__);
   1606         return -1;
   1607     }
   1608 
   1609     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_OFF) < 0) {
   1610         LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
   1611         return -1;
   1612     }
   1613 
   1614     return 0;
   1615 }
   1616 
   1617 // -----------------------------------
   1618 
   1619 int SecCamera::zoomIn(void)
   1620 {
   1621     LOGV("%s :", __func__);
   1622     return 0;
   1623 }
   1624 
   1625 int SecCamera::zoomOut(void)
   1626 {
   1627     LOGV("%s :", __func__);
   1628     return 0;
   1629 }
   1630 
   1631 // -----------------------------------
   1632 
   1633 int SecCamera::SetRotate(int angle)
   1634 {
   1635     LOGE("%s(angle(%d))", __func__, angle);
   1636 
   1637     if (m_angle != angle) {
   1638         switch (angle) {
   1639         case -360:
   1640         case    0:
   1641         case  360:
   1642             m_angle = 0;
   1643             break;
   1644 
   1645         case -270:
   1646         case   90:
   1647             m_angle = 90;
   1648             break;
   1649 
   1650         case -180:
   1651         case  180:
   1652             m_angle = 180;
   1653             break;
   1654 
   1655         case  -90:
   1656         case  270:
   1657             m_angle = 270;
   1658             break;
   1659 
   1660         default:
   1661             LOGE("ERR(%s):Invalid angle(%d)", __func__, angle);
   1662             return -1;
   1663         }
   1664 
   1665         if (m_flag_camera_start) {
   1666             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_ROTATION, angle) < 0) {
   1667                 LOGE("ERR(%s):Fail on V4L2_CID_ROTATION", __func__);
   1668                 return -1;
   1669             }
   1670         }
   1671     }
   1672 
   1673     return 0;
   1674 }
   1675 
   1676 int SecCamera::getRotate(void)
   1677 {
   1678     LOGV("%s : angle(%d)", __func__, m_angle);
   1679     return m_angle;
   1680 }
   1681 
   1682 int SecCamera::setFrameRate(int frame_rate)
   1683 {
   1684     LOGV("%s(FrameRate(%d))", __func__, frame_rate);
   1685 
   1686     if (frame_rate < FRAME_RATE_AUTO || FRAME_RATE_MAX < frame_rate )
   1687         LOGE("ERR(%s):Invalid frame_rate(%d)", __func__, frame_rate);
   1688 
   1689     if (m_params->capture.timeperframe.denominator != (unsigned)frame_rate) {
   1690         m_params->capture.timeperframe.denominator = frame_rate;
   1691         if (m_flag_camera_start) {
   1692             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, frame_rate) < 0) {
   1693                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FRAME_RATE", __func__);
   1694                 return -1;
   1695             }
   1696         }
   1697     }
   1698 
   1699     return 0;
   1700 }
   1701 
   1702 // -----------------------------------
   1703 
   1704 int SecCamera::setVerticalMirror(void)
   1705 {
   1706     LOGV("%s :", __func__);
   1707 
   1708     if (m_cam_fd <= 0) {
   1709         LOGE("ERR(%s):Camera was closed\n", __func__);
   1710         return -1;
   1711     }
   1712 
   1713     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_VFLIP, 0) < 0) {
   1714         LOGE("ERR(%s):Fail on V4L2_CID_VFLIP", __func__);
   1715         return -1;
   1716     }
   1717 
   1718     return 0;
   1719 }
   1720 
   1721 int SecCamera::setHorizontalMirror(void)
   1722 {
   1723     LOGV("%s :", __func__);
   1724 
   1725     if (m_cam_fd <= 0) {
   1726         LOGE("ERR(%s):Camera was closed\n", __func__);
   1727         return -1;
   1728     }
   1729 
   1730     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_HFLIP, 0) < 0) {
   1731         LOGE("ERR(%s):Fail on V4L2_CID_HFLIP", __func__);
   1732         return -1;
   1733     }
   1734 
   1735     return 0;
   1736 }
   1737 
   1738 // -----------------------------------
   1739 
   1740 int SecCamera::setWhiteBalance(int white_balance)
   1741 {
   1742     LOGV("%s(white_balance(%d))", __func__, white_balance);
   1743 
   1744     if (white_balance <= WHITE_BALANCE_BASE || WHITE_BALANCE_MAX <= white_balance) {
   1745         LOGE("ERR(%s):Invalid white_balance(%d)", __func__, white_balance);
   1746         return -1;
   1747     }
   1748 
   1749     if (m_params->white_balance != white_balance) {
   1750         m_params->white_balance = white_balance;
   1751         if (m_flag_camera_start) {
   1752             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WHITE_BALANCE, white_balance) < 0) {
   1753                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WHITE_BALANCE", __func__);
   1754                 return -1;
   1755             }
   1756         }
   1757     }
   1758 
   1759     return 0;
   1760 }
   1761 
   1762 int SecCamera::getWhiteBalance(void)
   1763 {
   1764     LOGV("%s : white_balance(%d)", __func__, m_params->white_balance);
   1765     return m_params->white_balance;
   1766 }
   1767 
   1768 // -----------------------------------
   1769 
   1770 int SecCamera::setBrightness(int brightness)
   1771 {
   1772     LOGV("%s(brightness(%d))", __func__, brightness);
   1773 
   1774     brightness += EV_DEFAULT;
   1775 
   1776     if (brightness < EV_MINUS_4 || EV_PLUS_4 < brightness) {
   1777         LOGE("ERR(%s):Invalid brightness(%d)", __func__, brightness);
   1778         return -1;
   1779     }
   1780 
   1781     if (m_params->brightness != brightness) {
   1782         m_params->brightness = brightness;
   1783         if (m_flag_camera_start) {
   1784             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BRIGHTNESS, brightness) < 0) {
   1785                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BRIGHTNESS", __func__);
   1786                 return -1;
   1787             }
   1788         }
   1789     }
   1790 
   1791     return 0;
   1792 }
   1793 
   1794 int SecCamera::getBrightness(void)
   1795 {
   1796     LOGV("%s : brightness(%d)", __func__, m_params->brightness);
   1797     return m_params->brightness;
   1798 }
   1799 
   1800 // -----------------------------------
   1801 
   1802 int SecCamera::setImageEffect(int image_effect)
   1803 {
   1804     LOGV("%s(image_effect(%d))", __func__, image_effect);
   1805 
   1806     if (image_effect <= IMAGE_EFFECT_BASE || IMAGE_EFFECT_MAX <= image_effect) {
   1807         LOGE("ERR(%s):Invalid image_effect(%d)", __func__, image_effect);
   1808         return -1;
   1809     }
   1810 
   1811     if (m_params->effects != image_effect) {
   1812         m_params->effects = image_effect;
   1813         if (m_flag_camera_start) {
   1814             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EFFECT, image_effect) < 0) {
   1815                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_EFFECT", __func__);
   1816                 return -1;
   1817             }
   1818         }
   1819     }
   1820 
   1821     return 0;
   1822 }
   1823 
   1824 int SecCamera::getImageEffect(void)
   1825 {
   1826     LOGV("%s : image_effect(%d)", __func__, m_params->effects);
   1827     return m_params->effects;
   1828 }
   1829 
   1830 // ======================================================================
   1831 int SecCamera::setAntiBanding(int anti_banding)
   1832 {
   1833     LOGV("%s(anti_banding(%d))", __func__, anti_banding);
   1834 
   1835     if (anti_banding < ANTI_BANDING_AUTO || ANTI_BANDING_OFF < anti_banding) {
   1836         LOGE("ERR(%s):Invalid anti_banding (%d)", __func__, anti_banding);
   1837         return -1;
   1838     }
   1839 
   1840     if (m_anti_banding != anti_banding) {
   1841         m_anti_banding = anti_banding;
   1842         if (m_flag_camera_start) {
   1843             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_BANDING, anti_banding) < 0) {
   1844                  LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_BANDING", __func__);
   1845                  return -1;
   1846             }
   1847         }
   1848     }
   1849 
   1850     return 0;
   1851 }
   1852 
   1853 //======================================================================
   1854 int SecCamera::setSceneMode(int scene_mode)
   1855 {
   1856     LOGV("%s(scene_mode(%d))", __func__, scene_mode);
   1857 
   1858     if (scene_mode <= SCENE_MODE_BASE || SCENE_MODE_MAX <= scene_mode) {
   1859         LOGE("ERR(%s):Invalid scene_mode (%d)", __func__, scene_mode);
   1860         return -1;
   1861     }
   1862 
   1863     if (m_params->scene_mode != scene_mode) {
   1864         m_params->scene_mode = scene_mode;
   1865         if (m_flag_camera_start) {
   1866             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SCENE_MODE, scene_mode) < 0) {
   1867                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SCENE_MODE", __func__);
   1868                 return -1;
   1869             }
   1870         }
   1871     }
   1872 
   1873     return 0;
   1874 }
   1875 
   1876 int SecCamera::getSceneMode(void)
   1877 {
   1878     return m_params->scene_mode;
   1879 }
   1880 
   1881 //======================================================================
   1882 
   1883 int SecCamera::setFlashMode(int flash_mode)
   1884 {
   1885     LOGV("%s(flash_mode(%d))", __func__, flash_mode);
   1886 
   1887     if (flash_mode <= FLASH_MODE_BASE || FLASH_MODE_MAX <= flash_mode) {
   1888         LOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode);
   1889         return -1;
   1890     }
   1891 
   1892     if (m_params->flash_mode != flash_mode) {
   1893         m_params->flash_mode = flash_mode;
   1894         if (m_flag_camera_start) {
   1895             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode) < 0) {
   1896                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FLASH_MODE", __func__);
   1897                 return -1;
   1898             }
   1899         }
   1900     }
   1901 
   1902     return 0;
   1903 }
   1904 
   1905 int SecCamera::getFlashMode(void)
   1906 {
   1907     return m_params->flash_mode;
   1908 }
   1909 
   1910 //======================================================================
   1911 
   1912 int SecCamera::setISO(int iso_value)
   1913 {
   1914     LOGV("%s(iso_value(%d))", __func__, iso_value);
   1915     if (iso_value < ISO_AUTO || ISO_MAX <= iso_value) {
   1916         LOGE("ERR(%s):Invalid iso_value (%d)", __func__, iso_value);
   1917         return -1;
   1918     }
   1919 
   1920     if (m_params->iso != iso_value) {
   1921         m_params->iso = iso_value;
   1922         if (m_flag_camera_start) {
   1923             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ISO, iso_value) < 0) {
   1924                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ISO", __func__);
   1925                 return -1;
   1926             }
   1927         }
   1928     }
   1929 
   1930     return 0;
   1931 }
   1932 
   1933 int SecCamera::getISO(void)
   1934 {
   1935     return m_params->iso;
   1936 }
   1937 
   1938 //======================================================================
   1939 
   1940 int SecCamera::setContrast(int contrast_value)
   1941 {
   1942     LOGV("%s(contrast_value(%d))", __func__, contrast_value);
   1943 
   1944     if (contrast_value < CONTRAST_MINUS_2 || CONTRAST_MAX <= contrast_value) {
   1945         LOGE("ERR(%s):Invalid contrast_value (%d)", __func__, contrast_value);
   1946         return -1;
   1947     }
   1948 
   1949     if (m_params->contrast != contrast_value) {
   1950         m_params->contrast = contrast_value;
   1951         if (m_flag_camera_start) {
   1952             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CONTRAST, contrast_value) < 0) {
   1953                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_CONTRAST", __func__);
   1954                 return -1;
   1955             }
   1956         }
   1957     }
   1958 
   1959     return 0;
   1960 }
   1961 
   1962 int SecCamera::getContrast(void)
   1963 {
   1964     return m_params->contrast;
   1965 }
   1966 
   1967 //======================================================================
   1968 
   1969 int SecCamera::setSaturation(int saturation_value)
   1970 {
   1971     LOGV("%s(saturation_value(%d))", __func__, saturation_value);
   1972 
   1973     if (saturation_value <SATURATION_MINUS_2 || SATURATION_MAX<= saturation_value) {
   1974         LOGE("ERR(%s):Invalid saturation_value (%d)", __func__, saturation_value);
   1975         return -1;
   1976     }
   1977 
   1978     if (m_params->saturation != saturation_value) {
   1979         m_params->saturation = saturation_value;
   1980         if (m_flag_camera_start) {
   1981             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SATURATION, saturation_value) < 0) {
   1982                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SATURATION", __func__);
   1983                 return -1;
   1984             }
   1985         }
   1986     }
   1987 
   1988     return 0;
   1989 }
   1990 
   1991 int SecCamera::getSaturation(void)
   1992 {
   1993     return m_params->saturation;
   1994 }
   1995 
   1996 //======================================================================
   1997 
   1998 int SecCamera::setSharpness(int sharpness_value)
   1999 {
   2000     LOGV("%s(sharpness_value(%d))", __func__, sharpness_value);
   2001 
   2002     if (sharpness_value < SHARPNESS_MINUS_2 || SHARPNESS_MAX <= sharpness_value) {
   2003         LOGE("ERR(%s):Invalid sharpness_value (%d)", __func__, sharpness_value);
   2004         return -1;
   2005     }
   2006 
   2007     if (m_params->sharpness != sharpness_value) {
   2008         m_params->sharpness = sharpness_value;
   2009         if (m_flag_camera_start) {
   2010             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SHARPNESS, sharpness_value) < 0) {
   2011                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SHARPNESS", __func__);
   2012                 return -1;
   2013             }
   2014         }
   2015     }
   2016 
   2017     return 0;
   2018 }
   2019 
   2020 int SecCamera::getSharpness(void)
   2021 {
   2022     return m_params->sharpness;
   2023 }
   2024 
   2025 //======================================================================
   2026 
   2027 int SecCamera::setWDR(int wdr_value)
   2028 {
   2029     LOGV("%s(wdr_value(%d))", __func__, wdr_value);
   2030 
   2031     if (wdr_value < WDR_OFF || WDR_MAX <= wdr_value) {
   2032         LOGE("ERR(%s):Invalid wdr_value (%d)", __func__, wdr_value);
   2033         return -1;
   2034     }
   2035 
   2036     if (m_wdr != wdr_value) {
   2037         m_wdr = wdr_value;
   2038         if (m_flag_camera_start) {
   2039             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WDR, wdr_value) < 0) {
   2040                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WDR", __func__);
   2041                 return -1;
   2042             }
   2043         }
   2044     }
   2045 
   2046     return 0;
   2047 }
   2048 
   2049 int SecCamera::getWDR(void)
   2050 {
   2051     return m_wdr;
   2052 }
   2053 
   2054 //======================================================================
   2055 
   2056 int SecCamera::setAntiShake(int anti_shake)
   2057 {
   2058     LOGV("%s(anti_shake(%d))", __func__, anti_shake);
   2059 
   2060     if (anti_shake < ANTI_SHAKE_OFF || ANTI_SHAKE_MAX <= anti_shake) {
   2061         LOGE("ERR(%s):Invalid anti_shake (%d)", __func__, anti_shake);
   2062         return -1;
   2063     }
   2064 
   2065     if (m_anti_shake != anti_shake) {
   2066         m_anti_shake = anti_shake;
   2067         if (m_flag_camera_start) {
   2068             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_SHAKE, anti_shake) < 0) {
   2069                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_SHAKE", __func__);
   2070                 return -1;
   2071             }
   2072         }
   2073     }
   2074 
   2075     return 0;
   2076 }
   2077 
   2078 int SecCamera::getAntiShake(void)
   2079 {
   2080     return m_anti_shake;
   2081 }
   2082 
   2083 //======================================================================
   2084 
   2085 
   2086 int SecCamera::setMetering(int metering_value)
   2087 {
   2088     LOGV("%s(metering (%d))", __func__, metering_value);
   2089 
   2090     if (metering_value <= METERING_BASE || METERING_MAX <= metering_value) {
   2091         LOGE("ERR(%s):Invalid metering_value (%d)", __func__, metering_value);
   2092         return -1;
   2093     }
   2094 
   2095     if (m_params->metering != metering_value) {
   2096         m_params->metering = metering_value;
   2097         if (m_flag_camera_start) {
   2098             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_METERING, metering_value) < 0) {
   2099                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_METERING", __func__);
   2100                 return -1;
   2101             }
   2102         }
   2103     }
   2104 
   2105     return 0;
   2106 }
   2107 
   2108 int SecCamera::getMetering(void)
   2109 {
   2110     return m_params->metering;
   2111 }
   2112 
   2113 //======================================================================
   2114 
   2115 int SecCamera::setJpegQuality(int jpeg_quality)
   2116 {
   2117     LOGV("%s(jpeg_quality (%d))", __func__, jpeg_quality);
   2118 
   2119     if (jpeg_quality < JPEG_QUALITY_ECONOMY || JPEG_QUALITY_MAX <= jpeg_quality) {
   2120         LOGE("ERR(%s):Invalid jpeg_quality (%d)", __func__, jpeg_quality);
   2121         return -1;
   2122     }
   2123 
   2124     if (m_jpeg_quality != jpeg_quality) {
   2125         m_jpeg_quality = jpeg_quality;
   2126         if (m_flag_camera_start && (m_camera_id == CAMERA_ID_BACK)) {
   2127             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_QUALITY, jpeg_quality) < 0) {
   2128                 LOGE("ERR(%s):Fail on V4L2_CID_CAM_JPEG_QUALITY", __func__);
   2129                 return -1;
   2130             }
   2131         }
   2132     }
   2133 
   2134     return 0;
   2135 }
   2136 
   2137 int SecCamera::getJpegQuality(void)
   2138 {
   2139     return m_jpeg_quality;
   2140 }
   2141 
   2142 //======================================================================
   2143 
   2144 int SecCamera::setZoom(int zoom_level)
   2145 {
   2146     LOGV("%s(zoom_level (%d))", __func__, zoom_level);
   2147 
   2148     if (zoom_level < ZOOM_LEVEL_0 || ZOOM_LEVEL_MAX <= zoom_level) {
   2149         LOGE("ERR(%s):Invalid zoom_level (%d)", __func__, zoom_level);
   2150         return -1;
   2151     }
   2152 
   2153     if (m_zoom_level != zoom_level) {
   2154         m_zoom_level = zoom_level;
   2155         if (m_flag_camera_start) {
   2156             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ZOOM, zoom_level) < 0) {
   2157                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ZOOM", __func__);
   2158                 return -1;
   2159             }
   2160         }
   2161     }
   2162 
   2163     return 0;
   2164 }
   2165 
   2166 int SecCamera::getZoom(void)
   2167 {
   2168     return m_zoom_level;
   2169 }
   2170 
   2171 //======================================================================
   2172 
   2173 int SecCamera::setObjectTracking(int object_tracking)
   2174 {
   2175     LOGV("%s(object_tracking (%d))", __func__, object_tracking);
   2176 
   2177     if (object_tracking < OBJECT_TRACKING_OFF || OBJECT_TRACKING_MAX <= object_tracking) {
   2178         LOGE("ERR(%s):Invalid object_tracking (%d)", __func__, object_tracking);
   2179         return -1;
   2180     }
   2181 
   2182     if (m_object_tracking != object_tracking) {
   2183         m_object_tracking = object_tracking;
   2184     }
   2185 
   2186     return 0;
   2187 }
   2188 
   2189 int SecCamera::getObjectTracking(void)
   2190 {
   2191     return m_object_tracking;
   2192 }
   2193 
   2194 int SecCamera::getObjectTrackingStatus(void)
   2195 {
   2196     int obj_status = 0;
   2197     obj_status = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJ_TRACKING_STATUS);
   2198     return obj_status;
   2199 }
   2200 
   2201 int SecCamera::setObjectTrackingStartStop(int start_stop)
   2202 {
   2203     LOGV("%s(object_tracking_start_stop (%d))", __func__, start_stop);
   2204 
   2205     if (m_object_tracking_start_stop != start_stop) {
   2206         m_object_tracking_start_stop = start_stop;
   2207         if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP, start_stop) < 0) {
   2208             LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP", __func__);
   2209             return -1;
   2210         }
   2211     }
   2212 
   2213     return 0;
   2214 }
   2215 
   2216 int SecCamera::setTouchAFStartStop(int start_stop)
   2217 {
   2218     LOGV("%s(touch_af_start_stop (%d))", __func__, start_stop);
   2219 
   2220     if (m_touch_af_start_stop != start_stop) {
   2221         m_touch_af_start_stop = start_stop;
   2222         if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_TOUCH_AF_START_STOP, start_stop) < 0) {
   2223             LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_TOUCH_AF_START_STOP", __func__);
   2224             return -1;
   2225         }
   2226     }
   2227 
   2228     return 0;
   2229 }
   2230 
   2231 //======================================================================
   2232 
   2233 int SecCamera::setSmartAuto(int smart_auto)
   2234 {
   2235     LOGV("%s(smart_auto (%d))", __func__, smart_auto);
   2236 
   2237     if (smart_auto < SMART_AUTO_OFF || SMART_AUTO_MAX <= smart_auto) {
   2238         LOGE("ERR(%s):Invalid smart_auto (%d)", __func__, smart_auto);
   2239         return -1;
   2240     }
   2241 
   2242     if (m_smart_auto != smart_auto) {
   2243         m_smart_auto = smart_auto;
   2244         if (m_flag_camera_start) {
   2245             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SMART_AUTO, smart_auto) < 0) {
   2246                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SMART_AUTO", __func__);
   2247                 return -1;
   2248             }
   2249         }
   2250     }
   2251 
   2252     return 0;
   2253 }
   2254 
   2255 int SecCamera::getSmartAuto(void)
   2256 {
   2257     return m_smart_auto;
   2258 }
   2259 
   2260 int SecCamera::getAutosceneStatus(void)
   2261 {
   2262     int autoscene_status = -1;
   2263 
   2264     if (getSmartAuto() == SMART_AUTO_ON) {
   2265         autoscene_status = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_SMART_AUTO_STATUS);
   2266 
   2267         if ((autoscene_status < SMART_AUTO_STATUS_AUTO) || (autoscene_status > SMART_AUTO_STATUS_MAX)) {
   2268             LOGE("ERR(%s):Invalid getAutosceneStatus (%d)", __func__, autoscene_status);
   2269             return -1;
   2270         }
   2271     }
   2272     //LOGV("%s :    autoscene_status (%d)", __func__, autoscene_status);
   2273     return autoscene_status;
   2274 }
   2275 //======================================================================
   2276 
   2277 int SecCamera::setBeautyShot(int beauty_shot)
   2278 {
   2279     LOGV("%s(beauty_shot (%d))", __func__, beauty_shot);
   2280 
   2281     if (beauty_shot < BEAUTY_SHOT_OFF || BEAUTY_SHOT_MAX <= beauty_shot) {
   2282         LOGE("ERR(%s):Invalid beauty_shot (%d)", __func__, beauty_shot);
   2283         return -1;
   2284     }
   2285 
   2286     if (m_beauty_shot != beauty_shot) {
   2287         m_beauty_shot = beauty_shot;
   2288         if (m_flag_camera_start) {
   2289             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BEAUTY_SHOT, beauty_shot) < 0) {
   2290                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BEAUTY_SHOT", __func__);
   2291                 return -1;
   2292             }
   2293         }
   2294 
   2295         setFaceDetect(FACE_DETECTION_ON_BEAUTY);
   2296     }
   2297 
   2298     return 0;
   2299 }
   2300 
   2301 int SecCamera::getBeautyShot(void)
   2302 {
   2303     return m_beauty_shot;
   2304 }
   2305 
   2306 //======================================================================
   2307 
   2308 int SecCamera::setVintageMode(int vintage_mode)
   2309 {
   2310     LOGV("%s(vintage_mode(%d))", __func__, vintage_mode);
   2311 
   2312     if (vintage_mode <= VINTAGE_MODE_BASE || VINTAGE_MODE_MAX <= vintage_mode) {
   2313         LOGE("ERR(%s):Invalid vintage_mode (%d)", __func__, vintage_mode);
   2314         return -1;
   2315     }
   2316 
   2317     if (m_vintage_mode != vintage_mode) {
   2318         m_vintage_mode = vintage_mode;
   2319         if (m_flag_camera_start) {
   2320             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_VINTAGE_MODE, vintage_mode) < 0) {
   2321                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_VINTAGE_MODE", __func__);
   2322                 return -1;
   2323             }
   2324         }
   2325     }
   2326 
   2327     return 0;
   2328 }
   2329 
   2330 int SecCamera::getVintageMode(void)
   2331 {
   2332     return m_vintage_mode;
   2333 }
   2334 
   2335 //======================================================================
   2336 
   2337 int SecCamera::setFocusMode(int focus_mode)
   2338 {
   2339     LOGV("%s(focus_mode(%d))", __func__, focus_mode);
   2340 
   2341     if (FOCUS_MODE_MAX <= focus_mode) {
   2342         LOGE("ERR(%s):Invalid focus_mode (%d)", __func__, focus_mode);
   2343         return -1;
   2344     }
   2345 
   2346     if (m_params->focus_mode != focus_mode) {
   2347         m_params->focus_mode = focus_mode;
   2348 
   2349         if (m_flag_camera_start) {
   2350             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FOCUS_MODE, focus_mode) < 0) {
   2351                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FOCUS_MODE", __func__);
   2352                 return -1;
   2353             }
   2354         }
   2355     }
   2356 
   2357     return 0;
   2358 }
   2359 
   2360 int SecCamera::getFocusMode(void)
   2361 {
   2362     return m_params->focus_mode;
   2363 }
   2364 
   2365 //======================================================================
   2366 
   2367 int SecCamera::setFaceDetect(int face_detect)
   2368 {
   2369     LOGV("%s(face_detect(%d))", __func__, face_detect);
   2370 
   2371     if (m_face_detect != face_detect) {
   2372         m_face_detect = face_detect;
   2373         if (m_flag_camera_start) {
   2374             if (m_face_detect != FACE_DETECTION_OFF) {
   2375                 if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FOCUS_MODE, FOCUS_MODE_AUTO) < 0) {
   2376                     LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FOCUS_MODin face detecion", __func__);
   2377                     return -1;
   2378                 }
   2379             }
   2380             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FACE_DETECTION, face_detect) < 0) {
   2381                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FACE_DETECTION", __func__);
   2382                 return -1;
   2383             }
   2384         }
   2385     }
   2386 
   2387     return 0;
   2388 }
   2389 
   2390 int SecCamera::getFaceDetect(void)
   2391 {
   2392     return m_face_detect;
   2393 }
   2394 
   2395 //======================================================================
   2396 
   2397 int SecCamera::setGPSLatitude(const char *gps_latitude)
   2398 {
   2399     LOGV("%s(gps_latitude(%s))", __func__, gps_latitude);
   2400     if (gps_latitude == NULL)
   2401         m_gps_enabled = false;
   2402     else {
   2403         m_gps_enabled = true;
   2404         m_gps_latitude = lround(strtod(gps_latitude, NULL) * 10000000);
   2405     }
   2406 
   2407     LOGV("%s(m_gps_latitude(%ld))", __func__, m_gps_latitude);
   2408     return 0;
   2409 }
   2410 
   2411 int SecCamera::setGPSLongitude(const char *gps_longitude)
   2412 {
   2413     LOGV("%s(gps_longitude(%s))", __func__, gps_longitude);
   2414     if (gps_longitude == NULL)
   2415         m_gps_enabled = false;
   2416     else {
   2417         m_gps_enabled = true;
   2418         m_gps_longitude = lround(strtod(gps_longitude, NULL) * 10000000);
   2419     }
   2420 
   2421     LOGV("%s(m_gps_longitude(%ld))", __func__, m_gps_longitude);
   2422     return 0;
   2423 }
   2424 
   2425 int SecCamera::setGPSAltitude(const char *gps_altitude)
   2426 {
   2427     LOGV("%s(gps_altitude(%s))", __func__, gps_altitude);
   2428     if (gps_altitude == NULL)
   2429         m_gps_altitude = 0;
   2430     else {
   2431         m_gps_altitude = lround(strtod(gps_altitude, NULL) * 100);
   2432     }
   2433 
   2434     LOGV("%s(m_gps_altitude(%ld))", __func__, m_gps_altitude);
   2435     return 0;
   2436 }
   2437 
   2438 int SecCamera::setGPSTimeStamp(const char *gps_timestamp)
   2439 {
   2440     LOGV("%s(gps_timestamp(%s))", __func__, gps_timestamp);
   2441     if (gps_timestamp == NULL)
   2442         m_gps_timestamp = 0;
   2443     else
   2444         m_gps_timestamp = atol(gps_timestamp);
   2445 
   2446     LOGV("%s(m_gps_timestamp(%ld))", __func__, m_gps_timestamp);
   2447     return 0;
   2448 }
   2449 
   2450 int SecCamera::setGPSProcessingMethod(const char *gps_processing_method)
   2451 {
   2452     LOGV("%s(gps_processing_method(%s))", __func__, gps_processing_method);
   2453     memset(mExifInfo.gps_processing_method, 0, sizeof(mExifInfo.gps_processing_method));
   2454     if (gps_processing_method != NULL) {
   2455         size_t len = strlen(gps_processing_method);
   2456         if (len > sizeof(mExifInfo.gps_processing_method)) {
   2457             len = sizeof(mExifInfo.gps_processing_method);
   2458         }
   2459         memcpy(mExifInfo.gps_processing_method, gps_processing_method, len);
   2460     }
   2461     return 0;
   2462 }
   2463 
   2464 int SecCamera::setFaceDetectLockUnlock(int facedetect_lockunlock)
   2465 {
   2466     LOGV("%s(facedetect_lockunlock(%d))", __func__, facedetect_lockunlock);
   2467 
   2468     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK, facedetect_lockunlock) < 0) {
   2469         LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK", __func__);
   2470         return -1;
   2471     }
   2472 
   2473     return 0;
   2474 }
   2475 
   2476 int SecCamera::setObjectPosition(int x, int y)
   2477 {
   2478     LOGV("%s(setObjectPosition(x=%d, y=%d))", __func__, x, y);
   2479 
   2480     if (m_preview_width ==640)
   2481         x = x - 80;
   2482 
   2483     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJECT_POSITION_X, x) < 0) {
   2484         LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_X", __func__);
   2485         return -1;
   2486     }
   2487 
   2488     if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJECT_POSITION_Y, y) < 0) {
   2489         LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_Y", __func__);
   2490         return -1;
   2491     }
   2492 
   2493     return 0;
   2494 }
   2495 
   2496 //======================================================================
   2497 
   2498 int SecCamera::setGamma(int gamma)
   2499 {
   2500      LOGV("%s(gamma(%d))", __func__, gamma);
   2501 
   2502      if (gamma < GAMMA_OFF || GAMMA_MAX <= gamma) {
   2503          LOGE("ERR(%s):Invalid gamma (%d)", __func__, gamma);
   2504          return -1;
   2505      }
   2506 
   2507      if (m_video_gamma != gamma) {
   2508          m_video_gamma = gamma;
   2509          if (m_flag_camera_start) {
   2510              if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_GAMMA, gamma) < 0) {
   2511                  LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_GAMMA", __func__);
   2512                  return -1;
   2513              }
   2514          }
   2515      }
   2516 
   2517      return 0;
   2518 }
   2519 
   2520 //======================================================================
   2521 
   2522 int SecCamera::setSlowAE(int slow_ae)
   2523 {
   2524      LOGV("%s(slow_ae(%d))", __func__, slow_ae);
   2525 
   2526      if (slow_ae < GAMMA_OFF || GAMMA_MAX <= slow_ae) {
   2527          LOGE("ERR(%s):Invalid slow_ae (%d)", __func__, slow_ae);
   2528          return -1;
   2529      }
   2530 
   2531      if (m_slow_ae!= slow_ae) {
   2532          m_slow_ae = slow_ae;
   2533          if (m_flag_camera_start) {
   2534              if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_SLOW_AE, slow_ae) < 0) {
   2535                  LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_SLOW_AE", __func__);
   2536                  return -1;
   2537              }
   2538          }
   2539      }
   2540 
   2541      return 0;
   2542 }
   2543 
   2544 //======================================================================
   2545 int SecCamera::setRecordingSize(int width, int height)
   2546 {
   2547      LOGV("%s(width(%d), height(%d))", __func__, width, height);
   2548 
   2549      m_recording_width  = width;
   2550      m_recording_height = height;
   2551 
   2552      return 0;
   2553 }
   2554 
   2555 //======================================================================
   2556 
   2557 int SecCamera::setExifOrientationInfo(int orientationInfo)
   2558 {
   2559      LOGV("%s(orientationInfo(%d))", __func__, orientationInfo);
   2560 
   2561      if (orientationInfo < 0) {
   2562          LOGE("ERR(%s):Invalid orientationInfo (%d)", __func__, orientationInfo);
   2563          return -1;
   2564      }
   2565      m_exif_orientation = orientationInfo;
   2566 
   2567      return 0;
   2568 }
   2569 
   2570 //======================================================================
   2571 int SecCamera::setBatchReflection()
   2572 {
   2573     if (m_flag_camera_start) {
   2574         if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BATCH_REFLECTION, 1) < 0) {
   2575              LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BATCH_REFLECTION", __func__);
   2576              return -1;
   2577         }
   2578     }
   2579 
   2580     return 0;
   2581 }
   2582 
   2583 /*Video call*/
   2584 int SecCamera::setVTmode(int vtmode)
   2585 {
   2586     LOGV("%s(vtmode (%d))", __func__, vtmode);
   2587 
   2588     if (vtmode < VT_MODE_OFF || VT_MODE_MAX <= vtmode) {
   2589         LOGE("ERR(%s):Invalid vtmode (%d)", __func__, vtmode);
   2590         return -1;
   2591     }
   2592 
   2593     if (m_vtmode != vtmode) {
   2594         m_vtmode = vtmode;
   2595     }
   2596 
   2597     return 0;
   2598 }
   2599 
   2600 /* Camcorder fix fps */
   2601 int SecCamera::setSensorMode(int sensor_mode)
   2602 {
   2603     LOGV("%s(sensor_mode (%d))", __func__, sensor_mode);
   2604 
   2605     if (sensor_mode < SENSOR_MODE_CAMERA || SENSOR_MODE_MOVIE < sensor_mode) {
   2606         LOGE("ERR(%s):Invalid sensor mode (%d)", __func__, sensor_mode);
   2607         return -1;
   2608     }
   2609 
   2610     if (m_sensor_mode != sensor_mode) {
   2611         m_sensor_mode = sensor_mode;
   2612     }
   2613 
   2614     return 0;
   2615 }
   2616 
   2617 /*  Shot mode   */
   2618 /*  SINGLE = 0
   2619 *   CONTINUOUS = 1
   2620 *   PANORAMA = 2
   2621 *   SMILE = 3
   2622 *   SELF = 6
   2623 */
   2624 int SecCamera::setShotMode(int shot_mode)
   2625 {
   2626     LOGV("%s(shot_mode (%d))", __func__, shot_mode);
   2627     if (shot_mode < SHOT_MODE_SINGLE || SHOT_MODE_SELF < shot_mode) {
   2628         LOGE("ERR(%s):Invalid shot_mode (%d)", __func__, shot_mode);
   2629         return -1;
   2630     }
   2631     m_shot_mode = shot_mode;
   2632 
   2633     return 0;
   2634 }
   2635 
   2636 int SecCamera::getVTmode(void)
   2637 {
   2638     return m_vtmode;
   2639 }
   2640 
   2641 int SecCamera::setBlur(int blur_level)
   2642 {
   2643     LOGV("%s(level (%d))", __func__, blur_level);
   2644 
   2645     if (blur_level < BLUR_LEVEL_0 || BLUR_LEVEL_MAX <= blur_level) {
   2646         LOGE("ERR(%s):Invalid level (%d)", __func__, blur_level);
   2647         return -1;
   2648     }
   2649 
   2650     if (m_blur_level != blur_level) {
   2651         m_blur_level = blur_level;
   2652         if (m_flag_camera_start) {
   2653             if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_VGA_BLUR, blur_level) < 0) {
   2654                 LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_VGA_BLUR", __func__);
   2655                 return -1;
   2656             }
   2657         }
   2658     }
   2659     return 0;
   2660 }
   2661 
   2662 int SecCamera::getBlur(void)
   2663 {
   2664     return m_blur_level;
   2665 }
   2666 
   2667 int SecCamera::setDataLineCheck(int chk_dataline)
   2668 {
   2669     LOGV("%s(chk_dataline (%d))", __func__, chk_dataline);
   2670 
   2671     if (chk_dataline < CHK_DATALINE_OFF || CHK_DATALINE_MAX <= chk_dataline) {
   2672         LOGE("ERR(%s):Invalid chk_dataline (%d)", __func__, chk_dataline);
   2673         return -1;
   2674     }
   2675 
   2676     m_chk_dataline = chk_dataline;
   2677 
   2678     return 0;
   2679 }
   2680 
   2681 int SecCamera::getDataLineCheck(void)
   2682 {
   2683     return m_chk_dataline;
   2684 }
   2685 
   2686 int SecCamera::setDataLineCheckStop(void)
   2687 {
   2688     LOGV("%s", __func__);
   2689 
   2690     if (m_flag_camera_start) {
   2691         if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CHECK_DATALINE_STOP, 1) < 0) {
   2692             LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_CHECK_DATALINE_STOP", __func__);
   2693             return -1;
   2694         }
   2695     }
   2696     return 0;
   2697 }
   2698 
   2699 const __u8* SecCamera::getCameraSensorName(void)
   2700 {
   2701     LOGV("%s", __func__);
   2702 
   2703     return fimc_v4l2_enuminput(m_cam_fd, getCameraId());
   2704 }
   2705 
   2706 #ifdef ENABLE_ESD_PREVIEW_CHECK
   2707 int SecCamera::getCameraSensorESDStatus(void)
   2708 {
   2709     LOGV("%s", __func__);
   2710 
   2711     // 0 : normal operation, 1 : abnormal operation
   2712     int status = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_ESD_INT);
   2713 
   2714     return status;
   2715 }
   2716 #endif // ENABLE_ESD_PREVIEW_CHECK
   2717 
   2718 // ======================================================================
   2719 // Jpeg
   2720 
   2721 int SecCamera::setJpegThumbnailSize(int width, int height)
   2722 {
   2723     LOGV("%s(width(%d), height(%d))", __func__, width, height);
   2724 
   2725     m_jpeg_thumbnail_width  = width;
   2726     m_jpeg_thumbnail_height = height;
   2727 
   2728     return 0;
   2729 }
   2730 
   2731 int SecCamera::getJpegThumbnailSize(int *width, int  *height)
   2732 {
   2733     if (width)
   2734         *width   = m_jpeg_thumbnail_width;
   2735     if (height)
   2736         *height  = m_jpeg_thumbnail_height;
   2737 
   2738     return 0;
   2739 }
   2740 
   2741 void SecCamera::setExifFixedAttribute()
   2742 {
   2743     char property[PROPERTY_VALUE_MAX];
   2744 
   2745     //2 0th IFD TIFF Tags
   2746     //3 Maker
   2747     property_get("ro.product.brand", property, EXIF_DEF_MAKER);
   2748     strncpy((char *)mExifInfo.maker, property,
   2749                 sizeof(mExifInfo.maker) - 1);
   2750     mExifInfo.maker[sizeof(mExifInfo.maker) - 1] = '\0';
   2751     //3 Model
   2752     property_get("ro.product.model", property, EXIF_DEF_MODEL);
   2753     strncpy((char *)mExifInfo.model, property,
   2754                 sizeof(mExifInfo.model) - 1);
   2755     mExifInfo.model[sizeof(mExifInfo.model) - 1] = '\0';
   2756     //3 Software
   2757     property_get("ro.build.id", property, EXIF_DEF_SOFTWARE);
   2758     strncpy((char *)mExifInfo.software, property,
   2759                 sizeof(mExifInfo.software) - 1);
   2760     mExifInfo.software[sizeof(mExifInfo.software) - 1] = '\0';
   2761 
   2762     //3 YCbCr Positioning
   2763     mExifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
   2764 
   2765     //2 0th IFD Exif Private Tags
   2766     //3 F Number
   2767     mExifInfo.fnumber.num = EXIF_DEF_FNUMBER_NUM;
   2768     mExifInfo.fnumber.den = EXIF_DEF_FNUMBER_DEN;
   2769     //3 Exposure Program
   2770     mExifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
   2771     //3 Exif Version
   2772     memcpy(mExifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(mExifInfo.exif_version));
   2773     //3 Aperture
   2774     uint32_t av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num/mExifInfo.fnumber.den);
   2775     mExifInfo.aperture.num = av*EXIF_DEF_APEX_DEN;
   2776     mExifInfo.aperture.den = EXIF_DEF_APEX_DEN;
   2777     //3 Maximum lens aperture
   2778     mExifInfo.max_aperture.num = mExifInfo.aperture.num;
   2779     mExifInfo.max_aperture.den = mExifInfo.aperture.den;
   2780     //3 Lens Focal Length
   2781     if (m_camera_id == CAMERA_ID_BACK)
   2782         mExifInfo.focal_length.num = BACK_CAMERA_FOCAL_LENGTH;
   2783     else
   2784         mExifInfo.focal_length.num = FRONT_CAMERA_FOCAL_LENGTH;
   2785 
   2786     mExifInfo.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
   2787     //3 User Comments
   2788     strcpy((char *)mExifInfo.user_comment, EXIF_DEF_USERCOMMENTS);
   2789     //3 Color Space information
   2790     mExifInfo.color_space = EXIF_DEF_COLOR_SPACE;
   2791     //3 Exposure Mode
   2792     mExifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
   2793 
   2794     //2 0th IFD GPS Info Tags
   2795     unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
   2796     memcpy(mExifInfo.gps_version_id, gps_version, sizeof(gps_version));
   2797 
   2798     //2 1th IFD TIFF Tags
   2799     mExifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
   2800     mExifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
   2801     mExifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
   2802     mExifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
   2803     mExifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
   2804     mExifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
   2805 }
   2806 
   2807 void SecCamera::setExifChangedAttribute()
   2808 {
   2809     //2 0th IFD TIFF Tags
   2810     //3 Width
   2811     mExifInfo.width = m_snapshot_width;
   2812     //3 Height
   2813     mExifInfo.height = m_snapshot_height;
   2814     //3 Orientation
   2815     switch (m_exif_orientation) {
   2816     case 0:
   2817         mExifInfo.orientation = EXIF_ORIENTATION_UP;
   2818         break;
   2819     case 90:
   2820         mExifInfo.orientation = EXIF_ORIENTATION_90;
   2821         break;
   2822     case 180:
   2823         mExifInfo.orientation = EXIF_ORIENTATION_180;
   2824         break;
   2825     case 270:
   2826         mExifInfo.orientation = EXIF_ORIENTATION_270;
   2827         break;
   2828     default:
   2829         mExifInfo.orientation = EXIF_ORIENTATION_UP;
   2830         break;
   2831     }
   2832     //3 Date time
   2833     time_t rawtime;
   2834     struct tm *timeinfo;
   2835     time(&rawtime);
   2836     timeinfo = localtime(&rawtime);
   2837     strftime((char *)mExifInfo.date_time, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
   2838 
   2839     //2 0th IFD Exif Private Tags
   2840     //3 Exposure Time
   2841     int shutterSpeed = fimc_v4l2_g_ctrl(m_cam_fd,
   2842                                             V4L2_CID_CAMERA_GET_SHT_TIME);
   2843     /* TBD - front camera needs to be fixed to support this g_ctrl,
   2844        it current returns a negative err value, so avoid putting
   2845        odd value into exif for now */
   2846     if (shutterSpeed < 0) {
   2847         LOGE("%s: error %d getting shutterSpeed, camera_id = %d, using 100",
   2848              __func__, shutterSpeed, m_camera_id);
   2849         shutterSpeed = 100;
   2850     }
   2851     mExifInfo.exposure_time.num = 1;
   2852     // x us -> 1/x s */
   2853     mExifInfo.exposure_time.den = (uint32_t)(1000000 / shutterSpeed);
   2854 
   2855     //3 ISO Speed Rating
   2856     int iso = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_GET_ISO);
   2857     /* TBD - front camera needs to be fixed to support this g_ctrl,
   2858        it current returns a negative err value, so avoid putting
   2859        odd value into exif for now */
   2860     if (iso < 0) {
   2861         LOGE("%s: error %d getting iso, camera_id = %d, using 100",
   2862              __func__, iso, m_camera_id);
   2863         iso = ISO_100;
   2864     }
   2865     switch(iso) {
   2866         case ISO_50:
   2867             mExifInfo.iso_speed_rating = 50;
   2868             break;
   2869         case ISO_100:
   2870             mExifInfo.iso_speed_rating = 100;
   2871             break;
   2872         case ISO_200:
   2873             mExifInfo.iso_speed_rating = 200;
   2874             break;
   2875         case ISO_400:
   2876             mExifInfo.iso_speed_rating = 400;
   2877             break;
   2878         case ISO_800:
   2879             mExifInfo.iso_speed_rating = 800;
   2880             break;
   2881         case ISO_1600:
   2882             mExifInfo.iso_speed_rating = 1600;
   2883             break;
   2884         default:
   2885             mExifInfo.iso_speed_rating = 100;
   2886             break;
   2887     }
   2888 
   2889     uint32_t av, tv, bv, sv, ev;
   2890     av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num / mExifInfo.fnumber.den);
   2891     tv = APEX_EXPOSURE_TO_SHUTTER((double)mExifInfo.exposure_time.num / mExifInfo.exposure_time.den);
   2892     sv = APEX_ISO_TO_FILMSENSITIVITY(mExifInfo.iso_speed_rating);
   2893     bv = av + tv - sv;
   2894     ev = av + tv;
   2895     LOGD("Shutter speed=%d us, iso=%d\n", shutterSpeed, mExifInfo.iso_speed_rating);
   2896     LOGD("AV=%d, TV=%d, SV=%d\n", av, tv, sv);
   2897 
   2898     //3 Shutter Speed
   2899     mExifInfo.shutter_speed.num = tv*EXIF_DEF_APEX_DEN;
   2900     mExifInfo.shutter_speed.den = EXIF_DEF_APEX_DEN;
   2901     //3 Brightness
   2902     mExifInfo.brightness.num = bv*EXIF_DEF_APEX_DEN;
   2903     mExifInfo.brightness.den = EXIF_DEF_APEX_DEN;
   2904     //3 Exposure Bias
   2905     if (m_params->scene_mode == SCENE_MODE_BEACH_SNOW) {
   2906         mExifInfo.exposure_bias.num = EXIF_DEF_APEX_DEN;
   2907         mExifInfo.exposure_bias.den = EXIF_DEF_APEX_DEN;
   2908     } else {
   2909         mExifInfo.exposure_bias.num = 0;
   2910         mExifInfo.exposure_bias.den = 0;
   2911     }
   2912     //3 Metering Mode
   2913     switch (m_params->metering) {
   2914     case METERING_SPOT:
   2915         mExifInfo.metering_mode = EXIF_METERING_SPOT;
   2916         break;
   2917     case METERING_MATRIX:
   2918         mExifInfo.metering_mode = EXIF_METERING_AVERAGE;
   2919         break;
   2920     case METERING_CENTER:
   2921         mExifInfo.metering_mode = EXIF_METERING_CENTER;
   2922         break;
   2923     default :
   2924         mExifInfo.metering_mode = EXIF_METERING_AVERAGE;
   2925         break;
   2926     }
   2927 
   2928     //3 Flash
   2929     int flash = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_GET_FLASH_ONOFF);
   2930     if (flash < 0)
   2931         mExifInfo.flash = EXIF_DEF_FLASH;
   2932     else
   2933         mExifInfo.flash = flash;
   2934 
   2935     //3 White Balance
   2936     if (m_params->white_balance == WHITE_BALANCE_AUTO)
   2937         mExifInfo.white_balance = EXIF_WB_AUTO;
   2938     else
   2939         mExifInfo.white_balance = EXIF_WB_MANUAL;
   2940     //3 Scene Capture Type
   2941     switch (m_params->scene_mode) {
   2942     case SCENE_MODE_PORTRAIT:
   2943         mExifInfo.scene_capture_type = EXIF_SCENE_PORTRAIT;
   2944         break;
   2945     case SCENE_MODE_LANDSCAPE:
   2946         mExifInfo.scene_capture_type = EXIF_SCENE_LANDSCAPE;
   2947         break;
   2948     case SCENE_MODE_NIGHTSHOT:
   2949         mExifInfo.scene_capture_type = EXIF_SCENE_NIGHT;
   2950         break;
   2951     default:
   2952         mExifInfo.scene_capture_type = EXIF_SCENE_STANDARD;
   2953         break;
   2954     }
   2955 
   2956     //2 0th IFD GPS Info Tags
   2957     if (m_gps_enabled) {
   2958         if (m_gps_latitude >= 0)
   2959             strcpy((char *)mExifInfo.gps_latitude_ref, "N");
   2960         else
   2961             strcpy((char *)mExifInfo.gps_latitude_ref, "S");
   2962 
   2963         if (m_gps_longitude >= 0)
   2964             strcpy((char *)mExifInfo.gps_longitude_ref, "E");
   2965         else
   2966             strcpy((char *)mExifInfo.gps_longitude_ref, "W");
   2967 
   2968         if (m_gps_altitude >= 0)
   2969             mExifInfo.gps_altitude_ref = 0;
   2970         else
   2971             mExifInfo.gps_altitude_ref = 1;
   2972 
   2973         mExifInfo.gps_latitude[0].num = (uint32_t)labs(m_gps_latitude);
   2974         mExifInfo.gps_latitude[0].den = 10000000;
   2975         mExifInfo.gps_latitude[1].num = 0;
   2976         mExifInfo.gps_latitude[1].den = 1;
   2977         mExifInfo.gps_latitude[2].num = 0;
   2978         mExifInfo.gps_latitude[2].den = 1;
   2979 
   2980         mExifInfo.gps_longitude[0].num = (uint32_t)labs(m_gps_longitude);
   2981         mExifInfo.gps_longitude[0].den = 10000000;
   2982         mExifInfo.gps_longitude[1].num = 0;
   2983         mExifInfo.gps_longitude[1].den = 1;
   2984         mExifInfo.gps_longitude[2].num = 0;
   2985         mExifInfo.gps_longitude[2].den = 1;
   2986 
   2987         mExifInfo.gps_altitude.num = (uint32_t)labs(m_gps_altitude);
   2988         mExifInfo.gps_altitude.den = 100;
   2989 
   2990         struct tm tm_data;
   2991         gmtime_r(&m_gps_timestamp, &tm_data);
   2992         mExifInfo.gps_timestamp[0].num = tm_data.tm_hour;
   2993         mExifInfo.gps_timestamp[0].den = 1;
   2994         mExifInfo.gps_timestamp[1].num = tm_data.tm_min;
   2995         mExifInfo.gps_timestamp[1].den = 1;
   2996         mExifInfo.gps_timestamp[2].num = tm_data.tm_sec;
   2997         mExifInfo.gps_timestamp[2].den = 1;
   2998         snprintf((char*)mExifInfo.gps_datestamp, sizeof(mExifInfo.gps_datestamp),
   2999                 "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
   3000 
   3001         mExifInfo.enableGps = true;
   3002     } else {
   3003         mExifInfo.enableGps = false;
   3004     }
   3005 
   3006     //2 1th IFD TIFF Tags
   3007     mExifInfo.widthThumb = m_jpeg_thumbnail_width;
   3008     mExifInfo.heightThumb = m_jpeg_thumbnail_height;
   3009 }
   3010 
   3011 // ======================================================================
   3012 // Conversions
   3013 
   3014 inline int SecCamera::m_frameSize(int format, int width, int height)
   3015 {
   3016     int size = 0;
   3017 
   3018     switch (format) {
   3019     case V4L2_PIX_FMT_YUV420:
   3020     case V4L2_PIX_FMT_NV12:
   3021     case V4L2_PIX_FMT_NV21:
   3022         size = (width * height * 3 / 2);
   3023         break;
   3024 
   3025     case V4L2_PIX_FMT_NV12T:
   3026         size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height)) +
   3027                             ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height / 2));
   3028         break;
   3029 
   3030     case V4L2_PIX_FMT_YUV422P:
   3031     case V4L2_PIX_FMT_YUYV:
   3032     case V4L2_PIX_FMT_UYVY:
   3033         size = (width * height * 2);
   3034         break;
   3035 
   3036     default :
   3037         LOGE("ERR(%s):Invalid V4L2 pixel format(%d)\n", __func__, format);
   3038     case V4L2_PIX_FMT_RGB565:
   3039         size = (width * height * BPP);
   3040         break;
   3041     }
   3042 
   3043     return size;
   3044 }
   3045 
   3046 status_t SecCamera::dump(int fd)
   3047 {
   3048     const size_t SIZE = 256;
   3049     char buffer[SIZE];
   3050     String8 result;
   3051     snprintf(buffer, 255, "dump(%d)\n", fd);
   3052     result.append(buffer);
   3053     ::write(fd, result.string(), result.size());
   3054     return NO_ERROR;
   3055 }
   3056 
   3057 double SecCamera::jpeg_ratio = 0.7;
   3058 int SecCamera::interleaveDataSize = 5242880;
   3059 int SecCamera::jpegLineLength = 636;
   3060 
   3061 }; // namespace android
   3062