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