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
32using namespace android;
33
34int camera_index = 0;
35int print_menu;
36sp<Camera> camera;
37sp<MediaRecorder> recorder;
38sp<SurfaceComposerClient> client;
39sp<SurfaceControl> surfaceControl;
40sp<Surface> previewSurface;
41CameraParameters params;
42float compensation = 0.0;
43double latitude = 0.0;
44double longitude = 0.0;
45double degree_by_step = 17.5609756;//..0975609756097;
46double altitude = 0.0;
47int awb_mode = 0;
48int effects_mode = 0;
49int scene_mode = 0;
50int caf_mode = 0;
51int vnf_mode = 0;
52int vstab_mode = 0;
53
54int tempBracketRange = 1;
55int tempBracketIdx = 0;
56int measurementIdx = 0;
57int expBracketIdx = 0;
58int AutoConvergenceModeIDX = 0;
59int ManualConvergenceValuesIDX = 0;
60int ManualConvergenceDefaultValueIDX = 2;
61int gbceIDX = 0;
62int glbceIDX = 0;
63int rotation = 0;
64bool reSizePreview = true;
65bool hardwareActive = false;
66bool recordingMode = false;
67bool previewRunning = false;
68int saturation = 0;
69int zoomIDX = 0;
70int videoCodecIDX = 0;
71int audioCodecIDX = 0;
72int outputFormatIDX = 0;
73int contrast = 0;
74int brightness = 0;
75unsigned int burst = 0;
76int sharpness = 0;
77int iso_mode = 0;
78int capture_mode = 0;
79int exposure_mode = 0;
80int ippIDX = 0;
81int ippIDX_old = 0;
82int previewFormat = 0;
83int jpegQuality = 85;
84int thumbQuality = 85;
85int flashIdx = 0;
86int fpsRangeIdx = 0;
87timeval autofocus_start, picture_start;
88char script_name[80];
89int prevcnt = 0;
90int videoFd = -1;
91int elockidx = 0;
92int wblockidx = 0;
93
94
95char dir_path[80] = SDCARD_PATH;
96
97const char *cameras[] = {"Primary Camera", "Secondary Camera 1", "Stereo Camera", "USB Camera", "Fake Camera"};
98const char *measurement[] = {"disable", "enable"};
99const char *expBracketing[] = {"disable", "enable"};
100const char *expBracketingRange[] = {"", "-30,0,30,0,-30"};
101const char *tempBracketing[] = {"disable", "enable"};
102const char *faceDetection[] = {"disable", "enable"};
103const char *lock[] = {"false", "true"};
104
105#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
106const char *ipp_mode[] = { "off", "Chroma Suppression", "Edge Enhancement" };
107#else
108const char *ipp_mode[] = { "off", "ldc", "nsf", "ldc-nsf" };
109#endif
110
111const char *iso [] = { "auto", "100", "200", "400", "800", "1200", "1600"};
112
113const 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
141const char CameraParameters::FLASH_MODE_OFF[] = "off";
142const char CameraParameters::FLASH_MODE_AUTO[] = "auto";
143const char CameraParameters::FLASH_MODE_ON[] = "on";
144const char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
145const char CameraParameters::FLASH_MODE_TORCH[] = "torch";
146
147const char *flashModes[] = {
148    "off",
149    "auto",
150    "on",
151    "red-eye",
152    "torch",
153    "fill-in",
154};
155
156const char *caf [] = { "Off", "On" };
157const char *vnf [] = { "Off", "On" };
158const char *vstab [] = { "Off", "On" };
159
160
161const 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};
197const 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
212size_t length_cam =  ARRAY_SIZE(cameras);
213
214
215preview_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
233size_t length_previewSize =  ARRAY_SIZE(previewSize);
234
235Vcapture_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
255size_t lenght_Vcapture_size = ARRAY_SIZE(VcaptureSize);
256
257capture_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
272size_t length_capture_Size = ARRAY_SIZE(captureSize);
273
274
275outformat outputFormat[] = {
276        { OUTPUT_FORMAT_THREE_GPP, "3gp" },
277        { OUTPUT_FORMAT_MPEG_4, "mp4" },
278    };
279
280size_t length_outformat = ARRAY_SIZE(outputFormat);
281
282video_Codecs videoCodecs[] = {
283  { VIDEO_ENCODER_H263, "H263" },
284  { VIDEO_ENCODER_H264, "H264" },
285  { VIDEO_ENCODER_MPEG_4_SP, "MPEG4"}
286};
287
288size_t length_video_Codecs = ARRAY_SIZE(videoCodecs);
289
290audio_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
298size_t length_audio_Codecs = ARRAY_SIZE(audioCodecs);
299
300V_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
319size_t length_V_bitRate = ARRAY_SIZE(VbitRate);
320
321Zoom 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
332size_t length_Zoom = ARRAY_SIZE(zoom);
333
334fps_ranges fpsRanges[] = {
335  { "5000,30000", "[5:30]" },
336  { "5000,10000", "[5:10]" },
337  { "5000,15000", "[5:15]" },
338  { "5000,20000", "[5:20]" },
339};
340
341size_t length_fps_ranges = ARRAY_SIZE(fpsRanges);
342
343fpsConst_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
352size_t length_fpsConst_Ranges = ARRAY_SIZE(fpsConstRanges);
353
354fpsConst_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
363size_t length_fpsConst_RangesSec = ARRAY_SIZE(fpsConstRangesSec);
364
365const char *antibanding[] = {
366    "off",
367    "auto",
368    "50hz",
369    "60hz",
370};
371int antibanding_mode = 0;
372const char *focus[] = {
373    "auto",
374    "infinity",
375    "macro",
376    "continuous-video",
377    "extended",
378    "portrait",
379};
380int focus_mode = 0;
381pixel_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
389const char *codingformat[] = {"yuv422i-yuyv", "yuv420sp", "rgb565", "jpeg", "raw", "jps", "mpo", "raw+jpeg", "raw+mpo"};
390const char *gbce[] = {"disable", "enable"};
391int pictureFormat = 3; // jpeg
392const char *exposure[] = {"auto", "macro", "portrait", "landscape", "sports", "night", "night-portrait", "backlighting", "manual"};
393const char *capture[] = { "high-performance", "high-quality", "video-mode" };
394const char *autoconvergencemode[] = { "mode-disable", "mode-frame", "mode-center", "mode-fft", "mode-manual" };
395const char *manualconvergencevalues[] = { "-100", "-50", "-30", "-25", "0", "25", "50", "100" };
396
397const struct {
398    int fps;
399} frameRate[] = {
400    {0},
401    {5},
402    {10},
403    {15},
404    {20},
405    {25},
406    {30}
407};
408
409int thumbSizeIDX =  3;
410int previewSizeIDX = ARRAY_SIZE(previewSize) - 1;
411int captureSizeIDX = ARRAY_SIZE(captureSize) - 1;
412int frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1;
413int frameRateIDXSec = ARRAY_SIZE(fpsConstRangesSec) - 1;
414int VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 1;
415int VbitRateIDX = ARRAY_SIZE(VbitRate) - 1;
416
417static unsigned int recording_counter = 1;
418
419int dump_preview = 0;
420int bufferStarvationTest = 0;
421bool showfps = false;
422
423const char *metering[] = {
424    "center",
425    "average",
426};
427int meter_mode = 0;
428bool bLogSysLinkTrace = true;
429bool stressTest = false;
430bool stopScript = false;
431int restartCount = 0;
432
433/** Calculate delay from a reference time */
434unsigned 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() */
448void 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
488out:
489
490    if (fd >= 0)
491        close(fd);
492
493    LOG_FUNCTION_NAME_EXIT;
494}
495
496void 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
535out:
536
537    if (fd >= 0)
538        close(fd);
539
540    LOG_FUNCTION_NAME_EXIT;
541}
542
543
544void 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() */
562void 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() */
582void 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
625out:
626
627    if (fd >= 0)
628        close(fd);
629
630    LOG_FUNCTION_NAME_EXIT;
631}
632
633void 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
651void 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
685void 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
714void 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
733int 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
773void 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
798int 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
817int 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
829int 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
859int 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
969int 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
993int 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
1013int 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
1039int 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
1054int 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
1097void stopPreview() {
1098    if ( hardwareActive ) {
1099        camera->stopPreview();
1100
1101        destroyPreviewSurface();
1102
1103        previewRunning  = false;
1104        reSizePreview = true;
1105        closeCamera();
1106    }
1107}
1108
1109void 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
1197int 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
1276int 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
2099void 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
2112int 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
2307int 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
2346int 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