Home | History | Annotate | Download | only in src
      1 /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #include <ctype.h>
     31 #include <cutils/properties.h>
     32 #include <fcntl.h>
     33 #include <dlfcn.h>
     34 #include <linux/msm_ion.h>
     35 #include <sys/mman.h>
     36 
     37 #include "mm_qcamera_dbg.h"
     38 #include "mm_qcamera_app.h"
     39 
     40 static pthread_mutex_t app_mutex;
     41 static int thread_status = 0;
     42 static pthread_cond_t app_cond_v;
     43 
     44 #define MM_QCAMERA_APP_NANOSEC_SCALE 1000000000
     45 
     46 int mm_camera_app_timedwait(uint8_t seconds)
     47 {
     48     int rc = 0;
     49     pthread_mutex_lock(&app_mutex);
     50     if(FALSE == thread_status) {
     51         struct timespec tw;
     52         memset(&tw, 0, sizeof tw);
     53         tw.tv_sec = 0;
     54         tw.tv_nsec = time(0) + seconds * MM_QCAMERA_APP_NANOSEC_SCALE;
     55 
     56         rc = pthread_cond_timedwait(&app_cond_v, &app_mutex,&tw);
     57         thread_status = FALSE;
     58     }
     59     pthread_mutex_unlock(&app_mutex);
     60     return rc;
     61 }
     62 
     63 int mm_camera_app_wait()
     64 {
     65     int rc = 0;
     66     pthread_mutex_lock(&app_mutex);
     67     if(FALSE == thread_status){
     68         pthread_cond_wait(&app_cond_v, &app_mutex);
     69     }
     70     thread_status = FALSE;
     71     pthread_mutex_unlock(&app_mutex);
     72     return rc;
     73 }
     74 
     75 void mm_camera_app_done()
     76 {
     77   pthread_mutex_lock(&app_mutex);
     78   thread_status = TRUE;
     79   pthread_cond_signal(&app_cond_v);
     80   pthread_mutex_unlock(&app_mutex);
     81 }
     82 
     83 int mm_app_load_hal(mm_camera_app_t *my_cam_app)
     84 {
     85     memset(&my_cam_app->hal_lib, 0, sizeof(hal_interface_lib_t));
     86     my_cam_app->hal_lib.ptr = dlopen("libmmcamera_interface.so", RTLD_NOW);
     87     my_cam_app->hal_lib.ptr_jpeg = dlopen("libmmjpeg_interface.so", RTLD_NOW);
     88     if (!my_cam_app->hal_lib.ptr || !my_cam_app->hal_lib.ptr_jpeg) {
     89         CDBG_ERROR("%s Error opening HAL library %s\n", __func__, dlerror());
     90         return -MM_CAMERA_E_GENERAL;
     91     }
     92     *(void **)&(my_cam_app->hal_lib.get_num_of_cameras) =
     93         dlsym(my_cam_app->hal_lib.ptr, "get_num_of_cameras");
     94     *(void **)&(my_cam_app->hal_lib.mm_camera_open) =
     95         dlsym(my_cam_app->hal_lib.ptr, "camera_open");
     96     *(void **)&(my_cam_app->hal_lib.jpeg_open) =
     97         dlsym(my_cam_app->hal_lib.ptr_jpeg, "jpeg_open");
     98 
     99     if (my_cam_app->hal_lib.get_num_of_cameras == NULL ||
    100         my_cam_app->hal_lib.mm_camera_open == NULL ||
    101         my_cam_app->hal_lib.jpeg_open == NULL) {
    102         CDBG_ERROR("%s Error loading HAL sym %s\n", __func__, dlerror());
    103         return -MM_CAMERA_E_GENERAL;
    104     }
    105 
    106     my_cam_app->num_cameras = my_cam_app->hal_lib.get_num_of_cameras();
    107     CDBG("%s: num_cameras = %d\n", __func__, my_cam_app->num_cameras);
    108 
    109     return MM_CAMERA_OK;
    110 }
    111 
    112 int mm_app_allocate_ion_memory(mm_camera_app_buf_t *buf, int ion_type)
    113 {
    114     int rc = MM_CAMERA_OK;
    115     struct ion_handle_data handle_data;
    116     struct ion_allocation_data alloc;
    117     struct ion_fd_data ion_info_fd;
    118     int main_ion_fd = 0;
    119     void *data = NULL;
    120 
    121     main_ion_fd = open("/dev/ion", O_RDONLY);
    122     if (main_ion_fd <= 0) {
    123         CDBG_ERROR("Ion dev open failed %s\n", strerror(errno));
    124         goto ION_OPEN_FAILED;
    125     }
    126 
    127     memset(&alloc, 0, sizeof(alloc));
    128     alloc.len = buf->mem_info.size;
    129     /* to make it page size aligned */
    130     alloc.len = (alloc.len + 4095) & (~4095);
    131     alloc.align = 4096;
    132     alloc.flags = ION_FLAG_CACHED;
    133     alloc.heap_mask = ion_type;
    134     rc = ioctl(main_ion_fd, ION_IOC_ALLOC, &alloc);
    135     if (rc < 0) {
    136         CDBG_ERROR("ION allocation failed\n");
    137         goto ION_ALLOC_FAILED;
    138     }
    139 
    140     memset(&ion_info_fd, 0, sizeof(ion_info_fd));
    141     ion_info_fd.handle = alloc.handle;
    142     rc = ioctl(main_ion_fd, ION_IOC_SHARE, &ion_info_fd);
    143     if (rc < 0) {
    144         CDBG_ERROR("ION map failed %s\n", strerror(errno));
    145         goto ION_MAP_FAILED;
    146     }
    147 
    148     data = mmap(NULL,
    149                 alloc.len,
    150                 PROT_READ  | PROT_WRITE,
    151                 MAP_SHARED,
    152                 ion_info_fd.fd,
    153                 0);
    154 
    155     if (data == MAP_FAILED) {
    156         CDBG_ERROR("ION_MMAP_FAILED: %s (%d)\n", strerror(errno), errno);
    157         goto ION_MAP_FAILED;
    158     }
    159     buf->mem_info.main_ion_fd = main_ion_fd;
    160     buf->mem_info.fd = ion_info_fd.fd;
    161     buf->mem_info.handle = ion_info_fd.handle;
    162     buf->mem_info.size = alloc.len;
    163     buf->mem_info.data = data;
    164     return MM_CAMERA_OK;
    165 
    166 ION_MAP_FAILED:
    167     memset(&handle_data, 0, sizeof(handle_data));
    168     handle_data.handle = ion_info_fd.handle;
    169     ioctl(main_ion_fd, ION_IOC_FREE, &handle_data);
    170 ION_ALLOC_FAILED:
    171     close(main_ion_fd);
    172 ION_OPEN_FAILED:
    173     return -MM_CAMERA_E_GENERAL;
    174 }
    175 
    176 int mm_app_deallocate_ion_memory(mm_camera_app_buf_t *buf)
    177 {
    178   struct ion_handle_data handle_data;
    179   int rc = 0;
    180 
    181   rc = munmap(buf->mem_info.data, buf->mem_info.size);
    182 
    183   if (buf->mem_info.fd > 0) {
    184       close(buf->mem_info.fd);
    185       buf->mem_info.fd = 0;
    186   }
    187 
    188   if (buf->mem_info.main_ion_fd > 0) {
    189       memset(&handle_data, 0, sizeof(handle_data));
    190       handle_data.handle = buf->mem_info.handle;
    191       ioctl(buf->mem_info.main_ion_fd, ION_IOC_FREE, &handle_data);
    192       close(buf->mem_info.main_ion_fd);
    193       buf->mem_info.main_ion_fd = 0;
    194   }
    195   return rc;
    196 }
    197 
    198 /* cmd = ION_IOC_CLEAN_CACHES, ION_IOC_INV_CACHES, ION_IOC_CLEAN_INV_CACHES */
    199 int mm_app_cache_ops(mm_camera_app_meminfo_t *mem_info,
    200                      unsigned int cmd)
    201 {
    202     struct ion_flush_data cache_inv_data;
    203     struct ion_custom_data custom_data;
    204     int ret = MM_CAMERA_OK;
    205 
    206 #ifdef USE_ION
    207     if (NULL == mem_info) {
    208         CDBG_ERROR("%s: mem_info is NULL, return here", __func__);
    209         return -MM_CAMERA_E_GENERAL;
    210     }
    211 
    212     memset(&cache_inv_data, 0, sizeof(cache_inv_data));
    213     memset(&custom_data, 0, sizeof(custom_data));
    214     cache_inv_data.vaddr = mem_info->data;
    215     cache_inv_data.fd = mem_info->fd;
    216     cache_inv_data.handle = mem_info->handle;
    217     cache_inv_data.length = mem_info->size;
    218     custom_data.cmd = cmd;
    219     custom_data.arg = (unsigned long)&cache_inv_data;
    220 
    221     CDBG("addr = %p, fd = %d, handle = %p length = %d, ION Fd = %d",
    222          cache_inv_data.vaddr, cache_inv_data.fd,
    223          cache_inv_data.handle, cache_inv_data.length,
    224          mem_info->main_ion_fd);
    225     if(mem_info->main_ion_fd > 0) {
    226         if(ioctl(mem_info->main_ion_fd, ION_IOC_CUSTOM, &custom_data) < 0) {
    227             ALOGE("%s: Cache Invalidate failed\n", __func__);
    228             ret = -MM_CAMERA_E_GENERAL;
    229         }
    230     }
    231 #endif
    232 
    233     return ret;
    234 }
    235 
    236 void mm_app_dump_frame(mm_camera_buf_def_t *frame,
    237                        char *name,
    238                        char *ext,
    239                        int frame_idx)
    240 {
    241     char file_name[64];
    242     int file_fd;
    243     int i;
    244     int offset = 0;
    245     if ( frame != NULL) {
    246         snprintf(file_name, sizeof(file_name), "/data/test/%s_%04d.%s", name, frame_idx, ext);
    247         file_fd = open(file_name, O_RDWR | O_CREAT, 0777);
    248         if (file_fd < 0) {
    249             CDBG_ERROR("%s: cannot open file %s \n", __func__, file_name);
    250         } else {
    251             for (i = 0; i < frame->num_planes; i++) {
    252                 CDBG("%s: saving file from address: 0x%x, data offset: %d, length: %d \n", __func__,
    253                           (uint32_t )frame->buffer, frame->planes[i].data_offset, frame->planes[i].length);
    254                 write(file_fd,
    255                       (uint8_t *)frame->buffer + offset,
    256                       frame->planes[i].length);
    257                 offset +=  frame->planes[i].length;
    258             }
    259 
    260             close(file_fd);
    261             CDBG("dump %s", file_name);
    262         }
    263     }
    264 }
    265 
    266 void mm_app_dump_jpeg_frame(const void * data, uint32_t size, char* name, char* ext, int index)
    267 {
    268     char buf[64];
    269     int file_fd;
    270     if ( data != NULL) {
    271         snprintf(buf, sizeof(buf), "/data/test/%s_%d.%s", name, index, ext);
    272         CDBG("%s: %s size =%d, jobId=%d", __func__, buf, size, index);
    273         file_fd = open(buf, O_RDWR | O_CREAT, 0777);
    274         write(file_fd, data, size);
    275         close(file_fd);
    276     }
    277 }
    278 
    279 int mm_app_alloc_bufs(mm_camera_app_buf_t* app_bufs,
    280                       cam_frame_len_offset_t *frame_offset_info,
    281                       uint8_t num_bufs,
    282                       uint8_t is_streambuf,
    283                       size_t multipleOf)
    284 {
    285     int i, j;
    286     int ion_type = 0x1 << CAMERA_ION_FALLBACK_HEAP_ID;
    287 
    288     if (is_streambuf) {
    289         ion_type |= 0x1 << CAMERA_ION_HEAP_ID;
    290     }
    291 
    292     for (i = 0; i < num_bufs ; i++) {
    293         if ( 0 < multipleOf ) {
    294             size_t m = frame_offset_info->frame_len / multipleOf;
    295             if ( ( frame_offset_info->frame_len % multipleOf ) != 0 ) {
    296                 m++;
    297             }
    298             app_bufs[i].mem_info.size = m * multipleOf;
    299         } else {
    300             app_bufs[i].mem_info.size = frame_offset_info->frame_len;
    301         }
    302         mm_app_allocate_ion_memory(&app_bufs[i], ion_type);
    303 
    304         app_bufs[i].buf.buf_idx = i;
    305         app_bufs[i].buf.num_planes = frame_offset_info->num_planes;
    306         app_bufs[i].buf.fd = app_bufs[i].mem_info.fd;
    307         app_bufs[i].buf.frame_len = app_bufs[i].mem_info.size;
    308         app_bufs[i].buf.buffer = app_bufs[i].mem_info.data;
    309         app_bufs[i].buf.mem_info = (void *)&app_bufs[i].mem_info;
    310 
    311         /* Plane 0 needs to be set seperately. Set other planes
    312              * in a loop. */
    313         app_bufs[i].buf.planes[0].length = frame_offset_info->mp[0].len;
    314         app_bufs[i].buf.planes[0].m.userptr = app_bufs[i].buf.fd;
    315         app_bufs[i].buf.planes[0].data_offset = frame_offset_info->mp[0].offset;
    316         app_bufs[i].buf.planes[0].reserved[0] = 0;
    317         for (j = 1; j < frame_offset_info->num_planes; j++) {
    318             app_bufs[i].buf.planes[j].length = frame_offset_info->mp[j].len;
    319             app_bufs[i].buf.planes[j].m.userptr = app_bufs[i].buf.fd;
    320             app_bufs[i].buf.planes[j].data_offset = frame_offset_info->mp[j].offset;
    321             app_bufs[i].buf.planes[j].reserved[0] =
    322                 app_bufs[i].buf.planes[j-1].reserved[0] +
    323                 app_bufs[i].buf.planes[j-1].length;
    324         }
    325     }
    326     CDBG("%s: X", __func__);
    327     return MM_CAMERA_OK;
    328 }
    329 
    330 int mm_app_release_bufs(uint8_t num_bufs,
    331                         mm_camera_app_buf_t* app_bufs)
    332 {
    333     int i, rc = MM_CAMERA_OK;
    334 
    335     CDBG("%s: E", __func__);
    336 
    337     for (i = 0; i < num_bufs; i++) {
    338         rc = mm_app_deallocate_ion_memory(&app_bufs[i]);
    339     }
    340     memset(app_bufs, 0, num_bufs * sizeof(mm_camera_app_buf_t));
    341     CDBG("%s: X", __func__);
    342     return rc;
    343 }
    344 
    345 int mm_app_stream_initbuf(cam_frame_len_offset_t *frame_offset_info,
    346                           uint8_t *num_bufs,
    347                           uint8_t **initial_reg_flag,
    348                           mm_camera_buf_def_t **bufs,
    349                           mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    350                           void *user_data)
    351 {
    352     mm_camera_stream_t *stream = (mm_camera_stream_t *)user_data;
    353     mm_camera_buf_def_t *pBufs = NULL;
    354     uint8_t *reg_flags = NULL;
    355     int i, rc;
    356 
    357     stream->offset = *frame_offset_info;
    358 
    359     CDBG("%s: alloc buf for stream_id %d, len=%d, num planes: %d, offset: %d",
    360          __func__,
    361          stream->s_id,
    362          frame_offset_info->frame_len,
    363          frame_offset_info->num_planes,
    364          frame_offset_info->mp[1].offset);
    365 
    366     pBufs = (mm_camera_buf_def_t *)malloc(sizeof(mm_camera_buf_def_t) * stream->num_of_bufs);
    367     reg_flags = (uint8_t *)malloc(sizeof(uint8_t) * stream->num_of_bufs);
    368     if (pBufs == NULL || reg_flags == NULL) {
    369         CDBG_ERROR("%s: No mem for bufs", __func__);
    370         if (pBufs != NULL) {
    371             free(pBufs);
    372         }
    373         if (reg_flags != NULL) {
    374             free(reg_flags);
    375         }
    376         return -1;
    377     }
    378 
    379     rc = mm_app_alloc_bufs(&stream->s_bufs[0],
    380                            frame_offset_info,
    381                            stream->num_of_bufs,
    382                            1,
    383                            stream->multipleOf);
    384 
    385     if (rc != MM_CAMERA_OK) {
    386         CDBG_ERROR("%s: mm_stream_alloc_bufs err = %d", __func__, rc);
    387         free(pBufs);
    388         free(reg_flags);
    389         return rc;
    390     }
    391 
    392     for (i = 0; i < stream->num_of_bufs; i++) {
    393         /* mapping stream bufs first */
    394         pBufs[i] = stream->s_bufs[i].buf;
    395         reg_flags[i] = 1;
    396         rc = ops_tbl->map_ops(pBufs[i].buf_idx,
    397                               -1,
    398                               pBufs[i].fd,
    399                               pBufs[i].frame_len,
    400                               ops_tbl->userdata);
    401         if (rc != MM_CAMERA_OK) {
    402             CDBG_ERROR("%s: mapping buf[%d] err = %d", __func__, i, rc);
    403             break;
    404         }
    405     }
    406 
    407     if (rc != MM_CAMERA_OK) {
    408         int j;
    409         for (j=0; j>i; j++) {
    410             ops_tbl->unmap_ops(pBufs[j].buf_idx, -1, ops_tbl->userdata);
    411         }
    412         mm_app_release_bufs(stream->num_of_bufs, &stream->s_bufs[0]);
    413         free(pBufs);
    414         free(reg_flags);
    415         return rc;
    416     }
    417 
    418     *num_bufs = stream->num_of_bufs;
    419     *bufs = pBufs;
    420     *initial_reg_flag = reg_flags;
    421 
    422     CDBG("%s: X",__func__);
    423     return rc;
    424 }
    425 
    426 int32_t mm_app_stream_deinitbuf(mm_camera_map_unmap_ops_tbl_t *ops_tbl,
    427                                 void *user_data)
    428 {
    429     mm_camera_stream_t *stream = (mm_camera_stream_t *)user_data;
    430     int i;
    431 
    432     for (i = 0; i < stream->num_of_bufs ; i++) {
    433         /* mapping stream bufs first */
    434         ops_tbl->unmap_ops(stream->s_bufs[i].buf.buf_idx, -1, ops_tbl->userdata);
    435     }
    436 
    437     mm_app_release_bufs(stream->num_of_bufs, &stream->s_bufs[0]);
    438 
    439     CDBG("%s: X",__func__);
    440     return 0;
    441 }
    442 
    443 int32_t mm_app_stream_clean_invalidate_buf(int index, void *user_data)
    444 {
    445     mm_camera_stream_t *stream = (mm_camera_stream_t *)user_data;
    446     return mm_app_cache_ops(&stream->s_bufs[index].mem_info,
    447       ION_IOC_CLEAN_INV_CACHES);
    448 }
    449 
    450 int32_t mm_app_stream_invalidate_buf(int index, void *user_data)
    451 {
    452     mm_camera_stream_t *stream = (mm_camera_stream_t *)user_data;
    453     return mm_app_cache_ops(&stream->s_bufs[index].mem_info, ION_IOC_INV_CACHES);
    454 }
    455 
    456 static void notify_evt_cb(uint32_t camera_handle,
    457                           mm_camera_event_t *evt,
    458                           void *user_data)
    459 {
    460     mm_camera_test_obj_t *test_obj =
    461         (mm_camera_test_obj_t *)user_data;
    462     if (test_obj == NULL || test_obj->cam->camera_handle != camera_handle) {
    463         CDBG_ERROR("%s: Not a valid test obj", __func__);
    464         return;
    465     }
    466 
    467     CDBG("%s:E evt = %d", __func__, evt->server_event_type);
    468     switch (evt->server_event_type) {
    469        case CAM_EVENT_TYPE_AUTO_FOCUS_DONE:
    470            CDBG("%s: rcvd auto focus done evt", __func__);
    471            break;
    472        case CAM_EVENT_TYPE_ZOOM_DONE:
    473            CDBG("%s: rcvd zoom done evt", __func__);
    474            break;
    475        default:
    476            break;
    477     }
    478 
    479     CDBG("%s:X", __func__);
    480 }
    481 
    482 int mm_app_open(mm_camera_app_t *cam_app,
    483                 uint8_t cam_id,
    484                 mm_camera_test_obj_t *test_obj)
    485 {
    486     int32_t rc;
    487     cam_frame_len_offset_t offset_info;
    488 
    489     CDBG("%s:BEGIN\n", __func__);
    490 
    491     test_obj->cam = cam_app->hal_lib.mm_camera_open(cam_id);
    492     if(test_obj->cam == NULL) {
    493         CDBG_ERROR("%s:dev open error\n", __func__);
    494         return -MM_CAMERA_E_GENERAL;
    495     }
    496 
    497     CDBG("Open Camera id = %d handle = %d", cam_id, test_obj->cam->camera_handle);
    498 
    499     /* alloc ion mem for capability buf */
    500     memset(&offset_info, 0, sizeof(offset_info));
    501     offset_info.frame_len = sizeof(cam_capability_t);
    502 
    503     rc = mm_app_alloc_bufs(&test_obj->cap_buf,
    504                            &offset_info,
    505                            1,
    506                            0,
    507                            0);
    508     if (rc != MM_CAMERA_OK) {
    509         CDBG_ERROR("%s:alloc buf for capability error\n", __func__);
    510         goto error_after_cam_open;
    511     }
    512 
    513     /* mapping capability buf */
    514     rc = test_obj->cam->ops->map_buf(test_obj->cam->camera_handle,
    515                                      CAM_MAPPING_BUF_TYPE_CAPABILITY,
    516                                      test_obj->cap_buf.mem_info.fd,
    517                                      test_obj->cap_buf.mem_info.size);
    518     if (rc != MM_CAMERA_OK) {
    519         CDBG_ERROR("%s:map for capability error\n", __func__);
    520         goto error_after_cap_buf_alloc;
    521     }
    522 
    523     /* alloc ion mem for getparm buf */
    524     memset(&offset_info, 0, sizeof(offset_info));
    525     offset_info.frame_len = sizeof(parm_buffer_t);
    526     rc = mm_app_alloc_bufs(&test_obj->parm_buf,
    527                            &offset_info,
    528                            1,
    529                            0,
    530                            0);
    531     if (rc != MM_CAMERA_OK) {
    532         CDBG_ERROR("%s:alloc buf for getparm_buf error\n", __func__);
    533         goto error_after_cap_buf_map;
    534     }
    535 
    536     /* mapping getparm buf */
    537     rc = test_obj->cam->ops->map_buf(test_obj->cam->camera_handle,
    538                                      CAM_MAPPING_BUF_TYPE_PARM_BUF,
    539                                      test_obj->parm_buf.mem_info.fd,
    540                                      test_obj->parm_buf.mem_info.size);
    541     if (rc != MM_CAMERA_OK) {
    542         CDBG_ERROR("%s:map getparm_buf error\n", __func__);
    543         goto error_after_getparm_buf_alloc;
    544     }
    545     test_obj->params_buffer = (parm_buffer_t*) test_obj->parm_buf.mem_info.data;
    546     CDBG_HIGH("\n%s params_buffer=%p\n",__func__,test_obj->params_buffer);
    547 
    548     rc = test_obj->cam->ops->register_event_notify(test_obj->cam->camera_handle,
    549                                                    notify_evt_cb,
    550                                                    test_obj);
    551     if (rc != MM_CAMERA_OK) {
    552         CDBG_ERROR("%s: failed register_event_notify", __func__);
    553         rc = -MM_CAMERA_E_GENERAL;
    554         goto error_after_getparm_buf_map;
    555     }
    556 
    557     rc = test_obj->cam->ops->query_capability(test_obj->cam->camera_handle);
    558     if (rc != MM_CAMERA_OK) {
    559         CDBG_ERROR("%s: failed query_capability", __func__);
    560         rc = -MM_CAMERA_E_GENERAL;
    561         goto error_after_getparm_buf_map;
    562     }
    563     memset(&test_obj->jpeg_ops, 0, sizeof(mm_jpeg_ops_t));
    564     mm_dimension pic_size;
    565     memset(&pic_size, 0, sizeof(mm_dimension));
    566     pic_size.w = 4000;
    567     pic_size.h = 3000;
    568     test_obj->jpeg_hdl = cam_app->hal_lib.jpeg_open(&test_obj->jpeg_ops,pic_size);
    569     if (test_obj->jpeg_hdl == 0) {
    570         CDBG_ERROR("%s: jpeg lib open err", __func__);
    571         rc = -MM_CAMERA_E_GENERAL;
    572         goto error_after_getparm_buf_map;
    573     }
    574 
    575     return rc;
    576 
    577 error_after_getparm_buf_map:
    578     test_obj->cam->ops->unmap_buf(test_obj->cam->camera_handle,
    579                                   CAM_MAPPING_BUF_TYPE_PARM_BUF);
    580 error_after_getparm_buf_alloc:
    581     mm_app_release_bufs(1, &test_obj->parm_buf);
    582 error_after_cap_buf_map:
    583     test_obj->cam->ops->unmap_buf(test_obj->cam->camera_handle,
    584                                   CAM_MAPPING_BUF_TYPE_CAPABILITY);
    585 error_after_cap_buf_alloc:
    586     mm_app_release_bufs(1, &test_obj->cap_buf);
    587 error_after_cam_open:
    588     test_obj->cam->ops->close_camera(test_obj->cam->camera_handle);
    589     test_obj->cam = NULL;
    590     return rc;
    591 }
    592 
    593 int add_parm_entry_tobatch(parm_buffer_t *p_table,
    594                            cam_intf_parm_type_t paramType,
    595                            uint32_t paramLength,
    596                            void *paramValue)
    597 {
    598     int rc = MM_CAMERA_OK;
    599     void* dst;
    600 
    601     if (paramLength > get_size_of(paramType)) {
    602         CDBG_ERROR("%s:Size of input larger than max entry size",__func__);
    603         return -1;
    604     }
    605     dst = get_pointer_of(paramType, p_table);
    606     if(dst){
    607         memcpy(dst, paramValue, paramLength);
    608         p_table->is_valid[paramType] = 1;
    609     }
    610     return rc;
    611 }
    612 
    613 int init_batch_update(parm_buffer_t *p_table)
    614 {
    615     int rc = MM_CAMERA_OK;
    616     CDBG_HIGH("\nEnter %s\n",__func__);
    617     int32_t hal_version = CAM_HAL_V1;
    618 
    619     memset(p_table, 0, sizeof(parm_buffer_t));
    620     rc = add_parm_entry_tobatch(p_table, CAM_INTF_PARM_HAL_VERSION,sizeof(hal_version), &hal_version);
    621     if (rc != MM_CAMERA_OK) {
    622         CDBG_ERROR("%s: add_parm_entry_tobatch failed !!", __func__);
    623     }
    624     return rc;
    625 }
    626 
    627 int commit_set_batch(mm_camera_test_obj_t *test_obj)
    628 {
    629     int rc = MM_CAMERA_OK;
    630     int i = 0;
    631 
    632     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
    633         if(test_obj->params_buffer->is_valid[i])
    634             break;
    635     }
    636     if (i < CAM_INTF_PARM_MAX) {
    637         CDBG_HIGH("\n set_param p_buffer =%p\n",test_obj->params_buffer);
    638         rc = test_obj->cam->ops->set_parms(test_obj->cam->camera_handle, test_obj->params_buffer);
    639     }
    640     if (rc != MM_CAMERA_OK) {
    641         CDBG_ERROR("%s: cam->ops->set_parms failed !!", __func__);
    642     }
    643     return rc;
    644 }
    645 
    646 
    647 int mm_app_set_params(mm_camera_test_obj_t *test_obj,
    648                       cam_intf_parm_type_t param_type,
    649                       int32_t value)
    650 {
    651     CDBG_HIGH("\nEnter mm_app_set_params!! param_type =%d & value =%d\n",param_type, value);
    652     int rc = MM_CAMERA_OK;
    653     rc = init_batch_update(test_obj->params_buffer);
    654     if (rc != MM_CAMERA_OK) {
    655         CDBG_ERROR("%s: init_batch_update failed !!", __func__);
    656         return rc;
    657     }
    658     rc = add_parm_entry_tobatch(test_obj->params_buffer, param_type, sizeof(value), &value);
    659     if (rc != MM_CAMERA_OK) {
    660         CDBG_ERROR("%s: add_parm_entry_tobatch failed !!", __func__);
    661         return rc;
    662     }
    663     rc = commit_set_batch(test_obj);
    664     if (rc != MM_CAMERA_OK) {
    665         CDBG_ERROR("%s: commit_set_batch failed !!", __func__);
    666         return rc;
    667     }
    668     return rc;
    669 }
    670 
    671 int mm_app_close(mm_camera_test_obj_t *test_obj)
    672 {
    673     uint32_t rc = MM_CAMERA_OK;
    674 
    675     if (test_obj == NULL || test_obj->cam ==NULL) {
    676         CDBG_ERROR("%s: cam not opened", __func__);
    677         return -MM_CAMERA_E_GENERAL;
    678     }
    679 
    680     /* unmap capability buf */
    681     rc = test_obj->cam->ops->unmap_buf(test_obj->cam->camera_handle,
    682                                        CAM_MAPPING_BUF_TYPE_CAPABILITY);
    683     if (rc != MM_CAMERA_OK) {
    684         CDBG_ERROR("%s: unmap capability buf failed, rc=%d", __func__, rc);
    685     }
    686 
    687     /* unmap parm buf */
    688     rc = test_obj->cam->ops->unmap_buf(test_obj->cam->camera_handle,
    689                                        CAM_MAPPING_BUF_TYPE_PARM_BUF);
    690     if (rc != MM_CAMERA_OK) {
    691         CDBG_ERROR("%s: unmap setparm buf failed, rc=%d", __func__, rc);
    692     }
    693 
    694     rc = test_obj->cam->ops->close_camera(test_obj->cam->camera_handle);
    695     if (rc != MM_CAMERA_OK) {
    696         CDBG_ERROR("%s: close camera failed, rc=%d", __func__, rc);
    697     }
    698     test_obj->cam = NULL;
    699 
    700     /* close jpeg client */
    701     if (test_obj->jpeg_hdl && test_obj->jpeg_ops.close) {
    702         rc = test_obj->jpeg_ops.close(test_obj->jpeg_hdl);
    703         test_obj->jpeg_hdl = 0;
    704         if (rc != MM_CAMERA_OK) {
    705             CDBG_ERROR("%s: close jpeg failed, rc=%d", __func__, rc);
    706         }
    707     }
    708 
    709     /* dealloc capability buf */
    710     rc = mm_app_release_bufs(1, &test_obj->cap_buf);
    711     if (rc != MM_CAMERA_OK) {
    712         CDBG_ERROR("%s: release capability buf failed, rc=%d", __func__, rc);
    713     }
    714 
    715     /* dealloc parm buf */
    716     rc = mm_app_release_bufs(1, &test_obj->parm_buf);
    717     if (rc != MM_CAMERA_OK) {
    718         CDBG_ERROR("%s: release setparm buf failed, rc=%d", __func__, rc);
    719     }
    720 
    721     return MM_CAMERA_OK;
    722 }
    723 
    724 mm_camera_channel_t * mm_app_add_channel(mm_camera_test_obj_t *test_obj,
    725                                          mm_camera_channel_type_t ch_type,
    726                                          mm_camera_channel_attr_t *attr,
    727                                          mm_camera_buf_notify_t channel_cb,
    728                                          void *userdata)
    729 {
    730     uint32_t ch_id = 0;
    731     mm_camera_channel_t *channel = NULL;
    732 
    733     ch_id = test_obj->cam->ops->add_channel(test_obj->cam->camera_handle,
    734                                             attr,
    735                                             channel_cb,
    736                                             userdata);
    737     if (ch_id == 0) {
    738         CDBG_ERROR("%s: add channel failed", __func__);
    739         return NULL;
    740     }
    741     channel = &test_obj->channels[ch_type];
    742     channel->ch_id = ch_id;
    743     return channel;
    744 }
    745 
    746 int mm_app_del_channel(mm_camera_test_obj_t *test_obj,
    747                        mm_camera_channel_t *channel)
    748 {
    749     test_obj->cam->ops->delete_channel(test_obj->cam->camera_handle,
    750                                        channel->ch_id);
    751     memset(channel, 0, sizeof(mm_camera_channel_t));
    752     return MM_CAMERA_OK;
    753 }
    754 
    755 mm_camera_stream_t * mm_app_add_stream(mm_camera_test_obj_t *test_obj,
    756                                        mm_camera_channel_t *channel)
    757 {
    758     mm_camera_stream_t *stream = NULL;
    759     int rc = MM_CAMERA_OK;
    760     cam_frame_len_offset_t offset_info;
    761 
    762     stream = &(channel->streams[channel->num_streams++]);
    763     stream->s_id = test_obj->cam->ops->add_stream(test_obj->cam->camera_handle,
    764                                                   channel->ch_id);
    765     if (stream->s_id == 0) {
    766         CDBG_ERROR("%s: add stream failed", __func__);
    767         return NULL;
    768     }
    769 
    770     stream->multipleOf = test_obj->slice_size;
    771 
    772     /* alloc ion mem for stream_info buf */
    773     memset(&offset_info, 0, sizeof(offset_info));
    774     offset_info.frame_len = sizeof(cam_stream_info_t);
    775 
    776     rc = mm_app_alloc_bufs(&stream->s_info_buf,
    777                            &offset_info,
    778                            1,
    779                            0,
    780                            0);
    781     if (rc != MM_CAMERA_OK) {
    782         CDBG_ERROR("%s:alloc buf for stream_info error\n", __func__);
    783         test_obj->cam->ops->delete_stream(test_obj->cam->camera_handle,
    784                                           channel->ch_id,
    785                                           stream->s_id);
    786         stream->s_id = 0;
    787         return NULL;
    788     }
    789 
    790     /* mapping streaminfo buf */
    791     rc = test_obj->cam->ops->map_stream_buf(test_obj->cam->camera_handle,
    792                                             channel->ch_id,
    793                                             stream->s_id,
    794                                             CAM_MAPPING_BUF_TYPE_STREAM_INFO,
    795                                             0,
    796                                             -1,
    797                                             stream->s_info_buf.mem_info.fd,
    798                                             stream->s_info_buf.mem_info.size);
    799     if (rc != MM_CAMERA_OK) {
    800         CDBG_ERROR("%s:map setparm_buf error\n", __func__);
    801         mm_app_deallocate_ion_memory(&stream->s_info_buf);
    802         test_obj->cam->ops->delete_stream(test_obj->cam->camera_handle,
    803                                           channel->ch_id,
    804                                           stream->s_id);
    805         stream->s_id = 0;
    806         return NULL;
    807     }
    808 
    809     return stream;
    810 }
    811 
    812 int mm_app_del_stream(mm_camera_test_obj_t *test_obj,
    813                       mm_camera_channel_t *channel,
    814                       mm_camera_stream_t *stream)
    815 {
    816     test_obj->cam->ops->unmap_stream_buf(test_obj->cam->camera_handle,
    817                                          channel->ch_id,
    818                                          stream->s_id,
    819                                          CAM_MAPPING_BUF_TYPE_STREAM_INFO,
    820                                          0,
    821                                          -1);
    822     mm_app_deallocate_ion_memory(&stream->s_info_buf);
    823     test_obj->cam->ops->delete_stream(test_obj->cam->camera_handle,
    824                                       channel->ch_id,
    825                                       stream->s_id);
    826     memset(stream, 0, sizeof(mm_camera_stream_t));
    827     return MM_CAMERA_OK;
    828 }
    829 
    830 mm_camera_channel_t *mm_app_get_channel_by_type(mm_camera_test_obj_t *test_obj,
    831                                                 mm_camera_channel_type_t ch_type)
    832 {
    833     return &test_obj->channels[ch_type];
    834 }
    835 
    836 int mm_app_config_stream(mm_camera_test_obj_t *test_obj,
    837                          mm_camera_channel_t *channel,
    838                          mm_camera_stream_t *stream,
    839                          mm_camera_stream_config_t *config)
    840 {
    841     return test_obj->cam->ops->config_stream(test_obj->cam->camera_handle,
    842                                              channel->ch_id,
    843                                              stream->s_id,
    844                                              config);
    845 }
    846 
    847 int mm_app_start_channel(mm_camera_test_obj_t *test_obj,
    848                          mm_camera_channel_t *channel)
    849 {
    850     return test_obj->cam->ops->start_channel(test_obj->cam->camera_handle,
    851                                              channel->ch_id);
    852 }
    853 
    854 int mm_app_stop_channel(mm_camera_test_obj_t *test_obj,
    855                         mm_camera_channel_t *channel)
    856 {
    857     return test_obj->cam->ops->stop_channel(test_obj->cam->camera_handle,
    858                                             channel->ch_id);
    859 }
    860 
    861 int AddSetParmEntryToBatch(mm_camera_test_obj_t *test_obj,
    862                            cam_intf_parm_type_t paramType,
    863                            uint32_t paramLength,
    864                            void *paramValue)
    865 {
    866     parm_buffer_t *p_table = ( parm_buffer_t * ) test_obj->parm_buf.mem_info.data;
    867     void* dst;
    868     /*************************************************************************
    869     *                   Copy contents into entry                             *
    870     *************************************************************************/
    871 
    872     if (paramLength > get_size_of(paramType)) {
    873         ALOGE("%s:Size of input larger than max entry size",__func__);
    874         return MM_CAMERA_E_GENERAL;
    875     }
    876     dst = get_pointer_of(paramType,p_table);
    877     if(dst){
    878         memcpy(dst, paramValue, paramLength);
    879         p_table->is_valid[paramType] = 1;
    880     }
    881     return MM_CAMERA_OK;
    882 }
    883 
    884 int initBatchUpdate(mm_camera_test_obj_t *test_obj)
    885 {
    886     int32_t hal_version = CAM_HAL_V1;
    887 
    888     parm_buffer_t *parm_buf = ( parm_buffer_t * ) test_obj->parm_buf.mem_info.data;
    889     memset(parm_buf, 0, sizeof(parm_buffer_t));
    890     AddSetParmEntryToBatch(test_obj,
    891                            CAM_INTF_PARM_HAL_VERSION,
    892                            sizeof(hal_version),
    893                            &hal_version);
    894 
    895     return MM_CAMERA_OK;
    896 }
    897 
    898 int ReadSetParmEntryToBatch(mm_camera_test_obj_t *test_obj,
    899                            cam_intf_parm_type_t paramType,
    900                            uint32_t paramLength,
    901                            void *paramValue)
    902 {
    903     void* dst;
    904     parm_buffer_t *p_table = ( parm_buffer_t * ) test_obj->parm_buf.mem_info.data;
    905     dst = get_pointer_of(paramType,p_table);
    906     if (NULL == dst) {
    907         ALOGE("%s: dst is NULL for paramType: %d", __func__, paramType);
    908         return MM_CAMERA_E_GENERAL;
    909     }
    910     memcpy(paramValue, dst, paramLength);
    911     return MM_CAMERA_OK;
    912 }
    913 
    914 int commitSetBatch(mm_camera_test_obj_t *test_obj)
    915 {
    916     int rc = MM_CAMERA_OK;
    917     int i = 0;
    918 
    919     parm_buffer_t *p_table = ( parm_buffer_t * ) test_obj->parm_buf.mem_info.data;
    920     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
    921         if(p_table->is_valid[i])
    922             break;
    923     }
    924     if (i < CAM_INTF_PARM_MAX) {
    925         rc = test_obj->cam->ops->set_parms(test_obj->cam->camera_handle, p_table);
    926     }
    927     return rc;
    928 }
    929 
    930 
    931 int commitGetBatch(mm_camera_test_obj_t *test_obj)
    932 {
    933     int rc = MM_CAMERA_OK;
    934     int i = 0;
    935     parm_buffer_t *p_table = ( parm_buffer_t * ) test_obj->parm_buf.mem_info.data;
    936     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
    937         if(p_table->is_valid[i])
    938             break;
    939     }
    940     if (i < CAM_INTF_PARM_MAX) {
    941         rc = test_obj->cam->ops->get_parms(test_obj->cam->camera_handle, p_table);
    942     }
    943     return rc;
    944 }
    945 
    946 int setAecLock(mm_camera_test_obj_t *test_obj, int value)
    947 {
    948     int rc = MM_CAMERA_OK;
    949 
    950     rc = initBatchUpdate(test_obj);
    951     if (rc != MM_CAMERA_OK) {
    952         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
    953         goto ERROR;
    954     }
    955 
    956     rc = AddSetParmEntryToBatch(test_obj,
    957                                 CAM_INTF_PARM_AEC_LOCK,
    958                                 sizeof(value),
    959                                 &value);
    960     if (rc != MM_CAMERA_OK) {
    961         CDBG_ERROR("%s: AEC Lock parameter not added to batch\n", __func__);
    962         goto ERROR;
    963     }
    964 
    965     rc = commitSetBatch(test_obj);
    966     if (rc != MM_CAMERA_OK) {
    967         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
    968         goto ERROR;
    969     }
    970 
    971 ERROR:
    972     return rc;
    973 }
    974 
    975 int setAwbLock(mm_camera_test_obj_t *test_obj, int value)
    976 {
    977     int rc = MM_CAMERA_OK;
    978 
    979     rc = initBatchUpdate(test_obj);
    980     if (rc != MM_CAMERA_OK) {
    981         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
    982         goto ERROR;
    983     }
    984 
    985     rc = AddSetParmEntryToBatch(test_obj,
    986                                 CAM_INTF_PARM_AWB_LOCK,
    987                                 sizeof(value),
    988                                 &value);
    989     if (rc != MM_CAMERA_OK) {
    990         CDBG_ERROR("%s: AWB Lock parameter not added to batch\n", __func__);
    991         goto ERROR;
    992     }
    993 
    994     rc = commitSetBatch(test_obj);
    995     if (rc != MM_CAMERA_OK) {
    996         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
    997         goto ERROR;
    998     }
    999 
   1000 ERROR:
   1001     return rc;
   1002 }
   1003 
   1004 
   1005 int set3Acommand(mm_camera_test_obj_t *test_obj, cam_eztune_cmd_data_t *value)
   1006 {
   1007     int rc = MM_CAMERA_OK;
   1008 
   1009     rc = initBatchUpdate(test_obj);
   1010     if (rc != MM_CAMERA_OK) {
   1011         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1012         goto ERROR;
   1013     }
   1014 
   1015     rc = AddSetParmEntryToBatch(test_obj,
   1016                                 CAM_INTF_PARM_EZTUNE_CMD,
   1017                                 sizeof(cam_eztune_cmd_data_t),
   1018                                 value);
   1019     if (rc != MM_CAMERA_OK) {
   1020         CDBG_ERROR("%s: CAM_INTF_PARM_EZTUNE_CMD parameter not added to batch\n", __func__);
   1021         goto ERROR;
   1022     }
   1023 
   1024     rc = commitSetBatch(test_obj);
   1025     if (rc != MM_CAMERA_OK) {
   1026         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1027         goto ERROR;
   1028     }
   1029 
   1030 ERROR:
   1031     return rc;
   1032 }
   1033 
   1034 int getChromatix(mm_camera_test_obj_t *test_obj, tune_chromatix_t *value)
   1035 {
   1036     int rc = MM_CAMERA_OK;
   1037 
   1038     rc = initBatchUpdate(test_obj);
   1039     if (rc != MM_CAMERA_OK) {
   1040         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1041         goto ERROR;
   1042     }
   1043 
   1044     rc = AddSetParmEntryToBatch(test_obj,
   1045                                 CAM_INTF_PARM_GET_CHROMATIX,
   1046                                 sizeof(tune_chromatix_t),
   1047                                 value);
   1048     if (rc != MM_CAMERA_OK) {
   1049         CDBG_ERROR("%s: getChromatixPointer not added to batch\n", __func__);
   1050         goto ERROR;
   1051     }
   1052 
   1053     rc = commitGetBatch(test_obj);
   1054     if (rc != MM_CAMERA_OK) {
   1055         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1056         goto ERROR;
   1057     }
   1058 
   1059     rc = ReadSetParmEntryToBatch(test_obj,
   1060                                 CAM_INTF_PARM_GET_CHROMATIX,
   1061                                 sizeof(tune_chromatix_t),
   1062                                 value);
   1063     if (rc != MM_CAMERA_OK) {
   1064         CDBG_ERROR("%s: getChromatixPointer not able to read\n", __func__);
   1065         goto ERROR;
   1066     }
   1067 ERROR:
   1068     return rc;
   1069 }
   1070 
   1071 int setReloadChromatix(mm_camera_test_obj_t *test_obj, tune_chromatix_t *value)
   1072 {
   1073     int rc = MM_CAMERA_OK;
   1074 
   1075     rc = initBatchUpdate(test_obj);
   1076     if (rc != MM_CAMERA_OK) {
   1077         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1078         goto ERROR;
   1079     }
   1080 
   1081     rc = AddSetParmEntryToBatch(test_obj,
   1082                                 CAM_INTF_PARM_SET_RELOAD_CHROMATIX,
   1083                                 sizeof(tune_chromatix_t),
   1084                                 value);
   1085     if (rc != MM_CAMERA_OK) {
   1086         CDBG_ERROR("%s: getChromatixPointer not added to batch\n", __func__);
   1087         goto ERROR;
   1088     }
   1089 
   1090     rc = commitSetBatch(test_obj);
   1091     if (rc != MM_CAMERA_OK) {
   1092         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1093         goto ERROR;
   1094     }
   1095 ERROR:
   1096     return rc;
   1097 }
   1098 
   1099 int getAutofocusParams(mm_camera_test_obj_t *test_obj, tune_autofocus_t *value)
   1100 {
   1101     int rc = MM_CAMERA_OK;
   1102 
   1103     rc = initBatchUpdate(test_obj);
   1104     if (rc != MM_CAMERA_OK) {
   1105         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1106         goto ERROR;
   1107     }
   1108 
   1109     rc = AddSetParmEntryToBatch(test_obj,
   1110                                 CAM_INTF_PARM_GET_AFTUNE,
   1111                                 sizeof(tune_autofocus_t),
   1112                                 value);
   1113     if (rc != MM_CAMERA_OK) {
   1114         CDBG_ERROR("%s: getChromatixPointer not added to batch\n", __func__);
   1115         goto ERROR;
   1116     }
   1117 
   1118     rc = commitGetBatch(test_obj);
   1119     if (rc != MM_CAMERA_OK) {
   1120         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1121         goto ERROR;
   1122     }
   1123 
   1124     rc = ReadSetParmEntryToBatch(test_obj,
   1125                                 CAM_INTF_PARM_GET_AFTUNE,
   1126                                 sizeof(tune_autofocus_t),
   1127                                 value);
   1128     if (rc != MM_CAMERA_OK) {
   1129         CDBG_ERROR("%s: getAutofocusParams not able to read\n", __func__);
   1130         goto ERROR;
   1131     }
   1132 ERROR:
   1133     return rc;
   1134 }
   1135 
   1136 int setReloadAutofocusParams(mm_camera_test_obj_t *test_obj, tune_autofocus_t *value)
   1137 {
   1138     int rc = MM_CAMERA_OK;
   1139 
   1140     rc = initBatchUpdate(test_obj);
   1141     if (rc != MM_CAMERA_OK) {
   1142         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1143         goto ERROR;
   1144     }
   1145 
   1146     rc = AddSetParmEntryToBatch(test_obj,
   1147                                 CAM_INTF_PARM_SET_RELOAD_AFTUNE,
   1148                                 sizeof(tune_autofocus_t),
   1149                                 value);
   1150     if (rc != MM_CAMERA_OK) {
   1151         CDBG_ERROR("%s: setReloadAutofocusParams not added to batch\n", __func__);
   1152         goto ERROR;
   1153     }
   1154 
   1155     rc = commitSetBatch(test_obj);
   1156     if (rc != MM_CAMERA_OK) {
   1157         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1158         goto ERROR;
   1159     }
   1160 ERROR:
   1161     return rc;
   1162 }
   1163 
   1164 int setAutoFocusTuning(mm_camera_test_obj_t *test_obj, tune_actuator_t *value)
   1165 {
   1166     int rc = MM_CAMERA_OK;
   1167 
   1168     rc = initBatchUpdate(test_obj);
   1169     if (rc != MM_CAMERA_OK) {
   1170         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1171         goto ERROR;
   1172     }
   1173 
   1174     rc = AddSetParmEntryToBatch(test_obj,
   1175                                 CAM_INTF_PARM_SET_AUTOFOCUSTUNING,
   1176                                 sizeof(tune_actuator_t),
   1177                                 value);
   1178     if (rc != MM_CAMERA_OK) {
   1179         CDBG_ERROR("%s: AutoFocus Tuning not added to batch\n", __func__);
   1180         goto ERROR;
   1181     }
   1182 
   1183     rc = commitSetBatch(test_obj);
   1184     if (rc != MM_CAMERA_OK) {
   1185         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1186         goto ERROR;
   1187     }
   1188 
   1189 ERROR:
   1190     return rc;
   1191 }
   1192 
   1193 int setVfeCommand(mm_camera_test_obj_t *test_obj, tune_cmd_t *value)
   1194 {
   1195     int rc = MM_CAMERA_OK;
   1196 
   1197     rc = initBatchUpdate(test_obj);
   1198     if (rc != MM_CAMERA_OK) {
   1199         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1200         goto ERROR;
   1201     }
   1202 
   1203     rc = AddSetParmEntryToBatch(test_obj,
   1204                                 CAM_INTF_PARM_SET_VFE_COMMAND,
   1205                                 sizeof(tune_cmd_t),
   1206                                 value);
   1207     if (rc != MM_CAMERA_OK) {
   1208         CDBG_ERROR("%s: VFE Command not added to batch\n", __func__);
   1209         goto ERROR;
   1210     }
   1211 
   1212     rc = commitSetBatch(test_obj);
   1213     if (rc != MM_CAMERA_OK) {
   1214         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1215         goto ERROR;
   1216     }
   1217 
   1218 ERROR:
   1219     return rc;
   1220 }
   1221 
   1222 int setPPCommand(mm_camera_test_obj_t *test_obj, tune_cmd_t *value)
   1223 {
   1224     int rc = MM_CAMERA_OK;
   1225 
   1226     rc = initBatchUpdate(test_obj);
   1227     if (rc != MM_CAMERA_OK) {
   1228         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1229         goto ERROR;
   1230     }
   1231 
   1232     rc = AddSetParmEntryToBatch(test_obj,
   1233                                 CAM_INTF_PARM_SET_PP_COMMAND,
   1234                                 sizeof(tune_cmd_t),
   1235                                 value);
   1236     if (rc != MM_CAMERA_OK) {
   1237         CDBG_ERROR("%s: PP Command not added to batch\n", __func__);
   1238         goto ERROR;
   1239     }
   1240 
   1241     rc = commitSetBatch(test_obj);
   1242     if (rc != MM_CAMERA_OK) {
   1243         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1244         goto ERROR;
   1245     }
   1246 
   1247 ERROR:
   1248     return rc;
   1249 }
   1250 
   1251 int setFocusMode(mm_camera_test_obj_t *test_obj, cam_focus_mode_type mode)
   1252 {
   1253     int rc = MM_CAMERA_OK;
   1254 
   1255     rc = initBatchUpdate(test_obj);
   1256     if (rc != MM_CAMERA_OK) {
   1257         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1258         goto ERROR;
   1259     }
   1260 
   1261     uint32_t value = mode;
   1262 
   1263     rc = AddSetParmEntryToBatch(test_obj,
   1264                                 CAM_INTF_PARM_FOCUS_MODE,
   1265                                 sizeof(value),
   1266                                 &value);
   1267     if (rc != MM_CAMERA_OK) {
   1268         CDBG_ERROR("%s: Focus mode parameter not added to batch\n", __func__);
   1269         goto ERROR;
   1270     }
   1271 
   1272     rc = commitSetBatch(test_obj);
   1273     if (rc != MM_CAMERA_OK) {
   1274         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1275         goto ERROR;
   1276     }
   1277 
   1278 ERROR:
   1279     return rc;
   1280 }
   1281 
   1282 int setEVCompensation(mm_camera_test_obj_t *test_obj, int ev)
   1283 {
   1284     int rc = MM_CAMERA_OK;
   1285 
   1286     cam_capability_t *camera_cap = NULL;
   1287 
   1288     camera_cap = (cam_capability_t *) test_obj->cap_buf.mem_info.data;
   1289     if ( (ev >= camera_cap->exposure_compensation_min) &&
   1290          (ev <= camera_cap->exposure_compensation_max) ) {
   1291 
   1292         rc = initBatchUpdate(test_obj);
   1293         if (rc != MM_CAMERA_OK) {
   1294             CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1295             goto ERROR;
   1296         }
   1297 
   1298         uint32_t value = ev;
   1299 
   1300         rc = AddSetParmEntryToBatch(test_obj,
   1301                                     CAM_INTF_PARM_EXPOSURE_COMPENSATION,
   1302                                     sizeof(value),
   1303                                     &value);
   1304         if (rc != MM_CAMERA_OK) {
   1305             CDBG_ERROR("%s: EV compensation parameter not added to batch\n", __func__);
   1306             goto ERROR;
   1307         }
   1308 
   1309         rc = commitSetBatch(test_obj);
   1310         if (rc != MM_CAMERA_OK) {
   1311             CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1312             goto ERROR;
   1313         }
   1314 
   1315         CDBG_ERROR("%s: EV compensation set to: %d", __func__, value);
   1316     } else {
   1317         CDBG_ERROR("%s: Invalid EV compensation", __func__);
   1318         return -EINVAL;
   1319     }
   1320 
   1321 ERROR:
   1322     return rc;
   1323 }
   1324 
   1325 int setAntibanding(mm_camera_test_obj_t *test_obj, cam_antibanding_mode_type antibanding)
   1326 {
   1327     int rc = MM_CAMERA_OK;
   1328 
   1329     rc = initBatchUpdate(test_obj);
   1330     if (rc != MM_CAMERA_OK) {
   1331         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1332         goto ERROR;
   1333     }
   1334 
   1335     uint32_t value = antibanding;
   1336 
   1337     rc = AddSetParmEntryToBatch(test_obj,
   1338                                 CAM_INTF_PARM_ANTIBANDING,
   1339                                 sizeof(value),
   1340                                 &value);
   1341     if (rc != MM_CAMERA_OK) {
   1342         CDBG_ERROR("%s: Antibanding parameter not added to batch\n", __func__);
   1343         goto ERROR;
   1344     }
   1345 
   1346     rc = commitSetBatch(test_obj);
   1347     if (rc != MM_CAMERA_OK) {
   1348         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1349         goto ERROR;
   1350     }
   1351 
   1352     CDBG_ERROR("%s: Antibanding set to: %d", __func__, value);
   1353 
   1354 ERROR:
   1355     return rc;
   1356 }
   1357 
   1358 int setWhiteBalance(mm_camera_test_obj_t *test_obj, cam_wb_mode_type mode)
   1359 {
   1360     int rc = MM_CAMERA_OK;
   1361 
   1362     rc = initBatchUpdate(test_obj);
   1363     if (rc != MM_CAMERA_OK) {
   1364         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1365         goto ERROR;
   1366     }
   1367 
   1368     uint32_t value = mode;
   1369 
   1370     rc = AddSetParmEntryToBatch(test_obj,
   1371                                 CAM_INTF_PARM_WHITE_BALANCE,
   1372                                 sizeof(value),
   1373                                 &value);
   1374     if (rc != MM_CAMERA_OK) {
   1375         CDBG_ERROR("%s: White balance parameter not added to batch\n", __func__);
   1376         goto ERROR;
   1377     }
   1378 
   1379     rc = commitSetBatch(test_obj);
   1380     if (rc != MM_CAMERA_OK) {
   1381         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1382         goto ERROR;
   1383     }
   1384 
   1385     CDBG_ERROR("%s: White balance set to: %d", __func__, value);
   1386 
   1387 ERROR:
   1388     return rc;
   1389 }
   1390 
   1391 int setExposureMetering(mm_camera_test_obj_t *test_obj, cam_auto_exposure_mode_type mode)
   1392 {
   1393     int rc = MM_CAMERA_OK;
   1394 
   1395     rc = initBatchUpdate(test_obj);
   1396     if (rc != MM_CAMERA_OK) {
   1397         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1398         goto ERROR;
   1399     }
   1400 
   1401     uint32_t value = mode;
   1402 
   1403     rc = AddSetParmEntryToBatch(test_obj,
   1404                                 CAM_INTF_PARM_EXPOSURE,
   1405                                 sizeof(value),
   1406                                 &value);
   1407     if (rc != MM_CAMERA_OK) {
   1408         CDBG_ERROR("%s: Exposure metering parameter not added to batch\n", __func__);
   1409         goto ERROR;
   1410     }
   1411 
   1412     rc = commitSetBatch(test_obj);
   1413     if (rc != MM_CAMERA_OK) {
   1414         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1415         goto ERROR;
   1416     }
   1417 
   1418     CDBG_ERROR("%s: Exposure metering set to: %d", __func__, value);
   1419 
   1420 ERROR:
   1421     return rc;
   1422 }
   1423 
   1424 int setBrightness(mm_camera_test_obj_t *test_obj, int brightness)
   1425 {
   1426     int rc = MM_CAMERA_OK;
   1427 
   1428     rc = initBatchUpdate(test_obj);
   1429     if (rc != MM_CAMERA_OK) {
   1430         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1431         goto ERROR;
   1432     }
   1433 
   1434     int32_t value = brightness;
   1435 
   1436     rc = AddSetParmEntryToBatch(test_obj,
   1437                                 CAM_INTF_PARM_BRIGHTNESS,
   1438                                 sizeof(value),
   1439                                 &value);
   1440     if (rc != MM_CAMERA_OK) {
   1441         CDBG_ERROR("%s: Brightness parameter not added to batch\n", __func__);
   1442         goto ERROR;
   1443     }
   1444 
   1445     rc = commitSetBatch(test_obj);
   1446     if (rc != MM_CAMERA_OK) {
   1447         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1448         goto ERROR;
   1449     }
   1450 
   1451     CDBG_ERROR("%s: Brightness set to: %d", __func__, value);
   1452 
   1453 ERROR:
   1454     return rc;
   1455 }
   1456 
   1457 int setContrast(mm_camera_test_obj_t *test_obj, int contrast)
   1458 {
   1459     int rc = MM_CAMERA_OK;
   1460 
   1461     rc = initBatchUpdate(test_obj);
   1462     if (rc != MM_CAMERA_OK) {
   1463         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1464         goto ERROR;
   1465     }
   1466 
   1467     int32_t value = contrast;
   1468 
   1469     rc = AddSetParmEntryToBatch(test_obj,
   1470                                 CAM_INTF_PARM_CONTRAST,
   1471                                 sizeof(value),
   1472                                 &value);
   1473     if (rc != MM_CAMERA_OK) {
   1474         CDBG_ERROR("%s: Contrast parameter not added to batch\n", __func__);
   1475         goto ERROR;
   1476     }
   1477 
   1478     rc = commitSetBatch(test_obj);
   1479     if (rc != MM_CAMERA_OK) {
   1480         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1481         goto ERROR;
   1482     }
   1483 
   1484     CDBG_ERROR("%s: Contrast set to: %d", __func__, value);
   1485 
   1486 ERROR:
   1487     return rc;
   1488 }
   1489 
   1490 int setTintless(mm_camera_test_obj_t *test_obj, int tintless)
   1491 {
   1492     int rc = MM_CAMERA_OK;
   1493 
   1494     rc = initBatchUpdate(test_obj);
   1495     if (rc != MM_CAMERA_OK) {
   1496         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1497         goto ERROR;
   1498     }
   1499 
   1500     int32_t value = tintless;
   1501 
   1502     rc = AddSetParmEntryToBatch(test_obj,
   1503                                 CAM_INTF_PARM_TINTLESS,
   1504                                 sizeof(value),
   1505                                 &value);
   1506     if (rc != MM_CAMERA_OK) {
   1507         CDBG_ERROR("%s: Contrast parameter not added to batch\n", __func__);
   1508         goto ERROR;
   1509     }
   1510 
   1511     rc = commitSetBatch(test_obj);
   1512     if (rc != MM_CAMERA_OK) {
   1513         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1514         goto ERROR;
   1515     }
   1516 
   1517     CDBG_ERROR("%s:  set Tintless to: %d", __func__, value);
   1518 
   1519 ERROR:
   1520     return rc;
   1521 }
   1522 
   1523 int setSaturation(mm_camera_test_obj_t *test_obj, int saturation)
   1524 {
   1525     int rc = MM_CAMERA_OK;
   1526 
   1527     rc = initBatchUpdate(test_obj);
   1528     if (rc != MM_CAMERA_OK) {
   1529         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1530         goto ERROR;
   1531     }
   1532 
   1533     int32_t value = saturation;
   1534 
   1535     rc = AddSetParmEntryToBatch(test_obj,
   1536                                 CAM_INTF_PARM_SATURATION,
   1537                                 sizeof(value),
   1538                                 &value);
   1539     if (rc != MM_CAMERA_OK) {
   1540         CDBG_ERROR("%s: Saturation parameter not added to batch\n", __func__);
   1541         goto ERROR;
   1542     }
   1543 
   1544     rc = commitSetBatch(test_obj);
   1545     if (rc != MM_CAMERA_OK) {
   1546         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1547         goto ERROR;
   1548     }
   1549 
   1550     CDBG_ERROR("%s: Saturation set to: %d", __func__, value);
   1551 
   1552 ERROR:
   1553     return rc;
   1554 }
   1555 
   1556 int setSharpness(mm_camera_test_obj_t *test_obj, int sharpness)
   1557 {
   1558     int rc = MM_CAMERA_OK;
   1559 
   1560     rc = initBatchUpdate(test_obj);
   1561     if (rc != MM_CAMERA_OK) {
   1562         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1563         goto ERROR;
   1564     }
   1565 
   1566     int32_t value = sharpness;
   1567 
   1568     rc = AddSetParmEntryToBatch(test_obj,
   1569                                 CAM_INTF_PARM_SHARPNESS,
   1570                                 sizeof(value),
   1571                                 &value);
   1572     if (rc != MM_CAMERA_OK) {
   1573         CDBG_ERROR("%s: Sharpness parameter not added to batch\n", __func__);
   1574         goto ERROR;
   1575     }
   1576 
   1577     rc = commitSetBatch(test_obj);
   1578     if (rc != MM_CAMERA_OK) {
   1579         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1580         goto ERROR;
   1581     }
   1582 
   1583     test_obj->reproc_sharpness = sharpness;
   1584     CDBG_ERROR("%s: Sharpness set to: %d", __func__, value);
   1585 
   1586 ERROR:
   1587     return rc;
   1588 }
   1589 
   1590 int setISO(mm_camera_test_obj_t *test_obj, cam_iso_mode_type iso)
   1591 {
   1592     int rc = MM_CAMERA_OK;
   1593 
   1594     rc = initBatchUpdate(test_obj);
   1595     if (rc != MM_CAMERA_OK) {
   1596         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1597         goto ERROR;
   1598     }
   1599 
   1600     int32_t value = iso;
   1601 
   1602     rc = AddSetParmEntryToBatch(test_obj,
   1603                                 CAM_INTF_PARM_ISO,
   1604                                 sizeof(value),
   1605                                 &value);
   1606     if (rc != MM_CAMERA_OK) {
   1607         CDBG_ERROR("%s: ISO parameter not added to batch\n", __func__);
   1608         goto ERROR;
   1609     }
   1610 
   1611     rc = commitSetBatch(test_obj);
   1612     if (rc != MM_CAMERA_OK) {
   1613         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1614         goto ERROR;
   1615     }
   1616 
   1617     CDBG_ERROR("%s: ISO set to: %d", __func__, value);
   1618 
   1619 ERROR:
   1620     return rc;
   1621 }
   1622 
   1623 int setZoom(mm_camera_test_obj_t *test_obj, int zoom)
   1624 {
   1625     int rc = MM_CAMERA_OK;
   1626 
   1627     rc = initBatchUpdate(test_obj);
   1628     if (rc != MM_CAMERA_OK) {
   1629         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1630         goto ERROR;
   1631     }
   1632 
   1633     int32_t value = zoom;
   1634 
   1635     rc = AddSetParmEntryToBatch(test_obj,
   1636                                 CAM_INTF_PARM_ZOOM,
   1637                                 sizeof(value),
   1638                                 &value);
   1639     if (rc != MM_CAMERA_OK) {
   1640         CDBG_ERROR("%s: Zoom parameter not added to batch\n", __func__);
   1641         goto ERROR;
   1642     }
   1643 
   1644     rc = commitSetBatch(test_obj);
   1645     if (rc != MM_CAMERA_OK) {
   1646         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1647         goto ERROR;
   1648     }
   1649 
   1650     CDBG_ERROR("%s: Zoom set to: %d", __func__, value);
   1651 
   1652 ERROR:
   1653     return rc;
   1654 }
   1655 
   1656 int setFPSRange(mm_camera_test_obj_t *test_obj, cam_fps_range_t range)
   1657 {
   1658     int rc = MM_CAMERA_OK;
   1659 
   1660     rc = initBatchUpdate(test_obj);
   1661     if (rc != MM_CAMERA_OK) {
   1662         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1663         goto ERROR;
   1664     }
   1665 
   1666     rc = AddSetParmEntryToBatch(test_obj,
   1667                                 CAM_INTF_PARM_FPS_RANGE,
   1668                                 sizeof(cam_fps_range_t),
   1669                                 &range);
   1670     if (rc != MM_CAMERA_OK) {
   1671         CDBG_ERROR("%s: FPS range parameter not added to batch\n", __func__);
   1672         goto ERROR;
   1673     }
   1674 
   1675     rc = commitSetBatch(test_obj);
   1676     if (rc != MM_CAMERA_OK) {
   1677         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1678         goto ERROR;
   1679     }
   1680 
   1681     CDBG_ERROR("%s: FPS Range set to: [%5.2f:%5.2f]",
   1682                 __func__,
   1683                 range.min_fps,
   1684                 range.max_fps);
   1685 
   1686 ERROR:
   1687     return rc;
   1688 }
   1689 
   1690 int setScene(mm_camera_test_obj_t *test_obj, cam_scene_mode_type scene)
   1691 {
   1692     int rc = MM_CAMERA_OK;
   1693 
   1694     rc = initBatchUpdate(test_obj);
   1695     if (rc != MM_CAMERA_OK) {
   1696         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1697         goto ERROR;
   1698     }
   1699 
   1700     int32_t value = scene;
   1701 
   1702     rc = AddSetParmEntryToBatch(test_obj,
   1703                                 CAM_INTF_PARM_BESTSHOT_MODE,
   1704                                 sizeof(value),
   1705                                 &value);
   1706     if (rc != MM_CAMERA_OK) {
   1707         CDBG_ERROR("%s: Scene parameter not added to batch\n", __func__);
   1708         goto ERROR;
   1709     }
   1710 
   1711     rc = commitSetBatch(test_obj);
   1712     if (rc != MM_CAMERA_OK) {
   1713         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1714         goto ERROR;
   1715     }
   1716 
   1717     CDBG_ERROR("%s: Scene set to: %d", __func__, value);
   1718 
   1719 ERROR:
   1720     return rc;
   1721 }
   1722 
   1723 int setFlash(mm_camera_test_obj_t *test_obj, cam_flash_mode_t flash)
   1724 {
   1725     int rc = MM_CAMERA_OK;
   1726 
   1727     rc = initBatchUpdate(test_obj);
   1728     if (rc != MM_CAMERA_OK) {
   1729         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1730         goto ERROR;
   1731     }
   1732 
   1733     int32_t value = flash;
   1734 
   1735     rc = AddSetParmEntryToBatch(test_obj,
   1736                                 CAM_INTF_PARM_LED_MODE,
   1737                                 sizeof(value),
   1738                                 &value);
   1739     if (rc != MM_CAMERA_OK) {
   1740         CDBG_ERROR("%s: Flash parameter not added to batch\n", __func__);
   1741         goto ERROR;
   1742     }
   1743 
   1744     rc = commitSetBatch(test_obj);
   1745     if (rc != MM_CAMERA_OK) {
   1746         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1747         goto ERROR;
   1748     }
   1749 
   1750     CDBG_ERROR("%s: Flash set to: %d", __func__, value);
   1751 
   1752 ERROR:
   1753     return rc;
   1754 }
   1755 
   1756 int setWNR(mm_camera_test_obj_t *test_obj, int enable)
   1757 {
   1758     int rc = MM_CAMERA_OK;
   1759 
   1760     rc = initBatchUpdate(test_obj);
   1761     if (rc != MM_CAMERA_OK) {
   1762         CDBG_ERROR("%s: Batch camera parameter update failed\n", __func__);
   1763         goto ERROR;
   1764     }
   1765 
   1766     cam_denoise_param_t param;
   1767     memset(&param, 0, sizeof(cam_denoise_param_t));
   1768     param.denoise_enable = enable;
   1769     param.process_plates = CAM_WAVELET_DENOISE_YCBCR_PLANE;
   1770 
   1771     rc = AddSetParmEntryToBatch(test_obj,
   1772                                 CAM_INTF_PARM_WAVELET_DENOISE,
   1773                                 sizeof(cam_denoise_param_t),
   1774                                 &param);
   1775     if (rc != MM_CAMERA_OK) {
   1776         CDBG_ERROR("%s: WNR enabled parameter not added to batch\n", __func__);
   1777         goto ERROR;
   1778     }
   1779 
   1780     rc = commitSetBatch(test_obj);
   1781     if (rc != MM_CAMERA_OK) {
   1782         CDBG_ERROR("%s: Batch parameters commit failed\n", __func__);
   1783         goto ERROR;
   1784     }
   1785 
   1786 
   1787     test_obj->reproc_wnr = param;
   1788     CDBG_ERROR("%s: WNR enabled: %d", __func__, enable);
   1789 
   1790 ERROR:
   1791     return rc;
   1792 }
   1793 
   1794 
   1795 /** tuneserver_capture
   1796  *    @lib_handle: the camera handle object
   1797  *    @dim: snapshot dimensions
   1798  *
   1799  *  makes JPEG capture
   1800  *
   1801  *  Return: >=0 on success, -1 on failure.
   1802  **/
   1803 int tuneserver_capture(mm_camera_lib_handle *lib_handle,
   1804                        mm_camera_lib_snapshot_params *dim)
   1805 {
   1806     int rc = 0;
   1807 
   1808     printf("Take jpeg snapshot\n");
   1809     if ( lib_handle->stream_running ) {
   1810 
   1811         if ( lib_handle->test_obj.zsl_enabled) {
   1812             if ( NULL != dim) {
   1813                 if ( ( lib_handle->test_obj.buffer_width != dim->width) ||
   1814                      ( lib_handle->test_obj.buffer_height = dim->height ) ) {
   1815 
   1816                     lib_handle->test_obj.buffer_width = dim->width;
   1817                     lib_handle->test_obj.buffer_height = dim->height;
   1818 
   1819                     rc = mm_camera_lib_stop_stream(lib_handle);
   1820                     if (rc != MM_CAMERA_OK) {
   1821                         CDBG_ERROR("%s: mm_camera_lib_stop_stream() err=%d\n",
   1822                                    __func__, rc);
   1823                         goto EXIT;
   1824                     }
   1825 
   1826                     rc = mm_camera_lib_start_stream(lib_handle);
   1827                     if (rc != MM_CAMERA_OK) {
   1828                         CDBG_ERROR("%s: mm_camera_lib_start_stream() err=%d\n",
   1829                                    __func__, rc);
   1830                         goto EXIT;
   1831                     }
   1832                 }
   1833 
   1834             }
   1835 
   1836             lib_handle->test_obj.encodeJpeg = 1;
   1837 
   1838             mm_camera_app_wait();
   1839         } else {
   1840             // For standard 2D capture streaming has to be disabled first
   1841             rc = mm_camera_lib_stop_stream(lib_handle);
   1842             if (rc != MM_CAMERA_OK) {
   1843                 CDBG_ERROR("%s: mm_camera_lib_stop_stream() err=%d\n",
   1844                          __func__, rc);
   1845                 goto EXIT;
   1846             }
   1847 
   1848             if ( NULL != dim ) {
   1849                 lib_handle->test_obj.buffer_width = dim->width;
   1850                 lib_handle->test_obj.buffer_height = dim->height;
   1851             }
   1852             rc = mm_app_start_capture(&lib_handle->test_obj, 1);
   1853             if (rc != MM_CAMERA_OK) {
   1854                 CDBG_ERROR("%s: mm_app_start_capture() err=%d\n",
   1855                          __func__, rc);
   1856                 goto EXIT;
   1857             }
   1858 
   1859             mm_camera_app_wait();
   1860 
   1861             rc = mm_app_stop_capture(&lib_handle->test_obj);
   1862             if (rc != MM_CAMERA_OK) {
   1863                 CDBG_ERROR("%s: mm_app_stop_capture() err=%d\n",
   1864                          __func__, rc);
   1865                 goto EXIT;
   1866             }
   1867 
   1868             // Restart streaming after capture is done
   1869             rc = mm_camera_lib_start_stream(lib_handle);
   1870             if (rc != MM_CAMERA_OK) {
   1871                 CDBG_ERROR("%s: mm_camera_lib_start_stream() err=%d\n",
   1872                          __func__, rc);
   1873                 goto EXIT;
   1874             }
   1875         }
   1876     }
   1877 
   1878 EXIT:
   1879 
   1880     return rc;
   1881 }
   1882 
   1883 int mm_app_start_regression_test(int run_tc)
   1884 {
   1885     int rc = MM_CAMERA_OK;
   1886     mm_camera_app_t my_cam_app;
   1887 
   1888     CDBG("\nCamera Test Application\n");
   1889     memset(&my_cam_app, 0, sizeof(mm_camera_app_t));
   1890 
   1891     rc = mm_app_load_hal(&my_cam_app);
   1892     if (rc != MM_CAMERA_OK) {
   1893         CDBG_ERROR("%s: mm_app_load_hal failed !!", __func__);
   1894         return rc;
   1895     }
   1896 
   1897     if(run_tc) {
   1898         rc = mm_app_unit_test_entry(&my_cam_app);
   1899         return rc;
   1900     }
   1901 #if 0
   1902     if(run_dual_tc) {
   1903         printf("\tRunning Dual camera test engine only\n");
   1904         rc = mm_app_dual_test_entry(&my_cam_app);
   1905         printf("\t Dual camera engine. EXIT(%d)!!!\n", rc);
   1906         exit(rc);
   1907     }
   1908 #endif
   1909     return rc;
   1910 }
   1911 
   1912 int32_t mm_camera_load_tuninglibrary(mm_camera_tuning_lib_params_t *tuning_param)
   1913 {
   1914   void *(*tuning_open_lib)(void) = NULL;
   1915 
   1916   CDBG("%s  %d\n", __func__, __LINE__);
   1917   tuning_param->lib_handle = dlopen("libmmcamera_tuning.so", RTLD_NOW);
   1918   if (!tuning_param->lib_handle) {
   1919     CDBG_ERROR("%s Failed opening libmmcamera_tuning.so\n", __func__);
   1920     return -EINVAL;
   1921   }
   1922 
   1923   *(void **)&tuning_open_lib  = dlsym(tuning_param->lib_handle,
   1924     "open_tuning_lib");
   1925   if (!tuning_open_lib) {
   1926     CDBG_ERROR("%s Failed symbol libmmcamera_tuning.so\n", __func__);
   1927     return -EINVAL;
   1928   }
   1929 
   1930   if (tuning_param->func_tbl) {
   1931     CDBG_ERROR("%s already loaded tuninglib..", __func__);
   1932     return 0;
   1933   }
   1934 
   1935   tuning_param->func_tbl = (mm_camera_tune_func_t *)tuning_open_lib();
   1936   if (!tuning_param->func_tbl) {
   1937     CDBG_ERROR("%s Failed opening library func table ptr\n", __func__);
   1938     return -EINVAL;
   1939   }
   1940 
   1941   CDBG("%s  %d\n", __func__, __LINE__);
   1942   return 0;
   1943 }
   1944 
   1945 int mm_camera_lib_open(mm_camera_lib_handle *handle, int cam_id)
   1946 {
   1947     int rc = MM_CAMERA_OK;
   1948 
   1949     if ( NULL == handle ) {
   1950         CDBG_ERROR(" %s : Invalid handle", __func__);
   1951         rc = MM_CAMERA_E_INVALID_INPUT;
   1952         goto EXIT;
   1953     }
   1954 
   1955     memset(handle, 0, sizeof(mm_camera_lib_handle));
   1956     rc = mm_app_load_hal(&handle->app_ctx);
   1957     if( MM_CAMERA_OK != rc ) {
   1958         CDBG_ERROR("%s:mm_app_init err\n", __func__);
   1959         goto EXIT;
   1960     }
   1961 
   1962     handle->test_obj.buffer_width = DEFAULT_PREVIEW_WIDTH;
   1963     handle->test_obj.buffer_height = DEFAULT_PREVIEW_HEIGHT;
   1964     handle->test_obj.buffer_format = DEFAULT_SNAPSHOT_FORMAT;
   1965     handle->current_params.stream_width = DEFAULT_SNAPSHOT_WIDTH;
   1966     handle->current_params.stream_height = DEFAULT_SNAPSHOT_HEIGHT;
   1967     handle->current_params.af_mode = CAM_FOCUS_MODE_AUTO; // Default to auto focus mode
   1968     rc = mm_app_open(&handle->app_ctx, cam_id, &handle->test_obj);
   1969     if (rc != MM_CAMERA_OK) {
   1970         CDBG_ERROR("%s:mm_app_open() cam_idx=%d, err=%d\n",
   1971                    __func__, cam_id, rc);
   1972         goto EXIT;
   1973     }
   1974 
   1975     //rc = mm_app_initialize_fb(&handle->test_obj);
   1976     rc = MM_CAMERA_OK;
   1977     if (rc != MM_CAMERA_OK) {
   1978         CDBG_ERROR("%s: mm_app_initialize_fb() cam_idx=%d, err=%d\n",
   1979                    __func__, cam_id, rc);
   1980         goto EXIT;
   1981     }
   1982 
   1983 EXIT:
   1984 
   1985     return rc;
   1986 }
   1987 
   1988 int mm_camera_lib_start_stream(mm_camera_lib_handle *handle)
   1989 {
   1990     int rc = MM_CAMERA_OK;
   1991     cam_capability_t camera_cap;
   1992 
   1993     if ( NULL == handle ) {
   1994         CDBG_ERROR(" %s : Invalid handle", __func__);
   1995         rc = MM_CAMERA_E_INVALID_INPUT;
   1996         goto EXIT;
   1997     }
   1998 
   1999     if ( handle->test_obj.zsl_enabled ) {
   2000         rc = mm_app_start_preview_zsl(&handle->test_obj);
   2001         if (rc != MM_CAMERA_OK) {
   2002             CDBG_ERROR("%s: mm_app_start_preview_zsl() err=%d\n",
   2003                        __func__, rc);
   2004             goto EXIT;
   2005         }
   2006     } else {
   2007         handle->test_obj.enable_reproc = ENABLE_REPROCESSING;
   2008         rc = mm_app_start_preview(&handle->test_obj);
   2009         if (rc != MM_CAMERA_OK) {
   2010             CDBG_ERROR("%s: mm_app_start_preview() err=%d\n",
   2011                        __func__, rc);
   2012             goto EXIT;
   2013         }
   2014     }
   2015 
   2016     // Configure focus mode after stream starts
   2017     rc = mm_camera_lib_get_caps(handle, &camera_cap);
   2018     if ( MM_CAMERA_OK != rc ) {
   2019       CDBG_ERROR("%s:mm_camera_lib_get_caps() err=%d\n", __func__, rc);
   2020       return -1;
   2021     }
   2022     if (camera_cap.supported_focus_modes_cnt == 1 &&
   2023       camera_cap.supported_focus_modes[0] == CAM_FOCUS_MODE_FIXED) {
   2024       CDBG("focus not supported");
   2025       handle->test_obj.focus_supported = 0;
   2026       handle->current_params.af_mode = CAM_FOCUS_MODE_FIXED;
   2027     } else {
   2028       handle->test_obj.focus_supported = 1;
   2029     }
   2030     rc = setFocusMode(&handle->test_obj, handle->current_params.af_mode);
   2031     if (rc != MM_CAMERA_OK) {
   2032       CDBG_ERROR("%s:autofocus error\n", __func__);
   2033       goto EXIT;
   2034     }
   2035     handle->stream_running = 1;
   2036 
   2037 EXIT:
   2038     return rc;
   2039 }
   2040 
   2041 int mm_camera_lib_stop_stream(mm_camera_lib_handle *handle)
   2042 {
   2043     int rc = MM_CAMERA_OK;
   2044 
   2045     if ( NULL == handle ) {
   2046         CDBG_ERROR(" %s : Invalid handle", __func__);
   2047         rc = MM_CAMERA_E_INVALID_INPUT;
   2048         goto EXIT;
   2049     }
   2050 
   2051     if ( handle->test_obj.zsl_enabled ) {
   2052         rc = mm_app_stop_preview_zsl(&handle->test_obj);
   2053         if (rc != MM_CAMERA_OK) {
   2054             CDBG_ERROR("%s: mm_app_stop_preview_zsl() err=%d\n",
   2055                        __func__, rc);
   2056             goto EXIT;
   2057         }
   2058     } else {
   2059         rc = mm_app_stop_preview(&handle->test_obj);
   2060         if (rc != MM_CAMERA_OK) {
   2061             CDBG_ERROR("%s: mm_app_stop_preview() err=%d\n",
   2062                        __func__, rc);
   2063             goto EXIT;
   2064         }
   2065     }
   2066 
   2067     handle->stream_running = 0;
   2068 
   2069 EXIT:
   2070     return rc;
   2071 }
   2072 
   2073 int mm_camera_lib_get_caps(mm_camera_lib_handle *handle,
   2074                            cam_capability_t *caps)
   2075 {
   2076     int rc = MM_CAMERA_OK;
   2077 
   2078     if ( NULL == handle ) {
   2079         CDBG_ERROR(" %s : Invalid handle", __func__);
   2080         rc = MM_CAMERA_E_INVALID_INPUT;
   2081         goto EXIT;
   2082     }
   2083 
   2084     if ( NULL == caps ) {
   2085         CDBG_ERROR(" %s : Invalid capabilities structure", __func__);
   2086         rc = MM_CAMERA_E_INVALID_INPUT;
   2087         goto EXIT;
   2088     }
   2089 
   2090     *caps = *( (cam_capability_t *) handle->test_obj.cap_buf.mem_info.data );
   2091 
   2092 EXIT:
   2093 
   2094     return rc;
   2095 }
   2096 
   2097 
   2098 int mm_camera_lib_send_command(mm_camera_lib_handle *handle,
   2099                                mm_camera_lib_commands cmd,
   2100                                void *in_data, void *out_data)
   2101 {
   2102     int width, height;
   2103     int rc = MM_CAMERA_OK;
   2104     cam_capability_t *camera_cap = NULL;
   2105     mm_camera_lib_snapshot_params *dim = NULL;
   2106 
   2107     if ( NULL == handle ) {
   2108         CDBG_ERROR(" %s : Invalid handle", __func__);
   2109         rc = MM_CAMERA_E_INVALID_INPUT;
   2110         goto EXIT;
   2111     }
   2112 
   2113     camera_cap = (cam_capability_t *) handle->test_obj.cap_buf.mem_info.data;
   2114 
   2115     switch(cmd) {
   2116         case MM_CAMERA_LIB_FPS_RANGE:
   2117             if ( NULL != in_data ) {
   2118                 cam_fps_range_t range = *(( cam_fps_range_t * )in_data);
   2119                 rc = setFPSRange(&handle->test_obj, range);
   2120                 if (rc != MM_CAMERA_OK) {
   2121                         CDBG_ERROR("%s: setFPSRange() err=%d\n",
   2122                                    __func__, rc);
   2123                         goto EXIT;
   2124                 }
   2125             }
   2126             break;
   2127         case MM_CAMERA_LIB_FLASH:
   2128             if ( NULL != in_data ) {
   2129                 cam_flash_mode_t flash = *(( int * )in_data);
   2130                 rc = setFlash(&handle->test_obj, flash);
   2131                 if (rc != MM_CAMERA_OK) {
   2132                         CDBG_ERROR("%s: setFlash() err=%d\n",
   2133                                    __func__, rc);
   2134                         goto EXIT;
   2135                 }
   2136             }
   2137             break;
   2138         case MM_CAMERA_LIB_BESTSHOT:
   2139             if ( NULL != in_data ) {
   2140                 cam_scene_mode_type scene = *(( int * )in_data);
   2141                 rc = setScene(&handle->test_obj, scene);
   2142                 if (rc != MM_CAMERA_OK) {
   2143                         CDBG_ERROR("%s: setScene() err=%d\n",
   2144                                    __func__, rc);
   2145                         goto EXIT;
   2146                 }
   2147             }
   2148             break;
   2149         case MM_CAMERA_LIB_ZOOM:
   2150             if ( NULL != in_data ) {
   2151                 int zoom = *(( int * )in_data);
   2152                 rc = setZoom(&handle->test_obj, zoom);
   2153                 if (rc != MM_CAMERA_OK) {
   2154                         CDBG_ERROR("%s: setZoom() err=%d\n",
   2155                                    __func__, rc);
   2156                         goto EXIT;
   2157                 }
   2158             }
   2159             break;
   2160         case MM_CAMERA_LIB_ISO:
   2161             if ( NULL != in_data ) {
   2162                 cam_iso_mode_type iso = *(( int * )in_data);
   2163                 rc = setISO(&handle->test_obj, iso);
   2164                 if (rc != MM_CAMERA_OK) {
   2165                         CDBG_ERROR("%s: setISO() err=%d\n",
   2166                                    __func__, rc);
   2167                         goto EXIT;
   2168                 }
   2169             }
   2170             break;
   2171         case MM_CAMERA_LIB_SHARPNESS:
   2172             if ( NULL != in_data ) {
   2173                 int sharpness = *(( int * )in_data);
   2174                 rc = setSharpness(&handle->test_obj, sharpness);
   2175                 if (rc != MM_CAMERA_OK) {
   2176                         CDBG_ERROR("%s: setSharpness() err=%d\n",
   2177                                    __func__, rc);
   2178                         goto EXIT;
   2179                 }
   2180             }
   2181             break;
   2182         case MM_CAMERA_LIB_SATURATION:
   2183             if ( NULL != in_data ) {
   2184                 int saturation = *(( int * )in_data);
   2185                 rc = setSaturation(&handle->test_obj, saturation);
   2186                 if (rc != MM_CAMERA_OK) {
   2187                         CDBG_ERROR("%s: setSaturation() err=%d\n",
   2188                                    __func__, rc);
   2189                         goto EXIT;
   2190                 }
   2191             }
   2192             break;
   2193         case MM_CAMERA_LIB_CONTRAST:
   2194             if ( NULL != in_data ) {
   2195                 int contrast = *(( int * )in_data);
   2196                 rc = setContrast(&handle->test_obj, contrast);
   2197                 if (rc != MM_CAMERA_OK) {
   2198                         CDBG_ERROR("%s: setContrast() err=%d\n",
   2199                                    __func__, rc);
   2200                         goto EXIT;
   2201                 }
   2202             }
   2203             break;
   2204         case MM_CAMERA_LIB_SET_TINTLESS:
   2205             if ( NULL != in_data ) {
   2206                 int tintless = *(( int * )in_data);
   2207                 rc = setTintless(&handle->test_obj, tintless);
   2208                 if (rc != MM_CAMERA_OK) {
   2209                         CDBG_ERROR("%s: enlabe/disable:%d tintless() err=%d\n",
   2210                                    __func__, tintless, rc);
   2211                         goto EXIT;
   2212                 }
   2213             }
   2214             break;
   2215         case MM_CAMERA_LIB_BRIGHTNESS:
   2216             if ( NULL != in_data ) {
   2217                 int brightness = *(( int * )in_data);
   2218                 rc = setBrightness(&handle->test_obj, brightness);
   2219                 if (rc != MM_CAMERA_OK) {
   2220                         CDBG_ERROR("%s: setBrightness() err=%d\n",
   2221                                    __func__, rc);
   2222                         goto EXIT;
   2223                 }
   2224             }
   2225             break;
   2226         case MM_CAMERA_LIB_EXPOSURE_METERING:
   2227             if ( NULL != in_data ) {
   2228                 cam_auto_exposure_mode_type exp = *(( int * )in_data);
   2229                 rc = setExposureMetering(&handle->test_obj, exp);
   2230                 if (rc != MM_CAMERA_OK) {
   2231                         CDBG_ERROR("%s: setExposureMetering() err=%d\n",
   2232                                    __func__, rc);
   2233                         goto EXIT;
   2234                 }
   2235             }
   2236             break;
   2237         case MM_CAMERA_LIB_WB:
   2238             if ( NULL != in_data ) {
   2239                 cam_wb_mode_type wb = *(( int * )in_data);
   2240                 rc = setWhiteBalance(&handle->test_obj, wb);
   2241                 if (rc != MM_CAMERA_OK) {
   2242                         CDBG_ERROR("%s: setWhiteBalance() err=%d\n",
   2243                                    __func__, rc);
   2244                         goto EXIT;
   2245                 }
   2246             }
   2247             break;
   2248         case MM_CAMERA_LIB_ANTIBANDING:
   2249             if ( NULL != in_data ) {
   2250                 int antibanding = *(( int * )in_data);
   2251                 rc = setAntibanding(&handle->test_obj, antibanding);
   2252                 if (rc != MM_CAMERA_OK) {
   2253                         CDBG_ERROR("%s: setAntibanding() err=%d\n",
   2254                                    __func__, rc);
   2255                         goto EXIT;
   2256                 }
   2257             }
   2258             break;
   2259         case MM_CAMERA_LIB_EV:
   2260             if ( NULL != in_data ) {
   2261                 int ev = *(( int * )in_data);
   2262                 rc = setEVCompensation(&handle->test_obj, ev);
   2263                 if (rc != MM_CAMERA_OK) {
   2264                         CDBG_ERROR("%s: setEVCompensation() err=%d\n",
   2265                                    __func__, rc);
   2266                         goto EXIT;
   2267                 }
   2268             }
   2269             break;
   2270         case MM_CAMERA_LIB_ZSL_ENABLE:
   2271             if ( NULL != in_data) {
   2272                 int enable_zsl = *(( int * )in_data);
   2273                 if ( ( enable_zsl != handle->test_obj.zsl_enabled ) &&
   2274                         handle->stream_running ) {
   2275                     rc = mm_camera_lib_stop_stream(handle);
   2276                     if (rc != MM_CAMERA_OK) {
   2277                         CDBG_ERROR("%s: mm_camera_lib_stop_stream() err=%d\n",
   2278                                    __func__, rc);
   2279                         goto EXIT;
   2280                     }
   2281                     handle->test_obj.zsl_enabled = enable_zsl;
   2282                     rc = mm_camera_lib_start_stream(handle);
   2283                     if (rc != MM_CAMERA_OK) {
   2284                         CDBG_ERROR("%s: mm_camera_lib_start_stream() err=%d\n",
   2285                                    __func__, rc);
   2286                         goto EXIT;
   2287                     }
   2288                 } else {
   2289                     handle->test_obj.zsl_enabled = enable_zsl;
   2290                 }
   2291             }
   2292             break;
   2293         case MM_CAMERA_LIB_RAW_CAPTURE:
   2294 
   2295             if ( 0 == handle->stream_running ) {
   2296                 CDBG_ERROR(" %s : Streaming is not enabled!", __func__);
   2297                 rc = MM_CAMERA_E_INVALID_OPERATION;
   2298                 goto EXIT;
   2299             }
   2300 
   2301             rc = mm_camera_lib_stop_stream(handle);
   2302             if (rc != MM_CAMERA_OK) {
   2303                 CDBG_ERROR("%s: mm_camera_lib_stop_stream() err=%d\n",
   2304                            __func__, rc);
   2305                 goto EXIT;
   2306             }
   2307 
   2308             width = handle->test_obj.buffer_width;
   2309             height = handle->test_obj.buffer_height;
   2310             handle->test_obj.buffer_width = camera_cap->raw_dim[0].width;
   2311             handle->test_obj.buffer_height = camera_cap->raw_dim[0].height;
   2312             handle->test_obj.buffer_format = DEFAULT_RAW_FORMAT;
   2313             CDBG_ERROR("%s: MM_CAMERA_LIB_RAW_CAPTURE %dx%d\n",
   2314                        __func__,
   2315                        camera_cap->raw_dim[0].width,
   2316                        camera_cap->raw_dim[0].height);
   2317             rc = mm_app_start_capture_raw(&handle->test_obj, 1);
   2318             if (rc != MM_CAMERA_OK) {
   2319                 CDBG_ERROR("%s: mm_app_start_capture() err=%d\n",
   2320                            __func__, rc);
   2321                 goto EXIT;
   2322             }
   2323 
   2324             mm_camera_app_wait();
   2325 
   2326             rc = mm_app_stop_capture_raw(&handle->test_obj);
   2327             if (rc != MM_CAMERA_OK) {
   2328                 CDBG_ERROR("%s: mm_app_stop_capture() err=%d\n",
   2329                            __func__, rc);
   2330                 goto EXIT;
   2331             }
   2332 
   2333             handle->test_obj.buffer_width = width;
   2334             handle->test_obj.buffer_height = height;
   2335             handle->test_obj.buffer_format = DEFAULT_SNAPSHOT_FORMAT;
   2336             rc = mm_camera_lib_start_stream(handle);
   2337             if (rc != MM_CAMERA_OK) {
   2338                 CDBG_ERROR("%s: mm_camera_lib_start_stream() err=%d\n",
   2339                            __func__, rc);
   2340                 goto EXIT;
   2341             }
   2342 
   2343             break;
   2344 
   2345         case MM_CAMERA_LIB_JPEG_CAPTURE:
   2346             if ( 0 == handle->stream_running ) {
   2347                 CDBG_ERROR(" %s : Streaming is not enabled!", __func__);
   2348                 rc = MM_CAMERA_E_INVALID_OPERATION;
   2349                 goto EXIT;
   2350             }
   2351 
   2352             if ( NULL != in_data ) {
   2353                 dim = ( mm_camera_lib_snapshot_params * ) in_data;
   2354             }
   2355 
   2356             rc = tuneserver_capture(handle, dim);
   2357             if (rc != MM_CAMERA_OK) {
   2358                 CDBG_ERROR("%s:capture error %d\n", __func__, rc);
   2359                 goto EXIT;
   2360             }
   2361 
   2362             if (handle->test_obj.is_chromatix_reload == TRUE) {
   2363               /**Re-load Chromatix is taken care to make sure Tuned data **
   2364               ** is not lost when capture Snapshot                       **/
   2365               rc = setReloadChromatix(&handle->test_obj,
   2366                 (tune_chromatix_t *)&(handle->test_obj.tune_data));
   2367               if (rc != MM_CAMERA_OK) {
   2368                 CDBG_ERROR("%s: setReloadChromatix failed\n", __func__);
   2369                 goto EXIT;
   2370               }
   2371             }
   2372             break;
   2373 
   2374         case MM_CAMERA_LIB_SET_FOCUS_MODE: {
   2375             cam_focus_mode_type mode = *((cam_focus_mode_type *)in_data);
   2376             handle->current_params.af_mode = mode;
   2377             rc = setFocusMode(&handle->test_obj, mode);
   2378             if (rc != MM_CAMERA_OK) {
   2379               CDBG_ERROR("%s:autofocus error\n", __func__);
   2380               goto EXIT;
   2381             }
   2382             break;
   2383         }
   2384 
   2385         case MM_CAMERA_LIB_DO_AF:
   2386             if (handle->test_obj.focus_supported) {
   2387               rc = handle->test_obj.cam->ops->do_auto_focus(handle->test_obj.cam->camera_handle);
   2388               if (rc != MM_CAMERA_OK) {
   2389                 CDBG_ERROR("%s:autofocus error\n", __func__);
   2390                 goto EXIT;
   2391               }
   2392               /*Waiting for Auto Focus Done Call Back*/
   2393               mm_camera_app_wait();
   2394             }
   2395             break;
   2396 
   2397         case MM_CAMERA_LIB_CANCEL_AF:
   2398             rc = handle->test_obj.cam->ops->cancel_auto_focus(handle->test_obj.cam->camera_handle);
   2399             if (rc != MM_CAMERA_OK) {
   2400                 CDBG_ERROR("%s:autofocus error\n", __func__);
   2401                 goto EXIT;
   2402             }
   2403 
   2404             break;
   2405 
   2406         case MM_CAMERA_LIB_LOCK_AWB:
   2407             rc = setAwbLock(&handle->test_obj, 1);
   2408             if (rc != MM_CAMERA_OK) {
   2409                 CDBG_ERROR("%s: AWB locking failed\n", __func__);
   2410                 goto EXIT;
   2411             }
   2412             break;
   2413 
   2414         case MM_CAMERA_LIB_UNLOCK_AWB:
   2415             rc = setAwbLock(&handle->test_obj, 0);
   2416             if (rc != MM_CAMERA_OK) {
   2417                 CDBG_ERROR("%s: AE unlocking failed\n", __func__);
   2418                 goto EXIT;
   2419             }
   2420             break;
   2421 
   2422         case MM_CAMERA_LIB_LOCK_AE:
   2423             rc = setAecLock(&handle->test_obj, 1);
   2424             if (rc != MM_CAMERA_OK) {
   2425                 CDBG_ERROR("%s: AE locking failed\n", __func__);
   2426                 goto EXIT;
   2427             }
   2428             break;
   2429 
   2430         case MM_CAMERA_LIB_UNLOCK_AE:
   2431             rc = setAecLock(&handle->test_obj, 0);
   2432             if (rc != MM_CAMERA_OK) {
   2433                 CDBG_ERROR("%s: AE unlocking failed\n", __func__);
   2434                 goto EXIT;
   2435             }
   2436             break;
   2437 
   2438        case MM_CAMERA_LIB_SET_3A_COMMAND: {
   2439           rc = set3Acommand(&handle->test_obj, (cam_eztune_cmd_data_t *)in_data);
   2440           if (rc != MM_CAMERA_OK) {
   2441             CDBG_ERROR("%s:3A set command error\n", __func__);
   2442             goto EXIT;
   2443           }
   2444           break;
   2445         }
   2446 
   2447        case MM_CAMERA_LIB_GET_CHROMATIX: {
   2448            rc = getChromatix(&handle->test_obj,
   2449                 (tune_chromatix_t *)out_data);
   2450            if (rc != MM_CAMERA_OK) {
   2451              CDBG_ERROR("%s: getChromatix failed\n", __func__);
   2452              goto EXIT;
   2453            }
   2454            break;
   2455        }
   2456 
   2457        case MM_CAMERA_LIB_SET_RELOAD_CHROMATIX: {
   2458            rc = setReloadChromatix(&handle->test_obj,
   2459              (tune_chromatix_t *)in_data);
   2460            if (rc != MM_CAMERA_OK) {
   2461              CDBG_ERROR("%s: setReloadChromatix failed\n", __func__);
   2462              goto EXIT;
   2463            }
   2464            handle->test_obj.is_chromatix_reload = TRUE;
   2465            memcpy((void *)&(handle->test_obj.tune_data),
   2466              (void *)in_data, sizeof(tune_chromatix_t));
   2467            break;
   2468        }
   2469 
   2470        case MM_CAMERA_LIB_GET_AFTUNE: {
   2471            rc = getAutofocusParams(&handle->test_obj,
   2472                 (tune_autofocus_t *)out_data);
   2473            if (rc != MM_CAMERA_OK) {
   2474              CDBG_ERROR("%s: getAutofocusParams failed\n", __func__);
   2475              goto EXIT;
   2476            }
   2477            break;
   2478        }
   2479 
   2480        case MM_CAMERA_LIB_SET_RELOAD_AFTUNE: {
   2481            rc = setReloadAutofocusParams(&handle->test_obj,
   2482              (tune_autofocus_t *)in_data);
   2483            if (rc != MM_CAMERA_OK) {
   2484              CDBG_ERROR("%s: setReloadAutofocusParams failed\n", __func__);
   2485              goto EXIT;
   2486            }
   2487            break;
   2488        }
   2489 
   2490        case MM_CAMERA_LIB_SET_AUTOFOCUS_TUNING: {
   2491            rc = setAutoFocusTuning(&handle->test_obj, in_data);
   2492            if (rc != MM_CAMERA_OK) {
   2493              CDBG_ERROR("%s: Set AF tuning failed\n", __func__);
   2494              goto EXIT;
   2495            }
   2496            break;
   2497        }
   2498 
   2499        case MM_CAMERA_LIB_SET_VFE_COMMAND: {
   2500            rc = setVfeCommand(&handle->test_obj, in_data);
   2501            if (rc != MM_CAMERA_OK) {
   2502              CDBG_ERROR("%s: Set vfe command failed\n", __func__);
   2503              goto EXIT;
   2504            }
   2505            break;
   2506        }
   2507 
   2508        case MM_CAMERA_LIB_SET_POSTPROC_COMMAND: {
   2509            rc = setPPCommand(&handle->test_obj, in_data);
   2510            if (rc != MM_CAMERA_OK) {
   2511              CDBG_ERROR("%s: Set pp command failed\n", __func__);
   2512              goto EXIT;
   2513            }
   2514            break;
   2515        }
   2516 
   2517         case MM_CAMERA_LIB_WNR_ENABLE: {
   2518             int wnr_enable = *((uint8_t *)in_data);
   2519             rc = setWNR(&handle->test_obj, wnr_enable);
   2520             if ( rc != MM_CAMERA_OK) {
   2521                 CDBG_ERROR("%s: Set wnr enable failed\n", __func__);
   2522                 goto EXIT;
   2523             }
   2524         }
   2525 
   2526       case MM_CAMERA_LIB_NO_ACTION:
   2527         default:
   2528             break;
   2529     };
   2530 
   2531 EXIT:
   2532 
   2533     return rc;
   2534 }
   2535 int mm_camera_lib_number_of_cameras(mm_camera_lib_handle *handle)
   2536 {
   2537     int rc = 0;
   2538 
   2539     if ( NULL == handle ) {
   2540         CDBG_ERROR(" %s : Invalid handle", __func__);
   2541         goto EXIT;
   2542     }
   2543 
   2544     rc = handle->app_ctx.num_cameras;
   2545 
   2546 EXIT:
   2547 
   2548     return rc;
   2549 }
   2550 
   2551 int mm_camera_lib_close(mm_camera_lib_handle *handle)
   2552 {
   2553     int rc = MM_CAMERA_OK;
   2554 
   2555     if ( NULL == handle ) {
   2556         CDBG_ERROR(" %s : Invalid handle", __func__);
   2557         rc = MM_CAMERA_E_INVALID_INPUT;
   2558         goto EXIT;
   2559     }
   2560 
   2561     //rc = mm_app_close_fb(&handle->test_obj);
   2562     rc = MM_CAMERA_OK;
   2563     if (rc != MM_CAMERA_OK) {
   2564         CDBG_ERROR("%s:mm_app_close_fb() err=%d\n",
   2565                    __func__, rc);
   2566         goto EXIT;
   2567     }
   2568 
   2569     rc = mm_app_close(&handle->test_obj);
   2570     if (rc != MM_CAMERA_OK) {
   2571         CDBG_ERROR("%s:mm_app_close() err=%d\n",
   2572                    __func__, rc);
   2573         goto EXIT;
   2574     }
   2575 
   2576 EXIT:
   2577     return rc;
   2578 }
   2579 
   2580 int mm_camera_lib_set_preview_usercb(
   2581    mm_camera_lib_handle *handle, prev_callback cb)
   2582 {
   2583     if (handle->test_obj.user_preview_cb != NULL) {
   2584         CDBG_ERROR("%s, already set preview callbacks\n", __func__);
   2585         return -1;
   2586     }
   2587     handle->test_obj.user_preview_cb = *cb;
   2588     return 0;
   2589 }
   2590