Home | History | Annotate | Download | only in src
      1 /*
      2 Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
      3 
      4 Redistribution and use in source and binary forms, with or without
      5 modification, are permitted provided that the following conditions are
      6 met:
      7     * Redistributions of source code must retain the above copyright
      8       notice, this list of conditions and the following disclaimer.
      9     * Redistributions in binary form must reproduce the above
     10       copyright notice, this list of conditions and the following
     11       disclaimer in the documentation and/or other materials provided
     12       with the distribution.
     13     * Neither the name of The Linux Foundation nor the names of its
     14       contributors may be used to endorse or promote products derived
     15       from this software without specific prior written permission.
     16 
     17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29 
     30 #include <pthread.h>
     31 #include <errno.h>
     32 #include <sys/ioctl.h>
     33 #include <sys/types.h>
     34 #include <sys/stat.h>
     35 #include <fcntl.h>
     36 #include <poll.h>
     37 #include "mm_camera_dbg.h"
     38 #include "mm_qcamera_app.h"
     39 
     40 #define BUFF_SIZE_128 128
     41 
     42 #ifdef TEST_ABORT_JPEG_ENCODE
     43 static uint8_t aborted_flag = 1;
     44 #endif
     45 
     46 //static mm_camera_ch_data_buf_t *mCurrentFrameEncoded;
     47 static int JpegOffset = 0;
     48 static int raw_snapshot_cnt = 0;
     49 static int snapshot_cnt = 0;
     50 static pthread_mutex_t g_s_mutex;
     51 static int g_status = 0;
     52 static pthread_cond_t g_s_cond_v;
     53 
     54 extern void dumpFrameToFile(mm_camera_buf_def_t* newFrame, int w, int h, char* name, int main_422,char *ext);
     55 extern int mm_app_open_zsl(int cam_id);
     56 extern int mm_app_open_camera(int cam_id);
     57 extern int mm_app_start_preview(int cam_id);
     58 extern int mm_stream_alloc_bufs(mm_camera_app_obj_t *pme,
     59                                 mm_camear_app_buf_t* app_bufs,
     60                                 mm_camera_frame_len_offset *frame_offset_info,
     61                                 uint8_t num_bufs);
     62 extern int mm_stream_release_bufs(mm_camera_app_obj_t *pme,
     63                                   mm_camear_app_buf_t* app_bufs);
     64 extern int mm_stream_invalid_cache(mm_camera_app_obj_t *pme,
     65                                    mm_camera_buf_def_t *frame);
     66 
     67 static void mm_app_snapshot_done()
     68 {
     69     pthread_mutex_lock(&g_s_mutex);
     70     g_status = TRUE;
     71     pthread_cond_signal(&g_s_cond_v);
     72     pthread_mutex_unlock(&g_s_mutex);
     73 }
     74 
     75 static int mm_app_dump_snapshot_frame(struct msm_frame *frame,
     76                                       uint32_t len, int is_main, int is_raw)
     77 {
     78     char bufp[BUFF_SIZE_128];
     79     int file_fdp;
     80     int rc = 0;
     81 
     82     if (is_raw) {
     83         snprintf(bufp, BUFF_SIZE_128, "/data/main_raw_%d.yuv", raw_snapshot_cnt);
     84     } else {
     85         if (is_main) {
     86             snprintf(bufp, BUFF_SIZE_128, "/data/main_%d.yuv", snapshot_cnt);
     87         } else {
     88             snprintf(bufp, BUFF_SIZE_128, "/data/thumb_%d.yuv", snapshot_cnt);
     89         }
     90     }
     91 
     92     file_fdp = open(bufp, O_RDWR | O_CREAT, 0777);
     93 
     94     if (file_fdp < 0) {
     95         CDBG("cannot open file %s\n", bufp);
     96         rc = -1;
     97         goto end;
     98     }
     99     CDBG("%s:dump snapshot frame to '%s'\n", __func__, bufp);
    100     write(file_fdp,
    101           (const void *)frame->buffer, len);
    102     close(file_fdp);
    103     end:
    104     return rc;
    105 }
    106 
    107 
    108 static void mm_app_dump_jpeg_frame(const void * data, uint32_t size, char* name, char* ext, int index)
    109 {
    110     char buf[32];
    111     int file_fd;
    112     if ( data != NULL) {
    113         char * str;
    114         snprintf(buf, sizeof(buf), "/data/%s_%d.%s", name, index, ext);
    115         CDBG("%s: %s size =%d, jobId=%d", __func__, buf, size, index);
    116         file_fd = open(buf, O_RDWR | O_CREAT, 0777);
    117         write(file_fd, data, size);
    118         close(file_fd);
    119     }
    120 }
    121 
    122 static int mm_app_set_thumbnail_fmt(int cam_id, mm_camera_image_fmt_t *fmt)
    123 {
    124     int rc = MM_CAMERA_OK;
    125     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    126 
    127     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    128     fmt->fmt = pme->dim.thumb_format;
    129     fmt->width = pme->dim.thumbnail_width;
    130     fmt->height = pme->dim.thumbnail_height;
    131     if (cam_id == 0) {
    132         /* back camera, rotate 90 */
    133         fmt->rotation = 90;
    134     }
    135     CDBG("Thumbnail Dimension = %dX%d",fmt->width,fmt->height);
    136     return rc;
    137 }
    138 
    139 int mm_app_set_snapshot_fmt(int cam_id, mm_camera_image_fmt_t *fmt)
    140 {
    141 
    142     int rc = MM_CAMERA_OK;
    143     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    144     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    145     fmt->fmt = pme->dim.main_img_format;
    146     fmt->width = pme->dim.picture_width;
    147     fmt->height = pme->dim.picture_height;
    148     if (cam_id == 0) {
    149         /* back camera, rotate 90 */
    150         fmt->rotation = 90;
    151     }
    152     CDBG("Snapshot Dimension = %dX%d",fmt->width,fmt->height);
    153     return rc;
    154 }
    155 
    156 int mm_app_set_live_snapshot_fmt(int cam_id, mm_camera_image_fmt_t *fmt)
    157 {
    158     int rc = MM_CAMERA_OK;
    159     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    160     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    161     fmt->fmt = pme->dim.enc_format;
    162     fmt->width = pme->dim.video_width;
    163     fmt->height = pme->dim.video_height;
    164     CDBG("Livesnapshot Dimension = %dX%d",fmt->width,fmt->height);
    165     return rc;
    166 }
    167 
    168 int mm_app_set_raw_snapshot_fmt(int cam_id,mm_camera_image_fmt_t *fmt)
    169 {
    170     int rc = MM_CAMERA_OK;
    171     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    172 
    173     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    174     fmt->fmt = pme->dim.raw_img_format;
    175     fmt->width = pme->dim.raw_picture_width;
    176     fmt->height = pme->dim.raw_picture_height;
    177     if (cam_id == 0) {
    178         /* back camera, rotate 90 */
    179         fmt->rotation = 90;
    180     }
    181     CDBG("%s: Raw Snapshot Dimension = %d X %d",__func__,pme->dim.raw_picture_width,pme->dim.raw_picture_height);
    182     return rc;
    183 }
    184 
    185 /* This callback is received once the complete JPEG encoding is done */
    186 static void jpeg_encode_cb(jpeg_job_status_t status,
    187                            uint8_t thumbnailDroppedFlag,
    188                            uint32_t client_hdl,
    189                            uint32_t jobId,
    190                            uint8_t* out_data,
    191                            uint32_t data_size,
    192                            void *userData)
    193 {
    194     int rc;
    195     int i = 0;
    196     mm_camera_buf_def_t *main_frame = NULL;
    197     mm_camera_buf_def_t *thumb_frame = NULL;
    198     mm_camera_app_obj_t *pme = NULL;
    199     CDBG("%s: BEGIN\n", __func__);
    200 
    201     pme = (mm_camera_app_obj_t *)userData;
    202     if (jobId != pme->current_job_id || !pme->current_job_frames) {
    203         CDBG_ERROR("%s: NULL current job frames or not matching job ID (%d, %d)",
    204                    __func__, jobId, pme->current_job_id);
    205         return;
    206     }
    207 
    208     /* dump jpeg img */
    209     CDBG_ERROR("%s: job %d, status=%d, thumbnail_dropped=%d",
    210                __func__, jobId, status, thumbnailDroppedFlag);
    211     if (status == JPEG_JOB_STATUS_DONE) {
    212         mm_app_dump_jpeg_frame(out_data, data_size, "jpeg_dump", "jpg", pme->my_id);
    213     }
    214 
    215     /* buf done current encoding frames */
    216     pme->current_job_id = 0;
    217     for (i=0; i<pme->current_job_frames->num_bufs; i++) {
    218         if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->current_job_frames->camera_handle,
    219                                                 pme->current_job_frames->ch_id,
    220                                                 pme->current_job_frames->bufs[i])) {
    221             CDBG_ERROR("%s: Failed in Qbuf\n", __func__);
    222         }
    223     }
    224     free(pme->current_job_frames);
    225     pme->current_job_frames = NULL;
    226 
    227     /* signal snapshot is done */
    228     mm_app_snapshot_done();
    229 }
    230 
    231 static int encodeData(mm_camera_app_obj_t *pme,
    232                       mm_camera_super_buf_t* recvd_frame)
    233 {
    234     int rc = -1;
    235     int i,index = -1;
    236     mm_jpeg_job job;
    237     mm_camera_buf_def_t *main_frame = NULL;
    238     mm_camera_buf_def_t *thumb_frame = NULL;
    239     src_image_buffer_info* main_buf_info = NULL;
    240     src_image_buffer_info* thumb_buf_info = NULL;
    241     mm_camera_frame_len_offset main_offset;
    242     mm_camera_frame_len_offset thumb_offset;
    243 
    244     /* dump raw img for debug purpose */
    245     CDBG("%s : total streams = %d",__func__,recvd_frame->num_bufs);
    246     for (i=0; i<recvd_frame->num_bufs; i++) {
    247         if (pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id == recvd_frame->bufs[i]->stream_id) {
    248             main_frame = recvd_frame->bufs[i];
    249             CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len);
    250             dumpFrameToFile(main_frame,pme->dim.picture_width,pme->dim.picture_height,"main", 1,"yuv");
    251         } else if (pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id == recvd_frame->bufs[i]->stream_id){
    252             thumb_frame = recvd_frame->bufs[1];
    253             CDBG("thumnail frame_idx = %d fd = %d frame length = %d",thumb_frame->frame_idx,thumb_frame->fd,thumb_frame->frame_len);
    254             dumpFrameToFile(thumb_frame,pme->dim.thumbnail_width,pme->dim.thumbnail_height,"thumb", 1,"yuv");
    255         }
    256     }
    257 
    258     if (main_frame == NULL) {
    259         CDBG_ERROR("%s: Main frame is NULL", __func__);
    260         return rc;
    261     }
    262 
    263     /* remember current frames being encoded */
    264     pme->current_job_frames =
    265         (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
    266     if (!pme->current_job_frames) {
    267         CDBG_ERROR("%s: No memory for current_job_frames", __func__);
    268         return rc;
    269     }
    270     memcpy(pme->current_job_frames, recvd_frame, sizeof(mm_camera_super_buf_t));
    271 
    272     memset(&job, 0, sizeof(job));
    273     job.job_type = JPEG_JOB_TYPE_ENCODE;
    274     job.encode_job.jpeg_cb = jpeg_encode_cb;
    275     job.encode_job.userdata = (void*)pme;
    276     job.encode_job.encode_parm.exif_data = NULL;
    277     job.encode_job.encode_parm.exif_numEntries = 0;
    278     job.encode_job.encode_parm.rotation = 0;
    279     job.encode_job.encode_parm.buf_info.src_imgs.src_img_num = recvd_frame->num_bufs;
    280     job.encode_job.encode_parm.rotation = 0;
    281     if (pme->my_id == 0) {
    282         /* back camera, rotate 90 */
    283         job.encode_job.encode_parm.rotation = 90;
    284     }
    285 
    286     /* fill in main src img encode param */
    287     main_buf_info = &job.encode_job.encode_parm.buf_info.src_imgs.src_img[JPEG_SRC_IMAGE_TYPE_MAIN];
    288     main_buf_info->type = JPEG_SRC_IMAGE_TYPE_MAIN;
    289     main_buf_info->color_format = MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; //TODO
    290     main_buf_info->quality = 85;
    291     main_buf_info->src_dim.width = pme->dim.picture_width;
    292     main_buf_info->src_dim.height = pme->dim.picture_height;
    293     main_buf_info->out_dim.width = pme->dim.picture_width;
    294     main_buf_info->out_dim.height = pme->dim.picture_height;
    295     main_buf_info->crop.width = pme->dim.picture_width;
    296     main_buf_info->crop.height = pme->dim.picture_height;
    297     main_buf_info->crop.offset_x = 0;
    298     main_buf_info->crop.offset_y = 0;
    299     main_buf_info->img_fmt = JPEG_SRC_IMAGE_FMT_YUV;
    300     main_buf_info->num_bufs = 1;
    301     main_buf_info->src_image[0].fd = main_frame->fd;
    302     main_buf_info->src_image[0].buf_vaddr = main_frame->buffer;
    303     pme->cam->ops->get_stream_parm(pme->cam->camera_handle,
    304                                    pme->ch_id,
    305                                    pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id,
    306                                    MM_CAMERA_STREAM_OFFSET,
    307                                    &main_buf_info->src_image[0].offset);
    308     CDBG("%s: main offset: num_planes=%d, frame length=%d, y_offset=%d, cbcr_offset=%d",
    309          __func__, main_buf_info->src_image[0].offset.num_planes,
    310          main_buf_info->src_image[0].offset.frame_len,
    311          main_buf_info->src_image[0].offset.mp[0].offset,
    312          main_buf_info->src_image[0].offset.mp[1].offset);
    313 
    314     mm_stream_clear_invalid_cache(pme,main_frame);
    315 
    316     if (thumb_frame) {
    317         /* fill in thumbnail src img encode param */
    318         thumb_buf_info = &job.encode_job.encode_parm.buf_info.src_imgs.src_img[JPEG_SRC_IMAGE_TYPE_THUMB];
    319         thumb_buf_info->type = JPEG_SRC_IMAGE_TYPE_THUMB;
    320         thumb_buf_info->color_format = MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; //TODO
    321         thumb_buf_info->quality = 85;
    322         thumb_buf_info->src_dim.width = pme->dim.thumbnail_width;
    323         thumb_buf_info->src_dim.height = pme->dim.thumbnail_height;
    324         thumb_buf_info->out_dim.width = pme->dim.thumbnail_width;
    325         thumb_buf_info->out_dim.height = pme->dim.thumbnail_height;
    326         thumb_buf_info->crop.width = pme->dim.thumbnail_width;
    327         thumb_buf_info->crop.height = pme->dim.thumbnail_height;
    328         thumb_buf_info->crop.offset_x = 0;
    329         thumb_buf_info->crop.offset_y = 0;
    330         thumb_buf_info->img_fmt = JPEG_SRC_IMAGE_FMT_YUV;
    331         thumb_buf_info->num_bufs = 1;
    332         thumb_buf_info->src_image[0].fd = thumb_frame->fd;
    333         thumb_buf_info->src_image[0].buf_vaddr = thumb_frame->buffer;
    334         pme->cam->ops->get_stream_parm(pme->cam->camera_handle,
    335                                        pme->ch_id,
    336                                        pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id,
    337                                        MM_CAMERA_STREAM_OFFSET,
    338                                        &thumb_buf_info->src_image[0].offset);
    339     }
    340 
    341     /* fill in sink img param */
    342     job.encode_job.encode_parm.buf_info.sink_img.buf_len = pme->jpeg_buf.bufs[0].frame_len;
    343     job.encode_job.encode_parm.buf_info.sink_img.buf_vaddr = pme->jpeg_buf.bufs[0].buffer;
    344     job.encode_job.encode_parm.buf_info.sink_img.fd = pme->jpeg_buf.bufs[0].fd;
    345 
    346     mm_stream_clear_invalid_cache(pme,thumb_frame);
    347 
    348     rc = pme->jpeg_ops.start_job(pme->jpeg_hdl, &job, &pme->current_job_id);
    349     if ( 0 != rc ) {
    350         free(pme->current_job_frames);
    351         pme->current_job_frames = NULL;
    352     }
    353 
    354     return rc;
    355 }
    356 
    357 static void snapshot_yuv_cb(mm_camera_super_buf_t *bufs,
    358                             void *user_data)
    359 {
    360 
    361     int rc;
    362     int i = 0;
    363     mm_camera_buf_def_t *main_frame = NULL;
    364     mm_camera_buf_def_t *thumb_frame = NULL;
    365     mm_camera_app_obj_t *pme = NULL;
    366     char* cmd = "This is a private cmd from test app";
    367 
    368     CDBG("%s: BEGIN\n", __func__);
    369 
    370     pme = (mm_camera_app_obj_t *)user_data;
    371 
    372     CDBG("%s: send private ioctl here", __func__);
    373     pme->cam->ops->send_command(bufs->camera_handle,
    374                                 MM_CAMERA_CMD_TYPE_PRIVATE,
    375                                 0,
    376                                 strlen(cmd) + 1,
    377                                 (void *)cmd);
    378 
    379     /* start jpeg encoding job */
    380     rc = encodeData(pme, bufs);
    381 
    382     /* buf done rcvd frames in error case */
    383     if ( 0 != rc ) {
    384         for (i=0; i<bufs->num_bufs; i++) {
    385             if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle,
    386                                                     bufs->ch_id,
    387                                                     bufs->bufs[i])) {
    388                 CDBG_ERROR("%s: Failed in Qbuf\n", __func__);
    389             }
    390             mm_stream_invalid_cache(pme,bufs->bufs[i]);
    391         }
    392     }
    393 #ifdef TEST_ABORT_JPEG_ENCODE
    394     else {
    395         if (aborted_flag) {
    396             aborted_flag = 0;
    397             /* abort the job */
    398             CDBG("%s: abort jpeg encode job  here", __func__);
    399             rc = pme->jpeg_ops.abort_job(pme->jpeg_hdl, pme->current_job_id);
    400             if (NULL != pme->current_job_frames) {
    401                 free(pme->current_job_frames);
    402                 pme->current_job_frames = NULL;
    403             }
    404             CDBG("%s: abort jpeg encode job returns %d", __func__, rc);
    405             for (i=0; i<bufs->num_bufs; i++) {
    406                 if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle,
    407                                                         bufs->ch_id,
    408                                                         bufs->bufs[i])) {
    409                     CDBG_ERROR("%s: Failed in Qbuf\n", __func__);
    410                 }
    411                 mm_stream_invalid_cache(pme,bufs->bufs[i]);
    412             }
    413 
    414             /* signal snapshot is done */
    415             mm_app_snapshot_done();
    416         }
    417     }
    418 #endif
    419 
    420     CDBG("%s: END\n", __func__);
    421 }
    422 
    423 static void snapshot_raw_cb(mm_camera_super_buf_t *recvd_frame,
    424                             void *user_data)
    425 {
    426     int rc;
    427     int i = 0;
    428     mm_camera_buf_def_t *main_frame = NULL;
    429     mm_camera_app_obj_t *pme = NULL;
    430 
    431     CDBG("%s: BEGIN\n", __func__);
    432 
    433     pme = (mm_camera_app_obj_t *)user_data;
    434 
    435      if (pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id == recvd_frame->bufs[i]->stream_id) {
    436          main_frame = recvd_frame->bufs[i];
    437          CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len);
    438          dumpFrameToFile(main_frame,pme->dim.raw_picture_width,pme->dim.raw_picture_height,"raw_main", 1,"raw");
    439      }
    440      if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,
    441                                                 main_frame)) {
    442         CDBG_ERROR("%s: Failed in Qbuf\n", __func__);
    443      }
    444 
    445      mm_app_snapshot_done();
    446 }
    447 
    448 static int encodeDisplayAndSave(mm_camera_super_buf_t* recvd_frame,
    449                                 int enqueued, mm_camera_app_obj_t *pme)
    450 {
    451     int ret = -1;
    452 #if 0
    453 
    454 
    455     CDBG("%s: Send frame for encoding", __func__);
    456     ret = encodeData(recvd_frame, pme->snapshot_buf.frame_len,
    457                      enqueued, pme);
    458     if (!ret) {
    459         CDBG_ERROR("%s: Failure configuring JPEG encoder", __func__);
    460     }
    461 
    462     LOGD("%s: X", __func__);
    463 #endif
    464     return ret;
    465 }
    466 
    467 int mm_app_add_snapshot_stream(int cam_id)
    468 {
    469     int rc = MM_CAMERA_OK;
    470     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    471 
    472     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id,
    473                                                                         NULL,pme,
    474                                                                         MM_CAMERA_SNAPSHOT_MAIN, 0);
    475 
    476     CDBG("Add Snapshot main is successfull stream ID = %d",pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id);
    477     if (!pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id) {
    478         CDBG_ERROR("%s:snapshot main streaming err=%d\n", __func__, rc);
    479         rc = -1;
    480         goto end;
    481     }
    482 
    483     pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id,
    484                                                                              NULL,pme,
    485                                                                              MM_CAMERA_SNAPSHOT_THUMBNAIL, 0);
    486     if (!pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id) {
    487         CDBG_ERROR("%s:snapshot thumbnail streaming err=%d\n", __func__, rc);
    488         rc = -1;
    489         goto end;
    490     }
    491     end:
    492     CDBG("%s: END, rc=%d\n", __func__, rc);
    493     return rc;
    494 }
    495 
    496 void mm_app_set_snapshot_mode(int cam_id,int op_mode)
    497 {
    498     denoise_param_t wnr;
    499     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    500     pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_OP_MODE, &op_mode);
    501 
    502     /* set wnr enabled */
    503     memset(&wnr, 0, sizeof(denoise_param_t));
    504     wnr.denoise_enable = 0;
    505     wnr.process_plates = 0;
    506  //   pme->cam->ops->set_parm(pme->cam->camera_handle, MM_CAMERA_PARM_WAVELET_DENOISE, &wnr);
    507 }
    508 
    509 int mm_app_config_raw_format(int cam_id)
    510 {
    511     int rc = MM_CAMERA_OK;
    512     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    513     mm_camera_image_fmt_t *m_fmt = NULL;
    514     mm_camera_image_fmt_t *t_fmt = NULL;
    515 
    516     mm_app_set_raw_snapshot_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.fmt);
    517 
    518     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.need_stream_on = 1;
    519     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.num_of_bufs = 1;
    520 
    521     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id,
    522                                                            &pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config))) {
    523         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    524         goto end;
    525     }
    526 
    527 end:
    528     CDBG("%s: END, rc=%d\n", __func__, rc);
    529     return rc;
    530 
    531 }
    532 
    533 int mm_app_config_snapshot_format(int cam_id)
    534 {
    535     int rc = MM_CAMERA_OK;
    536     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    537 
    538     mm_app_set_snapshot_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.fmt);
    539 
    540     mm_app_set_thumbnail_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config.fmt);
    541 
    542     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.need_stream_on = 1;
    543     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.num_of_bufs = 1;
    544 
    545     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id,
    546                                                            &pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config))) {
    547         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    548         goto end;
    549     }
    550 
    551     pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config.need_stream_on = 1;
    552     pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config.num_of_bufs = 1;
    553 
    554     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id,
    555                                                            &pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].str_config))) {
    556         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    557         goto end;
    558     }
    559     end:
    560     CDBG("%s: END, rc=%d\n", __func__, rc);
    561     return rc;
    562 
    563 }
    564 
    565 int mm_app_streamon_snapshot(int cam_id)
    566 {
    567     int rc = MM_CAMERA_OK;
    568     uint32_t stream[2];
    569     mm_camera_bundle_attr_t attr;
    570 
    571     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    572 
    573     stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
    574     stream[1] = pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id;
    575 
    576     attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST;
    577     attr.burst_num = 1;
    578     attr.look_back = 2;
    579     attr.post_frame_skip = 0;
    580     attr.water_mark = 2;
    581 
    582     if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle(
    583                                                                pme->cam->camera_handle,pme->ch_id,snapshot_yuv_cb,pme,&attr,2,stream))) {
    584         CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc);
    585         goto end;
    586     }
    587 
    588     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,
    589                                                            2, stream))) {
    590         CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc);
    591         goto end;
    592     }
    593 
    594     if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, attr.burst_num))) {
    595         CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc);
    596         goto end;
    597     }
    598     pme->cam_state = CAMERA_STATE_SNAPSHOT;
    599     end:
    600     CDBG("%s: END, rc=%d\n", __func__, rc);
    601     return rc;
    602 }
    603 
    604 int mm_app_streamon_raw(int cam_id)
    605 {
    606     int rc = MM_CAMERA_OK;
    607     uint32_t stream[2];
    608     mm_camera_bundle_attr_t attr;
    609 
    610     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    611 
    612     stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
    613 
    614     attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST;
    615     attr.burst_num = 1;
    616     attr.look_back = 2;
    617     attr.post_frame_skip = 0;
    618     attr.water_mark = 2;
    619 
    620     if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle(
    621                                                                pme->cam->camera_handle,pme->ch_id,snapshot_raw_cb,pme,&attr,1,stream))) {
    622         CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc);
    623         goto end;
    624     }
    625 
    626     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,
    627                                                            1, stream))) {
    628         CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc);
    629         goto end;
    630     }
    631 
    632     if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, attr.burst_num))) {
    633         CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc);
    634         goto end;
    635     }
    636     pme->cam_state = CAMERA_STATE_SNAPSHOT;
    637 end:
    638     CDBG("%s: END, rc=%d\n", __func__, rc);
    639     return rc;
    640 }
    641 
    642 int mm_app_streamoff_snapshot(int cam_id)
    643 {
    644     int rc = MM_CAMERA_OK;
    645     uint32_t stream[2];
    646 
    647     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    648 
    649     stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
    650     stream[1] = pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id;
    651 
    652     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,2,stream))) {
    653         CDBG_ERROR("%s : Snapshot Stream off Error",__func__);
    654         goto end;
    655     }
    656     CDBG("Stop snapshot main successfull");
    657 
    658     if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) {
    659         CDBG_ERROR("%s : Snapshot destroy_stream_bundle Error",__func__);
    660         goto end;
    661     }
    662 
    663     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id))) {
    664         CDBG_ERROR("%s : Snapshot main image del_stream Error",__func__);
    665         goto end;
    666     }
    667     CDBG("del_stream successfull");
    668 
    669     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_THUMBNAIL].id))) {
    670         CDBG_ERROR("%s : Snapshot thumnail image del_stream Error",__func__);
    671         goto end;
    672     }
    673     CDBG("del_stream successfull");
    674 
    675     end:
    676     return rc;
    677 }
    678 
    679 int mm_app_start_snapshot(int cam_id)
    680 {
    681     int rc = MM_CAMERA_OK;
    682     int stream[2];
    683     int op_mode = 0;
    684     uint8_t initial_reg_flag;
    685     mm_camera_frame_len_offset frame_offset_info;
    686 
    687     mm_camera_bundle_attr_t attr;
    688 
    689 
    690     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    691 
    692     if (MM_CAMERA_OK != mm_app_stop_preview(cam_id)) {
    693         CDBG_ERROR("%s: Stop preview Failed cam_id=%d\n",__func__,cam_id);
    694         return -1;
    695     }
    696     op_mode = MM_CAMERA_OP_MODE_CAPTURE;
    697     mm_app_set_snapshot_mode(cam_id,op_mode);
    698     usleep(20*1000);
    699 //    pme->cam->ops->prepare_snapshot(pme->cam->camera_handle,pme->ch_id,0);
    700 
    701     if (MM_CAMERA_OK != (rc = mm_app_add_snapshot_stream(cam_id))) {
    702         CDBG_ERROR("%s : Add Snapshot stream err",__func__);
    703         return rc;
    704     }
    705 
    706     if (MM_CAMERA_OK != (rc = mm_app_config_snapshot_format(cam_id))) {
    707         CDBG_ERROR("%s : Config Snapshot stream err",__func__);
    708         return rc;
    709     }
    710 
    711     if (MM_CAMERA_OK != (rc = mm_app_streamon_snapshot(cam_id))) {
    712         CDBG_ERROR("%s : Stream on Snapshot stream err",__func__);
    713         return rc;
    714     }
    715 
    716     /* init jpeg buf */
    717     pme->cam->ops->get_stream_parm(pme->cam->camera_handle,
    718                                    pme->ch_id,
    719                                    pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id,
    720                                    MM_CAMERA_STREAM_OFFSET,
    721                                    &frame_offset_info);
    722     CDBG_ERROR("%s : alloc jpeg buf (len=%d)",__func__, frame_offset_info.frame_len);
    723     rc = mm_stream_alloc_bufs(pme,
    724                               &pme->jpeg_buf,
    725                               &frame_offset_info,
    726                               1);
    727     if (0 != rc) {
    728         CDBG_ERROR("%s : mm_stream_alloc_bufs err",__func__);
    729         return rc;
    730     }
    731 
    732     CDBG("%s: END, rc=%d\n", __func__, rc);
    733     return rc;
    734 }
    735 
    736 int mm_app_start_raw(int cam_id)
    737 {
    738     int rc = MM_CAMERA_OK;
    739     int op_mode = 0;
    740 
    741     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    742 
    743     if (MM_CAMERA_OK != mm_app_stop_preview(cam_id)) {
    744         CDBG_ERROR("%s: Stop preview Failed cam_id=%d\n",__func__,cam_id);
    745         return -1;
    746     }
    747     op_mode = MM_CAMERA_OP_MODE_RAW;
    748     pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_OP_MODE, &op_mode);
    749     usleep(20*1000);
    750 
    751     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id,
    752                                                                         NULL,pme,
    753                                                                         MM_CAMERA_SNAPSHOT_MAIN, 0);
    754 
    755     CDBG("Add RAW main is successfull stream ID = %d",pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id);
    756     if (!pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id) {
    757         CDBG_ERROR("%s:Raw main streaming err=%d\n", __func__, rc);
    758         rc = -1;
    759         return rc;
    760     }
    761 
    762     if (MM_CAMERA_OK != (rc = mm_app_config_raw_format(cam_id))) {
    763         CDBG_ERROR("%s : Config Raw Snapshot stream err",__func__);
    764         return rc;
    765     }
    766 
    767     if (MM_CAMERA_OK != (rc = mm_app_streamon_raw(cam_id))) {
    768         CDBG_ERROR("%s : Stream on Raw Snapshot stream err",__func__);
    769         return rc;
    770     }
    771 
    772     CDBG("%s: END, rc=%d\n", __func__, rc);
    773     return rc;
    774 }
    775 
    776 int mm_app_stop_snapshot(int cam_id)
    777 {
    778     int rc = MM_CAMERA_OK;
    779     int i;
    780 
    781     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    782 
    783     if (pme->current_job_id) {
    784         /* have current jpeg encoding running, abort the job */
    785         if (pme->jpeg_ops.abort_job) {
    786             pme->jpeg_ops.abort_job(pme->jpeg_hdl, pme->current_job_id);
    787             pme->current_job_id = 0;
    788         }
    789 
    790         if (pme->current_job_frames) {
    791             for (i=0; i<pme->current_job_frames->num_bufs; i++) {
    792                 if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->current_job_frames->camera_handle,
    793                                                         pme->current_job_frames->ch_id,
    794                                                         pme->current_job_frames->bufs[i])) {
    795                     CDBG_ERROR("%s: Failed in Qbuf\n", __func__);
    796                 }
    797                 mm_stream_invalid_cache(pme,pme->current_job_frames->bufs[i]);
    798             }
    799             free(pme->current_job_frames);
    800             pme->current_job_frames = NULL;
    801         }
    802     }
    803 
    804     if (MM_CAMERA_OK != (rc = mm_app_streamoff_snapshot(cam_id))) {
    805         CDBG_ERROR("%s : Stream off Snapshot stream err",__func__);
    806     }
    807     pme->cam_state = CAMERA_STATE_OPEN;
    808 
    809     /* deinit jpeg buf */
    810     rc = mm_stream_release_bufs(pme,
    811                                 &pme->jpeg_buf);
    812 end:
    813     CDBG("%s: END, rc=%d\n", __func__, rc);
    814 
    815     return rc;
    816 }
    817 
    818 int mm_app_stop_raw(int cam_id)
    819 {
    820     int rc = MM_CAMERA_OK;
    821     int i;
    822     uint32_t stream[1];
    823 
    824     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    825 
    826     stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
    827 
    828     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream))) {
    829         CDBG_ERROR("%s : Snapshot Stream off Error",__func__);
    830         goto end;
    831     }
    832     CDBG("Stop snapshot main successfull");
    833 
    834     if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) {
    835         CDBG_ERROR("%s : Snapshot destroy_stream_bundle Error",__func__);
    836         goto end;
    837     }
    838 
    839     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id))) {
    840         CDBG_ERROR("%s : Snapshot main image del_stream Error",__func__);
    841         goto end;
    842     }
    843     CDBG("del_stream successfull");
    844 
    845     pme->cam_state = CAMERA_STATE_OPEN;
    846 end:
    847     return rc;
    848 }
    849 
    850 static void mm_app_snapshot_wait(int cam_id)
    851 {
    852     pthread_mutex_lock(&g_s_mutex);
    853     if (FALSE == g_status) {
    854         pthread_cond_wait(&g_s_cond_v, &g_s_mutex);
    855         g_status = FALSE;
    856     }
    857     pthread_mutex_unlock(&g_s_mutex);
    858 }
    859 
    860 static void mm_app_live_notify_cb(mm_camera_super_buf_t *bufs,
    861                                   void *user_data)
    862 {
    863 
    864     int rc;
    865     int i = 0;
    866     mm_camera_buf_def_t *main_frame = NULL;
    867     mm_camera_app_obj_t *pme = NULL;
    868     CDBG("%s: BEGIN\n", __func__);
    869 
    870     pme = (mm_camera_app_obj_t *)user_data;
    871 
    872     CDBG("%s : total streams = %d",__func__,bufs->num_bufs);
    873     main_frame = bufs->bufs[0];
    874     //thumb_frame = bufs->bufs[1];
    875 
    876     CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len);
    877     //CDBG("thumnail frame_idx = %d fd = %d frame length = %d",thumb_frame->frame_idx,thumb_frame->fd,thumb_frame->frame_len);
    878 
    879     //dumpFrameToFile(main_frame->frame,pme->dim.picture_width,pme->dim.picture_height,"main", 1);
    880 
    881     dumpFrameToFile(main_frame,pme->dim.picture_width,pme->dim.picture_height,"liveshot_main", 1,"yuv");
    882 
    883     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,main_frame)) {
    884         CDBG_ERROR("%s: Failed in thumbnail Qbuf\n", __func__);
    885     }
    886     mm_stream_invalid_cache(pme,main_frame);
    887     /*if(MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,thumb_frame))
    888     {
    889             CDBG_ERROR("%s: Failed in thumbnail Qbuf\n", __func__);
    890     }*/
    891 
    892     mm_app_snapshot_done();
    893     CDBG("%s: END\n", __func__);
    894 
    895 
    896 }
    897 
    898 int mm_app_prepare_live_snapshot(int cam_id)
    899 {
    900     int rc = 0;
    901     uint32_t stream[1];
    902     mm_camera_bundle_attr_t attr;
    903     int value = 0;
    904 
    905     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    906     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
    907 
    908     stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
    909     //stream[1] = pme->stream[MM_CAMERA_PREVIEW].id;  //Need to clarify
    910 
    911     attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST;
    912     attr.burst_num = 1;
    913     attr.look_back = 2;
    914     attr.post_frame_skip = 0;
    915     attr.water_mark = 2;
    916 
    917 
    918     if (MM_CAMERA_OK != (rc = pme->cam->ops->set_parm(
    919                                                      pme->cam->camera_handle,MM_CAMERA_PARM_FULL_LIVESHOT, (void *)&value))) {
    920         CDBG_ERROR("%s: set dimension err=%d\n", __func__, rc);
    921     }
    922 
    923     if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle(
    924                                                                pme->cam->camera_handle,pme->ch_id,mm_app_live_notify_cb,pme,&attr,1,stream))) {
    925         CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc);
    926         rc = -1;
    927         goto end;
    928     }
    929 
    930     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,
    931                                                            1, stream))) {
    932         CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc);
    933         rc = -1;
    934         goto end;
    935     }
    936 
    937 
    938     end:
    939     CDBG("%s:END, cam_id=%d\n",__func__,cam_id);
    940     return rc;
    941 }
    942 
    943 int mm_app_unprepare_live_snapshot(int cam_id)
    944 {
    945     int rc = 0;
    946     uint32_t stream[2];
    947 
    948     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    949     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
    950 
    951     stream[0] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
    952     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream))) {
    953         CDBG_ERROR("%s : Snapshot Stream off Error",__func__);
    954         return -1;
    955     }
    956 
    957     if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) {
    958         CDBG_ERROR("%s : Snapshot destroy_stream_bundle Error",__func__);
    959         return -1;
    960     }
    961     CDBG("%s:END, cam_id=%d\n",__func__,cam_id);
    962     return rc;
    963 }
    964 
    965 int mm_app_take_live_snapshot(int cam_id)
    966 {
    967     int rc = 0;
    968     int stream[3];
    969     mm_camera_bundle_attr_t attr;
    970 
    971     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    972 
    973     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
    974 
    975     if (pme->cam_mode == RECORDER_MODE &&
    976         pme->cam_state == CAMERA_STATE_RECORD) {
    977         //Code to get live shot
    978         if (mm_app_prepare_live_snapshot(cam_id) != MM_CAMERA_OK) {
    979             CDBG_ERROR("%s: Failed prepare liveshot",__func__);
    980             return -1;
    981         }
    982         if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, 1))) {
    983             CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc);
    984             return -1;
    985         }
    986         CDBG("%s:waiting images\n",__func__);
    987         mm_app_snapshot_wait(cam_id);
    988 
    989         if (MM_CAMERA_OK !=mm_app_unprepare_live_snapshot(cam_id)) {
    990             CDBG_ERROR("%s: Snapshot Stop error",__func__);
    991         }
    992 
    993     } else {
    994         CDBG_ERROR("%s: Should not come here for liveshot",__func__);
    995     }
    996     return rc;
    997 }
    998 
    999 int mm_app_take_picture_raw(int cam_id)
   1000 {
   1001 
   1002     int rc;
   1003     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1004 
   1005     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
   1006 
   1007     if (MM_CAMERA_OK != mm_app_start_raw(cam_id)) {
   1008         CDBG_ERROR("%s: cam_id=%d\n",__func__,cam_id);
   1009         rc = -1;
   1010         goto end;
   1011     }
   1012 
   1013     CDBG("%s:waiting images\n",__func__);
   1014     mm_app_snapshot_wait(cam_id);
   1015 
   1016     if (MM_CAMERA_OK !=mm_app_stop_raw(cam_id)) {
   1017         CDBG_ERROR("%s: Snapshot Stop error",__func__);
   1018     }
   1019 
   1020 preview:
   1021     if (MM_CAMERA_OK != (rc = mm_app_start_preview(cam_id))) {
   1022         CDBG("%s:preview start stream err=%d\n", __func__, rc);
   1023     }
   1024     end:
   1025     CDBG("%s:END, cam_id=%d\n",__func__,cam_id);
   1026     return rc;
   1027 }
   1028 
   1029 int mm_app_take_picture_zsl(int cam_id)
   1030 {
   1031     int rc = MM_CAMERA_OK;
   1032     int value = 1;
   1033     int op_mode;
   1034 
   1035     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1036 
   1037     CDBG("%s: Take picture ZSL",__func__);
   1038 
   1039     if (MM_CAMERA_OK != (rc =pme->cam->ops->request_super_buf(pme->cam->camera_handle,pme->ch_id, 1))) {
   1040         CDBG_ERROR("%s:request_super_buf err=%d\n", __func__, rc);
   1041         goto end;
   1042     }
   1043 
   1044     CDBG("%s: Start ZSL Preview",__func__);
   1045 
   1046     end:
   1047     CDBG("%s: END, rc=%d\n", __func__, rc);
   1048     return rc;
   1049 }
   1050 
   1051 int mm_app_take_picture_yuv(int cam_id)
   1052 {
   1053     int rc;
   1054     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1055 
   1056     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
   1057 
   1058     if (MM_CAMERA_OK != mm_app_start_snapshot(cam_id)) {
   1059         CDBG_ERROR("%s: cam_id=%d\n",__func__,cam_id);
   1060         rc = -1;
   1061         goto end;
   1062     }
   1063 
   1064     CDBG("%s:waiting images\n",__func__);
   1065     mm_app_snapshot_wait(cam_id);
   1066 
   1067     if (MM_CAMERA_OK !=mm_app_stop_snapshot(cam_id)) {
   1068         CDBG_ERROR("%s: Snapshot Stop error",__func__);
   1069     }
   1070 
   1071     preview:
   1072     if (MM_CAMERA_OK != (rc = mm_app_start_preview(cam_id))) {
   1073         CDBG("%s:preview start stream err=%d\n", __func__, rc);
   1074     }
   1075     end:
   1076     CDBG("%s:END, cam_id=%d\n",__func__,cam_id);
   1077     return rc;
   1078 }
   1079 
   1080 int mm_app_take_zsl(int cam_id)
   1081 {
   1082     int rc = MM_CAMERA_OK;
   1083 
   1084     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1085 
   1086     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
   1087 
   1088     if (pme->cam_mode == RECORDER_MODE) {
   1089         switch (pme->cam_state) {
   1090         case CAMERA_STATE_RECORD:
   1091             if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) {
   1092                 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc);
   1093                 return -1;
   1094             }
   1095         case CAMERA_STATE_PREVIEW:
   1096             if (MM_CAMERA_OK != mm_app_open_zsl(cam_id)) {
   1097                 CDBG_ERROR("%s: Cannot switch to camera mode\n", __func__);
   1098                 return -1;
   1099             }
   1100             break;
   1101         case CAMERA_STATE_SNAPSHOT:
   1102         default:
   1103             CDBG("%s: Cannot normal pciture in record mode\n", __func__);
   1104             break;
   1105         }
   1106     } else if (pme->cam_mode == CAMERA_MODE) {
   1107         switch (pme->cam_state) {
   1108         case CAMERA_STATE_PREVIEW:
   1109             mm_app_open_zsl(cam_id);
   1110             break;
   1111 
   1112         case CAMERA_STATE_SNAPSHOT:
   1113         case CAMERA_STATE_RECORD:
   1114         default:
   1115             CDBG("%s: Cannot normal pciture in record mode\n", __func__);
   1116             break;
   1117         }
   1118     }
   1119 
   1120     if (pme->cam_mode == ZSL_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1121         mm_app_take_picture_zsl(cam_id);
   1122     }
   1123     return rc;
   1124 }
   1125 
   1126 int mm_app_take_picture(int cam_id)
   1127 {
   1128     int rc = 0;
   1129 
   1130     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1131 
   1132     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
   1133 
   1134     if (pme->cam_mode == RECORDER_MODE) {
   1135         switch (pme->cam_state) {
   1136         case CAMERA_STATE_RECORD:
   1137             if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) {
   1138                 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc);
   1139                 return -1;
   1140             }
   1141         case CAMERA_STATE_PREVIEW:
   1142             if (MM_CAMERA_OK != mm_app_open_camera(cam_id)) {
   1143                 CDBG_ERROR("%s: Cannot switch to camera mode=%d\n", __func__,rc);
   1144                 return -1;
   1145             }
   1146             break;
   1147         case CAMERA_STATE_SNAPSHOT:
   1148         default:
   1149             CDBG("%s: Cannot normal pciture in record mode\n", __func__);
   1150             break;
   1151         }
   1152     } else if (pme->cam_mode == ZSL_MODE) {
   1153         switch (pme->cam_state) {
   1154         case CAMERA_STATE_PREVIEW:
   1155             mm_app_open_camera(cam_id);
   1156             break;
   1157 
   1158         case CAMERA_STATE_SNAPSHOT:
   1159         case CAMERA_STATE_RECORD:
   1160         default:
   1161             CDBG("%s: Cannot normal pciture in record mode\n", __func__);
   1162             break;
   1163         }
   1164     }
   1165 
   1166     CDBG("%s : Takepicture : mode = %d state = %d, rc = %d",__func__,pme->cam_mode,pme->cam_state,rc);
   1167     if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1168         mm_app_take_picture_yuv(cam_id);
   1169     }
   1170     return rc;
   1171 }
   1172 
   1173 
   1174 int mm_app_take_raw(int cam_id)
   1175 {
   1176     int rc = 0;
   1177 
   1178     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1179 
   1180     CDBG("%s:BEGIN, cam_id=%d\n",__func__,cam_id);
   1181 
   1182     if (pme->cam_mode == RECORDER_MODE) {
   1183         switch (pme->cam_state) {
   1184         case CAMERA_STATE_RECORD:
   1185             if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) {
   1186                 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc);
   1187                 return -1;
   1188             }
   1189         case CAMERA_STATE_PREVIEW:
   1190             if (MM_CAMERA_OK != mm_app_open_camera(cam_id)) {
   1191                 CDBG_ERROR("%s: Cannot switch to camera mode=%d\n", __func__,rc);
   1192                 return -1;
   1193             }
   1194             break;
   1195         case CAMERA_STATE_SNAPSHOT:
   1196         default:
   1197             CDBG("%s: Cannot normal pciture in record mode\n", __func__);
   1198             break;
   1199         }
   1200     } else if (pme->cam_mode == ZSL_MODE) {
   1201         switch (pme->cam_state) {
   1202         case CAMERA_STATE_PREVIEW:
   1203             mm_app_open_camera(cam_id);
   1204             break;
   1205 
   1206         case CAMERA_STATE_SNAPSHOT:
   1207         case CAMERA_STATE_RECORD:
   1208         default:
   1209             CDBG("%s: Cannot normal pciture in record mode\n", __func__);
   1210             break;
   1211         }
   1212     }
   1213 
   1214     CDBG("%s : Takepicture RAW: mode = %d state = %d, rc = %d",__func__,pme->cam_mode,pme->cam_state,rc);
   1215     if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1216         mm_app_take_picture_raw(cam_id);
   1217     }
   1218     return rc;
   1219 }
   1220 
   1221