Home | History | Annotate | Download | only in src
      1 /*
      2 Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
      3 
      4 Redistribution and use in source and binary forms, with or without
      5 modification, are permitted provided that the following conditions are
      6 met:
      7     * Redistributions of source code must retain the above copyright
      8       notice, this list of conditions and the following disclaimer.
      9     * Redistributions in binary form must reproduce the above
     10       copyright notice, this list of conditions and the following
     11       disclaimer in the documentation and/or other materials provided
     12       with the distribution.
     13     * Neither the name of The Linux Foundation nor the names of its
     14       contributors may be used to endorse or promote products derived
     15       from this software without specific prior written permission.
     16 
     17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29 
     30 #include <pthread.h>
     31 #include <fcntl.h>
     32 #include <stdio.h>
     33 #include <string.h>
     34 #include <unistd.h>
     35 #include <termios.h>
     36 #include <assert.h>
     37 #include <stdlib.h>
     38 #include <ctype.h>
     39 #include <signal.h>
     40 #include <errno.h>
     41 #include <sys/mman.h>
     42 #include <sys/time.h>
     43 #include <sys/ioctl.h>
     44 #include <linux/fb.h>
     45 #ifdef _ANDROID_
     46 #include <cutils/log.h>
     47 #endif
     48 #include <dlfcn.h>
     49 
     50 #include "camera.h"
     51 #include "mm_camera_dbg.h"
     52 #include "mm_qcamera_main_menu.h"
     53 #include "mm_qcamera_display_dimensions.h"
     54 #include "camera_defs_i.h"
     55 #include "mm_qcamera_app.h"
     56 
     57 #define CAMERA_OPENED 0
     58 
     59 #define VIDEO_BUFFER_SIZE       (PREVIEW_WIDTH * PREVIEW_HEIGHT * 3/2)
     60 #define THUMBNAIL_BUFFER_SIZE   (THUMBNAIL_WIDTH * THUMBNAIL_HEIGHT * 3/2)
     61 #define SNAPSHOT_BUFFER_SIZE    (PICTURE_WIDTH * PICTURE_HEIGHT * 3/2)
     62 
     63 extern int mm_app_take_zsl(int cam_id);
     64 extern int mm_app_take_live_snapshot(int cam_id);
     65 extern int stopPreview(int cam_id);
     66 extern void switchRes(int cam_id);
     67 extern void switchCamera(int cam_id);
     68 extern int startRdi(int cam_id);
     69 extern int stopRdi(int cam_id);
     70 
     71 /*===========================================================================
     72  * Macro
     73  *===========================================================================*/
     74 #define PREVIEW_FRAMES_NUM    4
     75 #define VIDEO_FRAMES_NUM      4
     76 #define THUMBNAIL_FRAMES_NUM  1
     77 #define SNAPSHOT_FRAMES_NUM   1
     78 #define MAX_NUM_FORMAT        32
     79 /*===========================================================================
     80  * Defines
     81  *===========================================================================*/
     82 
     83 const CAMERA_MAIN_MENU_TBL_T camera_main_menu_tbl[] = {
     84   {STOP_CAMERA,                   "Stop preview/video and exit camera."},
     85   {PREVIEW_VIDEO_RESOLUTION,      "Preview/Video Resolution: SQCIF/QCIF/"
     86                               "QVGA/CIF/VGA/WVGA... Default WVGA."},
     87   {TAKE_YUV_SNAPSHOT,       "Take a snapshot"},
     88   {TAKE_RAW_SNAPSHOT,       "Take a raw snapshot"},
     89   {TAKE_ZSL_SNAPSHOT,       "Take a ZSL snapshot"},
     90   {START_RECORDING,       "Start RECORDING"},
     91   {START_RDI, "Start RDI stream"},
     92   {STOP_RDI, "Stop RDI stream"},
     93   {SWITCH_CAMERA,       "Switch Camera"},
     94 #if 0
     95   {SET_WHITE_BALANCE,          "Set white balance mode: Auto/Off/Daylight/Incandescent/Fluorescent. Default Auto."},
     96   {SET_EXP_METERING,          "Set exposure metering mode: FrameAverage/CenterWeighted/SpotMetering. Default CenterWeighted"},
     97   {GET_CTRL_VALUE,              "Get control value menu"},
     98   {TOGGLE_AFR,                 "Toggle auto frame rate. Default fixed frame rate"},
     99   {SET_ISO,                 "ISO changes."},
    100   {BRIGHTNESS_GOTO_SUBMENU,                               "Brightness changes."},
    101   {CONTRAST_GOTO_SUBMENU,                                 "Contrast changes."},
    102   {EV_GOTO_SUBMENU,                                       "EV changes."},
    103   {SATURATION_GOTO_SUBMENU,                               "Saturation changes."},
    104   {SET_ZOOM,          "Set Digital Zoom."},
    105   {SET_SHARPNESS,          "Set Sharpness."},
    106 #endif
    107 };
    108 
    109 const PREVIEW_DIMENSION_TBL_T preview_video_dimension_tbl[] = {
    110    { SQCIF, SQCIF_WIDTH, SQCIF_HEIGHT, "SQCIF",  "Preview/Video Resolution: SQCIF <128x96>"},
    111    {  QCIF,  QCIF_WIDTH,  QCIF_HEIGHT,  "QCIF",  "Preview/Video Resolution: QCIF <176x144>"},
    112    {  QVGA,  QVGA_WIDTH,  QVGA_HEIGHT,  "QVGA",  "Preview/Video Resolution: QVGA <320x240>"},
    113    {   CIF,   CIF_WIDTH,   CIF_HEIGHT,   "CIF",  "Preview/Video Resolution: CIF <352x288>"},
    114    {   VGA,   VGA_WIDTH,   VGA_HEIGHT,   "VGA",  "Preview/Video Resolution: VGA <640x480>"},
    115    {  WVGA,  WVGA_WIDTH,  WVGA_HEIGHT,  "WVGA",  "Preview/Video Resolution: WVGA <800x480>"},
    116    {  SVGA,  SVGA_WIDTH,  SVGA_HEIGHT,  "SVGA",  "Preview/Video Resolution: SVGA <800x600>"},
    117    {   XGA,   XGA_WIDTH,   XGA_HEIGHT,    "XGA", "Preview/Video Resolution: XGA <1024x768>"},
    118    { HD720, HD720_WIDTH, HD720_HEIGHT,  "HD720", "Preview/Video Resolution: HD720 <1280x720>"},
    119 };
    120 
    121 const CAMERA_BRIGHTNESS_TBL_T brightness_change_tbl[] = {
    122   {INC_BRIGHTNESS, "Increase Brightness by one step."},
    123   {DEC_BRIGHTNESS, "Decrease Brightness by one step."},
    124 };
    125 
    126 const CAMERA_CONTRST_TBL_T contrast_change_tbl[] = {
    127   {INC_CONTRAST, "Increase Contrast by one step."},
    128   {DEC_CONTRAST, "Decrease Contrast by one step."},
    129 };
    130 
    131 const CAMERA_EV_TBL_T camera_EV_tbl[] = {
    132   {INCREASE_EV, "Increase EV by one step."},
    133   {DECREASE_EV, "Decrease EV by one step."},
    134 };
    135 
    136 const CAMERA_SATURATION_TBL_T camera_saturation_tbl[] = {
    137   {INC_SATURATION, "Increase Satuation by one step."},
    138   {DEC_SATURATION, "Decrease Satuation by one step."},
    139 };
    140 
    141 const CAMERA_SHARPNESS_TBL_T camera_sharpness_tbl[] = {
    142   {INC_SHARPNESS, "Increase Sharpness."},
    143   {DEC_SHARPNESS, "Decrease Sharpness."},
    144 };
    145 
    146 const WHITE_BALANCE_TBL_T white_balance_tbl[] = {
    147   { CAMERA_WB_AUTO,         "White Balance - Auto"},
    148   { CAMERA_WB_DAYLIGHT,     "White Balance - Daylight"},
    149   { CAMERA_WB_INCANDESCENT, "White Balance - Incandescent"},
    150   { CAMERA_WB_FLUORESCENT,  "White Balance - Fluorescent"},
    151   { CAMERA_WB_CLOUDY_DAYLIGHT,  "White Balance - Cloudy"},
    152 };
    153 
    154 const CAMERA_TBL_T cam_tbl[] = {
    155   { 	1,          "Back Camera"},
    156   { 	2,         "Front Camera"},
    157 };
    158 
    159 const RECORD_TBL_T record_tbl[] = {
    160   { 	LIVE_SNAPSHOT_MENU,          "Take Live snapshot"},
    161   { 	STOP_RECORDING_MENU,         "Stop Recording"},
    162 };
    163 
    164 const GET_CTRL_TBL_T get_ctrl_tbl[] = {
    165   {     WHITE_BALANCE_STATE,           "Get white balance state (auto/off)"},
    166   {     WHITE_BALANCE_TEMPERATURE,      "Get white balance temperature"},
    167   {     BRIGHTNESS_CTRL,      "Get brightness value"},
    168   {     EV,      "Get exposure value"},
    169   {     CONTRAST_CTRL,      "Get contrast value"},
    170   {     SATURATION_CTRL,      "Get saturation value"},
    171   {     SHARPNESS_CTRL,      "Get sharpness value"},
    172 };
    173 
    174 const EXP_METERING_TBL_T exp_metering_tbl[] = {
    175   {   EXP_METERING_FRAME_AVERAGE,      "Exposure Metering - Frame Average"},
    176   {   EXP_METERING_CENTER_WEIGHTED,    "Exposure Metering - Center Weighted"},
    177   {   EXP_METERING_SPOT_METERING,      "Exposure Metering - Spot Metering"},
    178 };
    179 
    180 const ISO_TBL_T iso_tbl[] = {
    181   {   ISO_AUTO, "ISO: Auto"},
    182   {   ISO_DEBLUR, "ISO: Deblur"},
    183   {   ISO_100, "ISO: 100"},
    184   {   ISO_200, "ISO: 200"},
    185   {   ISO_400, "ISO: 400"},
    186   {   ISO_800, "ISO: 800"},
    187   {   ISO_1600, "ISO: 1600"},
    188 };
    189 
    190 const ZOOM_TBL_T zoom_tbl[] = {
    191   {   ZOOM_IN, "Zoom In one step"},
    192   {   ZOOM_OUT, "Zoom Out one step"},
    193 };
    194 
    195 
    196 struct v4l2_fmtdesc enumfmtdesc[MAX_NUM_FORMAT];
    197 struct v4l2_format current_fmt;
    198 
    199 /*===========================================================================
    200  * Forward declarations
    201  *===========================================================================*/
    202 static int set_fps(int fps);
    203 static int start_snapshot (void);
    204 static int stop_snapshot (void);
    205 /*===========================================================================
    206  * Static global variables
    207  *===========================================================================*/
    208 USER_INPUT_DISPLAY_T input_display;
    209 static int camframe_status = 0;
    210 
    211 #ifdef _ANDROID_
    212 char *sdcard_path = "/data";
    213 #else
    214 char *sdcard_path = ".";
    215 #endif
    216 
    217 //void *libqcamera = NULL;
    218 //void (**LINK_jpegfragment_callback)(uint8_t * buff_ptr , uint32_t buff_size);
    219 //void (**LINK_jpeg_callback)(void);
    220 
    221 int num_supported_fmts = 0;
    222 int memoryType = V4L2_MEMORY_MMAP; /* default */
    223 int preview_video_resolution_flag = 0;
    224 int effect = CAMERA_EFFECT_OFF;
    225 int brightness = CAMERA_DEF_BRIGHTNESS;
    226 int contrast = CAMERA_DEF_CONTRAST;
    227 int saturation = CAMERA_DEF_SATURATION;
    228 int sharpness = CAMERA_DEF_SHARPNESS;
    229 int32_t ev_num = 0;
    230 uint8_t ezTune = FALSE;
    231 int pmemThumbnailfd = 0;
    232 int pmemSnapshotfd = 0;
    233 int pmemRawSnapshotfd = 0;
    234 int fdSnapshot = 0;
    235 int fdThumbnail = 0;
    236 char snapshotBuf[256] = { 0};
    237 char thumbnailBuf[256] = { 0};
    238 uint32_t snapshot_buff_size = 0;
    239 uint32_t raw_snapshot_buffer_size = 0;
    240 static int thumbnailCntr = 0, snapshotCntr = 0;
    241 unsigned char *thumbnail_buf = NULL, *main_img_buf = NULL, *raw_img_buf = NULL;
    242 int32_t *sharpness_AF = NULL;
    243 struct crop_info cropInfo;
    244 common_crop_t cropInfo_s;
    245 
    246 interface_ctrl_t intrfcCtrl;
    247 config3a_wb_t autoWB = CAMERA_WB_AUTO;
    248 isp3a_af_mode_t af_mode = AF_MODE_AUTO;
    249 cam_af_focusrect_t afFocusRect = AUTO;
    250 
    251 cam_af_ctrl_t af_ctrl;
    252 camera_iso_mode_type iso = CAMERA_ISO_AUTO;
    253 camera_antibanding_type antibanding = CAMERA_ANTIBANDING_OFF;
    254 camera_auto_exposure_mode_type aec_mode = CAMERA_AEC_CENTER_WEIGHTED;
    255 led_mode_t led_mode = LED_MODE_OFF;
    256 motion_iso_t motion_iso = MOTION_ISO_OFF;
    257 int32_t hue = CAMERA_DEF_HUE;
    258 fps_mode_t fps_mode = FPS_MODE_AUTO;
    259 
    260 struct v4l2_cropcap cropcap;
    261 struct v4l2_queryctrl zoom_queryctrl;
    262 struct v4l2_queryctrl sharpness_queryctrl;
    263 int zoom_level;
    264 
    265 Camera_Resolution Resolution;
    266 //int32_t g_camParmInfo_current_value = 0;
    267 //extern unsigned long preview_frames_buf;
    268 //extern void test_app_mmcamera_videoframe_callback(struct msm_frame *frame); // video_cam.c
    269 
    270 /* To flush free video buffers queue */
    271 //void (*LINK_cam_frame_flush_free_video)(void);
    272 static int submain();
    273 
    274 //struct v4l2_frame_buffer frames[PREVIEW_FRAMES_NUM];
    275 //struct v4l2_frame_buffer video_frames[VIDEO_FRAMES_NUM];
    276 
    277 //pthread_t frame_thread;
    278 
    279 void test_app_camframe_timeout_callback(void)
    280 {
    281   camframe_status = -1;
    282 }
    283 
    284 /*===========================================================================
    285  * FUNCTION    - keypress_to_event -
    286  *
    287  * DESCRIPTION:
    288  *==========================================================================*/
    289 int keypress_to_event(char keypress)
    290 {
    291   char out_buf = INVALID_KEY_PRESS;
    292   if ((keypress >= 'A' && keypress <= 'Z') ||
    293     (keypress >= 'a' && keypress <= 'z')) {
    294     out_buf = tolower(keypress);
    295     out_buf = out_buf - 'a' + 1;
    296   } else if (keypress >= '1' && keypress <= '9') {
    297     out_buf = keypress;
    298     out_buf = keypress - '1' + BASE_OFFSET_NUM;
    299   }
    300   return out_buf;
    301 }
    302 
    303 int next_menu(menu_id_change_t current_menu_id, char keypress, camera_action_t * action_id_ptr, int * action_param)
    304 {
    305   int output_to_event;
    306   menu_id_change_t next_menu_id = MENU_ID_INVALID;
    307   * action_id_ptr = ACTION_NO_ACTION;
    308 
    309   output_to_event = keypress_to_event(keypress);
    310   CDBG("current_menu_id=%d\n",current_menu_id);
    311   CDBG("output_to_event=%d\n",output_to_event);
    312   switch(current_menu_id) {
    313     case MENU_ID_MAIN:
    314       switch(output_to_event) {
    315         case STOP_CAMERA:
    316           * action_id_ptr = ACTION_STOP_CAMERA;
    317           CDBG("STOP_CAMERA\n");
    318           break;
    319 
    320         case PREVIEW_VIDEO_RESOLUTION:
    321           next_menu_id = MENU_ID_PREVIEWVIDEORESOLUTIONCHANGE;
    322           CDBG("next_menu_id = MENU_ID_PREVIEWVIDEORESOLUTIONCHANGE = %d\n", next_menu_id);
    323           break;
    324 #if 0
    325         case SET_WHITE_BALANCE:
    326           next_menu_id = MENU_ID_WHITEBALANCECHANGE;
    327           CDBG("next_menu_id = MENU_ID_WHITEBALANCECHANGE = %d\n", next_menu_id);
    328           break;
    329 
    330         case SET_EXP_METERING:
    331           next_menu_id = MENU_ID_EXPMETERINGCHANGE;
    332           CDBG("next_menu_id = MENU_ID_EXPMETERINGCHANGE = %d\n", next_menu_id);
    333           break;
    334 
    335         case GET_CTRL_VALUE:
    336           next_menu_id = MENU_ID_GET_CTRL_VALUE;
    337           CDBG("next_menu_id = MENU_ID_GET_CTRL_VALUE = %d\n", next_menu_id);
    338           break;
    339 
    340         case BRIGHTNESS_GOTO_SUBMENU:
    341           next_menu_id = MENU_ID_BRIGHTNESSCHANGE;
    342           CDBG("next_menu_id = MENU_ID_BRIGHTNESSCHANGE = %d\n", next_menu_id);
    343           break;
    344 
    345         case CONTRAST_GOTO_SUBMENU:
    346           next_menu_id = MENU_ID_CONTRASTCHANGE;
    347           break;
    348 
    349         case EV_GOTO_SUBMENU:
    350           next_menu_id = MENU_ID_EVCHANGE;
    351           break;
    352 
    353         case SATURATION_GOTO_SUBMENU:
    354           next_menu_id = MENU_ID_SATURATIONCHANGE;
    355           break;
    356 
    357         case TOGGLE_AFR:
    358           * action_id_ptr = ACTION_TOGGLE_AFR;
    359           CDBG("next_menu_id = MENU_ID_TOGGLEAFR = %d\n", next_menu_id);
    360           break;
    361 
    362         case SET_ISO:
    363           next_menu_id = MENU_ID_ISOCHANGE;
    364           CDBG("next_menu_id = MENU_ID_ISOCHANGE = %d\n", next_menu_id);
    365           break;
    366 
    367         case SET_ZOOM:
    368           next_menu_id = MENU_ID_ZOOMCHANGE;
    369           CDBG("next_menu_id = MENU_ID_ZOOMCHANGE = %d\n", next_menu_id);
    370           break;
    371 
    372         case SET_SHARPNESS:
    373           next_menu_id = MENU_ID_SHARPNESSCHANGE;
    374           CDBG("next_menu_id = MENU_ID_SHARPNESSCHANGE = %d\n", next_menu_id);
    375           break;
    376 #endif
    377         case TAKE_YUV_SNAPSHOT:
    378           * action_id_ptr = ACTION_TAKE_YUV_SNAPSHOT;
    379           CDBG("Taking YUV snapshot\n");
    380           break;
    381 
    382         case TAKE_RAW_SNAPSHOT:
    383           * action_id_ptr = ACTION_TAKE_RAW_SNAPSHOT;
    384           CDBG("Taking RAW snapshot\n");
    385           break;
    386         case START_RECORDING:
    387           *action_id_ptr = ACTION_START_RECORDING;
    388           next_menu_id = MENU_ID_RECORD;
    389           CDBG("Start recording\n");
    390           break;
    391         /*case STOP_RECORDING:
    392           * action_id_ptr = ACTION_STOP_RECORDING;
    393           CDBG("Stop recording\n");
    394           break;*/
    395         case SWITCH_CAMERA:
    396           next_menu_id = MENU_ID_SWITCHCAMERA;
    397           CDBG("SWitch Camera\n");
    398           break;
    399         case TAKE_ZSL_SNAPSHOT:
    400           * action_id_ptr = ACTION_TAKE_ZSL_SNAPSHOT;
    401           CDBG("Taking ZSL snapshot\n");
    402           break;
    403         case START_RDI:
    404           * action_id_ptr = ACTION_START_RDI;
    405           break;
    406         case STOP_RDI:
    407           * action_id_ptr = ACTION_STOP_RDI;
    408           break;
    409         default:
    410           next_menu_id = MENU_ID_MAIN;
    411           CDBG("next_menu_id = MENU_ID_MAIN = %d\n", next_menu_id);
    412           break;
    413       }
    414       break;
    415 
    416     case MENU_ID_PREVIEWVIDEORESOLUTIONCHANGE:
    417       printf("MENU_ID_PREVIEWVIDEORESOLUTIONCHANGE\n");
    418       * action_id_ptr = ACTION_PREVIEW_VIDEO_RESOLUTION;
    419       if (output_to_event > RESOLUTION_PREVIEW_VIDEO_MAX ||
    420         output_to_event < RESOLUTION_MIN) {
    421           next_menu_id = current_menu_id;
    422       }
    423       else {
    424         next_menu_id = MENU_ID_MAIN;
    425         * action_param = output_to_event;
    426       }
    427       break;
    428 
    429     case MENU_ID_WHITEBALANCECHANGE:
    430       printf("MENU_ID_WHITEBALANCECHANGE\n");
    431       * action_id_ptr = ACTION_SET_WHITE_BALANCE;
    432       if (output_to_event > 0 &&
    433         output_to_event <= sizeof(white_balance_tbl)/sizeof(white_balance_tbl[0])) {
    434           next_menu_id = MENU_ID_MAIN;
    435           * action_param = output_to_event;
    436       }
    437       else {
    438         next_menu_id = current_menu_id;
    439       }
    440       break;
    441 
    442     case MENU_ID_EXPMETERINGCHANGE:
    443       printf("MENU_ID_EXPMETERINGCHANGE\n");
    444       * action_id_ptr = ACTION_SET_EXP_METERING;
    445       if (output_to_event > 0 &&
    446         output_to_event <= sizeof(exp_metering_tbl)/sizeof(exp_metering_tbl[0])) {
    447           next_menu_id = MENU_ID_MAIN;
    448           * action_param = output_to_event;
    449       }
    450       else {
    451         next_menu_id = current_menu_id;
    452       }
    453       break;
    454 
    455     case MENU_ID_GET_CTRL_VALUE:
    456       printf("MENU_ID_GET_CTRL_VALUE\n");
    457       * action_id_ptr = ACTION_GET_CTRL_VALUE;
    458       if (output_to_event > 0 &&
    459         output_to_event <= sizeof(get_ctrl_tbl)/sizeof(get_ctrl_tbl[0])) {
    460           next_menu_id = MENU_ID_MAIN;
    461           * action_param = output_to_event;
    462       }
    463       else {
    464         next_menu_id = current_menu_id;
    465       }
    466       break;
    467 
    468     case MENU_ID_BRIGHTNESSCHANGE:
    469       switch (output_to_event) {
    470         case INC_BRIGHTNESS:
    471           * action_id_ptr = ACTION_BRIGHTNESS_INCREASE;
    472           next_menu_id = MENU_ID_MAIN;
    473           break;
    474 
    475         case DEC_BRIGHTNESS:
    476           * action_id_ptr = ACTION_BRIGHTNESS_DECREASE;
    477           next_menu_id = MENU_ID_MAIN;
    478           break;
    479 
    480         default:
    481           next_menu_id = MENU_ID_BRIGHTNESSCHANGE;
    482           break;
    483       }
    484       break;
    485 
    486     case MENU_ID_CONTRASTCHANGE:
    487       switch (output_to_event) {
    488         case INC_CONTRAST:
    489           * action_id_ptr = ACTION_CONTRAST_INCREASE;
    490           next_menu_id = MENU_ID_MAIN;
    491           break;
    492 
    493         case DEC_CONTRAST:
    494           * action_id_ptr = ACTION_CONTRAST_DECREASE;
    495           next_menu_id = MENU_ID_MAIN;
    496           break;
    497 
    498         default:
    499           next_menu_id = MENU_ID_CONTRASTCHANGE;
    500           break;
    501       }
    502       break;
    503 
    504     case MENU_ID_EVCHANGE:
    505       switch (output_to_event) {
    506         case INCREASE_EV:
    507           * action_id_ptr = ACTION_EV_INCREASE;
    508           next_menu_id = MENU_ID_MAIN;
    509           break;
    510 
    511         case DECREASE_EV:
    512           * action_id_ptr = ACTION_EV_DECREASE;
    513           next_menu_id = MENU_ID_MAIN;
    514           break;
    515 
    516         default:
    517           next_menu_id = MENU_ID_EVCHANGE;
    518           break;
    519       }
    520       break;
    521 
    522     case MENU_ID_SATURATIONCHANGE:
    523       switch (output_to_event) {
    524         case INC_SATURATION:
    525           * action_id_ptr = ACTION_SATURATION_INCREASE;
    526           next_menu_id = MENU_ID_MAIN;
    527           break;
    528 
    529         case DEC_SATURATION:
    530           * action_id_ptr = ACTION_SATURATION_DECREASE;
    531           next_menu_id = MENU_ID_MAIN;
    532           break;
    533 
    534         default:
    535           next_menu_id = MENU_ID_EVCHANGE;
    536           break;
    537       }
    538       break;
    539 
    540     case MENU_ID_ISOCHANGE:
    541       printf("MENU_ID_ISOCHANGE\n");
    542       * action_id_ptr = ACTION_SET_ISO;
    543       if (output_to_event > 0 &&
    544         output_to_event <= sizeof(iso_tbl)/sizeof(iso_tbl[0])) {
    545           next_menu_id = MENU_ID_MAIN;
    546           * action_param = output_to_event;
    547       } else {
    548         next_menu_id = current_menu_id;
    549       }
    550       break;
    551 
    552     case MENU_ID_ZOOMCHANGE:
    553       * action_id_ptr = ACTION_SET_ZOOM;
    554       if (output_to_event > 0 &&
    555         output_to_event <= sizeof(zoom_tbl)/sizeof(zoom_tbl[0])) {
    556           next_menu_id = MENU_ID_MAIN;
    557           * action_param = output_to_event;
    558       } else {
    559         next_menu_id = current_menu_id;
    560       }
    561       break;
    562 
    563     case MENU_ID_SHARPNESSCHANGE:
    564       switch (output_to_event) {
    565         case INC_SHARPNESS:
    566           * action_id_ptr = ACTION_SHARPNESS_INCREASE;
    567           next_menu_id = MENU_ID_MAIN;
    568           break;
    569         case DEC_SHARPNESS:
    570           * action_id_ptr = ACTION_SHARPNESS_DECREASE;
    571           next_menu_id = MENU_ID_MAIN;
    572           break;
    573         default:
    574           next_menu_id = MENU_ID_SHARPNESSCHANGE;
    575           break;
    576       }
    577       break;
    578     case MENU_ID_SWITCHCAMERA:
    579       * action_id_ptr = ACTION_SWITCH_CAMERA;
    580       if (output_to_event >= 0 &&
    581         output_to_event <= sizeof(cam_tbl)/sizeof(cam_tbl[0])) {
    582           next_menu_id = MENU_ID_MAIN;
    583           * action_param = output_to_event;
    584       } else {
    585         next_menu_id = current_menu_id;
    586       }
    587       break;
    588    case MENU_ID_RECORD:
    589       switch (output_to_event) {
    590         case LIVE_SNAPSHOT_MENU:
    591           * action_id_ptr = ACTION_TAKE_LIVE_SNAPSHOT;
    592           next_menu_id = MENU_ID_RECORD;
    593           break;
    594 
    595         default:
    596         case STOP_RECORDING_MENU:
    597           * action_id_ptr = ACTION_STOP_RECORDING;
    598           next_menu_id = MENU_ID_MAIN;
    599           break;
    600       }
    601    default:
    602       CDBG("menu id is wrong: %d\n", current_menu_id);
    603       break;
    604   }
    605 
    606   return next_menu_id;
    607 }
    608 
    609 /*===========================================================================
    610  * FUNCTION    - print_menu_preview_video -
    611  *
    612  * DESCRIPTION:
    613  * ===========================================================================*/
    614 static void print_menu_preview_video(void) {
    615   unsigned int i;
    616 
    617   printf("\n");
    618   printf("===========================================\n");
    619   printf("      Camera is in preview/video mode now        \n");
    620   printf("===========================================\n\n");
    621 
    622   char menuNum = 'A';
    623   for (i = 0; i < sizeof(camera_main_menu_tbl)/sizeof(camera_main_menu_tbl[0]); i++) {
    624     if (i == BASE_OFFSET) {
    625       menuNum = '1';
    626     }
    627 
    628     printf("%c.  %s\n", menuNum, camera_main_menu_tbl[i].menu_name);
    629     menuNum++;
    630   }
    631 
    632   printf("\nPlease enter your choice: ");
    633 
    634   return;
    635 }
    636 
    637 static void camera_preview_video_resolution_change_tbl(void) {
    638     unsigned int i;
    639 
    640     printf("\n");
    641     printf("==========================================================\n");
    642     printf("      Camera is in preview/video resolution mode       \n");
    643     printf("==========================================================\n\n");
    644 
    645     char previewVideomenuNum = 'A';
    646     for (i = 0; i < sizeof(preview_video_dimension_tbl) /
    647       sizeof(preview_video_dimension_tbl[0]); i++) {
    648         printf("%c.  %s\n", previewVideomenuNum,
    649           preview_video_dimension_tbl[i].str_name);
    650         previewVideomenuNum++;
    651     }
    652 
    653     printf("\nPlease enter your choice for Preview/Video Resolution: ");
    654     return;
    655 }
    656 
    657 static void camera_preview_video_wb_change_tbl(void) {
    658   unsigned int i;
    659   printf("\n");
    660   printf("==========================================================\n");
    661   printf("      Camera is in white balance change mode       \n");
    662   printf("==========================================================\n\n");
    663 
    664   char submenuNum = 'A';
    665   for (i = 0 ; i < sizeof(white_balance_tbl) /
    666                    sizeof(white_balance_tbl[0]); i++) {
    667         //printf("%c.  %s\n", submenuNum, white_balance_tbl[i].wb_name);
    668         submenuNum++;
    669   }
    670   printf("\nPlease enter your choice for White Balance modes: ");
    671   return;
    672 }
    673 
    674 static void camera_preview_video_get_ctrl_value_tbl(void) {
    675   unsigned int i;
    676   printf("\n");
    677   printf("==========================================================\n");
    678   printf("      Camera is in get control value mode       \n");
    679   printf("==========================================================\n\n");
    680 
    681   char submenuNum = 'A';
    682   for (i = 0 ; i < sizeof(get_ctrl_tbl) /
    683                    sizeof(get_ctrl_tbl[0]); i++) {
    684         printf("%c.  %s\n", submenuNum, get_ctrl_tbl[i].get_ctrl_name);
    685         submenuNum++;
    686   }
    687   printf("\nPlease enter your choice for control value you want to get: ");
    688   return;
    689 }
    690 
    691 static void camera_preview_video_exp_metering_change_tbl(void) {
    692   unsigned int i;
    693   printf("\n");
    694   printf("==========================================================\n");
    695   printf("      Camera is in exposure metering change mode       \n");
    696   printf("==========================================================\n\n");
    697 
    698   char submenuNum = 'A';
    699   for (i = 0 ; i < sizeof(exp_metering_tbl) /
    700                    sizeof(exp_metering_tbl[0]); i++) {
    701         printf("%c.  %s\n", submenuNum, exp_metering_tbl[i].exp_metering_name);
    702         submenuNum++;
    703   }
    704   printf("\nPlease enter your choice for exposure metering modes: ");
    705   return;
    706 }
    707 
    708 static void camera_contrast_change_tbl(void) {
    709     unsigned int i;
    710 
    711     printf("\n");
    712     printf("==========================================================\n");
    713     printf("      Camera is in change contrast resolution mode       \n");
    714     printf("==========================================================\n\n");
    715 
    716     char contrastmenuNum = 'A';
    717     for (i = 0; i < sizeof(contrast_change_tbl) /
    718                     sizeof(contrast_change_tbl[0]); i++) {
    719         printf("%c.  %s\n", contrastmenuNum,
    720                             contrast_change_tbl[i].contrast_name);
    721         contrastmenuNum++;
    722     }
    723 
    724     printf("\nPlease enter your choice for contrast Change: ");
    725     return;
    726 }
    727 
    728 static void camera_EV_change_tbl(void) {
    729   unsigned int i;
    730 
    731   printf("\n");
    732   printf("===========================================\n");
    733   printf("      Camera is in EV change mode now       \n");
    734   printf("===========================================\n\n");
    735 
    736   char submenuNum = 'A';
    737   for (i = 0; i < sizeof(camera_EV_tbl)/sizeof(camera_EV_tbl[0]); i++) {
    738     printf("%c.  %s\n", submenuNum, camera_EV_tbl[i].EV_name);
    739     submenuNum++;
    740   }
    741 
    742   printf("\nPlease enter your choice for EV changes: ");
    743   return;
    744 }
    745 
    746 static void camera_preview_video_zoom_change_tbl(void) {
    747   unsigned int i;
    748   struct v4l2_control ctrl;
    749 
    750   memset(&ctrl, 0, sizeof(ctrl));
    751   ctrl.id = V4L2_CID_ZOOM_ABSOLUTE;
    752 #if 0 /* TBD */
    753   if (ioctl(camfd, VIDIOC_G_CTRL, &ctrl) >= 0) {
    754     zoom_level = ctrl.value;
    755     printf("\n");
    756     printf("==========================================================\n");
    757     printf("      Camera is in zoom change mode: %d,  [%d..%d]        \n",
    758         ctrl.value, zoom_queryctrl.minimum, zoom_queryctrl.maximum);
    759     printf("==========================================================\n\n");
    760 
    761     char submenuNum = 'A';
    762     for (i = 0 ; i < sizeof(zoom_tbl) /
    763                    sizeof(zoom_tbl[0]); i++) {
    764         printf("%c.  %s\n", submenuNum, zoom_tbl[i].zoom_direction_name);
    765         submenuNum++;
    766     }
    767     printf("\nPlease enter your choice for zoom change direction: ");
    768   } else {
    769     printf("\nVIDIOC_G_CTRL error: %d\n", errno);
    770   }
    771 #endif /* TBD */
    772   return;
    773 }
    774 
    775 static void camera_brightness_change_tbl(void) {
    776     unsigned int i;
    777 
    778     printf("\n");
    779     printf("==========================================================\n");
    780     printf("      Camera is in change brightness mode       \n");
    781     printf("==========================================================\n\n");
    782 
    783     char brightnessmenuNum = 'A';
    784     for (i = 0; i < sizeof(brightness_change_tbl) /
    785                     sizeof(brightness_change_tbl[0]); i++) {
    786         printf("%c.  %s\n", brightnessmenuNum,
    787                             brightness_change_tbl[i].brightness_name);
    788         brightnessmenuNum++;
    789     }
    790 
    791     printf("\nPlease enter your choice for Brightness Change: ");
    792     return;
    793 }
    794 
    795 static void camera_saturation_change_tbl(void) {
    796     unsigned int i;
    797 
    798     printf("\n");
    799     printf("==========================================================\n");
    800     printf("      Camera is in change saturation mode       \n");
    801     printf("==========================================================\n\n");
    802 
    803     char saturationmenuNum = 'A';
    804     for (i = 0; i < sizeof(camera_saturation_tbl) /
    805                     sizeof(camera_saturation_tbl[0]); i++) {
    806         printf("%c.  %s\n", saturationmenuNum,
    807                             camera_saturation_tbl[i].saturation_name);
    808         saturationmenuNum++;
    809     }
    810 
    811     printf("\nPlease enter your choice for Saturation Change: ");
    812     return;
    813 }
    814 
    815 char * set_preview_video_dimension_tbl(Camera_Resolution cs_id, uint16_t * width, uint16_t * height)
    816 {
    817   unsigned int i;
    818   char * ptr = NULL;
    819   for (i = 0; i < sizeof(preview_video_dimension_tbl) /
    820     sizeof(preview_video_dimension_tbl[0]); i++) {
    821       if (cs_id == preview_video_dimension_tbl[i].cs_id) {
    822         *width = preview_video_dimension_tbl[i].width;
    823         *height = preview_video_dimension_tbl[i].height;
    824         ptr = preview_video_dimension_tbl[i].name;
    825         break;
    826       }
    827   }
    828   return ptr;
    829 }
    830 
    831 static void camera_preview_video_iso_change_tbl(void) {
    832   unsigned int i;
    833   printf("\n");
    834   printf("==========================================================\n");
    835   printf("      Camera is in ISO change mode       \n");
    836   printf("==========================================================\n\n");
    837 
    838   char submenuNum = 'A';
    839   for (i = 0 ; i < sizeof(iso_tbl) /
    840                    sizeof(iso_tbl[0]); i++) {
    841         printf("%c.  %s\n", submenuNum, iso_tbl[i].iso_modes_name);
    842         submenuNum++;
    843   }
    844   printf("\nPlease enter your choice for iso modes: ");
    845   return;
    846 }
    847 
    848 static void camera_preview_video_sharpness_change_tbl(void) {
    849   unsigned int i;
    850   printf("\n");
    851   printf("==========================================================\n");
    852   printf("      Camera is in sharpness change mode       \n");
    853   printf("==========================================================\n\n");
    854 
    855   char submenuNum = 'A';
    856   for (i = 0 ; i < sizeof(camera_sharpness_tbl) /
    857                    sizeof(camera_sharpness_tbl[0]); i++) {
    858         printf("%c.  %s\n", submenuNum, camera_sharpness_tbl[i].sharpness_name);
    859         submenuNum++;
    860   }
    861   printf("\nPlease enter your choice for sharpness modes: ");
    862   return;
    863 }
    864 
    865 static void camera_record_tbl(void) {
    866   unsigned int i;
    867   printf("\n");
    868   printf("==========================================================\n");
    869   printf("      Camera is in record mode       \n");
    870   printf("==========================================================\n\n");
    871 
    872   char submenuNum = 'A';
    873   for (i = 0 ; i < sizeof(record_tbl) /
    874                    sizeof(record_tbl[0]); i++) {
    875         printf("%c.  %s\n", submenuNum, record_tbl[i].act_name);
    876         submenuNum++;
    877   }
    878   printf("\nPlease enter your choice:  ");
    879   return;
    880 }
    881 
    882 static void camera_switch_tbl(void) {
    883   unsigned int i;
    884   printf("\n");
    885   printf("==========================================================\n");
    886   printf("      Camera is in switch camera mode       \n");
    887   printf("==========================================================\n\n");
    888 
    889   char submenuNum = 'A';
    890   for (i = 0 ; i < sizeof(cam_tbl) /
    891                    sizeof(cam_tbl[0]); i++) {
    892         printf("%c.  %s\n", submenuNum, cam_tbl[i].cam_name);
    893         submenuNum++;
    894   }
    895   printf("\nPlease enter your choice for camera modes: ");
    896   return;
    897 }
    898 /*===========================================================================
    899  * FUNCTION     - increase_contrast -
    900  *
    901  * DESCRIPTION:
    902  * ===========================================================================*/
    903 int increase_contrast (void) {
    904   ++contrast;
    905   if (contrast > CAMERA_MAX_CONTRAST) {
    906     contrast = CAMERA_MAX_CONTRAST;
    907     printf("Reached max CONTRAST. \n");
    908   } else
    909     printf("Increase CONTRAST to %d\n", contrast);
    910 
    911   /*intrfcCtrl.setContrast(camfd, contrast);*/
    912 
    913   struct v4l2_queryctrl queryctrl;
    914   struct v4l2_control control;
    915 
    916   memset (&queryctrl, 0, sizeof (queryctrl));
    917   queryctrl.id = V4L2_CID_CONTRAST;
    918 #if 0 /* TBD */
    919   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
    920     if (errno != EINVAL) {
    921       perror ("VIDIOC_QUERYCTRL");
    922       exit (EXIT_FAILURE);
    923     } else {
    924       printf ("V4L2_CID_contrast is not supported\n");
    925     }
    926   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
    927     printf ("V4L2_CID_contrast is not supported\n");
    928   } else {
    929     memset (&control, 0, sizeof (control));
    930     control.id = V4L2_CID_CONTRAST;
    931     /* Decreasing the contrast */
    932     control.value = contrast;
    933 
    934  //   if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
    935  //     perror ("VIDIOC_S_CTRL");
    936  //     return -1;
    937  //   }
    938   }
    939 #endif /* TBD */
    940   return 0;
    941 }
    942 
    943 /*===========================================================================
    944  * FUNCTION     - decrease_contrast -
    945  *
    946  * DESCRIPTION:
    947  * ===========================================================================*/
    948 int decrease_contrast (void) {
    949   --contrast;
    950   if (contrast < CAMERA_MIN_CONTRAST) {
    951     contrast = CAMERA_MIN_CONTRAST;
    952     printf("Reached min CONTRAST. \n");
    953   } else
    954     printf("Decrease CONTRAST to %d\n", contrast);
    955 
    956   /*intrfcCtrl.setContrast(camfd, contrast);*/
    957   struct v4l2_queryctrl queryctrl;
    958   struct v4l2_control control;
    959 
    960   memset (&queryctrl, 0, sizeof (queryctrl));
    961   queryctrl.id = V4L2_CID_CONTRAST;
    962 #if 0 /* TBD */
    963   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
    964     if (errno != EINVAL) {
    965       perror ("VIDIOC_QUERYCTRL");
    966       exit (EXIT_FAILURE);
    967     } else {
    968       printf ("V4L2_CID_contrast is not supported\n");
    969     }
    970   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
    971     printf ("V4L2_CID_contrast is not supported\n");
    972   } else {
    973     memset (&control, 0, sizeof (control));
    974     control.id = V4L2_CID_CONTRAST;
    975     /* Decreasing the contrast */
    976     control.value = contrast;
    977 
    978   //  if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
    979   //    perror ("VIDIOC_S_CTRL");
    980   //    return -1;
    981   //  }
    982   }
    983 #endif /* TBD */
    984   return 0;
    985 }
    986 
    987 /*===========================================================================
    988  * FUNCTION     - decrease_brightness -
    989  *
    990  * DESCRIPTION:
    991  * ===========================================================================*/
    992 int decrease_brightness (void) {
    993   brightness -= CAMERA_BRIGHTNESS_STEP;
    994   if (brightness < CAMERA_MIN_BRIGHTNESS) {
    995     brightness = CAMERA_MIN_BRIGHTNESS;
    996     printf("Reached min BRIGHTNESS. \n");
    997   } else
    998     printf("Decrease BRIGHTNESS to %d\n", brightness);
    999 
   1000   struct v4l2_queryctrl queryctrl;
   1001   struct v4l2_control control;
   1002 
   1003   memset (&queryctrl, 0, sizeof (queryctrl));
   1004   queryctrl.id = V4L2_CID_BRIGHTNESS;
   1005 #if 0 /* TBD */
   1006   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
   1007     if (errno != EINVAL) {
   1008       perror ("VIDIOC_QUERYCTRL");
   1009       exit (EXIT_FAILURE);
   1010     } else {
   1011       printf ("V4L2_CID_BRIGHTNESS is not supported\n");
   1012     }
   1013   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
   1014     printf ("V4L2_CID_BRIGHTNESS is not supported\n");
   1015   } else {
   1016     memset (&control, 0, sizeof (control));
   1017     control.id = V4L2_CID_BRIGHTNESS;
   1018     /* Decreasing the Brightness */
   1019     control.value = brightness;
   1020 
   1021     if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
   1022       perror ("VIDIOC_S_CTRL");
   1023       return -1;
   1024     }
   1025   }
   1026 #endif /* TBD */
   1027   return 0;
   1028 }
   1029 
   1030 /*===========================================================================
   1031  * FUNCTION     - increase_brightness -
   1032  *
   1033  * DESCRIPTION:
   1034  * ===========================================================================*/
   1035 int increase_brightness (void) {
   1036   brightness += CAMERA_BRIGHTNESS_STEP;
   1037   if (brightness > CAMERA_MAX_BRIGHTNESS) {
   1038     brightness = CAMERA_MAX_BRIGHTNESS;
   1039     printf("Reached max BRIGHTNESS. \n");
   1040   } else
   1041     printf("Increase BRIGHTNESS to %d\n", brightness);
   1042 
   1043   struct v4l2_queryctrl queryctrl;
   1044   struct v4l2_control control;
   1045 
   1046   memset (&queryctrl, 0, sizeof (queryctrl));
   1047   queryctrl.id = V4L2_CID_BRIGHTNESS;
   1048 #if 0 /* TBD */
   1049   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
   1050     if (errno != EINVAL) {
   1051       perror ("VIDIOC_QUERYCTRL");
   1052       exit (EXIT_FAILURE);
   1053     } else {
   1054       printf ("V4L2_CID_BRIGHTNESS is not supported\n");
   1055     }
   1056   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
   1057     printf ("V4L2_CID_BRIGHTNESS is not supported\n");
   1058   } else {
   1059     memset (&control, 0, sizeof (control));
   1060     control.id = V4L2_CID_BRIGHTNESS;
   1061     /* Increasing the Brightness */
   1062     control.value = brightness;
   1063 
   1064     if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
   1065       perror ("VIDIOC_S_CTRL");
   1066       return -1;
   1067     }
   1068   }
   1069 #endif /* TBD */
   1070   return 0;
   1071 }
   1072 
   1073 /*===========================================================================
   1074  * FUNCTION     - increase_EV -
   1075  *
   1076  * DESCRIPTION:
   1077  * ===========================================================================*/
   1078 int increase_EV (void) {
   1079   int32_t ev = 0;
   1080   if (++ev_num <= 12) {
   1081      ev = (ev_num << 16) | 6;
   1082     printf("Increase EV to %d\n", ev_num);
   1083   } else {
   1084     printf("Reached max EV. \n");
   1085     ev = ev_num;
   1086   }
   1087 
   1088   struct v4l2_queryctrl queryctrl;
   1089   struct v4l2_control control;
   1090 
   1091   memset (&queryctrl, 0, sizeof (queryctrl));
   1092   queryctrl.id = V4L2_CID_EXPOSURE;
   1093 #if 0 /* TBD */
   1094   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
   1095     if (errno != EINVAL) {
   1096       perror ("VIDIOC_QUERYCTRL");
   1097       exit (EXIT_FAILURE);
   1098     } else {
   1099       printf ("V4L2_CID_EXPOSURE is not supported\n");
   1100     }
   1101   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
   1102     printf ("V4L2_CID_EXPOSURE is not supported\n");
   1103   } else {
   1104     memset (&control, 0, sizeof (control));
   1105     control.id = V4L2_CID_EXPOSURE;
   1106     /* Increasing the EV*/
   1107     control.value = ev;
   1108 
   1109     if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
   1110       perror ("VIDIOC_S_CTRL");
   1111       return -1;
   1112     }
   1113   }
   1114 #endif /* TBD */
   1115   return 0;
   1116 }
   1117 
   1118 /*===========================================================================
   1119  * FUNCTION     - decrease_EV -
   1120  *
   1121  * DESCRIPTION:
   1122  * ===========================================================================*/
   1123 int decrease_EV (void) {
   1124   int32_t ev = 0;
   1125   if (--ev_num > -12) {
   1126     ev = (ev_num << 16) | 6;
   1127     printf("Decrease EV to %d\n", ev_num);
   1128   } else {
   1129     printf("Reached min EV. \n");
   1130     ev = ev_num;
   1131   }
   1132 
   1133   struct v4l2_queryctrl queryctrl;
   1134   struct v4l2_control control;
   1135 
   1136   memset (&queryctrl, 0, sizeof (queryctrl));
   1137   queryctrl.id = V4L2_CID_EXPOSURE;
   1138 #if 0 /* TBD */
   1139   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
   1140     if (errno != EINVAL) {
   1141       perror ("VIDIOC_QUERYCTRL");
   1142       exit (EXIT_FAILURE);
   1143     } else {
   1144       printf ("V4L2_CID_EXPOSURE is not supported\n");
   1145     }
   1146   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
   1147     printf ("V4L2_CID_EXPOSURE is not supported\n");
   1148   } else {
   1149     memset (&control, 0, sizeof (control));
   1150     control.id = V4L2_CID_EXPOSURE;
   1151     /* Increasing the EV*/
   1152     control.value = ev;
   1153 
   1154     if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
   1155       perror ("VIDIOC_S_CTRL");
   1156       return -1;
   1157     }
   1158   }
   1159 #endif /* TBD */
   1160   return 0;
   1161 }
   1162 
   1163 /*===========================================================================
   1164  * FUNCTION     - increase_contrast -
   1165  *
   1166  * DESCRIPTION:
   1167  * ===========================================================================*/
   1168 int increase_saturation (void) {
   1169   ++saturation;
   1170   if (saturation > CAMERA_MAX_SATURATION) {
   1171     saturation = CAMERA_MAX_SATURATION;
   1172     printf("Reached max saturation. \n");
   1173   } else
   1174     printf("Increase saturation to %d\n", saturation);
   1175 
   1176   /*intrfcCtrl.setContrast(camfd, contrast);*/
   1177 
   1178   struct v4l2_queryctrl queryctrl;
   1179   struct v4l2_control control;
   1180 
   1181   memset (&queryctrl, 0, sizeof (queryctrl));
   1182   queryctrl.id = V4L2_CID_SATURATION;
   1183 #if 0 /* TBD */
   1184   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
   1185     if (errno != EINVAL) {
   1186       perror ("VIDIOC_QUERYCTRL");
   1187       exit (EXIT_FAILURE);
   1188     } else {
   1189       printf ("V4L2_CID_saturation is not supported\n");
   1190     }
   1191   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
   1192     printf ("V4L2_CID_saturation is not supported\n");
   1193   } else {
   1194     memset (&control, 0, sizeof (control));
   1195     control.id = V4L2_CID_SATURATION;
   1196     /* Decreasing the contrast */
   1197     control.value = saturation;
   1198 
   1199     if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
   1200       perror ("VIDIOC_S_CTRL");
   1201       return -1;
   1202     }
   1203   }
   1204 #endif /* TBD */
   1205   return 0;
   1206 }
   1207 
   1208 /*===========================================================================
   1209  * FUNCTION     - decrease_saturation -
   1210  *
   1211  * DESCRIPTION:
   1212  * ===========================================================================*/
   1213 int decrease_saturation (void) {
   1214   --saturation;
   1215   if (saturation < CAMERA_MIN_SATURATION) {
   1216     saturation = CAMERA_MIN_SATURATION;
   1217     printf("Reached min saturation. \n");
   1218   } else
   1219     printf("Decrease saturation to %d\n", saturation);
   1220 
   1221   /*intrfcCtrl.setContrast(camfd, contrast);*/
   1222   struct v4l2_queryctrl queryctrl;
   1223   struct v4l2_control control;
   1224 
   1225   memset (&queryctrl, 0, sizeof (queryctrl));
   1226   queryctrl.id = V4L2_CID_SATURATION;
   1227 #if 0 /* TBD */
   1228   if (-1 == ioctl (camfd, VIDIOC_QUERYCTRL, &queryctrl)) {
   1229     if (errno != EINVAL) {
   1230       perror ("VIDIOC_QUERYCTRL");
   1231       exit (EXIT_FAILURE);
   1232     } else {
   1233       printf ("V4L2_CID_saturation is not supported\n");
   1234     }
   1235   } else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
   1236     printf ("V4L2_CID_saturation is not supported\n");
   1237   } else {
   1238     memset (&control, 0, sizeof (control));
   1239     control.id = V4L2_CID_SATURATION;
   1240     /* Decreasing the contrast */
   1241     control.value = saturation;
   1242 
   1243     if (-1 == ioctl (camfd, VIDIOC_S_CTRL, &control)) {
   1244       perror ("VIDIOC_S_CTRL");
   1245       return -1;
   1246     }
   1247   }
   1248 #endif /* TBD */
   1249   return 0;
   1250 }
   1251 
   1252 int takePicture_yuv(int cam_id)
   1253 {
   1254   int rc = 0;
   1255   CDBG("%s:BEGIN\n", __func__);
   1256   if(0 != (rc = mm_app_take_picture(cam_id))) {
   1257     CDBG_ERROR("%s: mm_app_take_picture() err=%d\n", __func__, rc);
   1258   }
   1259   return rc;
   1260 }
   1261 
   1262 int takePicture_zsl(int cam_id)
   1263 {
   1264   int rc = 0;
   1265   CDBG("%s:BEGIN\n", __func__);
   1266   if(0 != (rc = mm_app_take_zsl(cam_id))) {
   1267     CDBG_ERROR("%s: mm_app_take_picture() err=%d\n", __func__, rc);
   1268   }
   1269   return rc;
   1270 }
   1271 
   1272 int takePicture_live(int cam_id)
   1273 {
   1274   int rc = 0;
   1275   CDBG("%s:BEGIN\n", __func__);
   1276   if(0 != (rc = mm_app_take_live_snapshot(cam_id))) {
   1277     CDBG_ERROR("%s: mm_app_take_picture() err=%d\n", __func__, rc);
   1278   }
   1279   return rc;
   1280 }
   1281 
   1282 int takePicture_raw(int cam_id)
   1283 {
   1284   int rc = 0;
   1285   CDBG("%s:BEGIN\n", __func__);
   1286   if(0 != (rc = mm_app_take_raw(cam_id))) {
   1287     CDBG("%s: mm_app_take_raw_picture() err=%d\n", __func__, rc);
   1288   }
   1289   return rc;
   1290 }
   1291 int system_dimension_set(int cam_id)
   1292 {
   1293   static cam_ctrl_dimension_t dim;
   1294   int rc = 0;
   1295 
   1296   if (preview_video_resolution_flag == 0) {
   1297     mm_app_set_dim_def(&dim);
   1298   } else {
   1299     dim.video_width = input_display.user_input_display_width;
   1300     dim.video_width = CEILING32(dim.video_width);
   1301     dim.video_height = input_display.user_input_display_height;
   1302     dim.orig_video_width = dim.video_width;
   1303     dim.orig_video_height = dim.video_height;
   1304     dim.display_width = dim.video_width;
   1305     dim.display_height = dim.video_height;
   1306   }
   1307   rc = mm_app_set_dim(cam_id, &dim);
   1308   return rc;
   1309 }
   1310 
   1311 /*int run_test_harness()
   1312 {
   1313     int good_test_cnt = 0;
   1314 
   1315     rc = run_test_1();
   1316     if(rc < 0)
   1317         CDBG_EROR("%s: run_test_1 err = %d", __func__, rc);
   1318     rc = run_test_2();
   1319 }*/
   1320 /*===========================================================================
   1321  * FUNCTION    - main -
   1322  *
   1323  * DESCRIPTION:
   1324  *==========================================================================*/
   1325 int main(int argc, char **argv)
   1326 {
   1327   int keep_on_going = 1;
   1328   int c, rc = 0, tmp_fd;
   1329   int run_tc = 0;
   1330   int run_dual_tc = 0;
   1331   struct v4l2_capability v4l2_cap;
   1332 
   1333   /* get v4l2 params - memory type etc */
   1334   while ((c = getopt(argc, argv, "tdh")) != -1) {
   1335     //printf("usage: %s [-m] [-u] [-o]\n", argv[1]);
   1336     switch (c) {
   1337 #if 0
   1338       case 'm':
   1339         memoryType = V4L2_MEMORY_MMAP;
   1340         break;
   1341 
   1342       case 'o':
   1343         /*use_overlay_fb_display_driver();*/
   1344         break;
   1345       case 'u':
   1346         memoryType = V4L2_MEMORY_USERPTR;
   1347         break;
   1348 #endif
   1349       case 't':
   1350         run_tc = 1;
   1351         break;
   1352       case 'd':
   1353         run_dual_tc = 1;
   1354         break;
   1355       case 'h':
   1356       default:
   1357         printf("usage: %s [-m] [-u] [-o]\n", argv[0]);
   1358         printf("-m:   V4L2_MEMORY_MMAP.      \n");
   1359         printf("-o:   use overlay fb display driver\n");
   1360         printf("-u:   V4L2_MEMORY_USERPTR\n");
   1361         exit(0);
   1362     }
   1363   }
   1364 
   1365   CDBG("\nCamera Test Application\n");
   1366 
   1367   struct timeval tdBeforePreviewVideo, tdStopCamera;
   1368   struct timezone tz;
   1369 
   1370   //return run_test_harness();
   1371   if((rc = mm_app_load_hal())) {
   1372     CDBG_ERROR("%s:mm_app_init err=%d\n", __func__, rc);
   1373     exit(-1);
   1374   }
   1375     /* we must init mm_app first */
   1376   if(mm_app_init() != MM_CAMERA_OK) {
   1377     CDBG_ERROR("%s:mm_app_init err=%d\n", __func__, rc);
   1378     exit(-1);
   1379   }
   1380 
   1381   if(run_tc) {
   1382     printf("\tRunning unit test engine only\n");
   1383     rc = mm_app_unit_test();
   1384     printf("\tUnit test engine. EXIT(%d)!!!\n", rc);
   1385     exit(rc);
   1386   }
   1387 
   1388   if(run_dual_tc) {
   1389     printf("\tRunning Dual camera test engine only\n");
   1390     rc = mm_app_dual_test();
   1391     printf("\t Dual camera engine. EXIT(%d)!!!\n", rc);
   1392     exit(rc);
   1393   }
   1394 
   1395   gettimeofday(&tdBeforePreviewVideo, &tz);
   1396 
   1397   CDBG("Profiling: Start Camera timestamp = %ld ms\n",
   1398     (tdBeforePreviewVideo.tv_sec * 1000) + (tdBeforePreviewVideo.tv_usec/1000));
   1399 
   1400   /* launch the primary camera in default mode */
   1401   if( mm_app_open(CAMERA_OPENED)) {
   1402     CDBG_ERROR("%s:mm_app_open() err=%d\n",__func__, rc);
   1403     exit(-2);
   1404   }
   1405 
   1406   /* main loop doing the work*/
   1407   do {
   1408     keep_on_going = submain();
   1409   } while ( keep_on_going );
   1410 
   1411   /* Clean up and exit. */
   1412   CDBG("Exiting the app\n");
   1413 
   1414 error_ionfd_open:
   1415   mm_app_close(CAMERA_OPENED);
   1416 
   1417   gettimeofday(&tdStopCamera, &tz);
   1418   CDBG("Exiting application\n");
   1419   CDBG("Profiling: Stop camera end timestamp = %ld ms\n",
   1420       (tdStopCamera.tv_sec * 1000) + (tdStopCamera.tv_usec/1000));
   1421 
   1422   return 0;
   1423 }
   1424 
   1425 
   1426 /*===========================================================================
   1427  * FUNCTION     - submain -
   1428  *
   1429  * DESCRIPTION:
   1430  * ===========================================================================*/
   1431 static int submain()
   1432 {
   1433   int rc = 0;
   1434   int back_mainflag = 0;
   1435   char tc_buf[3];
   1436   int stop_preview = 1;
   1437   menu_id_change_t current_menu_id = MENU_ID_MAIN, next_menu_id;
   1438   camera_action_t action_id;
   1439   int action_param;
   1440   int i;
   1441   int cam_id;
   1442 
   1443   CDBG("%s:E", __func__);
   1444   struct timeval tdStopCamera;
   1445   struct timezone tz;
   1446 
   1447   cam_id = my_cam_app.cam_open;
   1448 
   1449   rc = system_dimension_set(cam_id);
   1450   CDBG("Start Preview");
   1451   if( 0 != (rc = startPreview(cam_id))) {
   1452     CDBG("%s: startPreview() err=%d\n", __func__, rc);
   1453     return 0;
   1454   }
   1455 
   1456   do {
   1457     print_current_menu (current_menu_id);
   1458     fgets(tc_buf, 3, stdin);
   1459 
   1460     next_menu_id = next_menu(current_menu_id, tc_buf[0], &action_id, &action_param);
   1461 
   1462     if (next_menu_id != MENU_ID_INVALID) {
   1463       current_menu_id = next_menu_id;
   1464     }
   1465     if (action_id == ACTION_NO_ACTION) {
   1466       continue;
   1467     }
   1468     if(camframe_status == -1) {
   1469       printf("Preview/Video ERROR condition reported Closing Camera APP\n");
   1470       break;
   1471     }
   1472 
   1473     switch(action_id) {
   1474       case ACTION_STOP_CAMERA:
   1475         CDBG("ACTION_STOP_CAMERA \n");
   1476         stopPreview(cam_id);
   1477         break;
   1478 
   1479       case ACTION_PREVIEW_VIDEO_RESOLUTION:
   1480         back_mainflag = 1;
   1481         CDBG("Selection for the preview/video resolution change\n");
   1482         switchRes(cam_id);
   1483         preview_video_resolution (action_param);
   1484         break;
   1485       case ACTION_SET_WHITE_BALANCE:
   1486         CDBG("Selection for the White Balance changes\n");
   1487         set_whitebalance(action_param);
   1488         break;
   1489 
   1490       case ACTION_SET_EXP_METERING:
   1491         CDBG("Selection for the Exposure Metering changes\n");
   1492         set_exp_metering(action_param);
   1493         break;
   1494 
   1495       case ACTION_GET_CTRL_VALUE:
   1496         CDBG("Selection for getting control value\n");
   1497         get_ctrl_value(action_param);
   1498         break;
   1499 
   1500       case ACTION_BRIGHTNESS_INCREASE:
   1501         printf("Increase brightness\n");
   1502         increase_brightness();
   1503         break;
   1504 
   1505       case ACTION_BRIGHTNESS_DECREASE:
   1506         printf("Decrease brightness\n");
   1507         decrease_brightness();
   1508         break;
   1509 
   1510       case ACTION_CONTRAST_INCREASE:
   1511         CDBG("Selection for the contrast increase\n");
   1512         increase_contrast ();
   1513         break;
   1514 
   1515       case ACTION_CONTRAST_DECREASE:
   1516         CDBG("Selection for the contrast decrease\n");
   1517         decrease_contrast ();
   1518         break;
   1519 
   1520       case ACTION_EV_INCREASE:
   1521         CDBG("Selection for the EV increase\n");
   1522         increase_EV ();
   1523         break;
   1524 
   1525       case ACTION_EV_DECREASE:
   1526         CDBG("Selection for the EV decrease\n");
   1527         decrease_EV ();
   1528         break;
   1529 
   1530       case ACTION_SATURATION_INCREASE:
   1531         CDBG("Selection for the EV increase\n");
   1532         increase_saturation ();
   1533         break;
   1534 
   1535       case ACTION_SATURATION_DECREASE:
   1536         CDBG("Selection for the EV decrease\n");
   1537         decrease_saturation ();
   1538         break;
   1539 
   1540       case ACTION_TOGGLE_AFR:
   1541         CDBG("Select for auto frame rate toggling\n");
   1542         toggle_afr();
   1543         break;
   1544 
   1545       case ACTION_SET_ISO:
   1546         CDBG("Select for ISO changes\n");
   1547         set_iso(action_param);
   1548         break;
   1549 
   1550       case ACTION_SET_ZOOM:
   1551         CDBG("Selection for the zoom direction changes\n");
   1552         set_zoom(action_param);
   1553         break;
   1554 
   1555       case ACTION_SHARPNESS_INCREASE:
   1556         CDBG("Selection for sharpness increase\n");
   1557         increase_sharpness();
   1558         break;
   1559 
   1560       case ACTION_SHARPNESS_DECREASE:
   1561         CDBG("Selection for sharpness decrease\n");
   1562         decrease_sharpness();
   1563         break;
   1564 
   1565       case ACTION_TAKE_YUV_SNAPSHOT:
   1566         CDBG("Take YUV snapshot\n");
   1567         if (takePicture_yuv(cam_id) < 0)
   1568           goto ERROR;
   1569         break;
   1570       case ACTION_TAKE_RAW_SNAPSHOT:
   1571         CDBG("Take YUV snapshot\n");
   1572         if (takePicture_raw(cam_id) < 0)
   1573           goto ERROR;
   1574         break;
   1575       case ACTION_START_RECORDING:
   1576         CDBG("Start recording action\n");
   1577         if (startRecording(cam_id) < 0)
   1578           goto ERROR;
   1579         break;
   1580       case ACTION_STOP_RECORDING:
   1581         CDBG("Stop recording action\n");
   1582         if (stopRecording(cam_id) < 0)
   1583           goto ERROR;
   1584         break;
   1585       case ACTION_NO_ACTION:
   1586         printf("Go back to main menu");
   1587         break;
   1588       case ACTION_SWITCH_CAMERA:
   1589         CDBG("Toggle Camera action\n");
   1590         back_mainflag = 1;
   1591         switchCamera(action_param - 1);
   1592         break;
   1593 
   1594       case ACTION_TAKE_ZSL_SNAPSHOT:
   1595         CDBG("Take ZSL snapshot\n");
   1596         if (takePicture_zsl(cam_id) < 0)
   1597         {
   1598           CDBG("Error");
   1599           goto ERROR;
   1600         }
   1601         break;
   1602       case ACTION_START_RDI:
   1603 		CDBG("Start RDI Stream\n");
   1604 		startRdi(cam_id);
   1605 		break;
   1606 	  case ACTION_STOP_RDI:
   1607 		CDBG("Stop RDI Stream\n");
   1608 		stopRdi(cam_id);
   1609 		break;
   1610       case ACTION_TAKE_LIVE_SNAPSHOT:
   1611         CDBG("Take Live snapshot\n");
   1612         if (takePicture_live(cam_id) < 0)
   1613         {
   1614           CDBG("Error");
   1615           goto ERROR;
   1616         }
   1617         break;
   1618 
   1619       default:
   1620         printf("\n\n!!!!!WRONG INPUT: %d!!!!\n", action_id);
   1621         break;
   1622     }
   1623 
   1624     usleep(1000 * 1000);
   1625     CDBG("action_id = %d\n", action_id);
   1626     camframe_status = 0;
   1627 
   1628   } while ((action_id != ACTION_STOP_CAMERA) &&
   1629       (action_id != ACTION_PREVIEW_VIDEO_RESOLUTION) && (action_id !=ACTION_SWITCH_CAMERA));
   1630   action_id = ACTION_NO_ACTION;
   1631 
   1632   //system_destroy();
   1633 
   1634 
   1635   return back_mainflag;
   1636 
   1637 ERROR:
   1638   back_mainflag = 0;
   1639   return back_mainflag;
   1640 }
   1641 
   1642 
   1643 /*===========================================================================
   1644  * FUNCTION     - preview_resolution -
   1645  *
   1646  * DESCRIPTION:
   1647  * ===========================================================================*/
   1648 int preview_video_resolution (int preview_video_action_param) {
   1649   char * resolution_name;
   1650   CDBG("Selecting the action for preview/video resolution = %d \n", preview_video_action_param);
   1651   resolution_name = set_preview_video_dimension_tbl(preview_video_action_param,
   1652                       & input_display.user_input_display_width,
   1653                       & input_display.user_input_display_height);
   1654 
   1655   CDBG("Selected preview/video resolution is %s\n", resolution_name);
   1656 
   1657   if (resolution_name == NULL) {
   1658     CDBG("main:%d set_preview_dimension failed!\n", __LINE__);
   1659     goto ERROR;
   1660   }
   1661 
   1662   CDBG("Selected Preview Resolution: display_width = %d, display_height = %d\n",
   1663     input_display.user_input_display_width, input_display.user_input_display_height);
   1664 
   1665   preview_video_resolution_flag = 1;
   1666   return 0;
   1667 
   1668 ERROR:
   1669   return -1;
   1670 }
   1671 
   1672 /*===========================================================================
   1673  * FUNCTION     - set_whitebalance -
   1674  *
   1675  * DESCRIPTION:
   1676  * ===========================================================================*/
   1677 int set_whitebalance (int wb_action_param) {
   1678 
   1679     int rc = 0;
   1680     struct v4l2_control ctrl_awb, ctrl_temperature;
   1681 
   1682     ctrl_awb.id = V4L2_CID_AUTO_WHITE_BALANCE;
   1683     ctrl_awb.id = V4L2_CID_WHITE_BALANCE_TEMPERATURE;
   1684 
   1685     switch (wb_action_param) {
   1686     case CAMERA_WB_INCANDESCENT:
   1687         ctrl_awb.value = FALSE;
   1688         ctrl_temperature.value = 2800;
   1689         break;
   1690     case CAMERA_WB_DAYLIGHT:
   1691         ctrl_awb.value = FALSE;
   1692         ctrl_temperature.value = 6500;
   1693 	break;
   1694     case CAMERA_WB_FLUORESCENT:
   1695         ctrl_awb.value = FALSE;
   1696 	ctrl_temperature.value = 4200;
   1697 	break;
   1698     case CAMERA_WB_CLOUDY_DAYLIGHT:
   1699         ctrl_awb.value = FALSE;
   1700 	ctrl_temperature.value = 7500;
   1701 	break;
   1702     case CAMERA_WB_AUTO:
   1703     default:
   1704         ctrl_awb.value = TRUE;
   1705         break;
   1706     }
   1707 
   1708 DONE:
   1709     return rc;
   1710 }
   1711 
   1712 
   1713 /*===========================================================================
   1714  * FUNCTION     - set_exp_metering -
   1715  *
   1716  * DESCRIPTION:
   1717  * ===========================================================================*/
   1718 int set_exp_metering (int exp_metering_action_param) {
   1719 
   1720 	int rc = 0;
   1721 	struct v4l2_control ctrl;
   1722 
   1723   ctrl.id = MSM_V4L2_PID_EXP_METERING;
   1724   ctrl.value = exp_metering_action_param;
   1725  // rc = ioctl(camfd, VIDIOC_S_CTRL, &ctrl);
   1726 
   1727   return rc;
   1728 }
   1729 
   1730 int get_ctrl_value (int ctrl_value_mode_param){
   1731 
   1732     int rc = 0;
   1733     struct v4l2_control ctrl;
   1734 
   1735     if (ctrl_value_mode_param == WHITE_BALANCE_STATE) {
   1736         printf("You chose WHITE_BALANCE_STATE\n");
   1737         ctrl.id = V4L2_CID_AUTO_WHITE_BALANCE;
   1738     }
   1739     else if (ctrl_value_mode_param == WHITE_BALANCE_TEMPERATURE) {
   1740         printf("You chose WHITE_BALANCE_TEMPERATURE\n");
   1741         ctrl.id = V4L2_CID_WHITE_BALANCE_TEMPERATURE;
   1742     }
   1743     else if (ctrl_value_mode_param == BRIGHTNESS_CTRL) {
   1744         printf("You chose brightness value\n");
   1745         ctrl.id = V4L2_CID_BRIGHTNESS;
   1746     }
   1747     else if (ctrl_value_mode_param == EV) {
   1748         printf("You chose exposure value\n");
   1749         ctrl.id = V4L2_CID_EXPOSURE;
   1750     }
   1751     else if (ctrl_value_mode_param == CONTRAST_CTRL) {
   1752         printf("You chose contrast value\n");
   1753         ctrl.id = V4L2_CID_CONTRAST;
   1754     }
   1755     else if (ctrl_value_mode_param == SATURATION_CTRL) {
   1756         printf("You chose saturation value\n");
   1757         ctrl.id = V4L2_CID_SATURATION;
   1758     } else if (ctrl_value_mode_param == SHARPNESS_CTRL) {
   1759         printf("You chose sharpness value\n");
   1760         ctrl.id = V4L2_CID_SHARPNESS;
   1761     }
   1762 
   1763   //  rc = ioctl(camfd, VIDIOC_G_CTRL, &ctrl);
   1764 
   1765     return rc;
   1766 }
   1767 
   1768 /*===========================================================================
   1769  * FUNCTION     - toggle_afr -
   1770  *
   1771  * DESCRIPTION:
   1772  * ===========================================================================*/
   1773 int toggle_afr () {
   1774   int rc = 0;
   1775   struct v4l2_control ctrl;
   1776 
   1777   memset(&ctrl, 0, sizeof(ctrl));
   1778   ctrl.id = V4L2_CID_EXPOSURE_AUTO;
   1779 //  rc = ioctl(camfd, VIDIOC_G_CTRL, &ctrl);
   1780   if (rc == -1) {
   1781     CDBG("%s: VIDIOC_G_CTRL V4L2_CID_EXPOSURE_AUTO failed: %s\n",
   1782         __func__, strerror(errno));
   1783     return rc;
   1784   }
   1785 
   1786   /* V4L2_CID_EXPOSURE_AUTO needs to be AUTO or SHUTTER_PRIORITY */
   1787   if (ctrl.value != V4L2_EXPOSURE_AUTO &&
   1788     ctrl.value != V4L2_EXPOSURE_SHUTTER_PRIORITY) {
   1789     CDBG("%s: V4L2_CID_EXPOSURE_AUTO needs to be AUTO/SHUTTER_PRIORITY\n",
   1790         __func__);
   1791     return -1;
   1792   }
   1793 
   1794   /* Get V4L2_CID_EXPOSURE_AUTO_PRIORITY */
   1795   memset(&ctrl, 0, sizeof(ctrl));
   1796   ctrl.id = V4L2_CID_EXPOSURE_AUTO_PRIORITY;
   1797  // rc = ioctl(camfd, VIDIOC_G_CTRL, &ctrl);
   1798   if (rc == -1) {
   1799     CDBG("%s: VIDIOC_G_CTRL V4L2_CID_EXPOSURE_AUTO_PRIORITY failed: %s\n",
   1800         __func__, strerror(errno));
   1801     return rc;
   1802   }
   1803 
   1804   ctrl.value = !ctrl.value;
   1805   printf("V4L2_CID_EXPOSURE_AUTO_PRIORITY changed to %d\n", ctrl.value);
   1806  // rc = ioctl(camfd, VIDIOC_S_CTRL, &ctrl);
   1807   if (rc == -1) {
   1808     CDBG("%s: VIDIOC_S_CTRL V4L2_CID_EXPOSURE_AUTO_PRIORITY failed: %s\n",
   1809       __func__, strerror(errno));
   1810   }
   1811   return rc;
   1812 }
   1813 
   1814 int set_zoom (int zoom_action_param) {
   1815     int rc = 0;
   1816     struct v4l2_control ctrl;
   1817 
   1818     if (zoom_action_param == ZOOM_IN) {
   1819         zoom_level += zoom_queryctrl.step;
   1820         if (zoom_level > zoom_queryctrl.maximum)
   1821             zoom_level = zoom_queryctrl.maximum;
   1822     } else if (zoom_action_param == ZOOM_OUT) {
   1823         zoom_level -= zoom_queryctrl.step;
   1824         if (zoom_level < zoom_queryctrl.minimum)
   1825             zoom_level = zoom_queryctrl.minimum;
   1826     } else {
   1827         CDBG("%s: Invalid zoom_action_param value\n", __func__);
   1828         return -EINVAL;
   1829     }
   1830     ctrl.id = V4L2_CID_ZOOM_ABSOLUTE;
   1831     ctrl.value = zoom_level;
   1832   //  rc = ioctl(camfd, VIDIOC_S_CTRL, &ctrl);
   1833 
   1834     return rc;
   1835 }
   1836 
   1837 /*===========================================================================
   1838  * FUNCTION     - set_iso -
   1839  *
   1840  * DESCRIPTION:
   1841  * ===========================================================================*/
   1842 int set_iso (int iso_action_param) {
   1843     int rc = 0;
   1844     struct v4l2_control ctrl;
   1845 
   1846     ctrl.id = MSM_V4L2_PID_ISO;
   1847     ctrl.value = iso_action_param - 1;
   1848   //  rc = ioctl(camfd, VIDIOC_S_CTRL, &ctrl);
   1849 
   1850     return rc;
   1851 }
   1852 
   1853 /*===========================================================================
   1854  * FUNCTION     - increase_sharpness -
   1855  *
   1856  * DESCRIPTION:
   1857  * ===========================================================================*/
   1858 int increase_sharpness () {
   1859     int rc = 0;
   1860     struct v4l2_control ctrl;
   1861 
   1862     sharpness += sharpness_queryctrl.step;
   1863     if (sharpness > sharpness_queryctrl.maximum)
   1864         sharpness = sharpness_queryctrl.maximum;
   1865 
   1866     ctrl.id = V4L2_CID_SHARPNESS;
   1867     ctrl.value = sharpness;
   1868  //   rc = ioctl(camfd, VIDIOC_S_CTRL, &ctrl);
   1869 
   1870     return rc;
   1871 }
   1872 
   1873 /*===========================================================================
   1874  * FUNCTION     - decrease_sharpness -
   1875  *
   1876  * DESCRIPTION:
   1877  * ===========================================================================*/
   1878 int decrease_sharpness () {
   1879     int rc = 0;
   1880     struct v4l2_control ctrl;
   1881 
   1882     sharpness -= sharpness_queryctrl.step;
   1883     if (sharpness < sharpness_queryctrl.minimum)
   1884         sharpness = sharpness_queryctrl.minimum;
   1885 
   1886     ctrl.id = V4L2_CID_SHARPNESS;
   1887     ctrl.value = sharpness;
   1888   //  rc = ioctl(camfd, VIDIOC_S_CTRL, &ctrl);
   1889 
   1890     return rc;
   1891 }
   1892 
   1893 /*===========================================================================
   1894  * FUNCTION     - print_current_menu -
   1895  *
   1896  * DESCRIPTION:
   1897  * ===========================================================================*/
   1898 int print_current_menu (menu_id_change_t current_menu_id) {
   1899   if (current_menu_id == MENU_ID_MAIN) {
   1900     print_menu_preview_video ();
   1901   } else if (current_menu_id == MENU_ID_PREVIEWVIDEORESOLUTIONCHANGE) {
   1902     camera_preview_video_resolution_change_tbl ();
   1903   }else if (current_menu_id == MENU_ID_WHITEBALANCECHANGE) {
   1904     camera_preview_video_wb_change_tbl();
   1905   } else if (current_menu_id == MENU_ID_EXPMETERINGCHANGE) {
   1906     camera_preview_video_exp_metering_change_tbl();
   1907   } else if (current_menu_id == MENU_ID_GET_CTRL_VALUE) {
   1908     camera_preview_video_get_ctrl_value_tbl();
   1909   } else if (current_menu_id == MENU_ID_ISOCHANGE) {
   1910     camera_preview_video_iso_change_tbl();
   1911   } else if (current_menu_id == MENU_ID_BRIGHTNESSCHANGE) {
   1912     camera_brightness_change_tbl ();
   1913   } else if (current_menu_id == MENU_ID_CONTRASTCHANGE) {
   1914     camera_contrast_change_tbl ();
   1915   } else if (current_menu_id == MENU_ID_EVCHANGE) {
   1916     camera_EV_change_tbl ();
   1917   } else if (current_menu_id == MENU_ID_SATURATIONCHANGE) {
   1918     camera_saturation_change_tbl ();
   1919   } else if (current_menu_id == MENU_ID_ZOOMCHANGE) {
   1920     camera_preview_video_zoom_change_tbl();
   1921   } else if (current_menu_id == MENU_ID_SHARPNESSCHANGE) {
   1922     camera_preview_video_sharpness_change_tbl();
   1923   }else if (current_menu_id == MENU_ID_SWITCHCAMERA) {
   1924     camera_switch_tbl();
   1925   }else if (current_menu_id == MENU_ID_RECORD) {
   1926     camera_record_tbl();
   1927   }
   1928 
   1929   return 0;
   1930 }
   1931 
   1932