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 "mm_camera_dbg.h"
     32 #include <errno.h>
     33 #include <sys/ioctl.h>
     34 #include <sys/types.h>
     35 #include <sys/stat.h>
     36 #include <fcntl.h>
     37 #include <poll.h>
     38 #include <linux/msm_ion.h>
     39 #include "mm_qcamera_app.h"
     40 
     41 int mm_app_start_preview(int cam_id);
     42 int mm_app_start_preview_zsl(int cam_id);
     43 int mm_app_stop_preview_zsl(int cam_id);
     44 int mm_app_stop_preview_stats(int cam_id);
     45 int mm_app_start_preview_stats(int cam_id);
     46 
     47 extern int mm_stream_alloc_bufs(mm_camera_app_obj_t *pme,
     48                                 mm_camear_app_buf_t* app_bufs,
     49                                 mm_camera_frame_len_offset *frame_offset_info,
     50                                 uint8_t num_bufs);
     51 extern int mm_stream_release_bufs(mm_camera_app_obj_t *pme,
     52                                   mm_camear_app_buf_t* app_bufs);
     53 extern int mm_app_unprepare_video(int cam_id);
     54 extern int mm_stream_invalid_cache(mm_camera_app_obj_t *pme,
     55                                    mm_camera_buf_def_t *frame);
     56 
     57 /*===========================================================================
     58  * FUNCTION    - mm_camera_do_mmap_ion -
     59  *
     60  * DESCRIPTION:
     61  *==========================================================================*/
     62 uint8_t *mm_camera_do_mmap_ion(int ion_fd, struct ion_allocation_data *alloc,
     63                                struct ion_fd_data *ion_info_fd, int *mapFd)
     64 {
     65     void *ret; /* returned virtual address */
     66     int rc = 0;
     67     struct ion_handle_data handle_data;
     68 
     69     /* to make it page size aligned */
     70     alloc->len = (alloc->len + 4095) & (~4095);
     71 
     72     rc = ioctl(ion_fd, ION_IOC_ALLOC, alloc);
     73     if (rc < 0) {
     74         CDBG_ERROR("ION allocation failed %s\n", strerror(errno));
     75         goto ION_ALLOC_FAILED;
     76     }
     77 
     78     ion_info_fd->handle = alloc->handle;
     79     rc = ioctl(ion_fd, ION_IOC_SHARE, ion_info_fd);
     80     if (rc < 0) {
     81         CDBG_ERROR("ION map failed %s\n", strerror(errno));
     82         goto ION_MAP_FAILED;
     83     }
     84     *mapFd = ion_info_fd->fd;
     85     ret = mmap(NULL,
     86                alloc->len,
     87                PROT_READ  | PROT_WRITE,
     88                MAP_SHARED,
     89                *mapFd,
     90                0);
     91 
     92     if (ret == MAP_FAILED) {
     93         CDBG_ERROR("ION_MMAP_FAILED: %s (%d)\n", strerror(errno), errno);
     94         goto ION_MAP_FAILED;
     95     }
     96 
     97     return ret;
     98 
     99     ION_MAP_FAILED:
    100     handle_data.handle = ion_info_fd->handle;
    101     ioctl(ion_fd, ION_IOC_FREE, &handle_data);
    102     ION_ALLOC_FAILED:
    103     return NULL;
    104 }
    105 
    106 /*===========================================================================
    107  * FUNCTION    - mm_camera_do_munmap_ion -
    108  *
    109  * DESCRIPTION:
    110  *==========================================================================*/
    111 int mm_camera_do_munmap_ion (int ion_fd, struct ion_fd_data *ion_info_fd,
    112                              void *addr, size_t size)
    113 {
    114     int rc = 0;
    115     rc = munmap(addr, size);
    116     close(ion_info_fd->fd);
    117 
    118     struct ion_handle_data handle_data;
    119     handle_data.handle = ion_info_fd->handle;
    120     ioctl(ion_fd, ION_IOC_FREE, &handle_data);
    121     return rc;
    122 }
    123 
    124 
    125 int mm_app_set_preview_fmt(int cam_id,mm_camera_image_fmt_t *fmt)
    126 {
    127     int rc = MM_CAMERA_OK;
    128     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    129 
    130     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    131     fmt->fmt = pme->dim.prev_format;
    132     fmt->width = pme->dim.display_width;
    133     fmt->height = pme->dim.display_height;
    134     return rc;
    135 }
    136 
    137 int mm_app_set_aec_stats_fmt(int cam_id,mm_camera_image_fmt_t *fmt)
    138 {
    139     int rc = MM_CAMERA_OK;
    140     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    141 
    142     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    143     fmt->fmt = CAMERA_SAEC;
    144     fmt->width = 1060; //hard code for testing
    145     fmt->height = 1;
    146     return rc;
    147 }
    148 
    149 int mm_app_set_awb_stats_fmt(int cam_id,mm_camera_image_fmt_t *fmt)
    150 {
    151     int rc = MM_CAMERA_OK;
    152     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    153 
    154     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    155     fmt->fmt = CAMERA_SAWB;
    156     fmt->width = 1060; //hard code for testing
    157     fmt->height = 1;
    158     return rc;
    159 }
    160 
    161 int mm_app_set_af_stats_fmt(int cam_id,mm_camera_image_fmt_t *fmt)
    162 {
    163     int rc = MM_CAMERA_OK;
    164     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    165 
    166     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    167     fmt->fmt = CAMERA_SAFC;
    168     fmt->width = 1060; //hard code for testing
    169     fmt->height = 1;
    170     return rc;
    171 }
    172 
    173 
    174 int mm_app_set_ihist_stats_fmt(int cam_id,mm_camera_image_fmt_t *fmt)
    175 {
    176     int rc = MM_CAMERA_OK;
    177     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    178 
    179     fmt->meta_header = MM_CAMEAR_META_DATA_TYPE_DEF;
    180     fmt->fmt = CAMERA_SHST;
    181     fmt->width = 1060; //hard code for testing
    182     fmt->height = 1;
    183     return rc;
    184 }
    185 
    186 //void dumpFrameToFile(struct msm_frame* newFrame, int w, int h, char* name, int main_422)
    187 void dumpFrameToFile(mm_camera_buf_def_t* newFrame, int w, int h, char* name, int main_422,char *ext)
    188 {
    189     char buf[50];
    190     int file_fd;
    191     int i;
    192     if ( newFrame != NULL) {
    193         char * str;
    194         snprintf(buf, sizeof(buf), "/data/%s.%s", name, ext);
    195         file_fd = open(buf, O_RDWR | O_CREAT, 0777);
    196         if (file_fd < 0) {
    197             CDBG_ERROR("%s: cannot open file %s \n", __func__, buf);
    198         } else {
    199             void* y_off = newFrame->buffer + newFrame->planes[0].data_offset;
    200             void* cbcr_off = newFrame->buffer + newFrame->planes[0].length;
    201 
    202             CDBG("%s: %s Y_off = %p cbcr_off = %p", __func__, name, y_off,cbcr_off);
    203             CDBG("%s: Y_off length = %d cbcr_off length = %d", __func__, newFrame->planes[0].length,newFrame->planes[1].length);
    204 
    205             write(file_fd, (const void *)(y_off), (w * h));
    206             if (newFrame->num_planes > 1)
    207                 write(file_fd, (const void *)(cbcr_off), (w * h/2 * main_422));
    208 
    209             close(file_fd);
    210             CDBG("dump %s", buf);
    211         }
    212     }
    213 }
    214 
    215 int mm_app_open_camera(int cam_id)
    216 {
    217     int rc = MM_CAMERA_OK;
    218     int value = 0;
    219     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    220 
    221     if (pme->cam_mode == CAMERA_MODE) {
    222         return rc;
    223     }
    224 
    225     if (MM_CAMERA_OK != (rc = mm_app_stop_preview(cam_id))) {
    226         CDBG_ERROR("%s:Stop preview err=%d\n", __func__, rc);
    227         goto end;
    228     }
    229 
    230     pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_RECORDING_HINT, &value);
    231 
    232     if (MM_CAMERA_OK != (rc = mm_app_start_preview(cam_id))) {
    233         CDBG_ERROR("%s:Start preview err=%d\n", __func__, rc);
    234         goto end;
    235     }
    236 
    237     pme->cam_mode = CAMERA_MODE;
    238     end:
    239     CDBG("%s: END, rc=%d\n", __func__, rc);
    240     return rc;
    241 }
    242 
    243 int mm_app_open_camera_stats(int cam_id)
    244 {
    245     int rc = MM_CAMERA_OK;
    246     int value = 0;
    247     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    248 
    249     if (pme->cam_mode == CAMERA_MODE) {
    250         return rc;
    251     }
    252 
    253     if (MM_CAMERA_OK != (rc = mm_app_stop_preview_stats(cam_id))) {
    254         CDBG_ERROR("%s:Stop preview err=%d\n", __func__, rc);
    255         goto end;
    256     }
    257 
    258     pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_RECORDING_HINT, &value);
    259 
    260     if (MM_CAMERA_OK != (rc = mm_app_start_preview_stats(cam_id))) {
    261         CDBG_ERROR("%s:Start preview err=%d\n", __func__, rc);
    262         goto end;
    263     }
    264 
    265     pme->cam_mode = CAMERA_MODE;
    266     end:
    267     CDBG("%s: END, rc=%d\n", __func__, rc);
    268     return rc;
    269 }
    270 
    271 int mm_app_open_zsl(int cam_id)
    272 {
    273     int rc = MM_CAMERA_OK;
    274     int value = 0;
    275     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    276 
    277     if (pme->cam_mode == ZSL_MODE) {
    278         return rc;
    279     }
    280 
    281     if (MM_CAMERA_OK != (rc = mm_app_stop_preview(cam_id))) {
    282         CDBG_ERROR("%s:Stop preview err=%d\n", __func__, rc);
    283         goto end;
    284     }
    285 
    286     pme->cam->ops->set_parm(pme->cam->camera_handle,MM_CAMERA_PARM_RECORDING_HINT, &value);
    287 
    288     if (MM_CAMERA_OK != (rc = mm_app_start_preview_zsl(cam_id))) {
    289         CDBG_ERROR("%s:stream on preview err=%d\n", __func__, rc);
    290         goto end;
    291     }
    292     pme->cam_mode = ZSL_MODE;
    293     end:
    294     CDBG("%s: END, rc=%d\n", __func__, rc);
    295     return rc;
    296 }
    297 #if 0
    298 int mm_stream_deinit_preview_buf(uint32_t camera_handle,
    299                                  uint32_t ch_id, uint32_t stream_id,
    300                                  void *user_data, uint8_t num_bufs,
    301                                  mm_camera_buf_def_t *bufs)
    302 {
    303     int i, rc = MM_CAMERA_OK;
    304     mm_camera_app_obj_t *pme = (mm_camera_app_obj_t *)user_data;
    305     for (i = 0; i < num_bufs; i++) {
    306         rc = my_cam_app.hal_lib.mm_camera_do_munmap_ion (pme->ionfd, &(pme->preview_buf.frame[i].fd_data),
    307                                                          (void *)pme->preview_buf.frame[i].buffer, bufs[i].frame_len);
    308         if (rc != MM_CAMERA_OK) {
    309             CDBG("%s: mm_camera_do_munmap err, pmem_fd = %d, rc = %d",
    310                  __func__, bufs[i].fd, rc);
    311         }
    312     }
    313     close(pme->ionfd);
    314     return rc;
    315 }
    316 
    317 int mm_stream_init_preview_buf(uint32_t camera_handle,
    318                                uint32_t ch_id, uint32_t stream_id,
    319                                void *user_data,
    320                                mm_camera_frame_len_offset *frame_offset_info,
    321                                uint8_t num_bufs,
    322                                uint8_t *initial_reg_flag,
    323                                mm_camera_buf_def_t *bufs)
    324 {
    325     int i,j,num_planes, frame_len, y_off, cbcr_off;
    326     uint32_t planes[VIDEO_MAX_PLANES];
    327     uint32_t pmem_addr = 0;
    328 
    329     mm_camera_app_obj_t *pme = (mm_camera_app_obj_t *)user_data;
    330 
    331     num_planes = frame_offset_info->num_planes;
    332     for ( i = 0; i < num_planes; i++) {
    333         planes[i] = frame_offset_info->mp[i].len;
    334     }
    335 
    336     frame_len = frame_offset_info->frame_len;
    337     y_off = frame_offset_info->mp[0].offset;
    338     cbcr_off = frame_offset_info->mp[1].offset;
    339 
    340     CDBG("Allocating Preview Memory for %d buffers frame_len = %d",num_bufs,frame_offset_info->frame_len);
    341 
    342     for (i = 0; i < num_bufs ; i++) {
    343         int j;
    344         pme->preview_buf.reg[i] = 1;
    345         initial_reg_flag[i] = 1;
    346 
    347         pme->preview_buf.frame_len = frame_len;
    348         pme->preview_buf.frame[i].ion_alloc.len = pme->preview_buf.frame_len;
    349         pme->preview_buf.frame[i].ion_alloc.flags =
    350         (0x1 << CAMERA_ION_HEAP_ID | 0x1 << ION_IOMMU_HEAP_ID);
    351         pme->preview_buf.frame[i].ion_alloc.align = 4096;
    352 
    353         pmem_addr = (unsigned long) my_cam_app.hal_lib.mm_camera_do_mmap_ion(pme->ionfd,
    354                                                                              &(pme->preview_buf.frame[i].ion_alloc), &(pme->preview_buf.frame[i].fd_data),
    355                                                                              &pme->preview_buf.frame[i].fd);
    356 
    357         pme->preview_buf.frame[i].buffer = pmem_addr;
    358         pme->preview_buf.frame[i].path = OUTPUT_TYPE_P;
    359         pme->preview_buf.frame[i].y_off = 0;
    360         pme->preview_buf.frame[i].cbcr_off = planes[0];
    361         pme->preview_buf.frame[i].phy_offset = 0;
    362 
    363         CDBG("Buffer allocated Successfully fd = %d",pme->preview_buf.frame[i].fd);
    364 
    365         bufs[i].fd = pme->preview_buf.frame[i].fd;
    366         //bufs[i].buffer = pmem_addr;
    367         bufs[i].frame_len = pme->preview_buf.frame[i].ion_alloc.len;
    368         bufs[i].num_planes = num_planes;
    369 
    370         bufs[i].frame = &pme->preview_buf.frame[i];
    371 
    372         /* Plane 0 needs to be set seperately. Set other planes
    373              * in a loop. */
    374         bufs[i].planes[0].length = planes[0];
    375         bufs[i].planes[0].m.userptr = bufs[i].fd;
    376         bufs[i].planes[0].data_offset = y_off;
    377         bufs[i].planes[0].reserved[0] = 0;
    378         //buf_def->buf.mp[i].frame_offset;
    379         for (j = 1; j < num_planes; j++) {
    380             bufs[i].planes[j].length = planes[j];
    381             bufs[i].planes[j].m.userptr = bufs[i].fd;
    382             bufs[i].planes[j].data_offset = cbcr_off;
    383             bufs[i].planes[j].reserved[0] =
    384             bufs[i].planes[j-1].reserved[0] +
    385             bufs[i].planes[j-1].length;
    386         }
    387     }
    388     return MM_CAMERA_OK;
    389 }
    390 #endif
    391 
    392 int mm_stream_initbuf(uint32_t camera_handle,
    393                       uint32_t ch_id, uint32_t stream_id,
    394                       void *user_data,
    395                       mm_camera_frame_len_offset *frame_offset_info,
    396                       uint8_t num_bufs,
    397                       uint8_t *initial_reg_flag,
    398                       mm_camera_buf_def_t *bufs)
    399 {
    400     mm_camera_app_obj_t *pme = (mm_camera_app_obj_t *)user_data;
    401     mm_camear_app_buf_t* app_bufs = NULL;
    402     int i, rc;
    403 
    404     if (MM_CAMERA_MAX_NUM_FRAMES < num_bufs) {
    405         CDBG_ERROR("%s: num_bufs (%d) exceeds max (%d)",
    406                    __func__, num_bufs, MM_CAMERA_MAX_NUM_FRAMES);
    407         return -1;
    408     }
    409     for (i = 0; i < MM_QCAM_APP_MAX_STREAM_NUM; i++) {
    410         if (pme->stream[i].id == stream_id) {
    411             app_bufs = &pme->stream [i].app_bufs;
    412             break;
    413         }
    414     }
    415 
    416     if (app_bufs == NULL) {
    417         CDBG_ERROR("%s: no matching stream for stream_id %d", __func__, stream_id);
    418         return -1;
    419     }
    420 
    421     CDBG("%s: alloc buf for stream_id %d, len=%d",
    422          __func__, stream_id, frame_offset_info->frame_len);
    423     rc = mm_stream_alloc_bufs(pme,
    424                               app_bufs,
    425                               frame_offset_info,
    426                               num_bufs);
    427 
    428     if (rc != 0) {
    429         CDBG_ERROR("%s: mm_stream_alloc_bufs err = %d", __func__, rc);
    430         return rc;
    431     }
    432 
    433     memcpy(bufs, app_bufs->bufs, sizeof(mm_camera_buf_def_t) * num_bufs);
    434     for (i = 0; i < num_bufs ; i++) {
    435         initial_reg_flag[i] = 1;
    436     }
    437 
    438     CDBG("%s: X",__func__);
    439     return MM_CAMERA_OK;
    440 }
    441 
    442 #if 0
    443 int mm_stream_initbuf_1(uint32_t camera_handle,
    444                         uint32_t ch_id, uint32_t stream_id,
    445                         void *user_data,
    446                         mm_camera_frame_len_offset *frame_offset_info,
    447                         uint8_t num_bufs,
    448                         uint8_t *initial_reg_flag,
    449                         mm_camera_buf_def_t *bufs)
    450 {
    451     int i;
    452     int streamType = 0;
    453 
    454     mm_camera_app_obj_t *pme = (mm_camera_app_obj_t *)user_data;
    455 
    456     CDBG("%s : E ", __FUNCTION__);
    457 
    458     for (i= 0; i < 5; i++) {
    459         if (pme->stream[i].id == stream_id) {
    460             CDBG("Allocate Memory for Stream %d",i);
    461             streamType = i;
    462             break;
    463         }
    464     }
    465 
    466     streamType = MM_CAMERA_PREVIEW;
    467     switch (streamType) {
    468     case MM_CAMERA_PREVIEW:
    469         mm_stream_init_preview_buf( camera_handle,
    470                                     ch_id, stream_id,
    471                                     user_data,
    472                                     frame_offset_info,
    473                                     num_bufs,
    474                                     initial_reg_flag,
    475                                     bufs);
    476         break;
    477     case MM_CAMERA_VIDEO:
    478         mm_stream_init_video_buf( camera_handle,
    479                                   ch_id, stream_id,
    480                                   user_data,
    481                                   frame_offset_info,
    482                                   num_bufs,
    483                                   initial_reg_flag,
    484                                   bufs);
    485         break;
    486     case MM_CAMERA_SNAPSHOT_MAIN:
    487         mm_stream_init_main_buf( camera_handle,
    488                                  ch_id, stream_id,
    489                                  user_data,
    490                                  frame_offset_info,
    491                                  num_bufs,
    492                                  initial_reg_flag,
    493                                  bufs);
    494         break;
    495     case MM_CAMERA_SNAPSHOT_THUMBNAIL:
    496         mm_stream_init_thumbnail_buf( camera_handle,
    497                                       ch_id, stream_id,
    498                                       user_data,
    499                                       frame_offset_info,
    500                                       num_bufs,
    501                                       initial_reg_flag,
    502                                       bufs);
    503         break;
    504     default:
    505         break;
    506     }
    507 
    508     CDBG(" %s : X ",__FUNCTION__);
    509     return MM_CAMERA_OK;
    510 }
    511 #endif
    512 int mm_stream_deinitbuf(uint32_t camera_handle,
    513                         uint32_t ch_id, uint32_t stream_id,
    514                         void *user_data, uint8_t num_bufs,
    515                         mm_camera_buf_def_t *bufs)
    516 {
    517     int i, rc = MM_CAMERA_OK;
    518     mm_camera_app_obj_t *pme = (mm_camera_app_obj_t *)user_data;
    519     mm_camear_app_buf_t* app_bufs = NULL;
    520 
    521     for (i = 0; i < MM_QCAM_APP_MAX_STREAM_NUM; i++) {
    522         if (pme->stream[i].id == stream_id) {
    523             app_bufs = &pme->stream [i].app_bufs;
    524             break;
    525         }
    526     }
    527 
    528     if (app_bufs == NULL) {
    529         CDBG_ERROR("%s: no matching stream for stream_id %d", __func__, stream_id);
    530         return -1;
    531     }
    532 
    533     rc = mm_stream_release_bufs(pme, app_bufs);
    534 
    535     if (rc != 0) {
    536         CDBG_ERROR("%s: mm_stream_release_bufs err = %d", __func__, rc);
    537     }
    538 
    539     return rc;
    540 }
    541 
    542 #if 0
    543 static int mm_stream_deinitbuf_1(uint32_t camera_handle,
    544                                  uint32_t ch_id, uint32_t stream_id,
    545                                  void *user_data, uint8_t num_bufs,
    546                                  mm_camera_buf_def_t *bufs)
    547 {
    548     int i, rc = MM_CAMERA_OK;
    549     int streamType = 0;
    550     mm_camera_app_obj_t *pme = (mm_camera_app_obj_t *)user_data;
    551     CDBG("%s: BEGIN",__func__);
    552 
    553     for (i= 0; i < 5; i++) {
    554         if (pme->stream[i].id == stream_id) {
    555             CDBG("Allocate Memory for Stream %d",i);
    556             streamType = i;
    557             break;
    558         }
    559     }
    560     streamType = MM_CAMERA_PREVIEW;
    561     switch (streamType) {
    562     case MM_CAMERA_PREVIEW:
    563         mm_stream_deinit_preview_buf(camera_handle,
    564                                      ch_id, stream_id,
    565                                      user_data, num_bufs,
    566                                      bufs);
    567         break;
    568     case MM_CAMERA_VIDEO:
    569         mm_stream_deinit_video_buf(camera_handle,
    570                                    ch_id, stream_id,
    571                                    user_data, num_bufs,
    572                                    bufs);
    573         break;
    574     case MM_CAMERA_SNAPSHOT_MAIN:
    575         mm_stream_deinit_main_buf(camera_handle,
    576                                   ch_id, stream_id,
    577                                   user_data, num_bufs,
    578                                   bufs);
    579         break;
    580     case MM_CAMERA_SNAPSHOT_THUMBNAIL:
    581         mm_stream_deinit_thumbnail_buf(camera_handle,
    582                                        ch_id, stream_id,
    583                                        user_data, num_bufs,
    584                                        bufs);
    585         break;
    586     default:
    587         break;
    588     }
    589 
    590     /* zero out the buf stuct */
    591     CDBG("%s: END",__func__);
    592     return MM_CAMERA_OK;
    593 }
    594 #endif
    595 
    596 void preview_cb_signal(mm_camera_app_obj_t *pme)
    597 {
    598     if (pme->cam_state == CAMERA_STATE_PREVIEW && pme->cam_mode == CAMERA_MODE) {
    599         mm_camera_app_done();
    600     }
    601 }
    602 
    603 void previewzsl_cb_signal(mm_camera_app_obj_t *pme)
    604 {
    605     if (pme->cam_state == CAMERA_STATE_PREVIEW && pme->cam_mode == ZSL_MODE) {
    606         mm_camera_app_done();
    607     }
    608 }
    609 
    610 
    611 void mm_app_preview_notify_cb(mm_camera_super_buf_t *bufs,
    612                               void *user_data)
    613 {
    614     int rc, cam = 0;
    615     char buf[32];
    616     mm_camera_buf_def_t *frame = NULL;
    617     mm_camera_app_obj_t *pme = NULL;
    618     CDBG("%s: BEGIN\n", __func__);
    619     frame = bufs->bufs[MM_CAMERA_PREVIEW];
    620     pme = (mm_camera_app_obj_t *)user_data;
    621 
    622     CDBG("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx);
    623 
    624     snprintf(buf, sizeof(buf), "P_%dx%d_C%d", pme->dim.display_width,
    625         pme->dim.display_height, pme->cam->camera_info->camera_id);
    626 
    627     dumpFrameToFile(frame, pme->dim.display_width,
    628         pme->dim.display_height, buf, 1,"yuv");
    629 
    630     if (!my_cam_app.run_sanity) {
    631         if (0 != (rc = mm_app_dl_render(frame->fd, NULL))) {
    632             CDBG("%s:DL rendering err=%d, frame fd=%d,frame idx = %d\n",
    633                  __func__, rc, frame->fd, frame->frame_idx);
    634         }
    635     }
    636 
    637     CDBG("In CB function i/p = %p o/p = %p",bufs->bufs[MM_CAMERA_PREVIEW],frame);
    638 
    639     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,frame)) {
    640         CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__);
    641         return;
    642     }
    643     mm_stream_invalid_cache(pme,frame);
    644     if (my_cam_app.run_sanity) {
    645         preview_cb_signal(pme);
    646     }
    647     CDBG("%s: END\n", __func__);
    648 
    649 }
    650 
    651 void mm_app_aec_stats_notify_cb(mm_camera_super_buf_t *bufs,
    652                               void *user_data)
    653 {
    654     int rc;
    655     mm_camera_buf_def_t *frame = NULL;
    656     mm_camera_app_obj_t *pme = NULL;
    657     CDBG("%s: BEGIN\n", __func__);
    658     frame = bufs->bufs[0];
    659     pme = (mm_camera_app_obj_t *)user_data;
    660 
    661     CDBG("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx);
    662 
    663     CDBG("%s:DL rendering err=%d, frame fd=%d,frame idx = %d\n",
    664                  __func__, rc, frame->fd, frame->frame_idx);
    665     CDBG("In CB function i/p = %p o/p = %p",bufs->bufs[MM_CAMERA_SAEC],frame);
    666 
    667     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,frame)) {
    668         CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__);
    669         return;
    670     }
    671     mm_stream_invalid_cache(pme,frame);
    672     CDBG("%s: END\n", __func__);
    673 }
    674 
    675 void mm_app_awb_stats_notify_cb(mm_camera_super_buf_t *bufs,
    676                               void *user_data)
    677 {
    678     int rc;
    679     mm_camera_buf_def_t *frame = NULL;
    680     mm_camera_app_obj_t *pme = NULL;
    681     CDBG("%s: BEGIN\n", __func__);
    682     frame = bufs->bufs[0];
    683     pme = (mm_camera_app_obj_t *)user_data;
    684 
    685     CDBG("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx);
    686 
    687     CDBG("%s:DL rendering err=%d, frame fd=%d,frame idx = %d\n",
    688                  __func__, rc, frame->fd, frame->frame_idx);
    689     CDBG("In CB function i/p = %p o/p = %p",bufs->bufs[MM_CAMERA_SAWB],frame);
    690 
    691     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,frame)) {
    692         CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__);
    693         return;
    694     }
    695     mm_stream_invalid_cache(pme,frame);
    696     CDBG("%s: END\n", __func__);
    697 }
    698 
    699 void mm_app_af_stats_notify_cb(mm_camera_super_buf_t *bufs,
    700                               void *user_data)
    701 {
    702     int rc;
    703     mm_camera_buf_def_t *frame = NULL;
    704     mm_camera_app_obj_t *pme = NULL;
    705     CDBG("%s: BEGIN\n", __func__);
    706     frame = bufs->bufs[0] ;
    707     pme = (mm_camera_app_obj_t *)user_data;
    708 
    709     CDBG("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx);
    710 
    711     CDBG("%s:DL rendering err=%d, frame fd=%d,frame idx = %d\n",
    712                  __func__, rc, frame->fd, frame->frame_idx);
    713     CDBG("In CB function i/p = %p o/p = %p",bufs->bufs[MM_CAMERA_SAFC],frame);
    714 
    715     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,frame)) {
    716         CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__);
    717         return;
    718     }
    719     mm_stream_invalid_cache(pme,frame);
    720     CDBG("%s: END\n", __func__);
    721 }
    722 
    723 void mm_app_ihist_stats_notify_cb(mm_camera_super_buf_t *bufs,
    724                               void *user_data)
    725 {
    726     int rc;
    727     mm_camera_buf_def_t *frame = NULL;
    728     mm_camera_app_obj_t *pme = NULL;
    729     CDBG("%s: BEGIN\n", __func__);
    730     frame = bufs->bufs[0] ;
    731     pme = (mm_camera_app_obj_t *)user_data;
    732 
    733     CDBG("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx);
    734 
    735     CDBG("%s:DL rendering err=%d, frame fd=%d,frame idx = %d\n",
    736                  __func__, rc, frame->fd, frame->frame_idx);
    737     CDBG("In CB function i/p = %p o/p = %p",bufs->bufs[MM_CAMERA_IHST],frame);
    738 
    739     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,frame)) {
    740         CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__);
    741         return;
    742     }
    743     mm_stream_invalid_cache(pme,frame);
    744     CDBG("%s: END\n", __func__);
    745 }
    746 
    747 static void mm_app_zsl_notify_cb(mm_camera_super_buf_t *bufs,
    748                                  void *user_data)
    749 {
    750     int rc;
    751     int i = 0;
    752     mm_camera_buf_def_t *preview_frame = NULL;
    753     mm_camera_buf_def_t *main_frame = NULL;
    754     mm_camera_buf_def_t *thumb_frame = NULL;
    755     mm_camera_app_obj_t *pme = NULL;
    756     CDBG("%s: BEGIN\n", __func__);
    757 
    758     pme = (mm_camera_app_obj_t *)user_data;
    759 
    760     CDBG("%s : total streams = %d",__func__,bufs->num_bufs);
    761     preview_frame = bufs->bufs[0] ;
    762     main_frame = bufs->bufs[1];
    763     thumb_frame = bufs->bufs[0];
    764 
    765     //dumpFrameToFile(preview_frame->frame,pme->dim.display_width,pme->dim.display_height,"preview", 1);
    766     dumpFrameToFile(preview_frame,pme->dim.display_width,pme->dim.display_height,"zsl_preview", 1,"yuv");
    767     if (0 != (rc = mm_app_dl_render(preview_frame->fd, NULL))) {
    768         CDBG("%s:DL rendering err=%d, frame fd=%d,frame idx = %d\n",
    769              __func__, rc, preview_frame->fd, preview_frame->frame_idx);
    770     }
    771 
    772     if (bufs->num_bufs == 2 && main_frame != NULL) {
    773         CDBG("mainframe frame_idx = %d fd = %d frame length = %d",main_frame->frame_idx,main_frame->fd,main_frame->frame_len);
    774         CDBG("thumnail frame_idx = %d fd = %d frame length = %d",thumb_frame->frame_idx,thumb_frame->fd,thumb_frame->frame_len);
    775 
    776         //dumpFrameToFile(main_frame->frame,pme->dim.picture_width,pme->dim.picture_height,"main", 1);
    777         //dumpFrameToFile(thumb_frame->frame,pme->dim.thumbnail_width,pme->dim.thumbnail_height,"thumb", 1);
    778 
    779         dumpFrameToFile(main_frame,pme->dim.picture_width,pme->dim.picture_height,"zsl_main", 1,"yuv");
    780         dumpFrameToFile(thumb_frame,pme->dim.thumbnail_width,pme->dim.thumbnail_height,"zsl_thumb", 1,"yuv");
    781 
    782         if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,main_frame)) {
    783             CDBG_ERROR("%s: Failed in thumbnail Qbuf\n", __func__);
    784         }
    785         mm_stream_invalid_cache(pme,main_frame);
    786     }
    787 
    788     if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,pme->ch_id,preview_frame)) {
    789         CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__);
    790     }
    791     mm_stream_invalid_cache(pme,preview_frame);
    792 	if (my_cam_app.run_sanity) {
    793         previewzsl_cb_signal(pme);
    794     }
    795     CDBG("%s: END\n", __func__);
    796 }
    797 
    798 int mm_app_prepare_stats(int cam_id)
    799 {
    800     int rc = MM_CAMERA_OK;
    801     int op_mode;
    802 
    803     CDBG("%s: E",__func__);
    804     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    805 
    806     pme->mem_cam->get_buf = mm_stream_initbuf;
    807     pme->mem_cam->put_buf = mm_stream_deinitbuf;
    808     pme->mem_cam->user_data = pme;
    809     // AEC Stream
    810     pme->stream[MM_CAMERA_SAEC].id =
    811         pme->cam->ops->add_stream(pme->cam->camera_handle, pme->ch_id,
    812                                   mm_app_aec_stats_notify_cb, pme,
    813                                   MM_CAMERA_SAEC, 0);
    814     if (!pme->stream[MM_CAMERA_SAEC].id) {
    815         CDBG_ERROR("%s:Add MM_CAMERA_SAEC error =%d\n", __func__, rc);
    816         rc = -1;
    817         goto end;
    818     }
    819 
    820     CDBG_ERROR("%s :Add stream is successful stream ID = %d",__func__,pme->stream[MM_CAMERA_SAEC].id);
    821 
    822     mm_app_set_aec_stats_fmt(cam_id,&pme->stream[MM_CAMERA_SAEC].str_config.fmt);
    823     pme->stream[MM_CAMERA_SAEC].str_config.need_stream_on = 1;
    824     pme->stream[MM_CAMERA_SAEC].str_config.num_of_bufs = STATS_BUF_NUM;
    825 
    826     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SAEC].id,
    827                                                            &pme->stream[MM_CAMERA_SAEC].str_config))) {
    828         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    829         goto end;
    830     }
    831     // AWB Stream
    832     pme->stream[MM_CAMERA_SAWB].id =
    833         pme->cam->ops->add_stream(pme->cam->camera_handle, pme->ch_id,
    834                                   mm_app_awb_stats_notify_cb, pme,
    835                                   MM_CAMERA_SAWB, 0);
    836     if (!pme->stream[MM_CAMERA_SAWB].id) {
    837         CDBG_ERROR("%s:Add MM_CAMERA_SAWB error =%d\n", __func__, rc);
    838         rc = -1;
    839         goto end;
    840     }
    841 
    842     CDBG_ERROR("%s :Add stream is successful stream ID = %d",__func__,pme->stream[MM_CAMERA_SAWB].id);
    843 
    844     mm_app_set_awb_stats_fmt(cam_id,&pme->stream[MM_CAMERA_SAWB].str_config.fmt);
    845     pme->stream[MM_CAMERA_SAWB].str_config.need_stream_on = 1;
    846     pme->stream[MM_CAMERA_SAWB].str_config.num_of_bufs = STATS_BUF_NUM;
    847 
    848     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SAWB].id,
    849                                                            &pme->stream[MM_CAMERA_SAWB].str_config))) {
    850         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    851         goto end;
    852     }
    853 
    854     // AF Stream
    855     pme->stream[MM_CAMERA_SAFC].id =
    856         pme->cam->ops->add_stream(pme->cam->camera_handle, pme->ch_id,
    857                                   mm_app_af_stats_notify_cb, pme,
    858                                   MM_CAMERA_SAFC, 0);
    859     if (!pme->stream[MM_CAMERA_SAFC].id) {
    860         CDBG_ERROR("%s:Add MM_CAMERA_SAFC error =%d\n", __func__, rc);
    861         rc = -1;
    862         goto end;
    863     }
    864 
    865     CDBG_ERROR("%s :Add stream is successful stream ID = %d",__func__,pme->stream[MM_CAMERA_SAFC].id);
    866 
    867     mm_app_set_af_stats_fmt(cam_id,&pme->stream[MM_CAMERA_SAFC].str_config.fmt);
    868     pme->stream[MM_CAMERA_SAFC].str_config.need_stream_on = 1;
    869     pme->stream[MM_CAMERA_SAFC].str_config.num_of_bufs = STATS_BUF_NUM;
    870 
    871     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SAFC].id,
    872                                                            &pme->stream[MM_CAMERA_SAFC].str_config))) {
    873         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    874         goto end;
    875     }
    876 
    877     // HIST Stream
    878     pme->stream[MM_CAMERA_IHST].id =
    879         pme->cam->ops->add_stream(pme->cam->camera_handle, pme->ch_id,
    880                                   mm_app_ihist_stats_notify_cb, pme,
    881                                   MM_CAMERA_IHST, 0);
    882     if (!pme->stream[MM_CAMERA_IHST].id) {
    883         CDBG_ERROR("%s:Add MM_CAMERA_IHST error =%d\n", __func__, rc);
    884         rc = -1;
    885         goto end;
    886     }
    887 
    888     CDBG_ERROR("%s :Add stream is successful stream ID = %d",__func__,pme->stream[MM_CAMERA_IHST].id);
    889 
    890     mm_app_set_ihist_stats_fmt(cam_id,&pme->stream[MM_CAMERA_IHST].str_config.fmt);
    891     pme->stream[MM_CAMERA_IHST].str_config.need_stream_on = 1;
    892     pme->stream[MM_CAMERA_IHST].str_config.num_of_bufs = STATS_BUF_NUM;
    893 
    894     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_IHST].id,
    895                                                            &pme->stream[MM_CAMERA_IHST].str_config))) {
    896         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    897         goto end;
    898     }
    899 
    900     end:
    901     return rc;
    902 }
    903 
    904 int mm_app_prepare_preview(int cam_id)
    905 {
    906     int rc = MM_CAMERA_OK;
    907     int op_mode;
    908 
    909     CDBG("%s: E",__func__);
    910     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    911 
    912     pme->mem_cam->get_buf = mm_stream_initbuf;
    913     pme->mem_cam->put_buf = mm_stream_deinitbuf;
    914     pme->mem_cam->user_data = pme;
    915 
    916     op_mode = MM_CAMERA_OP_MODE_VIDEO;
    917     if (MM_CAMERA_OK != (rc = pme->cam->ops->set_parm(
    918                                                      pme->cam->camera_handle,MM_CAMERA_PARM_OP_MODE, &op_mode))) {
    919         CDBG_ERROR("%s: Set preview op mode error",__func__);
    920         goto end;
    921     }
    922 
    923     pme->stream[MM_CAMERA_PREVIEW].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id,
    924                                                                   mm_app_preview_notify_cb,pme,
    925                                                                   MM_CAMERA_PREVIEW, 0);
    926 
    927     if (!pme->stream[MM_CAMERA_PREVIEW].id) {
    928         CDBG_ERROR("%s:Add stream preview error =%d\n", __func__, rc);
    929         rc = -1;
    930         goto end;
    931     }
    932 
    933     CDBG("%s :Add stream is successfull stream ID = %d",__func__,pme->stream[MM_CAMERA_PREVIEW].id);
    934 
    935     mm_app_set_preview_fmt(cam_id,&pme->stream[MM_CAMERA_PREVIEW].str_config.fmt);
    936     pme->stream[MM_CAMERA_PREVIEW].str_config.need_stream_on = 1;
    937     pme->stream[MM_CAMERA_PREVIEW].str_config.num_of_bufs = PREVIEW_BUF_NUM;
    938 
    939     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_PREVIEW].id,
    940                                                            &pme->stream[MM_CAMERA_PREVIEW].str_config))) {
    941         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
    942         goto end;
    943     }
    944     end:
    945     return rc;
    946 }
    947 
    948 int mm_app_unprepare_preview(int cam_id)
    949 {
    950     int rc = MM_CAMERA_OK;
    951     return rc;
    952 }
    953 
    954 int mm_app_streamon_stats(int cam_id)
    955 {
    956     int rc = MM_CAMERA_OK;
    957     uint32_t stream_aec[2], stream_af[2], stream_awb[2], stream_ihist[2];
    958     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
    959     mm_camera_frame_len_offset frame_offset_info;
    960 
    961     stream_aec[0] = pme->stream[MM_CAMERA_SAEC].id;
    962     stream_aec[1] = 0;
    963 
    964     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,1,stream_aec))) {
    965         CDBG_ERROR("%s : Start Stats Stream Error",__func__);
    966         goto end;
    967     }
    968     stream_awb[0] = pme->stream[MM_CAMERA_SAWB].id;
    969     stream_awb[1] = 0;
    970 
    971     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,1,stream_awb))) {
    972         CDBG_ERROR("%s : Start Stats Stream Error",__func__);
    973         goto end;
    974     }
    975 
    976     stream_af[0] = pme->stream[MM_CAMERA_SAFC].id;
    977     stream_af[1] = 0;
    978 
    979     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,1,stream_af))) {
    980         CDBG_ERROR("%s : Start Stats Stream Error",__func__);
    981         goto end;
    982     }
    983 
    984     stream_ihist[0] = pme->stream[MM_CAMERA_IHST].id;
    985     stream_ihist[1] = 0;
    986 
    987     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,1,stream_ihist))) {
    988         CDBG_ERROR("%s : Start Stats Stream Error",__func__);
    989         goto end;
    990     }
    991 
    992     end:
    993     CDBG("%s: X rc = %d",__func__,rc);
    994     return rc;
    995 }
    996 
    997 
    998 int mm_app_streamon_preview(int cam_id)
    999 {
   1000     int rc = MM_CAMERA_OK;
   1001     uint32_t stream;
   1002     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1003     mm_camera_frame_len_offset frame_offset_info;
   1004 
   1005     stream = pme->stream[MM_CAMERA_PREVIEW].id;
   1006 
   1007     pme->cam->ops->get_stream_parm(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_PREVIEW].id,MM_CAMERA_STREAM_OFFSET,&frame_offset_info);
   1008     ALOGE("DEBUG : length = %d",frame_offset_info.frame_len);
   1009     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,1,&stream))) {
   1010         CDBG_ERROR("%s : Start Stream preview Error",__func__);
   1011         goto end;
   1012     }
   1013     pme->cam_state = CAMERA_STATE_PREVIEW;
   1014     end:
   1015     CDBG("%s: X rc = %d",__func__,rc);
   1016     return rc;
   1017 }
   1018 
   1019 int mm_app_prepare_preview_zsl(int cam_id)
   1020 {
   1021     int rc = MM_CAMERA_OK;
   1022     mm_camera_bundle_attr_t attr;
   1023     int stream[3];
   1024 
   1025     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1026     int op_mode = 0;
   1027 
   1028     op_mode = MM_CAMERA_OP_MODE_ZSL;
   1029     if (MM_CAMERA_OK != (rc = pme->cam->ops->set_parm(
   1030                                                      pme->cam->camera_handle,MM_CAMERA_PARM_OP_MODE, &op_mode))) {
   1031         CDBG_ERROR("%s: Set preview op mode error",__func__);
   1032         goto end;
   1033     }
   1034 
   1035     pme->stream[MM_CAMERA_PREVIEW].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id,
   1036                                                                   mm_app_preview_notify_cb,pme,
   1037                                                                   MM_CAMERA_PREVIEW, 0);
   1038 
   1039     if (!pme->stream[MM_CAMERA_PREVIEW].id) {
   1040         CDBG_ERROR("%s:Add stream preview error =%d\n", __func__, rc);
   1041         goto end;
   1042     }
   1043 
   1044     CDBG("%s :Add stream is successfull stream ID = %d",__func__,pme->stream[MM_CAMERA_PREVIEW].id);
   1045 
   1046     mm_app_set_preview_fmt(cam_id,&pme->stream[MM_CAMERA_PREVIEW].str_config.fmt);
   1047     pme->stream[MM_CAMERA_PREVIEW].str_config.need_stream_on = 1;
   1048     pme->stream[MM_CAMERA_PREVIEW].str_config.num_of_bufs = PREVIEW_BUF_NUM;
   1049 
   1050     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_PREVIEW].id,
   1051                                                            &pme->stream[MM_CAMERA_PREVIEW].str_config))) {
   1052         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
   1053         goto end;
   1054     }
   1055 
   1056     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id = pme->cam->ops->add_stream(pme->cam->camera_handle,pme->ch_id,
   1057                                                                         NULL,pme,
   1058                                                                         MM_CAMERA_SNAPSHOT_MAIN, 0);
   1059 
   1060     CDBG("Add Snapshot main is successfull stream ID = %d",pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id);
   1061     if (!pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id) {
   1062         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
   1063         rc = -1;
   1064         goto end;
   1065     }
   1066 
   1067     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.need_stream_on = 1;
   1068     pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.num_of_bufs = 7;
   1069 
   1070     mm_app_set_snapshot_fmt(cam_id,&pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config.fmt);
   1071 
   1072 
   1073     if (MM_CAMERA_OK != (rc = pme->cam->ops->config_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id,
   1074                                                            &pme->stream[MM_CAMERA_SNAPSHOT_MAIN].str_config))) {
   1075         CDBG_ERROR("%s:preview streaming err=%d\n", __func__, rc);
   1076         goto end;
   1077     }
   1078     end:
   1079     CDBG("%s: END, rc=%d\n", __func__, rc);
   1080     return rc;
   1081 }
   1082 
   1083 int mm_app_streamon_preview_zsl(int cam_id)
   1084 {
   1085     int rc = MM_CAMERA_OK;
   1086     mm_camera_bundle_attr_t attr;
   1087     uint32_t stream[2];
   1088 
   1089     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1090     int op_mode = 0;
   1091 
   1092     stream[0] = pme->stream[MM_CAMERA_PREVIEW].id;
   1093     stream[1] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
   1094 
   1095     attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST;
   1096     attr.burst_num = 1;
   1097     attr.look_back = 2;
   1098     attr.post_frame_skip = 0;
   1099     attr.water_mark = 2;
   1100 
   1101     if (MM_CAMERA_OK != (rc = pme->cam->ops->init_stream_bundle(
   1102                                                                pme->cam->camera_handle,pme->ch_id,mm_app_zsl_notify_cb,pme,&attr,2,stream))) {
   1103         CDBG_ERROR("%s:init_stream_bundle err=%d\n", __func__, rc);
   1104         rc = -1;
   1105         goto end;
   1106     }
   1107 
   1108     if (MM_CAMERA_OK != (rc = pme->cam->ops->start_streams(pme->cam->camera_handle,pme->ch_id,
   1109                                                            2, stream))) {
   1110         CDBG_ERROR("%s:start_streams err=%d\n", __func__, rc);
   1111         rc = -1;
   1112         goto end;
   1113     }
   1114     pme->cam_state = CAMERA_STATE_PREVIEW;
   1115     end:
   1116     CDBG("%s: END, rc=%d\n", __func__, rc);
   1117     return rc;
   1118 
   1119 }
   1120 
   1121 int initDisplay()
   1122 {
   1123     int rc = MM_CAMERA_OK;
   1124 
   1125     use_overlay_fb_display_driver();
   1126     if (launch_camframe_fb_thread()) {
   1127         CDBG_ERROR("%s:launch_camframe_fb_thread failed!\n", __func__);
   1128         //rc = -MM_CAMERA_E_GENERAL;
   1129     }
   1130     CDBG("%s: launch_camframe_fb_thread done\n", __func__);
   1131     return rc;
   1132 }
   1133 
   1134 int deinitDisplay()
   1135 {
   1136     /* stop the display thread */
   1137     release_camframe_fb_thread();
   1138     return MM_CAMERA_OK;
   1139 }
   1140 
   1141 int mm_app_start_preview(int cam_id)
   1142 {
   1143     int rc = MM_CAMERA_OK;
   1144 
   1145     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1146     int op_mode = 0;
   1147 
   1148     CDBG("pme = %p, pme->cam =%p, pme->cam->camera_handle = %d",
   1149          pme,pme->cam,pme->cam->camera_handle);
   1150 
   1151     if (pme->cam_state == CAMERA_STATE_PREVIEW) {
   1152         return rc;
   1153     }
   1154 
   1155     if (!my_cam_app.run_sanity) {
   1156         if (MM_CAMERA_OK != initDisplay()) {
   1157             CDBG_ERROR("%s : Could not initalize display",__func__);
   1158             goto end;
   1159         }
   1160     }
   1161 
   1162     if (MM_CAMERA_OK != (rc = mm_app_prepare_preview(cam_id))) {
   1163         CDBG_ERROR("%s:Stream On Preview failed rc=%d\n", __func__, rc);
   1164         goto end;
   1165     }
   1166 
   1167     if (MM_CAMERA_OK != (rc = mm_app_streamon_preview(cam_id))) {
   1168         CDBG_ERROR("%s:Stream On Preview failed rc=%d\n", __func__, rc);
   1169         goto end;
   1170     }
   1171     end:
   1172     CDBG("%s: END, rc=%d\n", __func__, rc);
   1173     return rc;
   1174 }
   1175 
   1176 int mm_app_start_preview_stats(int cam_id)
   1177 {
   1178     int rc = MM_CAMERA_OK;
   1179 
   1180     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1181     int op_mode = 0;
   1182 
   1183     CDBG("pme = %p, pme->cam =%p, pme->cam->camera_handle = %d",
   1184          pme,pme->cam,pme->cam->camera_handle);
   1185 
   1186     if (pme->cam_state == CAMERA_STATE_PREVIEW) {
   1187         return rc;
   1188     }
   1189 
   1190     if (!my_cam_app.run_sanity) {
   1191         if (MM_CAMERA_OK != initDisplay()) {
   1192             CDBG_ERROR("%s : Could not initalize display",__func__);
   1193             goto end;
   1194         }
   1195     }
   1196 
   1197     if (MM_CAMERA_OK != (rc = mm_app_prepare_stats(cam_id))) {
   1198         CDBG_ERROR("%s:Prepare On Stats failed rc=%d\n", __func__, rc);
   1199         goto end;
   1200     }
   1201 
   1202     if (MM_CAMERA_OK != (rc = mm_app_prepare_preview(cam_id))) {
   1203         CDBG_ERROR("%s:Stream On Preview failed rc=%d\n", __func__, rc);
   1204         goto end;
   1205     }
   1206 
   1207     if (MM_CAMERA_OK != (rc = mm_app_streamon_stats(cam_id))) {
   1208         CDBG_ERROR("%s:Stream On Stats failed rc=%d\n", __func__, rc);
   1209         goto end;
   1210 	}
   1211 
   1212     if (MM_CAMERA_OK != (rc = mm_app_streamon_preview(cam_id))) {
   1213         CDBG_ERROR("%s:Stream On Preview failed rc=%d\n", __func__, rc);
   1214         goto end;
   1215     }
   1216     end:
   1217     CDBG("%s: END, rc=%d\n", __func__, rc);
   1218     return rc;
   1219 }
   1220 
   1221 
   1222 int mm_app_start_preview_zsl(int cam_id)
   1223 {
   1224     int rc = MM_CAMERA_OK;
   1225 
   1226     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1227 
   1228     CDBG("pme = %p, pme->cam =%p, pme->cam->camera_handle = %d",
   1229          pme,pme->cam,pme->cam->camera_handle);
   1230 
   1231     if (!my_cam_app.run_sanity) {
   1232         if (MM_CAMERA_OK != initDisplay()) {
   1233             CDBG_ERROR("%s : Could not initalize display",__func__);
   1234             goto end;
   1235         }
   1236     }
   1237 
   1238     pme->mem_cam->get_buf = mm_stream_initbuf;
   1239     pme->mem_cam->put_buf = mm_stream_deinitbuf;
   1240     pme->mem_cam->user_data = pme;
   1241 
   1242     if (MM_CAMERA_OK != (rc = mm_app_prepare_preview_zsl(cam_id))) {
   1243         CDBG_ERROR("%s:Prepare preview err=%d\n", __func__, rc);
   1244         goto end;
   1245     }
   1246 
   1247     if (MM_CAMERA_OK != (rc = mm_app_streamon_preview_zsl(cam_id))) {
   1248         CDBG_ERROR("%s:stream on preview err=%d\n", __func__, rc);
   1249         goto end;
   1250     }
   1251 
   1252     /*if(MM_CAMERA_OK != (rc = mm_app_bundle_zsl_stream(cam_id))){
   1253         CDBG_ERROR("%s: bundle and start of ZSl err=%d\n", __func__, rc);
   1254         goto end;
   1255     }*/
   1256 
   1257     end:
   1258     CDBG("%s: END, rc=%d\n", __func__, rc);
   1259     return rc;
   1260 }
   1261 
   1262 static int mm_app_streamoff_stats(int cam_id)
   1263 {
   1264     int rc = MM_CAMERA_OK;
   1265     uint32_t stream_aec[2], stream_af[2],stream_awb[2], stream_ihist[2];
   1266 
   1267     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1268 
   1269     stream_aec[0] = pme->stream[MM_CAMERA_SAEC].id;
   1270     stream_aec[1] = 0;
   1271 
   1272     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream_aec))) {
   1273         CDBG_ERROR("%s : Stats Stream off Error",__func__);
   1274         goto end;
   1275     }
   1276 
   1277     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SAEC].id))) {
   1278         CDBG_ERROR("%s : Delete Stats Stream error",__func__);
   1279         goto end;
   1280     }
   1281     CDBG("AEC: del_stream successfull");
   1282     stream_awb[0] = pme->stream[MM_CAMERA_SAWB].id;
   1283     stream_awb[1] = 0;
   1284 
   1285     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream_awb))) {
   1286         CDBG_ERROR("%s : Stats Stream off Error",__func__);
   1287         goto end;
   1288     }
   1289 
   1290     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SAWB].id))) {
   1291         CDBG_ERROR("%s : Delete Stats Stream error",__func__);
   1292         goto end;
   1293     }
   1294     CDBG("AWB: del_stream successfull");
   1295 
   1296     stream_af[0] = pme->stream[MM_CAMERA_SAFC].id;
   1297     stream_af[1] = 0;
   1298 
   1299     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1, stream_af))) {
   1300         CDBG_ERROR("%s : Stats Stream off Error",__func__);
   1301         goto end;
   1302     }
   1303 
   1304     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SAFC].id))) {
   1305         CDBG_ERROR("%s : Delete Stats Stream error",__func__);
   1306         goto end;
   1307     }
   1308     CDBG("AF: del_stream successfull");
   1309 
   1310 
   1311     stream_ihist[0] = pme->stream[MM_CAMERA_IHST].id;
   1312     stream_ihist[1] = 0;
   1313 
   1314     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,stream_ihist))) {
   1315         CDBG_ERROR("%s : Stats Stream off Error",__func__);
   1316         goto end;
   1317     }
   1318 
   1319     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_IHST].id))) {
   1320         CDBG_ERROR("%s : Delete Stats Stream error",__func__);
   1321         goto end;
   1322     }
   1323     CDBG("IHIST: del_stream successfull");
   1324 
   1325     end:
   1326     CDBG("%s: END, rc=%d\n", __func__, rc);
   1327 
   1328     return rc;
   1329 }
   1330 
   1331 static int mm_app_streamoff_preview(int cam_id)
   1332 {
   1333     int rc = MM_CAMERA_OK;
   1334     uint32_t stream;
   1335 
   1336     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1337 
   1338     stream = pme->stream[MM_CAMERA_PREVIEW].id;
   1339 
   1340     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,1,&stream))) {
   1341         CDBG_ERROR("%s : Preview Stream off Error",__func__);
   1342         goto end;
   1343     }
   1344 
   1345     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_PREVIEW].id))) {
   1346         CDBG_ERROR("%s : Delete Stream Preview error",__func__);
   1347         goto end;
   1348     }
   1349     CDBG("del_stream successfull");
   1350     pme->cam_state = CAMERA_STATE_OPEN;
   1351     end:
   1352     CDBG("%s: END, rc=%d\n", __func__, rc);
   1353 
   1354     return rc;
   1355 }
   1356 
   1357 static int mm_app_streamoff_preview_zsl(int cam_id)
   1358 {
   1359     int rc = MM_CAMERA_OK;
   1360     uint32_t stream[2];
   1361 
   1362     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1363 
   1364     stream[0] = pme->stream[MM_CAMERA_PREVIEW].id;
   1365     stream[1] = pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id;
   1366 
   1367     if (MM_CAMERA_OK != (rc = pme->cam->ops->stop_streams(pme->cam->camera_handle,pme->ch_id,2,stream))) {
   1368         CDBG_ERROR("%s : Preview Stream off Error",__func__);
   1369         goto end;
   1370     }
   1371 
   1372     if (MM_CAMERA_OK != (rc = pme->cam->ops->destroy_stream_bundle(pme->cam->camera_handle,pme->ch_id))) {
   1373         CDBG_ERROR("%s : ZSL Snapshot destroy_stream_bundle Error",__func__);
   1374         goto end;
   1375     }
   1376 
   1377     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_PREVIEW].id))) {
   1378         CDBG_ERROR("%s : Delete Stream Preview error",__func__);
   1379         goto end;
   1380     }
   1381 
   1382     if (MM_CAMERA_OK != (rc = pme->cam->ops->del_stream(pme->cam->camera_handle,pme->ch_id,pme->stream[MM_CAMERA_SNAPSHOT_MAIN].id))) {
   1383         CDBG_ERROR("%s : Delete Stream Preview error",__func__);
   1384         goto end;
   1385     }
   1386     CDBG("del_stream successfull");
   1387     pme->cam_state = CAMERA_STATE_OPEN;
   1388     end:
   1389     CDBG("%s: END, rc=%d\n", __func__, rc);
   1390 
   1391     return rc;
   1392 }
   1393 
   1394 int startPreview(int cam_id)
   1395 {
   1396     int rc = MM_CAMERA_OK;
   1397 
   1398     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1399 
   1400     CDBG("%s: Start Preview",__func__);
   1401 
   1402     if (pme->cam_mode == ZSL_MODE || pme->cam_mode == RECORDER_MODE) {
   1403         switch (pme->cam_state) {
   1404         case CAMERA_STATE_RECORD:
   1405             if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) {
   1406                 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc);
   1407                 return -1;
   1408             }
   1409         case CAMERA_STATE_PREVIEW:
   1410             if (MM_CAMERA_OK != mm_app_open_camera(cam_id)) {
   1411                 CDBG_ERROR("%s: Cannot switch to camera mode\n", __func__);
   1412                 return -1;
   1413             }
   1414             break;
   1415         case CAMERA_STATE_SNAPSHOT:
   1416         default:
   1417             break;
   1418         }
   1419     } else if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_OPEN) {
   1420 
   1421         if (MM_CAMERA_OK != (rc = mm_app_start_preview(cam_id))) {
   1422             CDBG_ERROR("%s:preview streaming on err=%d\n", __func__, rc);
   1423             return -1;
   1424         }
   1425     }
   1426     CDBG("%s: END, rc=%d\n", __func__, rc);
   1427     return rc;
   1428 }
   1429 
   1430 int stopPreview(int cam_id)
   1431 {
   1432     int rc = MM_CAMERA_OK;
   1433     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1434 
   1435     CDBG("%s : pme->cam_mode = %d, pme->cam_state = %d",__func__,pme->cam_mode,pme->cam_state);
   1436 
   1437     if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1438         if (MM_CAMERA_OK != (rc = mm_app_stop_preview(cam_id))) {
   1439             CDBG("%s:streamoff preview err=%d\n", __func__, rc);
   1440             goto end;
   1441         }
   1442     } else if (pme->cam_mode == ZSL_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1443         if (MM_CAMERA_OK != (rc = mm_app_stop_preview_zsl(cam_id))) {
   1444             CDBG("%s:streamoff preview err=%d\n", __func__, rc);
   1445             goto end;
   1446         }
   1447     } else if (pme->cam_mode == RECORDER_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1448         if (MM_CAMERA_OK != (rc = mm_app_stop_preview(cam_id))) {
   1449             CDBG("%s:streamoff preview err=%d\n", __func__, rc);
   1450             goto end;
   1451         }
   1452         mm_app_unprepare_video(cam_id);
   1453     }
   1454     end:
   1455     return rc;
   1456 }
   1457 
   1458 int startStats(int cam_id)
   1459 {
   1460     int rc = MM_CAMERA_OK;
   1461 
   1462     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1463 
   1464     CDBG("%s: Start Preview",__func__);
   1465 
   1466     if (pme->cam_mode == ZSL_MODE || pme->cam_mode == RECORDER_MODE) {
   1467         switch (pme->cam_state) {
   1468         case CAMERA_STATE_RECORD:
   1469             if (MM_CAMERA_OK != mm_app_stop_video(cam_id)) {
   1470                 CDBG_ERROR("%s:Cannot stop video err=%d\n", __func__, rc);
   1471                 return -1;
   1472             }
   1473         case CAMERA_STATE_PREVIEW:
   1474             if (MM_CAMERA_OK != mm_app_open_camera_stats(cam_id)) {
   1475                 CDBG_ERROR("%s: Cannot switch to camera mode\n", __func__);
   1476                 return -1;
   1477             }
   1478             break;
   1479         case CAMERA_STATE_SNAPSHOT:
   1480         default:
   1481             break;
   1482         }
   1483     } else if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_OPEN) {
   1484 
   1485         if (MM_CAMERA_OK != (rc = mm_app_start_preview_stats(cam_id))) {
   1486             CDBG_ERROR("%s:preview streaming on err=%d\n", __func__, rc);
   1487             return -1;
   1488         }
   1489     }
   1490     CDBG("%s: END, rc=%d\n", __func__, rc);
   1491     return rc;
   1492 }
   1493 
   1494 int stopStats(int cam_id)
   1495 {
   1496     int rc = MM_CAMERA_OK;
   1497     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1498 
   1499     CDBG("%s : pme->cam_mode = %d, pme->cam_state = %d",__func__,pme->cam_mode,pme->cam_state);
   1500 
   1501     if (pme->cam_mode == CAMERA_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1502         if (MM_CAMERA_OK != (rc = mm_app_stop_preview_stats(cam_id))) {
   1503             CDBG("%s:streamoff preview err=%d\n", __func__, rc);
   1504             goto end;
   1505         }
   1506     } else if (pme->cam_mode == ZSL_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1507         if (MM_CAMERA_OK != (rc = mm_app_stop_preview_zsl(cam_id))) {
   1508             CDBG("%s:streamoff preview err=%d\n", __func__, rc);
   1509             goto end;
   1510         }
   1511     } else if (pme->cam_mode == RECORDER_MODE && pme->cam_state == CAMERA_STATE_PREVIEW) {
   1512         if (MM_CAMERA_OK != (rc = mm_app_stop_preview_stats(cam_id))) {
   1513             CDBG("%s:streamoff preview err=%d\n", __func__, rc);
   1514             goto end;
   1515         }
   1516         mm_app_unprepare_video(cam_id);
   1517     }
   1518     end:
   1519     return rc;
   1520 }
   1521 
   1522 int mm_app_stop_preview(int cam_id)
   1523 {
   1524     int rc = MM_CAMERA_OK;
   1525 
   1526     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1527 
   1528     if (MM_CAMERA_OK != (rc = mm_app_streamoff_preview(cam_id))) {
   1529         CDBG_ERROR("%s : Delete Stream Preview error",__func__);
   1530         goto end;
   1531     }
   1532     CDBG("Stop Preview successfull");
   1533 
   1534     if (!my_cam_app.run_sanity) {
   1535         deinitDisplay();
   1536     }
   1537     end:
   1538     CDBG("%s: END, rc=%d\n", __func__, rc);
   1539     return rc;
   1540 }
   1541 
   1542 int mm_app_stop_preview_stats(int cam_id)
   1543 {
   1544     int rc = MM_CAMERA_OK;
   1545 
   1546     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1547 
   1548     if (MM_CAMERA_OK != (rc = mm_app_streamoff_stats(cam_id))) {
   1549         CDBG_ERROR("%s : Delete Stream Stats error",__func__);
   1550         goto end;
   1551     }
   1552     if (MM_CAMERA_OK != (rc = mm_app_streamoff_preview(cam_id))) {
   1553         CDBG_ERROR("%s : Delete Stream Preview error",__func__);
   1554         goto end;
   1555     }
   1556     CDBG("Stop Preview successfull");
   1557 
   1558     if (!my_cam_app.run_sanity) {
   1559         deinitDisplay();
   1560     }
   1561     end:
   1562     CDBG("%s: END, rc=%d\n", __func__, rc);
   1563     return rc;
   1564 }
   1565 
   1566 int mm_app_stop_preview_zsl(int cam_id)
   1567 {
   1568     int rc = MM_CAMERA_OK;
   1569 
   1570     mm_camera_app_obj_t *pme = mm_app_get_cam_obj(cam_id);
   1571 
   1572     if (MM_CAMERA_OK != (rc = mm_app_streamoff_preview_zsl(cam_id))) {
   1573         CDBG_ERROR("%s : Delete Stream Preview error",__func__);
   1574         goto end;
   1575     }
   1576 
   1577     CDBG("Stop Preview successfull");
   1578     if (!my_cam_app.run_sanity) {
   1579         deinitDisplay();
   1580     }
   1581     end:
   1582     CDBG("%s: END, rc=%d\n", __func__, rc);
   1583     return rc;
   1584 }
   1585