Home | History | Annotate | Download | only in CameraHal
      1 #include <stdlib.h>
      2 #include <unistd.h>
      3 #include <sys/types.h>
      4 #include <sys/stat.h>
      5 #include <fcntl.h>
      6 #include <time.h>
      7 #include <semaphore.h>
      8 #include <pthread.h>
      9 
     10 #include <gui/Surface.h>
     11 #include <gui/SurfaceComposerClient.h>
     12 
     13 #include <camera/Camera.h>
     14 #include <camera/ICamera.h>
     15 #include <media/mediarecorder.h>
     16 
     17 #include <binder/IPCThreadState.h>
     18 #include <binder/ProcessState.h>
     19 #include <binder/IServiceManager.h>
     20 #include <cutils/properties.h>
     21 #include <camera/CameraParameters.h>
     22 #include <system/audio.h>
     23 #include <system/camera.h>
     24 
     25 #include <cutils/memory.h>
     26 #include <utils/Log.h>
     27 
     28 #include <sys/wait.h>
     29 
     30 #include "camera_test.h"
     31 
     32 using namespace android;
     33 
     34 int camera_index = 0;
     35 int print_menu;
     36 sp<Camera> camera;
     37 sp<MediaRecorder> recorder;
     38 sp<SurfaceComposerClient> client;
     39 sp<SurfaceControl> surfaceControl;
     40 sp<Surface> previewSurface;
     41 CameraParameters params;
     42 float compensation = 0.0;
     43 double latitude = 0.0;
     44 double longitude = 0.0;
     45 double degree_by_step = 17.5609756;//..0975609756097;
     46 double altitude = 0.0;
     47 int awb_mode = 0;
     48 int effects_mode = 0;
     49 int scene_mode = 0;
     50 int caf_mode = 0;
     51 int vnf_mode = 0;
     52 int vstab_mode = 0;
     53 
     54 int tempBracketRange = 1;
     55 int tempBracketIdx = 0;
     56 int measurementIdx = 0;
     57 int expBracketIdx = 0;
     58 int AutoConvergenceModeIDX = 0;
     59 int ManualConvergenceValuesIDX = 0;
     60 int ManualConvergenceDefaultValueIDX = 2;
     61 int gbceIDX = 0;
     62 int glbceIDX = 0;
     63 int rotation = 0;
     64 bool reSizePreview = true;
     65 bool hardwareActive = false;
     66 bool recordingMode = false;
     67 bool previewRunning = false;
     68 int saturation = 0;
     69 int zoomIDX = 0;
     70 int videoCodecIDX = 0;
     71 int audioCodecIDX = 0;
     72 int outputFormatIDX = 0;
     73 int contrast = 0;
     74 int brightness = 0;
     75 unsigned int burst = 0;
     76 int sharpness = 0;
     77 int iso_mode = 0;
     78 int capture_mode = 0;
     79 int exposure_mode = 0;
     80 int ippIDX = 0;
     81 int ippIDX_old = 0;
     82 int previewFormat = 0;
     83 int jpegQuality = 85;
     84 int thumbQuality = 85;
     85 int flashIdx = 0;
     86 int fpsRangeIdx = 0;
     87 timeval autofocus_start, picture_start;
     88 char script_name[80];
     89 int prevcnt = 0;
     90 int videoFd = -1;
     91 int elockidx = 0;
     92 int wblockidx = 0;
     93 
     94 
     95 char dir_path[80] = SDCARD_PATH;
     96 
     97 const char *cameras[] = {"Primary Camera", "Secondary Camera 1", "Stereo Camera", "USB Camera", "Fake Camera"};
     98 const char *measurement[] = {"disable", "enable"};
     99 const char *expBracketing[] = {"disable", "enable"};
    100 const char *expBracketingRange[] = {"", "-30,0,30,0,-30"};
    101 const char *tempBracketing[] = {"disable", "enable"};
    102 const char *faceDetection[] = {"disable", "enable"};
    103 const char *lock[] = {"false", "true"};
    104 
    105 #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
    106 const char *ipp_mode[] = { "off", "Chroma Suppression", "Edge Enhancement" };
    107 #else
    108 const char *ipp_mode[] = { "off", "ldc", "nsf", "ldc-nsf" };
    109 #endif
    110 
    111 const char *iso [] = { "auto", "100", "200", "400", "800", "1200", "1600"};
    112 
    113 const char *effects [] = {
    114 #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
    115     "none",
    116     "mono",
    117     "negative",
    118     "solarize",
    119     "sepia",
    120     "whiteboard",
    121     "blackboard",
    122     "cool",
    123     "emboss"
    124 #else
    125     "none",
    126     "mono",
    127     "negative",
    128     "solarize",
    129     "sepia",
    130     "vivid",
    131     "whiteboard",
    132     "blackboard",
    133     "cool",
    134     "emboss",
    135     "blackwhite",
    136     "aqua",
    137     "posterize"
    138 #endif
    139 };
    140 
    141 const char CameraParameters::FLASH_MODE_OFF[] = "off";
    142 const char CameraParameters::FLASH_MODE_AUTO[] = "auto";
    143 const char CameraParameters::FLASH_MODE_ON[] = "on";
    144 const char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
    145 const char CameraParameters::FLASH_MODE_TORCH[] = "torch";
    146 
    147 const char *flashModes[] = {
    148     "off",
    149     "auto",
    150     "on",
    151     "red-eye",
    152     "torch",
    153     "fill-in",
    154 };
    155 
    156 const char *caf [] = { "Off", "On" };
    157 const char *vnf [] = { "Off", "On" };
    158 const char *vstab [] = { "Off", "On" };
    159 
    160 
    161 const char *scene [] = {
    162 #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
    163     "auto",
    164     "portrait",
    165     "landscape",
    166     "night",
    167     "night-portrait",
    168     "fireworks",
    169     "snow",
    170     "action",
    171 #else
    172     "auto",
    173     "portrait",
    174     "landscape",
    175     "night",
    176     "night-portrait",
    177     "night-indoor",
    178     "fireworks",
    179     "sport",
    180     "cine",
    181     "beach",
    182     "snow",
    183     "mood",
    184     "closeup",
    185     "underwater",
    186     "document",
    187     "barcode",
    188     "oldfilm",
    189     "candlelight",
    190     "party",
    191     "steadyphoto",
    192     "sunset",
    193     "action",
    194     "theatre"
    195 #endif
    196 };
    197 const char *strawb_mode[] = {
    198     "auto",
    199     "incandescent",
    200     "fluorescent",
    201     "daylight",
    202     "horizon",
    203     "shadow",
    204     "tungsten",
    205     "shade",
    206     "twilight",
    207     "warm-fluorescent",
    208     "facepriority",
    209     "sunset"
    210 };
    211 
    212 size_t length_cam =  ARRAY_SIZE(cameras);
    213 
    214 
    215 preview_size previewSize [] = {
    216   { 0,   0,  "NULL"},
    217   { 128, 96, "SQCIF" },
    218   { 176, 144, "QCIF" },
    219   { 352, 288, "CIF" },
    220   { 320, 240, "QVGA" },
    221   { 352, 288, "CIF" },
    222   { 640, 480, "VGA" },
    223   { 720, 480, "NTSC" },
    224   { 720, 576, "PAL" },
    225   { 800, 480, "WVGA" },
    226   { 848, 480, "WVGA2"},
    227   { 864, 480, "WVGA3"},
    228   { 992, 560, "WVGA4"},
    229   { 1280, 720, "HD" },
    230   { 1920, 1080, "FULLHD"},
    231 };
    232 
    233 size_t length_previewSize =  ARRAY_SIZE(previewSize);
    234 
    235 Vcapture_size VcaptureSize [] = {
    236   { 128, 96, "SQCIF" },
    237   { 176, 144, "QCIF" },
    238   { 352, 288, "CIF" },
    239   { 320, 240, "QVGA" },
    240   { 640, 480, "VGA" },
    241   { 704, 480, "TVNTSC" },
    242   { 704, 576, "TVPAL" },
    243   { 720, 480, "D1NTSC" },
    244   { 720, 576, "D1PAL" },
    245   { 800, 480, "WVGA" },
    246   #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
    247   { 848, 480, "WVGA2"},
    248   { 864, 480, "WVGA3"},
    249   { 992, 560, "WVGA4"},
    250   #endif
    251   { 1280, 720, "HD" },
    252   { 1920, 1080, "FULLHD"},
    253 };
    254 
    255 size_t lenght_Vcapture_size = ARRAY_SIZE(VcaptureSize);
    256 
    257 capture_Size captureSize[] = {
    258   {  320, 240,  "QVGA" },
    259   {  640, 480,  "VGA" },
    260   {  800, 600,  "SVGA" },
    261   { 1152, 864,  "1MP" },
    262   { 1280, 1024, "1.3MP" },
    263   { 1600, 1200,  "2MP" },
    264   { 2048, 1536,  "3MP" },
    265   { 2592, 1944,  "5MP" },
    266   { 2608, 1960,  "5MP" },
    267   { 3264, 2448,  "8MP" },
    268   { 3648, 2736, "10MP"},
    269   { 4032, 3024, "12MP"},
    270 };
    271 
    272 size_t length_capture_Size = ARRAY_SIZE(captureSize);
    273 
    274 
    275 outformat outputFormat[] = {
    276         { OUTPUT_FORMAT_THREE_GPP, "3gp" },
    277         { OUTPUT_FORMAT_MPEG_4, "mp4" },
    278     };
    279 
    280 size_t length_outformat = ARRAY_SIZE(outputFormat);
    281 
    282 video_Codecs videoCodecs[] = {
    283   { VIDEO_ENCODER_H263, "H263" },
    284   { VIDEO_ENCODER_H264, "H264" },
    285   { VIDEO_ENCODER_MPEG_4_SP, "MPEG4"}
    286 };
    287 
    288 size_t length_video_Codecs = ARRAY_SIZE(videoCodecs);
    289 
    290 audio_Codecs audioCodecs[] = {
    291   { AUDIO_ENCODER_AMR_NB, "AMR_NB" },
    292   { AUDIO_ENCODER_AMR_WB, "AMR_WB" },
    293   { AUDIO_ENCODER_AAC, "AAC" },
    294   { AUDIO_ENCODER_HE_AAC, "AAC+" },
    295   { AUDIO_ENCODER_LIST_END, "disabled"},
    296 };
    297 
    298 size_t length_audio_Codecs = ARRAY_SIZE(audioCodecs);
    299 
    300 V_bitRate VbitRate[] = {
    301   {    64000, "64K"  },
    302   {   128000, "128K" },
    303   {   192000, "192K" },
    304   {   240000, "240K" },
    305   {   320000, "320K" },
    306   {   360000, "360K" },
    307   {   384000, "384K" },
    308   {   420000, "420K" },
    309   {   768000, "768K" },
    310   {  1000000, "1M"   },
    311   {  1500000, "1.5M" },
    312   {  2000000, "2M"   },
    313   {  4000000, "4M"   },
    314   {  6000000, "6M"   },
    315   {  8000000, "8M"   },
    316   { 10000000, "10M"  },
    317 };
    318 
    319 size_t length_V_bitRate = ARRAY_SIZE(VbitRate);
    320 
    321 Zoom zoom[] = {
    322   { 0,  "1x"  },
    323   { 12, "1.5x"},
    324   { 20, "2x"  },
    325   { 27, "2.5x"},
    326   { 32, "3x"  },
    327   { 36, "3.5x"},
    328   { 40, "4x"  },
    329   { 60, "8x"  },
    330 };
    331 
    332 size_t length_Zoom = ARRAY_SIZE(zoom);
    333 
    334 fps_ranges fpsRanges[] = {
    335   { "5000,30000", "[5:30]" },
    336   { "5000,10000", "[5:10]" },
    337   { "5000,15000", "[5:15]" },
    338   { "5000,20000", "[5:20]" },
    339 };
    340 
    341 size_t length_fps_ranges = ARRAY_SIZE(fpsRanges);
    342 
    343 fpsConst_Ranges fpsConstRanges[] = {
    344   { "5000,5000", "[5:5]", 5 },
    345   { "10000,10000", "[10:10]", 10 },
    346   { "15000,15000", "[15:15]", 15 },
    347   { "20000,20000", "[20:20]", 20 },
    348   { "25000,25000", "[25:25]", 25 },
    349   { "30000,30000", "[30:30]", 30 },
    350 };
    351 
    352 size_t length_fpsConst_Ranges = ARRAY_SIZE(fpsConstRanges);
    353 
    354 fpsConst_RangesSec fpsConstRangesSec[] = {
    355   { "5000,5000", "[5:5]", 5 },
    356   { "10000,10000", "[10:10]", 10 },
    357   { "15000,15000", "[15:15]", 15 },
    358   { "20000,20000", "[20:20]", 20 },
    359   { "25000,25000", "[25:25]", 25 },
    360   { "27000,27000", "[27:27]", 27 },
    361 };
    362 
    363 size_t length_fpsConst_RangesSec = ARRAY_SIZE(fpsConstRangesSec);
    364 
    365 const char *antibanding[] = {
    366     "off",
    367     "auto",
    368     "50hz",
    369     "60hz",
    370 };
    371 int antibanding_mode = 0;
    372 const char *focus[] = {
    373     "auto",
    374     "infinity",
    375     "macro",
    376     "continuous-video",
    377     "extended",
    378     "portrait",
    379 };
    380 int focus_mode = 0;
    381 pixel_format pixelformat[] = {
    382   { HAL_PIXEL_FORMAT_YCbCr_422_I, CameraParameters::PIXEL_FORMAT_YUV422I },
    383   { HAL_PIXEL_FORMAT_YCrCb_420_SP, CameraParameters::PIXEL_FORMAT_YUV420SP },
    384   { HAL_PIXEL_FORMAT_RGB_565, CameraParameters::PIXEL_FORMAT_RGB565 },
    385   { -1, CameraParameters::PIXEL_FORMAT_JPEG },
    386   { -1, "raw" },
    387   };
    388 
    389 const char *codingformat[] = {"yuv422i-yuyv", "yuv420sp", "rgb565", "jpeg", "raw", "jps", "mpo", "raw+jpeg", "raw+mpo"};
    390 const char *gbce[] = {"disable", "enable"};
    391 int pictureFormat = 3; // jpeg
    392 const char *exposure[] = {"auto", "macro", "portrait", "landscape", "sports", "night", "night-portrait", "backlighting", "manual"};
    393 const char *capture[] = { "high-performance", "high-quality", "video-mode" };
    394 const char *autoconvergencemode[] = { "mode-disable", "mode-frame", "mode-center", "mode-fft", "mode-manual" };
    395 const char *manualconvergencevalues[] = { "-100", "-50", "-30", "-25", "0", "25", "50", "100" };
    396 
    397 const struct {
    398     int fps;
    399 } frameRate[] = {
    400     {0},
    401     {5},
    402     {10},
    403     {15},
    404     {20},
    405     {25},
    406     {30}
    407 };
    408 
    409 int thumbSizeIDX =  3;
    410 int previewSizeIDX = ARRAY_SIZE(previewSize) - 1;
    411 int captureSizeIDX = ARRAY_SIZE(captureSize) - 1;
    412 int frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1;
    413 int frameRateIDXSec = ARRAY_SIZE(fpsConstRangesSec) - 1;
    414 int VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 1;
    415 int VbitRateIDX = ARRAY_SIZE(VbitRate) - 1;
    416 
    417 static unsigned int recording_counter = 1;
    418 
    419 int dump_preview = 0;
    420 int bufferStarvationTest = 0;
    421 bool showfps = false;
    422 
    423 const char *metering[] = {
    424     "center",
    425     "average",
    426 };
    427 int meter_mode = 0;
    428 bool bLogSysLinkTrace = true;
    429 bool stressTest = false;
    430 bool stopScript = false;
    431 int restartCount = 0;
    432 
    433 static const String16 processName("camera_test");
    434 
    435 /** Calculate delay from a reference time */
    436 unsigned long long timeval_delay(const timeval *ref) {
    437     unsigned long long st, end, delay;
    438     timeval current_time;
    439 
    440     gettimeofday(&current_time, 0);
    441 
    442     st = ref->tv_sec * 1000000 + ref->tv_usec;
    443     end = current_time.tv_sec * 1000000 + current_time.tv_usec;
    444     delay = end - st;
    445 
    446     return delay;
    447 }
    448 
    449 /** Callback for takePicture() */
    450 void my_raw_callback(const sp<IMemory>& mem) {
    451 
    452     static int      counter = 1;
    453     unsigned char   *buff = NULL;
    454     int             size;
    455     int             fd = -1;
    456     char            fn[256];
    457 
    458     LOG_FUNCTION_NAME;
    459 
    460     if (mem == NULL)
    461         goto out;
    462 
    463     //Start preview after capture.
    464     camera->startPreview();
    465 
    466     fn[0] = 0;
    467     sprintf(fn, "/sdcard/img%03d.raw", counter);
    468     fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777);
    469 
    470     if (fd < 0)
    471         goto out;
    472 
    473     size = mem->size();
    474 
    475     if (size <= 0)
    476         goto out;
    477 
    478     buff = (unsigned char *)mem->pointer();
    479 
    480     if (!buff)
    481         goto out;
    482 
    483     if (size != write(fd, buff, size))
    484         printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
    485 
    486     counter++;
    487     printf("%s: buffer=%08X, size=%d stored at %s\n",
    488            __FUNCTION__, (int)buff, size, fn);
    489 
    490 out:
    491 
    492     if (fd >= 0)
    493         close(fd);
    494 
    495     LOG_FUNCTION_NAME_EXIT;
    496 }
    497 
    498 void saveFile(const sp<IMemory>& mem) {
    499     static int      counter = 1;
    500     unsigned char   *buff = NULL;
    501     int             size;
    502     int             fd = -1;
    503     char            fn[256];
    504 
    505     LOG_FUNCTION_NAME;
    506 
    507     if (mem == NULL)
    508         goto out;
    509 
    510     fn[0] = 0;
    511     sprintf(fn, "/sdcard/preview%03d.yuv", counter);
    512     fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777);
    513     if(fd < 0) {
    514         ALOGE("Unable to open file %s: %s", fn, strerror(fd));
    515         goto out;
    516     }
    517 
    518     size = mem->size();
    519     if (size <= 0) {
    520         ALOGE("IMemory object is of zero size");
    521         goto out;
    522     }
    523 
    524     buff = (unsigned char *)mem->pointer();
    525     if (!buff) {
    526         ALOGE("Buffer pointer is invalid");
    527         goto out;
    528     }
    529 
    530     if (size != write(fd, buff, size))
    531         printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
    532 
    533     counter++;
    534     printf("%s: buffer=%08X, size=%d\n",
    535            __FUNCTION__, (int)buff, size);
    536 
    537 out:
    538 
    539     if (fd >= 0)
    540         close(fd);
    541 
    542     LOG_FUNCTION_NAME_EXIT;
    543 }
    544 
    545 
    546 void debugShowFPS()
    547 {
    548     static int mFrameCount = 0;
    549     static int mLastFrameCount = 0;
    550     static nsecs_t mLastFpsTime = 0;
    551     static float mFps = 0;
    552     mFrameCount++;
    553     if ( ( mFrameCount % 30 ) == 0 ) {
    554         nsecs_t now = systemTime();
    555         nsecs_t diff = now - mLastFpsTime;
    556         mFps =  ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff;
    557         mLastFpsTime = now;
    558         mLastFrameCount = mFrameCount;
    559         printf("####### [%d] Frames, %f FPS", mFrameCount, mFps);
    560     }
    561 }
    562 
    563 /** Callback for startPreview() */
    564 void my_preview_callback(const sp<IMemory>& mem) {
    565 
    566     printf("PREVIEW Callback 0x%x", ( unsigned int ) mem->pointer());
    567     if (dump_preview) {
    568 
    569         if(prevcnt==50)
    570         saveFile(mem);
    571 
    572         prevcnt++;
    573 
    574         uint8_t *ptr = (uint8_t*) mem->pointer();
    575 
    576         printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9]);
    577 
    578     }
    579 
    580     debugShowFPS();
    581 }
    582 
    583 /** Callback for takePicture() */
    584 void my_jpeg_callback(const sp<IMemory>& mem) {
    585     static int  counter = 1;
    586     unsigned char   *buff = NULL;
    587     int     size;
    588     int     fd = -1;
    589     char        fn[256];
    590 
    591     LOG_FUNCTION_NAME;
    592 
    593     //Start preview after capture.
    594     camera->startPreview();
    595 
    596     if (mem == NULL)
    597         goto out;
    598 
    599     fn[0] = 0;
    600     sprintf(fn, "%s/img%03d.jpg", dir_path,counter);
    601     fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777);
    602 
    603     if(fd < 0) {
    604         ALOGE("Unable to open file %s: %s", fn, strerror(fd));
    605         goto out;
    606     }
    607 
    608     size = mem->size();
    609     if (size <= 0) {
    610         ALOGE("IMemory object is of zero size");
    611         goto out;
    612     }
    613 
    614     buff = (unsigned char *)mem->pointer();
    615     if (!buff) {
    616         ALOGE("Buffer pointer is invalid");
    617         goto out;
    618     }
    619 
    620     if (size != write(fd, buff, size))
    621         printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
    622 
    623     counter++;
    624     printf("%s: buffer=%08X, size=%d stored at %s\n",
    625            __FUNCTION__, (int)buff, size, fn);
    626 
    627 out:
    628 
    629     if (fd >= 0)
    630         close(fd);
    631 
    632     LOG_FUNCTION_NAME_EXIT;
    633 }
    634 
    635 void my_face_callback(camera_frame_metadata_t *metadata) {
    636     int idx;
    637 
    638     if ( NULL == metadata ) {
    639         return;
    640     }
    641 
    642     for ( idx = 0 ; idx < metadata->number_of_faces ; idx++ ) {
    643         printf("Face %d at %d,%d %d,%d \n",
    644                idx,
    645                metadata->faces[idx].rect[0],
    646                metadata->faces[idx].rect[1],
    647                metadata->faces[idx].rect[2],
    648                metadata->faces[idx].rect[3]);
    649     }
    650 
    651 }
    652 
    653 void CameraHandler::notify(int32_t msgType, int32_t ext1, int32_t ext2) {
    654 
    655     printf("Notify cb: %d %d %d\n", msgType, ext1, ext2);
    656 
    657     if ( msgType & CAMERA_MSG_FOCUS )
    658         printf("AutoFocus %s in %llu us\n", (ext1) ? "OK" : "FAIL", timeval_delay(&autofocus_start));
    659 
    660     if ( msgType & CAMERA_MSG_SHUTTER )
    661         printf("Shutter done in %llu us\n", timeval_delay(&picture_start));
    662 
    663     if ( msgType & CAMERA_MSG_ERROR && (ext1 == 1))
    664       {
    665         printf("Camera Test CAMERA_MSG_ERROR.....\n");
    666         if (stressTest)
    667           {
    668             printf("Camera Test Notified of Error Restarting.....\n");
    669             stopScript = true;
    670           }
    671         else
    672           {
    673             printf("Camera Test Notified of Error Stopping.....\n");
    674             stopScript =false;
    675             stopPreview();
    676 
    677             if (recordingMode)
    678               {
    679                 stopRecording();
    680                 closeRecorder();
    681                 recordingMode = false;
    682               }
    683           }
    684       }
    685 }
    686 
    687 void CameraHandler::postData(int32_t msgType,
    688                              const sp<IMemory>& dataPtr,
    689                              camera_frame_metadata_t *metadata) {
    690     printf("Data cb: %d\n", msgType);
    691 
    692     if ( msgType & CAMERA_MSG_PREVIEW_FRAME )
    693         my_preview_callback(dataPtr);
    694 
    695     if ( msgType & CAMERA_MSG_RAW_IMAGE ) {
    696         printf("RAW done in %llu us\n", timeval_delay(&picture_start));
    697         my_raw_callback(dataPtr);
    698     }
    699 
    700     if (msgType & CAMERA_MSG_POSTVIEW_FRAME) {
    701         printf("Postview frame %llu us\n", timeval_delay(&picture_start));
    702     }
    703 
    704     if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) {
    705         printf("JPEG done in %llu us\n", timeval_delay(&picture_start));
    706         my_jpeg_callback(dataPtr);
    707     }
    708 
    709     if ( ( msgType & CAMERA_MSG_PREVIEW_METADATA ) &&
    710          ( NULL != metadata ) ) {
    711         printf("Face detected %d \n", metadata->number_of_faces);
    712         my_face_callback(metadata);
    713     }
    714 }
    715 
    716 void CameraHandler::postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
    717 
    718 {
    719     printf("Recording cb: %d %lld %p\n", msgType, timestamp, dataPtr.get());
    720 
    721     static uint32_t count = 0;
    722 
    723     //if(count==100)
    724     //saveFile(dataPtr);
    725 
    726     count++;
    727 
    728     uint8_t *ptr = (uint8_t*) dataPtr->pointer();
    729 
    730     printf("VID_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9]);
    731 
    732     camera->releaseRecordingFrame(dataPtr);
    733 }
    734 
    735 int createPreviewSurface(unsigned int width, unsigned int height, int32_t pixFormat) {
    736     unsigned int previewWidth, previewHeight;
    737 
    738     if ( MAX_PREVIEW_SURFACE_WIDTH < width ) {
    739         previewWidth = MAX_PREVIEW_SURFACE_WIDTH;
    740     } else {
    741         previewWidth = width;
    742     }
    743 
    744     if ( MAX_PREVIEW_SURFACE_HEIGHT < height ) {
    745         previewHeight = MAX_PREVIEW_SURFACE_HEIGHT;
    746     } else {
    747         previewHeight = height;
    748     }
    749 
    750     client = new SurfaceComposerClient();
    751 
    752     if ( NULL == client.get() ) {
    753         printf("Unable to establish connection to Surface Composer \n");
    754 
    755         return -1;
    756     }
    757 
    758     surfaceControl = client->createSurface(String8("camera_test_menu"),
    759                                            previewWidth,
    760                                            previewHeight,
    761                                            pixFormat, 0);
    762 
    763     previewSurface = surfaceControl->getSurface();
    764 
    765     client->openGlobalTransaction();
    766     surfaceControl->setLayer(0x7fffffff);
    767     surfaceControl->setPosition(0, 0);
    768     surfaceControl->setSize(previewWidth, previewHeight);
    769     surfaceControl->show();
    770     client->closeGlobalTransaction();
    771 
    772     return 0;
    773 }
    774 
    775 void printSupportedParams()
    776 {
    777     printf("\n\r\tSupported Cameras: %s", params.get("camera-indexes"));
    778     printf("\n\r\tSupported Picture Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES));
    779     printf("\n\r\tSupported Picture Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS));
    780     printf("\n\r\tSupported Preview Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
    781     printf("\n\r\tSupported Preview Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS));
    782     printf("\n\r\tSupported Preview Frame Rates: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES));
    783     printf("\n\r\tSupported Thumbnail Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES));
    784     printf("\n\r\tSupported Whitebalance Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE));
    785     printf("\n\r\tSupported Effects: %s", params.get(CameraParameters::KEY_SUPPORTED_EFFECTS));
    786     printf("\n\r\tSupported Scene Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES));
    787     printf("\n\r\tSupported Focus Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES));
    788     printf("\n\r\tSupported Antibanding Options: %s", params.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING));
    789     printf("\n\r\tSupported Flash Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES));
    790     printf("\n\r\tSupported Focus Areas: %d", params.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS));
    791 
    792     if ( NULL != params.get(CameraParameters::KEY_FOCUS_DISTANCES) ) {
    793         printf("\n\r\tFocus Distances: %s \n", params.get(CameraParameters::KEY_FOCUS_DISTANCES));
    794     }
    795 
    796     return;
    797 }
    798 
    799 
    800 int destroyPreviewSurface() {
    801 
    802     if ( NULL != previewSurface.get() ) {
    803         previewSurface.clear();
    804     }
    805 
    806     if ( NULL != surfaceControl.get() ) {
    807         surfaceControl->clear();
    808         surfaceControl.clear();
    809     }
    810 
    811     if ( NULL != client.get() ) {
    812         client->dispose();
    813         client.clear();
    814     }
    815 
    816     return 0;
    817 }
    818 
    819 int openRecorder() {
    820     recorder = new MediaRecorder();
    821 
    822     if ( NULL == recorder.get() ) {
    823         printf("Error while creating MediaRecorder\n");
    824 
    825         return -1;
    826     }
    827 
    828     return 0;
    829 }
    830 
    831 int closeRecorder() {
    832     if ( NULL == recorder.get() ) {
    833         printf("invalid recorder reference\n");
    834 
    835         return -1;
    836     }
    837 
    838     if ( recorder->init() < 0 ) {
    839         printf("recorder failed to initialize\n");
    840 
    841         return -1;
    842     }
    843 
    844     if ( recorder->close() < 0 ) {
    845         printf("recorder failed to close\n");
    846 
    847         return -1;
    848     }
    849 
    850     if ( recorder->release() < 0 ) {
    851         printf("error while releasing recorder\n");
    852 
    853         return -1;
    854     }
    855 
    856     recorder.clear();
    857 
    858     return 0;
    859 }
    860 
    861 int configureRecorder() {
    862 
    863     char videoFile[256],vbit_string[50];
    864     videoFd = -1;
    865 
    866     if ( ( NULL == recorder.get() ) || ( NULL == camera.get() ) ) {
    867         printf("invalid recorder and/or camera references\n");
    868 
    869         return -1;
    870     }
    871 
    872     camera->unlock();
    873 
    874     sprintf(vbit_string,"video-param-encoding-bitrate=%u", VbitRate[VbitRateIDX].bit_rate);
    875     String8 bit_rate(vbit_string);
    876     if ( recorder->setParameters(bit_rate) < 0 ) {
    877         printf("error while configuring bit rate\n");
    878 
    879         return -1;
    880     }
    881 
    882     if ( recorder->setCamera(camera->remote(), camera->getRecordingProxy()) < 0 ) {
    883         printf("error while setting the camera\n");
    884 
    885         return -1;
    886     }
    887 
    888     if ( recorder->setVideoSource(VIDEO_SOURCE_CAMERA) < 0 ) {
    889         printf("error while configuring camera video source\n");
    890 
    891         return -1;
    892     }
    893 
    894 
    895     if ( AUDIO_ENCODER_LIST_END != audioCodecs[audioCodecIDX].type ) {
    896         if ( recorder->setAudioSource(AUDIO_SOURCE_DEFAULT) < 0 ) {
    897             printf("error while configuring camera audio source\n");
    898 
    899             return -1;
    900         }
    901     }
    902 
    903     if ( recorder->setOutputFormat(outputFormat[outputFormatIDX].type) < 0 ) {
    904         printf("error while configuring output format\n");
    905 
    906         return -1;
    907     }
    908 
    909     if(mkdir("/mnt/sdcard/videos",0777) == -1)
    910          printf("\n Directory --videos-- was not created \n");
    911     sprintf(videoFile, "/mnt/sdcard/videos/video%d.%s", recording_counter,outputFormat[outputFormatIDX].desc);
    912 
    913     videoFd = open(videoFile, O_CREAT | O_RDWR);
    914 
    915     if(videoFd < 0){
    916         printf("Error while creating video filename\n");
    917 
    918         return -1;
    919     }
    920 
    921     if ( recorder->setOutputFile(videoFd, 0, 0) < 0 ) {
    922         printf("error while configuring video filename\n");
    923 
    924         return -1;
    925     }
    926 
    927     recording_counter++;
    928 
    929     if (camera_index == 0) {
    930         if ( recorder->setVideoFrameRate(fpsConstRanges[frameRateIDX].constFramerate) < 0 ) {
    931             printf("error while configuring video framerate\n");
    932             return -1;
    933         }
    934     }
    935     else  {
    936         if ( recorder->setVideoFrameRate(fpsConstRangesSec[frameRateIDXSec].constFramerate) < 0 ) {
    937             printf("error while configuring video framerate\n");
    938             return -1;
    939         }
    940     }
    941 
    942     if ( recorder->setVideoSize(VcaptureSize[VcaptureSizeIDX].width, VcaptureSize[VcaptureSizeIDX].height) < 0 ) {
    943         printf("error while configuring video size\n");
    944 
    945         return -1;
    946     }
    947 
    948     if ( recorder->setVideoEncoder(videoCodecs[videoCodecIDX].type) < 0 ) {
    949         printf("error while configuring video codec\n");
    950 
    951         return -1;
    952     }
    953 
    954     if ( AUDIO_ENCODER_LIST_END != audioCodecs[audioCodecIDX].type ) {
    955         if ( recorder->setAudioEncoder(audioCodecs[audioCodecIDX].type) < 0 ) {
    956             printf("error while configuring audio codec\n");
    957 
    958             return -1;
    959         }
    960     }
    961 
    962     if ( recorder->setPreviewSurface( surfaceControl->getSurface()->getIGraphicBufferProducer() ) < 0 ) {
    963         printf("error while configuring preview surface\n");
    964 
    965         return -1;
    966     }
    967 
    968     return 0;
    969 }
    970 
    971 int startRecording() {
    972     if ( ( NULL == recorder.get() ) || ( NULL == camera.get() ) ) {
    973         printf("invalid recorder and/or camera references\n");
    974 
    975         return -1;
    976     }
    977 
    978     camera->unlock();
    979 
    980     if ( recorder->prepare() < 0 ) {
    981         printf("recorder prepare failed\n");
    982 
    983         return -1;
    984     }
    985 
    986     if ( recorder->start() < 0 ) {
    987         printf("recorder start failed\n");
    988 
    989         return -1;
    990     }
    991 
    992     return 0;
    993 }
    994 
    995 int stopRecording() {
    996     if ( NULL == recorder.get() ) {
    997         printf("invalid recorder reference\n");
    998 
    999         return -1;
   1000     }
   1001 
   1002     if ( recorder->stop() < 0 ) {
   1003         printf("recorder failed to stop\n");
   1004 
   1005         return -1;
   1006     }
   1007 
   1008     if ( 0 < videoFd ) {
   1009         close(videoFd);
   1010     }
   1011 
   1012     return 0;
   1013 }
   1014 
   1015 int openCamera() {
   1016     printf("openCamera(camera_index=%d)\n", camera_index);
   1017     camera = Camera::connect(camera_index,
   1018             processName,
   1019             Camera::USE_CALLING_UID);
   1020 
   1021     if ( NULL == camera.get() ) {
   1022         printf("Unable to connect to CameraService\n");
   1023         printf("Retrying... \n");
   1024         sleep(1);
   1025         camera = Camera::connect(camera_index,
   1026                 processName,
   1027                 Camera::USE_CALLING_UID);
   1028 
   1029         if ( NULL == camera.get() ) {
   1030             printf("Giving up!! \n");
   1031             return -1;
   1032         }
   1033     }
   1034 
   1035     params = camera->getParameters();
   1036     camera->setParameters(params.flatten());
   1037 
   1038     camera->setListener(new CameraHandler());
   1039 
   1040     hardwareActive = true;
   1041 
   1042     return 0;
   1043 }
   1044 
   1045 int closeCamera() {
   1046     if ( NULL == camera.get() ) {
   1047         printf("invalid camera reference\n");
   1048 
   1049         return -1;
   1050     }
   1051 
   1052     camera->disconnect();
   1053     camera.clear();
   1054 
   1055     hardwareActive = false;
   1056 
   1057     return 0;
   1058 }
   1059 
   1060 int startPreview() {
   1061     int previewWidth, previewHeight;
   1062     if (reSizePreview) {
   1063 
   1064         if(recordingMode)
   1065         {
   1066             previewWidth = VcaptureSize[VcaptureSizeIDX].width;
   1067             previewHeight = VcaptureSize[VcaptureSizeIDX].height;
   1068         }else
   1069         {
   1070             previewWidth = previewSize[previewSizeIDX].width;
   1071             previewHeight = previewSize[previewSizeIDX].height;
   1072         }
   1073 
   1074         if ( createPreviewSurface(previewWidth,
   1075                                   previewHeight,
   1076                                   pixelformat[previewFormat].pixelFormatDesc) < 0 ) {
   1077             printf("Error while creating preview surface\n");
   1078             return -1;
   1079         }
   1080 
   1081         if ( !hardwareActive ) {
   1082             openCamera();
   1083         }
   1084 
   1085         params.setPreviewSize(previewWidth, previewHeight);
   1086         params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
   1087 
   1088         camera->setParameters(params.flatten());
   1089         camera->setPreviewTexture(previewSurface->getIGraphicBufferProducer());
   1090 
   1091         if(!hardwareActive) prevcnt = 0;
   1092 
   1093         camera->startPreview();
   1094 
   1095         previewRunning = true;
   1096         reSizePreview = false;
   1097 
   1098     }
   1099 
   1100     return 0;
   1101 }
   1102 
   1103 void stopPreview() {
   1104     if ( hardwareActive ) {
   1105         camera->stopPreview();
   1106 
   1107         destroyPreviewSurface();
   1108 
   1109         previewRunning  = false;
   1110         reSizePreview = true;
   1111         closeCamera();
   1112     }
   1113 }
   1114 
   1115 void initDefaults() {
   1116     camera_index = 0;
   1117     antibanding_mode = 0;
   1118     focus_mode = 0;
   1119     fpsRangeIdx = 0;
   1120     previewSizeIDX = 1;  /* Default resolution set to WVGA */
   1121     captureSizeIDX = 3;  /* Default capture resolution is 8MP */
   1122     frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1;      /* Default frame rate is 30 FPS */
   1123 #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
   1124     VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 6;/* Default video record is WVGA */
   1125 #else
   1126     VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 2;/* Default video record is WVGA */
   1127 #endif
   1128     VbitRateIDX = ARRAY_SIZE(VbitRate) - 4;        /*Default video bit rate is 4M */
   1129     thumbSizeIDX = 0;
   1130     compensation = 0.0;
   1131     awb_mode = 0;
   1132     effects_mode = 0;
   1133     scene_mode = 0;
   1134     caf_mode = 0;
   1135     vnf_mode = 0;
   1136     vstab_mode = 0;
   1137     expBracketIdx = 0;
   1138     flashIdx = 0;
   1139     rotation = 0;
   1140     zoomIDX = 0;
   1141     videoCodecIDX = 0;
   1142     gbceIDX = 0;
   1143     glbceIDX = 0;
   1144 #ifdef TARGET_OMAP4
   1145     ///Temporary fix until OMAP3 and OMAP4 3A values are synced
   1146     contrast = 90;
   1147     brightness = 50;
   1148     sharpness = 0;
   1149     saturation = 50;
   1150 #else
   1151     contrast = 100;
   1152     brightness = 100;
   1153     sharpness = 0;
   1154     saturation = 100;
   1155 #endif
   1156     iso_mode = 0;
   1157     capture_mode = 0;
   1158     exposure_mode = 0;
   1159     ippIDX = 0;//set the ipp to ldc-nsf as the capture mode is set to HQ by default
   1160     ippIDX_old = ippIDX;
   1161     jpegQuality = 85;
   1162     bufferStarvationTest = 0;
   1163     meter_mode = 0;
   1164     previewFormat = 1;
   1165     pictureFormat = 3; // jpeg
   1166     params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height);
   1167     params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
   1168     params.set(CameraParameters::KEY_ROTATION, rotation);
   1169     params.set(KEY_COMPENSATION, (int) (compensation * 10));
   1170     params.set(params.KEY_WHITE_BALANCE, strawb_mode[awb_mode]);
   1171     params.set(KEY_MODE, (capture[capture_mode]));
   1172     params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
   1173     params.set(KEY_CAF, caf_mode);
   1174     params.set(KEY_ISO, iso_mode);
   1175     params.set(KEY_GBCE, gbce[gbceIDX]);
   1176     params.set(KEY_GLBCE, gbce[glbceIDX]);
   1177     params.set(KEY_SHARPNESS, sharpness);
   1178     params.set(KEY_CONTRAST, contrast);
   1179     params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
   1180     params.set(KEY_EXPOSURE, exposure[exposure_mode]);
   1181     params.set(KEY_BRIGHTNESS, brightness);
   1182     params.set(KEY_SATURATION, saturation);
   1183     params.set(params.KEY_EFFECT, effects[effects_mode]);
   1184     params.setPreviewFrameRate(frameRate[ARRAY_SIZE(frameRate) - 1].fps);
   1185     params.set(params.KEY_ANTIBANDING, antibanding[antibanding_mode]);
   1186     params.set(params.KEY_FOCUS_MODE, focus[focus_mode]);
   1187     params.set(KEY_IPP, ipp_mode[ippIDX]);
   1188     params.set(CameraParameters::KEY_JPEG_QUALITY, jpegQuality);
   1189     params.setPreviewFormat(pixelformat[previewFormat].pixformat);
   1190     params.setPictureFormat(codingformat[pictureFormat]);
   1191     params.set(KEY_BUFF_STARV, bufferStarvationTest); //enable buffer starvation
   1192     params.set(KEY_METERING_MODE, metering[meter_mode]);
   1193     params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, previewSize[thumbSizeIDX].width);
   1194     params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, previewSize[thumbSizeIDX].height);
   1195     ManualConvergenceValuesIDX = ManualConvergenceDefaultValueIDX;
   1196     params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
   1197     params.set(KEY_S3D2D_PREVIEW_MODE, "off");
   1198     params.set(KEY_STEREO_CAMERA, "false");
   1199     params.set(KEY_EXIF_MODEL, MODEL);
   1200     params.set(KEY_EXIF_MAKE, MAKE);
   1201 }
   1202 
   1203 int menu_gps() {
   1204     char ch;
   1205     char coord_str[100];
   1206 
   1207     if (print_menu) {
   1208         printf("\n\n== GPS MENU ============================\n\n");
   1209         printf("   e. Latitude:       %.7lf\n", latitude);
   1210         printf("   d. Longitude:      %.7lf\n", longitude);
   1211         printf("   c. Altitude:       %.7lf\n", altitude);
   1212         printf("\n");
   1213         printf("   q. Return to main menu\n");
   1214         printf("\n");
   1215         printf("   Choice: ");
   1216     }
   1217 
   1218     ch = getchar();
   1219     printf("%c", ch);
   1220 
   1221     print_menu = 1;
   1222 
   1223     switch (ch) {
   1224 
   1225         case 'e':
   1226             latitude += degree_by_step;
   1227 
   1228             if (latitude > 90.0) {
   1229                 latitude -= 180.0;
   1230             }
   1231 
   1232             snprintf(coord_str, 7, "%.7lf", latitude);
   1233             params.set(params.KEY_GPS_LATITUDE, coord_str);
   1234 
   1235             if ( hardwareActive )
   1236                 camera->setParameters(params.flatten());
   1237 
   1238             break;
   1239 
   1240         case 'd':
   1241             longitude += degree_by_step;
   1242 
   1243             if (longitude > 180.0) {
   1244                 longitude -= 360.0;
   1245             }
   1246 
   1247             snprintf(coord_str, 7, "%.7lf", longitude);
   1248             params.set(params.KEY_GPS_LONGITUDE, coord_str);
   1249 
   1250             if ( hardwareActive )
   1251                 camera->setParameters(params.flatten());
   1252 
   1253             break;
   1254 
   1255         case 'c':
   1256             altitude += 12345.67890123456789;
   1257 
   1258             if (altitude > 100000.0) {
   1259                 altitude -= 200000.0;
   1260             }
   1261 
   1262             snprintf(coord_str, 100, "%.20lf", altitude);
   1263             params.set(params.KEY_GPS_ALTITUDE, coord_str);
   1264 
   1265             if ( hardwareActive )
   1266                 camera->setParameters(params.flatten());
   1267 
   1268             break;
   1269 
   1270         case 'Q':
   1271         case 'q':
   1272             return -1;
   1273 
   1274         default:
   1275             print_menu = 0;
   1276             break;
   1277     }
   1278 
   1279     return 0;
   1280 }
   1281 
   1282 int functional_menu() {
   1283     char ch;
   1284 
   1285     if (print_menu) {
   1286 
   1287         printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n");
   1288 
   1289         printf(" \n\nSTART / STOP / GENERAL SERVICES \n");
   1290         printf(" -----------------------------\n");
   1291         printf("   A  Select Camera %s\n", cameras[camera_index]);
   1292         printf("   [. Resume Preview after capture\n");
   1293         printf("   0. Reset to defaults\n");
   1294         printf("   q. Quit\n");
   1295         printf("   @. Disconnect and Reconnect to CameraService \n");
   1296         printf("   /. Enable/Disable showfps: %s\n", ((showfps)? "Enabled":"Disabled"));
   1297         printf("   a. GEO tagging settings menu\n");
   1298         printf("   E.  Camera Capability Dump");
   1299 
   1300 
   1301         printf(" \n\n PREVIEW SUB MENU \n");
   1302         printf(" -----------------------------\n");
   1303         printf("   1. Start Preview\n");
   1304         printf("   2. Stop Preview\n");
   1305         printf("   ~. Preview format %s\n", pixelformat[previewFormat].pixformat);
   1306 #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
   1307         printf("   4. Preview size:   %4d x %4d - %s\n",previewSize[previewSizeIDX].width,  previewSize[previewSizeIDX].height, previewSize[previewSizeIDX].desc);
   1308 #else
   1309         printf("   4. Preview size:   %4d x %4d - %s\n",previewSize[previewSizeIDX].width, camera_index == 2 ? previewSize[previewSizeIDX].height*2 : previewSize[previewSizeIDX].height, previewSize[previewSizeIDX].desc);
   1310 #endif
   1311         printf("   R. Preview framerate range: %s\n", fpsRanges[fpsRangeIdx].rangeDescription);
   1312         printf("   &. Dump a preview frame\n");
   1313         printf("   _. Auto Convergence mode: %s\n", autoconvergencemode[AutoConvergenceModeIDX]);
   1314         printf("   ^. Manual Convergence Value: %s\n", manualconvergencevalues[ManualConvergenceValuesIDX]);
   1315         printf("   {. 2D Preview in 3D Stereo Mode: %s\n", params.get(KEY_S3D2D_PREVIEW_MODE));
   1316 
   1317         printf(" \n\n IMAGE CAPTURE SUB MENU \n");
   1318         printf(" -----------------------------\n");
   1319         printf("   p. Take picture/Full Press\n");
   1320         printf("   H. Exposure Bracketing: %s\n", expBracketing[expBracketIdx]);
   1321         printf("   U. Temporal Bracketing:   %s\n", tempBracketing[tempBracketIdx]);
   1322         printf("   W. Temporal Bracketing Range: [-%d;+%d]\n", tempBracketRange, tempBracketRange);
   1323         printf("   $. Picture Format: %s\n", codingformat[pictureFormat]);
   1324         printf("   3. Picture Rotation:       %3d degree\n", rotation );
   1325         printf("   5. Picture size:   %4d x %4d - %s\n",captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height,              captureSize[captureSizeIDX].name);
   1326         printf("   i. ISO mode:       %s\n", iso[iso_mode]);
   1327         printf("   u. Capture Mode:   %s\n", capture[capture_mode]);
   1328         printf("   k. IPP Mode:       %s\n", ipp_mode[ippIDX]);
   1329         printf("   K. GBCE: %s\n", gbce[gbceIDX]);
   1330         printf("   O. GLBCE %s\n", gbce[glbceIDX]);
   1331         printf("   o. Jpeg Quality:   %d\n", jpegQuality);
   1332         printf("   #. Burst Images:  %3d\n", burst);
   1333         printf("   :. Thumbnail Size:  %4d x %4d - %s\n",previewSize[thumbSizeIDX].width, previewSize[thumbSizeIDX].height, previewSize[thumbSizeIDX].desc);
   1334         printf("   ': Thumbnail Quality %d\n", thumbQuality);
   1335 
   1336         printf(" \n\n VIDEO CAPTURE SUB MENU \n");
   1337         printf(" -----------------------------\n");
   1338 
   1339         printf("   6. Start Video Recording\n");
   1340         printf("   2. Stop Recording\n");
   1341         printf("   l. Video Capture resolution:   %4d x %4d - %s\n",VcaptureSize[VcaptureSizeIDX].width,VcaptureSize[VcaptureSizeIDX].height, VcaptureSize[VcaptureSizeIDX].desc);
   1342         printf("   ]. Video Bit rate :  %s\n", VbitRate[VbitRateIDX].desc);
   1343         printf("   9. Video Codec:    %s\n", videoCodecs[videoCodecIDX].desc);
   1344         printf("   D. Audio Codec:    %s\n", audioCodecs[audioCodecIDX].desc);
   1345         printf("   v. Output Format:  %s\n", outputFormat[outputFormatIDX].desc);
   1346 
   1347         if  (camera_index == 1) {
   1348             printf("   r. Framerate:     %d\n", fpsConstRangesSec[frameRateIDXSec].constFramerate);
   1349         }
   1350         else {
   1351             printf("   r. Framerate:     %d\n", fpsConstRanges[frameRateIDX].constFramerate);
   1352         }
   1353         printf("   *. Start Video Recording dump ( 1 raw frame ) \n");
   1354         printf("   B  VNF              %s \n", vnf[vnf_mode]);
   1355         printf("   C  VSTAB              %s", vstab[vstab_mode]);
   1356 
   1357         printf(" \n\n 3A SETTING SUB MENU \n");
   1358         printf(" -----------------------------\n");
   1359 
   1360         printf("   M. Measurement Data: %s\n", measurement[measurementIdx]);
   1361         printf("   F. Start face detection \n");
   1362         printf("   T. Stop face detection \n");
   1363         printf("   G. Touch/Focus area AF\n");
   1364         printf("   f. Auto Focus/Half Press\n");
   1365         printf("   J.Flash:              %s\n", flashModes[flashIdx]);
   1366         printf("   7. EV offset:      %4.1f\n", compensation);
   1367         printf("   8. AWB mode:       %s\n", strawb_mode[awb_mode]);
   1368         printf("   z. Zoom            %s\n", zoom[zoomIDX].zoom_description);
   1369         printf("   j. Exposure        %s\n", exposure[exposure_mode]);
   1370         printf("   e. Effect:         %s\n", effects[effects_mode]);
   1371         printf("   w. Scene:          %s\n", scene[scene_mode]);
   1372         printf("   s. Saturation:     %d\n", saturation);
   1373         printf("   c. Contrast:       %d\n", contrast);
   1374         printf("   h. Sharpness:      %d\n", sharpness);
   1375         printf("   b. Brightness:     %d\n", brightness);
   1376         printf("   x. Antibanding:    %s\n", antibanding[antibanding_mode]);
   1377         printf("   g. Focus mode:     %s\n", focus[focus_mode]);
   1378         printf("   m. Metering mode:     %s\n" , metering[meter_mode]);
   1379         printf("   <. Exposure Lock:     %s\n", lock[elockidx]);
   1380         printf("   >. WhiteBalance Lock:  %s\n",lock[wblockidx]);
   1381         printf("\n");
   1382         printf("   Choice: ");
   1383     }
   1384 
   1385     ch = getchar();
   1386     printf("%c", ch);
   1387 
   1388     print_menu = 1;
   1389 
   1390     switch (ch) {
   1391 
   1392     case '_':
   1393         AutoConvergenceModeIDX++;
   1394         AutoConvergenceModeIDX %= ARRAY_SIZE(autoconvergencemode);
   1395         params.set(KEY_AUTOCONVERGENCE, autoconvergencemode[AutoConvergenceModeIDX]);
   1396         if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], AUTOCONVERGENCE_MODE_MANUAL) == 0) {
   1397             params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
   1398         }
   1399         else {
   1400             params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceDefaultValueIDX]);
   1401             ManualConvergenceValuesIDX = ManualConvergenceDefaultValueIDX;
   1402         }
   1403         camera->setParameters(params.flatten());
   1404 
   1405         break;
   1406     case '^':
   1407         if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], AUTOCONVERGENCE_MODE_MANUAL) == 0) {
   1408             ManualConvergenceValuesIDX++;
   1409             ManualConvergenceValuesIDX %= ARRAY_SIZE(manualconvergencevalues);
   1410             params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
   1411             camera->setParameters(params.flatten());
   1412         }
   1413         break;
   1414     case 'A':
   1415         camera_index++;
   1416         camera_index %= ARRAY_SIZE(cameras);
   1417         if ( camera_index == 2) {
   1418             params.set(KEY_STEREO_CAMERA, "true");
   1419         } else {
   1420             params.set(KEY_STEREO_CAMERA, "false");
   1421         }
   1422         closeCamera();
   1423 
   1424         openCamera();
   1425 
   1426         if (camera_index == 0) {
   1427             params.setPreviewFrameRate(30);
   1428         } else {
   1429             params.setPreviewFrameRate(27);
   1430         }
   1431 
   1432 
   1433         break;
   1434     case '[':
   1435         if ( hardwareActive ) {
   1436             camera->setParameters(params.flatten());
   1437             camera->startPreview();
   1438         }
   1439         break;
   1440 
   1441     case '0':
   1442         initDefaults();
   1443         break;
   1444 
   1445         case '1':
   1446 
   1447             if ( startPreview() < 0 ) {
   1448                 printf("Error while starting preview\n");
   1449 
   1450                 return -1;
   1451             }
   1452 
   1453             break;
   1454 
   1455         case '2':
   1456             stopPreview();
   1457 
   1458             if ( recordingMode ) {
   1459                 camera->disconnect();
   1460                 camera.clear();
   1461                 stopRecording();
   1462                 closeRecorder();
   1463 
   1464                 camera = Camera::connect(camera_index,
   1465                         processName,
   1466                         Camera::USE_CALLING_UID);
   1467                   if ( NULL == camera.get() ) {
   1468                       sleep(1);
   1469                       camera = Camera::connect(camera_index,
   1470                               processName,
   1471                               Camera::USE_CALLING_UID);
   1472                       if ( NULL == camera.get() ) {
   1473                           return -1;
   1474                       }
   1475                   }
   1476                   camera->setListener(new CameraHandler());
   1477                   camera->setParameters(params.flatten());
   1478                   recordingMode = false;
   1479             }
   1480 
   1481             break;
   1482 
   1483         case '3':
   1484             rotation += 90;
   1485             rotation %= 360;
   1486             params.set(CameraParameters::KEY_ROTATION, rotation);
   1487             if ( hardwareActive )
   1488                 camera->setParameters(params.flatten());
   1489 
   1490             break;
   1491 
   1492         case '4':
   1493             previewSizeIDX += 1;
   1494             previewSizeIDX %= ARRAY_SIZE(previewSize);
   1495             if ( NULL != params.get(KEY_STEREO_CAMERA) ) {
   1496                 if ( strcmp(params.get(KEY_STEREO_CAMERA), "false") == 0 ) {
   1497                     params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height);
   1498                 } else {
   1499                     params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height*2);
   1500                 }
   1501             }
   1502             reSizePreview = true;
   1503 
   1504             if ( hardwareActive && previewRunning ) {
   1505                 camera->stopPreview();
   1506                 camera->setParameters(params.flatten());
   1507                 camera->startPreview();
   1508             } else if ( hardwareActive ) {
   1509                 camera->setParameters(params.flatten());
   1510             }
   1511 
   1512             break;
   1513 
   1514         case '5':
   1515             captureSizeIDX += 1;
   1516             captureSizeIDX %= ARRAY_SIZE(captureSize);
   1517             params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
   1518 
   1519             if ( hardwareActive )
   1520                 camera->setParameters(params.flatten());
   1521             break;
   1522 
   1523         case 'l':
   1524         case 'L':
   1525             VcaptureSizeIDX++;
   1526             VcaptureSizeIDX %= ARRAY_SIZE(VcaptureSize);
   1527             break;
   1528 
   1529         case ']':
   1530             VbitRateIDX++;
   1531             VbitRateIDX %= ARRAY_SIZE(VbitRate);
   1532             break;
   1533 
   1534 
   1535         case '6':
   1536 
   1537             if ( !recordingMode ) {
   1538 
   1539                 recordingMode = true;
   1540 
   1541                 if ( startPreview() < 0 ) {
   1542                     printf("Error while starting preview\n");
   1543 
   1544                     return -1;
   1545                 }
   1546 
   1547                 if ( openRecorder() < 0 ) {
   1548                     printf("Error while openning video recorder\n");
   1549 
   1550                     return -1;
   1551                 }
   1552 
   1553                 if ( configureRecorder() < 0 ) {
   1554                     printf("Error while configuring video recorder\n");
   1555 
   1556                     return -1;
   1557                 }
   1558 
   1559                 if ( startRecording() < 0 ) {
   1560                     printf("Error while starting video recording\n");
   1561 
   1562                     return -1;
   1563                 }
   1564             }
   1565 
   1566             break;
   1567 
   1568         case '7':
   1569 
   1570             if ( compensation > 2.0) {
   1571                 compensation = -2.0;
   1572             } else {
   1573                 compensation += 0.1;
   1574             }
   1575 
   1576             params.set(KEY_COMPENSATION, (int) (compensation * 10));
   1577 
   1578             if ( hardwareActive )
   1579                 camera->setParameters(params.flatten());
   1580 
   1581             break;
   1582 
   1583         case '8':
   1584             awb_mode++;
   1585             awb_mode %= ARRAY_SIZE(strawb_mode);
   1586             params.set(params.KEY_WHITE_BALANCE, strawb_mode[awb_mode]);
   1587 
   1588             if ( hardwareActive )
   1589                 camera->setParameters(params.flatten());
   1590 
   1591             break;
   1592 
   1593         case '9':
   1594             videoCodecIDX++;
   1595             videoCodecIDX %= ARRAY_SIZE(videoCodecs);
   1596             break;
   1597         case '~':
   1598             previewFormat += 1;
   1599             previewFormat %= ARRAY_SIZE(pixelformat) - 1;
   1600             params.setPreviewFormat(pixelformat[previewFormat].pixformat);
   1601 
   1602             if ( hardwareActive )
   1603                 camera->setParameters(params.flatten());
   1604 
   1605             break;
   1606         case '$':
   1607             pictureFormat += 1;
   1608             if ( NULL != params.get(KEY_STEREO_CAMERA) ) {
   1609                 if ( strcmp(params.get(KEY_STEREO_CAMERA), "false") == 0 && pictureFormat > 4 )
   1610                     pictureFormat = 0;
   1611             }
   1612             pictureFormat %= ARRAY_SIZE(codingformat);
   1613             params.setPictureFormat(codingformat[pictureFormat]);
   1614             if ( hardwareActive )
   1615                 camera->setParameters(params.flatten());
   1616 
   1617             break;
   1618 
   1619         case '?' :
   1620             ///Set mode=3 to select video mode
   1621             params.set(KEY_MODE, 3);
   1622             params.set(KEY_VNF, 1);
   1623             params.set(KEY_VSTAB, 1);
   1624             break;
   1625 
   1626         case ':':
   1627             thumbSizeIDX += 1;
   1628             thumbSizeIDX %= ARRAY_SIZE(previewSize);
   1629             params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, previewSize[thumbSizeIDX].width);
   1630             params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, previewSize[thumbSizeIDX].height);
   1631 
   1632             if ( hardwareActive )
   1633                 camera->setParameters(params.flatten());
   1634 
   1635             break;
   1636 
   1637         case '\'':
   1638             if ( thumbQuality >= 100) {
   1639                 thumbQuality = 0;
   1640             } else {
   1641                 thumbQuality += 5;
   1642             }
   1643 
   1644             params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, thumbQuality);
   1645             if ( hardwareActive )
   1646                 camera->setParameters(params.flatten());
   1647             break;
   1648 
   1649         case 'B' :
   1650             vnf_mode++;
   1651             vnf_mode %= ARRAY_SIZE(vnf);
   1652             params.set(KEY_VNF, vnf_mode);
   1653 
   1654             if ( hardwareActive )
   1655                 camera->setParameters(params.flatten());
   1656             break;
   1657 
   1658         case 'C' :
   1659             vstab_mode++;
   1660             vstab_mode %= ARRAY_SIZE(vstab);
   1661             params.set(KEY_VSTAB, vstab_mode);
   1662 
   1663             if ( hardwareActive )
   1664                 camera->setParameters(params.flatten());
   1665             break;
   1666 
   1667         case 'E':
   1668             if(hardwareActive)
   1669                 params.unflatten(camera->getParameters());
   1670             printSupportedParams();
   1671             break;
   1672 
   1673         case '*':
   1674             if ( hardwareActive )
   1675                 camera->startRecording();
   1676             break;
   1677 
   1678         case 'o':
   1679             if ( jpegQuality >= 100) {
   1680                 jpegQuality = 0;
   1681             } else {
   1682                 jpegQuality += 5;
   1683             }
   1684 
   1685             params.set(CameraParameters::KEY_JPEG_QUALITY, jpegQuality);
   1686             if ( hardwareActive )
   1687                 camera->setParameters(params.flatten());
   1688             break;
   1689 
   1690         case 'M':
   1691             measurementIdx = (measurementIdx + 1)%ARRAY_SIZE(measurement);
   1692             params.set(KEY_MEASUREMENT, measurement[measurementIdx]);
   1693             if ( hardwareActive )
   1694                 camera->setParameters(params.flatten());
   1695             break;
   1696         case 'm':
   1697         {
   1698             meter_mode = (meter_mode + 1)%ARRAY_SIZE(metering);
   1699             params.set(KEY_METERING_MODE, metering[meter_mode]);
   1700             if ( hardwareActive )
   1701                 camera->setParameters(params.flatten());
   1702             break;
   1703         }
   1704 
   1705         case 'k':
   1706             ippIDX += 1;
   1707             ippIDX %= ARRAY_SIZE(ipp_mode);
   1708             ippIDX_old = ippIDX;
   1709 
   1710             params.set(KEY_IPP, ipp_mode[ippIDX]);
   1711 
   1712             if ( hardwareActive )
   1713                 camera->setParameters(params.flatten());
   1714 
   1715             break;
   1716 
   1717         case 'K':
   1718             gbceIDX+= 1;
   1719             gbceIDX %= ARRAY_SIZE(gbce);
   1720             params.set(KEY_GBCE, gbce[gbceIDX]);
   1721 
   1722             if ( hardwareActive )
   1723                 camera->setParameters(params.flatten());
   1724             break;
   1725 
   1726         case 'O':
   1727             glbceIDX+= 1;
   1728             glbceIDX %= ARRAY_SIZE(gbce);
   1729             params.set(KEY_GLBCE, gbce[glbceIDX]);
   1730 
   1731             if ( hardwareActive )
   1732                 camera->setParameters(params.flatten());
   1733             break;
   1734 
   1735         case 'F':
   1736             if ( hardwareActive )
   1737                 camera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, 0, 0);
   1738 
   1739             break;
   1740 
   1741         case 'T':
   1742 
   1743             if ( hardwareActive )
   1744                 camera->sendCommand(CAMERA_CMD_STOP_FACE_DETECTION, 0, 0);
   1745 
   1746             break;
   1747 
   1748         case '@':
   1749             if ( hardwareActive ) {
   1750 
   1751                 closeCamera();
   1752 
   1753                 if ( 0 >= openCamera() ) {
   1754                     printf( "Reconnected to CameraService \n");
   1755                 }
   1756             }
   1757 
   1758             break;
   1759 
   1760         case '#':
   1761 
   1762             if ( burst >= MAX_BURST ) {
   1763                 burst = 0;
   1764             } else {
   1765                 burst += BURST_INC;
   1766             }
   1767             params.set(KEY_BURST, burst);
   1768 
   1769             if ( hardwareActive )
   1770                 camera->setParameters(params.flatten());
   1771 
   1772             break;
   1773 
   1774         case 'J':
   1775             flashIdx++;
   1776             flashIdx %= ARRAY_SIZE(flashModes);
   1777             params.set(CameraParameters::KEY_FLASH_MODE, (flashModes[flashIdx]));
   1778 
   1779             if ( hardwareActive )
   1780                 camera->setParameters(params.flatten());
   1781 
   1782             break;
   1783 
   1784         case 'u':
   1785             capture_mode++;
   1786             capture_mode %= ARRAY_SIZE(capture);
   1787 
   1788             // HQ should always be in ldc-nsf
   1789             // if not HQ, then return the ipp to its previous state
   1790             if( !strcmp(capture[capture_mode], "high-quality") ) {
   1791                 ippIDX_old = ippIDX;
   1792                 ippIDX = 3;
   1793                 params.set(KEY_IPP, ipp_mode[ippIDX]);
   1794             } else {
   1795                 ippIDX = ippIDX_old;
   1796             }
   1797 
   1798             params.set(KEY_MODE, (capture[capture_mode]));
   1799 
   1800             if ( hardwareActive )
   1801                 camera->setParameters(params.flatten());
   1802 
   1803             break;
   1804 
   1805         case 'U':
   1806             tempBracketIdx++;
   1807             tempBracketIdx %= ARRAY_SIZE(tempBracketing);
   1808             params.set(KEY_TEMP_BRACKETING, tempBracketing[tempBracketIdx]);
   1809 
   1810             if ( hardwareActive )
   1811                 camera->setParameters(params.flatten());
   1812 
   1813             break;
   1814 
   1815         case 'H':
   1816             expBracketIdx++;
   1817             expBracketIdx %= ARRAY_SIZE(expBracketing);
   1818 
   1819             params.set(KEY_EXP_BRACKETING_RANGE, expBracketingRange[expBracketIdx]);
   1820 
   1821             if ( hardwareActive )
   1822                 camera->setParameters(params.flatten());
   1823 
   1824             break;
   1825 
   1826         case 'W':
   1827             tempBracketRange++;
   1828             tempBracketRange %= TEMP_BRACKETING_MAX_RANGE;
   1829             if ( 0 == tempBracketRange ) {
   1830                 tempBracketRange = 1;
   1831             }
   1832 
   1833             params.set(KEY_TEMP_BRACKETING_NEG, tempBracketRange);
   1834             params.set(KEY_TEMP_BRACKETING_POS, tempBracketRange);
   1835 
   1836             if ( hardwareActive )
   1837                 camera->setParameters(params.flatten());
   1838 
   1839             break;
   1840 
   1841         case 'w':
   1842             scene_mode++;
   1843             scene_mode %= ARRAY_SIZE(scene);
   1844             params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
   1845 
   1846             if ( hardwareActive )
   1847                 camera->setParameters(params.flatten());
   1848 
   1849             break;
   1850 
   1851         case 'i':
   1852             iso_mode++;
   1853             iso_mode %= ARRAY_SIZE(iso);
   1854             params.set(KEY_ISO, iso[iso_mode]);
   1855 
   1856             if ( hardwareActive )
   1857                 camera->setParameters(params.flatten());
   1858             break;
   1859 
   1860         case 'h':
   1861             if ( sharpness >= 100) {
   1862                 sharpness = 0;
   1863             } else {
   1864                 sharpness += 10;
   1865             }
   1866             params.set(KEY_SHARPNESS, sharpness);
   1867             if ( hardwareActive )
   1868                 camera->setParameters(params.flatten());
   1869             break;
   1870 
   1871         case 'D':
   1872         {
   1873             audioCodecIDX++;
   1874             audioCodecIDX %= ARRAY_SIZE(audioCodecs);
   1875             break;
   1876         }
   1877 
   1878         case 'v':
   1879         {
   1880             outputFormatIDX++;
   1881             outputFormatIDX %= ARRAY_SIZE(outputFormat);
   1882             break;
   1883         }
   1884 
   1885         case 'z':
   1886             zoomIDX++;
   1887             zoomIDX %= ARRAY_SIZE(zoom);
   1888             params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
   1889 
   1890             if ( hardwareActive )
   1891                 camera->setParameters(params.flatten());
   1892 
   1893             break;
   1894 
   1895         case 'j':
   1896             exposure_mode++;
   1897             exposure_mode %= ARRAY_SIZE(exposure);
   1898             params.set(KEY_EXPOSURE, exposure[exposure_mode]);
   1899 
   1900             if ( hardwareActive )
   1901                 camera->setParameters(params.flatten());
   1902 
   1903             break;
   1904 
   1905         case 'c':
   1906             if( contrast >= 200){
   1907                 contrast = 0;
   1908             } else {
   1909                 contrast += 10;
   1910             }
   1911             params.set(KEY_CONTRAST, contrast);
   1912             if ( hardwareActive )
   1913                 camera->setParameters(params.flatten());
   1914             break;
   1915         case 'b':
   1916             if ( brightness >= 200) {
   1917                 brightness = 0;
   1918             } else {
   1919                 brightness += 10;
   1920             }
   1921 
   1922             params.set(KEY_BRIGHTNESS, brightness);
   1923 
   1924             if ( hardwareActive )
   1925                 camera->setParameters(params.flatten());
   1926 
   1927             break;
   1928 
   1929         case 's':
   1930         case 'S':
   1931             if ( saturation >= 100) {
   1932                 saturation = 0;
   1933             } else {
   1934                 saturation += 10;
   1935             }
   1936 
   1937             params.set(KEY_SATURATION, saturation);
   1938 
   1939             if ( hardwareActive )
   1940                 camera->setParameters(params.flatten());
   1941 
   1942             break;
   1943 
   1944         case 'e':
   1945             effects_mode++;
   1946             effects_mode %= ARRAY_SIZE(effects);
   1947             params.set(params.KEY_EFFECT, effects[effects_mode]);
   1948 
   1949             if ( hardwareActive )
   1950                 camera->setParameters(params.flatten());
   1951 
   1952             break;
   1953 
   1954         case 'r':
   1955 
   1956 
   1957             if (camera_index == 0) {
   1958                 frameRateIDX += 1;
   1959                 frameRateIDX %= ARRAY_SIZE(fpsConstRanges);
   1960                 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsConstRanges[frameRateIDX].range);
   1961             } else
   1962             {
   1963                 frameRateIDXSec += 1;
   1964                 frameRateIDXSec %= ARRAY_SIZE(fpsConstRangesSec);
   1965                 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsConstRangesSec[frameRateIDXSec].range);
   1966 
   1967 
   1968             }
   1969 
   1970             if ( hardwareActive ) {
   1971                 camera->setParameters(params.flatten());
   1972             }
   1973 
   1974             break;
   1975 
   1976         case 'R':
   1977             fpsRangeIdx += 1;
   1978             fpsRangeIdx %= ARRAY_SIZE(fpsRanges);
   1979             params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsRanges[fpsRangeIdx].range);
   1980 
   1981             if ( hardwareActive ) {
   1982                 camera->setParameters(params.flatten());
   1983             }
   1984 
   1985             break;
   1986 
   1987         case 'x':
   1988             antibanding_mode++;
   1989             antibanding_mode %= ARRAY_SIZE(antibanding);
   1990             params.set(params.KEY_ANTIBANDING, antibanding[antibanding_mode]);
   1991 
   1992             if ( hardwareActive )
   1993                 camera->setParameters(params.flatten());
   1994 
   1995             break;
   1996 
   1997         case 'g':
   1998             focus_mode++;
   1999             focus_mode %= ARRAY_SIZE(focus);
   2000             params.set(params.KEY_FOCUS_MODE, focus[focus_mode]);
   2001 
   2002             if ( hardwareActive )
   2003                 camera->setParameters(params.flatten());
   2004 
   2005             break;
   2006 
   2007         case 'G':
   2008 
   2009             params.set(CameraParameters::KEY_FOCUS_AREAS, TEST_FOCUS_AREA);
   2010 
   2011             if ( hardwareActive )
   2012                 camera->setParameters(params.flatten());
   2013 
   2014             params.remove(CameraParameters::KEY_FOCUS_AREAS);
   2015 
   2016         case 'f':
   2017 
   2018             gettimeofday(&autofocus_start, 0);
   2019 
   2020             if ( hardwareActive )
   2021                 camera->autoFocus();
   2022 
   2023             break;
   2024 
   2025         case 'p':
   2026 
   2027             gettimeofday(&picture_start, 0);
   2028 
   2029             if ( hardwareActive )
   2030                 camera->takePicture(CAMERA_MSG_COMPRESSED_IMAGE|CAMERA_MSG_RAW_IMAGE);
   2031 
   2032             break;
   2033 
   2034         case '&':
   2035             printf("Enabling Preview Callback");
   2036             dump_preview = 1;
   2037             if ( hardwareActive )
   2038             camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
   2039             break;
   2040 
   2041         case '{':
   2042             if ( strcmp(params.get(KEY_S3D2D_PREVIEW_MODE), "off") == 0 )
   2043                 {
   2044                 params.set(KEY_S3D2D_PREVIEW_MODE, "on");
   2045                 }
   2046             else
   2047                 {
   2048                 params.set(KEY_S3D2D_PREVIEW_MODE, "off");
   2049                 }
   2050             if ( hardwareActive )
   2051                 camera->setParameters(params.flatten());
   2052             break;
   2053 
   2054         case 'a':
   2055 
   2056             while (1) {
   2057                 if ( menu_gps() < 0)
   2058                     break;
   2059             };
   2060 
   2061             break;
   2062 
   2063         case 'q':
   2064 
   2065             stopPreview();
   2066 
   2067             return -1;
   2068 
   2069         case '/':
   2070         {
   2071             if (showfps)
   2072             {
   2073                 property_set("debug.image.showfps", "0");
   2074                 showfps = false;
   2075             }
   2076             else
   2077             {
   2078                 property_set("debug.image.showfps", "1");
   2079                 showfps = true;
   2080             }
   2081             break;
   2082         }
   2083 
   2084     case '<':
   2085       elockidx += 1;
   2086       elockidx %= ARRAY_SIZE(lock);
   2087       params.set(KEY_AUTO_EXPOSURE_LOCK, lock[elockidx]);
   2088       if ( hardwareActive )
   2089         camera->setParameters(params.flatten());
   2090       break;
   2091 
   2092     case '>':
   2093       wblockidx += 1;
   2094       wblockidx %= ARRAY_SIZE(lock);
   2095       params.set(KEY_AUTO_WHITEBALANCE_LOCK, lock[wblockidx]);
   2096       if ( hardwareActive )
   2097         camera->setParameters(params.flatten());
   2098       break;
   2099 
   2100         default:
   2101             print_menu = 0;
   2102 
   2103             break;
   2104     }
   2105 
   2106     return 0;
   2107 }
   2108 
   2109 void print_usage() {
   2110     printf(" USAGE: camera_test  <param>  <script>\n");
   2111     printf(" <param>\n-----------\n\n");
   2112     printf(" F or f -> Functional tests \n");
   2113     printf(" A or a -> API tests \n");
   2114     printf(" E or e -> Error scenario tests \n");
   2115     printf(" S or s -> Stress tests; with syslink trace \n");
   2116     printf(" SN or sn -> Stress tests; No syslink trace \n\n");
   2117     printf(" <script>\n----------\n");
   2118     printf("Script name (Only for stress tests)\n\n");
   2119     return;
   2120 }
   2121 
   2122 int error_scenario() {
   2123     char ch;
   2124     status_t stat = NO_ERROR;
   2125 
   2126     if (print_menu) {
   2127         printf("   0. Buffer need\n");
   2128         printf("   1. Not enough memory\n");
   2129         printf("   2. Media server crash\n");
   2130         printf("   3. Overlay object request\n");
   2131         printf("   4. Pass unsupported preview&picture format\n");
   2132         printf("   5. Pass unsupported preview&picture resolution\n");
   2133         printf("   6. Pass unsupported preview framerate\n");
   2134 
   2135         printf("   q. Quit\n");
   2136         printf("   Choice: ");
   2137     }
   2138 
   2139     print_menu = 1;
   2140     ch = getchar();
   2141     printf("%c\n", ch);
   2142 
   2143     switch (ch) {
   2144         case '0': {
   2145             printf("Case0:Buffer need\n");
   2146             bufferStarvationTest = 1;
   2147             params.set(KEY_BUFF_STARV, bufferStarvationTest); //enable buffer starvation
   2148 
   2149             if ( !recordingMode ) {
   2150                 recordingMode = true;
   2151                 if ( startPreview() < 0 ) {
   2152                     printf("Error while starting preview\n");
   2153 
   2154                     return -1;
   2155                 }
   2156 
   2157                 if ( openRecorder() < 0 ) {
   2158                     printf("Error while openning video recorder\n");
   2159 
   2160                     return -1;
   2161                 }
   2162 
   2163                 if ( configureRecorder() < 0 ) {
   2164                     printf("Error while configuring video recorder\n");
   2165 
   2166                     return -1;
   2167                 }
   2168 
   2169                 if ( startRecording() < 0 ) {
   2170                     printf("Error while starting video recording\n");
   2171 
   2172                     return -1;
   2173                 }
   2174 
   2175             }
   2176 
   2177             usleep(1000000);//1s
   2178 
   2179             stopPreview();
   2180 
   2181             if ( recordingMode ) {
   2182                 stopRecording();
   2183                 closeRecorder();
   2184 
   2185                 recordingMode = false;
   2186             }
   2187 
   2188             break;
   2189         }
   2190 
   2191         case '1': {
   2192             printf("Case1:Not enough memory\n");
   2193             int* tMemoryEater = new int[999999999];
   2194 
   2195             if (!tMemoryEater) {
   2196                 printf("Not enough memory\n");
   2197                 return -1;
   2198             } else {
   2199                 delete tMemoryEater;
   2200             }
   2201 
   2202             break;
   2203         }
   2204 
   2205         case '2': {
   2206             printf("Case2:Media server crash\n");
   2207             //camera = Camera::connect();
   2208 
   2209             if ( NULL == camera.get() ) {
   2210                 printf("Unable to connect to CameraService\n");
   2211                 return -1;
   2212             }
   2213 
   2214             break;
   2215         }
   2216 
   2217         case '3': {
   2218             printf("Case3:Overlay object request\n");
   2219             int err = 0;
   2220 
   2221             err = open("/dev/video5", O_RDWR);
   2222 
   2223             if (err < 0) {
   2224                 printf("Could not open the camera device5: %d\n",  err );
   2225                 return err;
   2226             }
   2227 
   2228             if ( startPreview() < 0 ) {
   2229                 printf("Error while starting preview\n");
   2230                 return -1;
   2231             }
   2232 
   2233             usleep(1000000);//1s
   2234 
   2235             stopPreview();
   2236 
   2237             close(err);
   2238             break;
   2239         }
   2240 
   2241         case '4': {
   2242 
   2243             if ( hardwareActive ) {
   2244 
   2245                 params.setPictureFormat("invalid-format");
   2246                 params.setPreviewFormat("invalid-format");
   2247 
   2248                 stat = camera->setParameters(params.flatten());
   2249 
   2250                 if ( NO_ERROR != stat ) {
   2251                     printf("Test passed!\n");
   2252                 } else {
   2253                     printf("Test failed!\n");
   2254                 }
   2255 
   2256                 initDefaults();
   2257             }
   2258 
   2259             break;
   2260         }
   2261 
   2262         case '5': {
   2263 
   2264             if ( hardwareActive ) {
   2265 
   2266                 params.setPictureSize(-1, -1);
   2267                 params.setPreviewSize(-1, -1);
   2268 
   2269                 stat = camera->setParameters(params.flatten());
   2270 
   2271                 if ( NO_ERROR != stat ) {
   2272                     printf("Test passed!\n");
   2273                 } else {
   2274                     printf("Test failed!\n");
   2275                 }
   2276 
   2277                 initDefaults();
   2278             }
   2279 
   2280             break;
   2281         }
   2282 
   2283         case '6': {
   2284 
   2285             if ( hardwareActive ) {
   2286 
   2287                 params.setPreviewFrameRate(-1);
   2288 
   2289                 stat = camera->setParameters(params.flatten());
   2290 
   2291                 if ( NO_ERROR != stat ) {
   2292                     printf("Test passed!\n");
   2293                 } else {
   2294                     printf("Test failed!\n");
   2295                 }
   2296 
   2297                 initDefaults();
   2298             }
   2299 
   2300 
   2301             break;
   2302         }
   2303 
   2304         case 'q': {
   2305             return -1;
   2306         }
   2307 
   2308         default: {
   2309             print_menu = 0;
   2310             break;
   2311         }
   2312     }
   2313 
   2314     return 0;
   2315 }
   2316 
   2317 int restartCamera() {
   2318 
   2319   const char dir_path_name[80] = SDCARD_PATH;
   2320 
   2321   printf("+++Restarting Camera After Error+++\n");
   2322   stopPreview();
   2323 
   2324   if (recordingMode) {
   2325     stopRecording();
   2326     closeRecorder();
   2327 
   2328     recordingMode = false;
   2329   }
   2330 
   2331   sleep(3); //Wait a bit before restarting
   2332 
   2333   restartCount++;
   2334 
   2335   if (strcpy(dir_path, dir_path_name) == NULL)
   2336   {
   2337     printf("Error reseting dir name");
   2338     return -1;
   2339   }
   2340 
   2341   if ( openCamera() < 0 )
   2342   {
   2343     printf("+++Camera Restarted Failed+++\n");
   2344     system("echo camerahal_test > /sys/power/wake_unlock");
   2345     return -1;
   2346   }
   2347 
   2348   initDefaults();
   2349 
   2350   stopScript = false;
   2351 
   2352   printf("+++Camera Restarted Successfully+++\n");
   2353   return 0;
   2354 }
   2355 
   2356 int main(int argc, char *argv[]) {
   2357     char *cmd;
   2358     int pid;
   2359     sp<ProcessState> proc(ProcessState::self());
   2360 
   2361     unsigned long long st, end, delay;
   2362     timeval current_time;
   2363 
   2364     gettimeofday(&current_time, 0);
   2365 
   2366     st = current_time.tv_sec * 1000000 + current_time.tv_usec;
   2367 
   2368     cmd = NULL;
   2369 
   2370     if ( argc < 2 ) {
   2371         printf(" Please enter atleast 1 argument\n");
   2372         print_usage();
   2373 
   2374         return 0;
   2375     }
   2376     system("echo camerahal_test > /sys/power/wake_lock");
   2377     if ( argc < 3 ) {
   2378         switch (*argv[1]) {
   2379             case 'S':
   2380             case 's':
   2381                 printf("This is stress / regression tests \n");
   2382                 printf("Provide script file as 2nd argument\n");
   2383 
   2384                 break;
   2385 
   2386             case 'F':
   2387             case 'f':
   2388                 ProcessState::self()->startThreadPool();
   2389 
   2390                 if ( openCamera() < 0 ) {
   2391                     printf("Camera initialization failed\n");
   2392                     system("echo camerahal_test > /sys/power/wake_unlock");
   2393                     return -1;
   2394                 }
   2395 
   2396                 initDefaults();
   2397                 print_menu = 1;
   2398 
   2399                 while ( 1 ) {
   2400                     if ( functional_menu() < 0 )
   2401                         break;
   2402                 };
   2403 
   2404                 break;
   2405 
   2406             case 'A':
   2407             case 'a':
   2408                 printf("API level test cases coming soon ... \n");
   2409 
   2410                 break;
   2411 
   2412             case 'E':
   2413             case 'e': {
   2414                 ProcessState::self()->startThreadPool();
   2415 
   2416                 if ( openCamera() < 0 ) {
   2417                     printf("Camera initialization failed\n");
   2418                     system("echo camerahal_test > /sys/power/wake_unlock");
   2419                     return -1;
   2420                 }
   2421 
   2422                 initDefaults();
   2423                 print_menu = 1;
   2424 
   2425                 while (1) {
   2426                     if (error_scenario() < 0) {
   2427                         break;
   2428                     }
   2429                 }
   2430 
   2431                 break;
   2432             }
   2433 
   2434             default:
   2435                 printf("INVALID OPTION USED\n");
   2436                 print_usage();
   2437 
   2438                 break;
   2439         }
   2440     } else if ( ( argc == 3) && ( ( *argv[1] == 'S' ) || ( *argv[1] == 's') ) ) {
   2441 
   2442         if((argv[1][1] == 'N') || (argv[1][1] == 'n')) {
   2443             bLogSysLinkTrace = false;
   2444         }
   2445 
   2446         ProcessState::self()->startThreadPool();
   2447 
   2448         if ( openCamera() < 0 ) {
   2449             printf("Camera initialization failed\n");
   2450             system("echo camerahal_test > /sys/power/wake_unlock");
   2451             return -1;
   2452         }
   2453 
   2454         initDefaults();
   2455 
   2456         cmd = load_script(argv[2]);
   2457 
   2458         if ( cmd != NULL) {
   2459             start_logging(argv[2], pid);
   2460             stressTest = true;
   2461 
   2462             while (1)
   2463               {
   2464                 if ( execute_functional_script(cmd) == 0 )
   2465                   {
   2466                     break;
   2467                   }
   2468                 else
   2469                   {
   2470                     printf("CameraTest Restarting Camera...\n");
   2471 
   2472                     free(cmd);
   2473                     cmd = NULL;
   2474 
   2475                     if ( (restartCamera() != 0)  || ((cmd = load_script(argv[2])) == NULL) )
   2476                       {
   2477                         printf("ERROR::CameraTest Restarting Camera...\n");
   2478                         break;
   2479                       }
   2480                   }
   2481               }
   2482             free(cmd);
   2483             stop_logging(pid);
   2484         }
   2485     } else if ( ( argc == 3) && ( ( *argv[1] == 'E' ) || ( *argv[1] == 'e') ) ) {
   2486 
   2487         ProcessState::self()->startThreadPool();
   2488 
   2489         if ( openCamera() < 0 ) {
   2490             printf("Camera initialization failed\n");
   2491             system("echo camerahal_test > /sys/power/wake_unlock");
   2492             return -1;
   2493         }
   2494 
   2495         initDefaults();
   2496 
   2497         cmd = load_script(argv[2]);
   2498 
   2499         if ( cmd != NULL) {
   2500             start_logging(argv[2], pid);
   2501             execute_error_script(cmd);
   2502             free(cmd);
   2503             stop_logging(pid);
   2504         }
   2505 
   2506     } else {
   2507         printf("INVALID OPTION USED\n");
   2508         print_usage();
   2509     }
   2510 
   2511     gettimeofday(&current_time, 0);
   2512     end = current_time.tv_sec * 1000000 + current_time.tv_usec;
   2513     delay = end - st;
   2514     printf("Application clossed after: %llu ms\n", delay);
   2515     system("echo camerahal_test > /sys/power/wake_unlock");
   2516     return 0;
   2517 }
   2518