initial commit
Change-Id: I8f7a7eeece0e516efa486b77e9d97805c0e65d3e
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/test/CameraHal/camera_test_menu.cpp b/test/CameraHal/camera_test_menu.cpp
new file mode 100644
index 0000000..9bbf16a
--- /dev/null
+++ b/test/CameraHal/camera_test_menu.cpp
@@ -0,0 +1,2522 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <semaphore.h>
+#include <pthread.h>
+
+#include <surfaceflinger/Surface.h>
+#include <surfaceflinger/ISurface.h>
+#include <surfaceflinger/ISurfaceComposer.h>
+#include <surfaceflinger/ISurfaceComposerClient.h>
+#include <surfaceflinger/SurfaceComposerClient.h>
+
+#include <camera/Camera.h>
+#include <camera/ICamera.h>
+#include <media/mediarecorder.h>
+
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
+#include <cutils/properties.h>
+#include <camera/CameraParameters.h>
+#include <system/audio.h>
+#include <system/camera.h>
+
+#include <cutils/memory.h>
+#include <utils/Log.h>
+
+#include <sys/wait.h>
+
+#include "camera_test.h"
+
+using namespace android;
+
+int camera_index = 0;
+int print_menu;
+sp<Camera> camera;
+sp<MediaRecorder> recorder;
+sp<SurfaceComposerClient> client;
+sp<SurfaceControl> surfaceControl;
+sp<Surface> previewSurface;
+CameraParameters params;
+float compensation = 0.0;
+double latitude = 0.0;
+double longitude = 0.0;
+double degree_by_step = 17.5609756;//..0975609756097;
+double altitude = 0.0;
+int awb_mode = 0;
+int effects_mode = 0;
+int scene_mode = 0;
+int caf_mode = 0;
+int vnf_mode = 0;
+int vstab_mode = 0;
+
+int tempBracketRange = 1;
+int tempBracketIdx = 0;
+int measurementIdx = 0;
+int expBracketIdx = 0;
+int AutoConvergenceModeIDX = 0;
+int ManualConvergenceValuesIDX = 0;
+int ManualConvergenceDefaultValueIDX = 2;
+int gbceIDX = 0;
+int rotation = 0;
+bool reSizePreview = true;
+bool hardwareActive = false;
+bool recordingMode = false;
+bool previewRunning = false;
+int saturation = 0;
+int zoomIDX = 0;
+int videoCodecIDX = 0;
+int audioCodecIDX = 0;
+int outputFormatIDX = 0;
+int contrast = 0;
+int brightness = 0;
+unsigned int burst = 0;
+int sharpness = 0;
+int iso_mode = 0;
+int capture_mode = 0;
+int exposure_mode = 0;
+int ippIDX = 0;
+int ippIDX_old = 0;
+int previewFormat = 0;
+int jpegQuality = 85;
+int thumbQuality = 85;
+int flashIdx = 0;
+int fpsRangeIdx = 0;
+timeval autofocus_start, picture_start;
+char script_name[80];
+int prevcnt = 0;
+int videoFd = -1;
+int elockidx = 0;
+int wblockidx = 0;
+
+
+char dir_path[80] = SDCARD_PATH;
+
+const char *cameras[] = {"Primary Camera", "Secondary Camera 1", "Stereo Camera", "USB Camera", "Fake Camera"};
+const char *measurement[] = {"disable", "enable"};
+const char *expBracketing[] = {"disable", "enable"};
+const char *expBracketingRange[] = {"", "-30,0,30,0,-30"};
+const char *tempBracketing[] = {"disable", "enable"};
+const char *faceDetection[] = {"disable", "enable"};
+const char *lock[] = {"false", "true"};
+
+#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+const char *ipp_mode[] = { "off", "Chroma Suppression", "Edge Enhancement" };
+#else
+const char *ipp_mode[] = { "off", "ldc", "nsf", "ldc-nsf" };
+#endif
+
+const char *iso [] = { "auto", "100", "200", "400", "800", "1200", "1600"};
+
+const char *effects [] = {
+#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+ "none",
+ "mono",
+ "negative",
+ "solarize",
+ "sepia",
+ "whiteboard",
+ "blackboard",
+ "cool",
+ "emboss"
+#else
+ "none",
+ "mono",
+ "negative",
+ "solarize",
+ "sepia",
+ "vivid",
+ "whiteboard",
+ "blackboard",
+ "cool",
+ "emboss",
+ "blackwhite",
+ "aqua",
+ "posterize"
+#endif
+};
+
+const char CameraParameters::FLASH_MODE_OFF[] = "off";
+const char CameraParameters::FLASH_MODE_AUTO[] = "auto";
+const char CameraParameters::FLASH_MODE_ON[] = "on";
+const char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
+const char CameraParameters::FLASH_MODE_TORCH[] = "torch";
+
+const char *flashModes[] = {
+ "off",
+ "auto",
+ "on",
+ "red-eye",
+ "torch",
+ "fill-in",
+};
+
+const char *caf [] = { "Off", "On" };
+const char *vnf [] = { "Off", "On" };
+const char *vstab [] = { "Off", "On" };
+
+
+const char *scene [] = {
+#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+ "auto",
+ "portrait",
+ "landscape",
+ "night",
+ "night-portrait",
+ "fireworks",
+ "snow",
+ "action",
+#else
+ "auto",
+ "portrait",
+ "landscape",
+ "night",
+ "night-portrait",
+ "night-indoor",
+ "fireworks",
+ "sport",
+ "cine",
+ "beach",
+ "snow",
+ "mood",
+ "closeup",
+ "underwater",
+ "document",
+ "barcode",
+ "oldfilm",
+ "candlelight",
+ "party",
+ "steadyphoto",
+ "sunset",
+ "action",
+ "theatre"
+#endif
+};
+const char *strawb_mode[] = {
+ "auto",
+ "incandescent",
+ "fluorescent",
+ "daylight",
+ "horizon",
+ "shadow",
+ "tungsten",
+ "shade",
+ "twilight",
+ "warm-fluorescent",
+ "facepriority",
+ "sunset"
+};
+
+size_t length_cam = ARRAY_SIZE(cameras);
+
+
+preview_size previewSize [] = {
+ { 0, 0, "NULL"},
+ { 128, 96, "SQCIF" },
+ { 176, 144, "QCIF" },
+ { 352, 288, "CIF" },
+ { 320, 240, "QVGA" },
+ { 352, 288, "CIF" },
+ { 640, 480, "VGA" },
+ { 720, 480, "NTSC" },
+ { 720, 576, "PAL" },
+ { 800, 480, "WVGA" },
+ { 848, 480, "WVGA2"},
+ { 864, 480, "WVGA3"},
+ { 992, 560, "WVGA4"},
+ { 1280, 720, "HD" },
+ { 1920, 1080, "FULLHD"},
+};
+
+size_t length_previewSize = ARRAY_SIZE(previewSize);
+
+Vcapture_size VcaptureSize [] = {
+ { 128, 96, "SQCIF" },
+ { 176, 144, "QCIF" },
+ { 352, 288, "CIF" },
+ { 320, 240, "QVGA" },
+ { 640, 480, "VGA" },
+ { 704, 480, "TVNTSC" },
+ { 704, 576, "TVPAL" },
+ { 720, 480, "D1NTSC" },
+ { 720, 576, "D1PAL" },
+ { 800, 480, "WVGA" },
+ #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+ { 848, 480, "WVGA2"},
+ { 864, 480, "WVGA3"},
+ { 992, 560, "WVGA4"},
+ #endif
+ { 1280, 720, "HD" },
+ { 1920, 1080, "FULLHD"},
+};
+
+size_t lenght_Vcapture_size = ARRAY_SIZE(VcaptureSize);
+
+capture_Size captureSize[] = {
+ { 320, 240, "QVGA" },
+ { 640, 480, "VGA" },
+ { 800, 600, "SVGA" },
+ { 1152, 864, "1MP" },
+ { 1280, 1024, "1.3MP" },
+ { 1600, 1200, "2MP" },
+ { 2048, 1536, "3MP" },
+ { 2592, 1944, "5MP" },
+ { 2608, 1960, "5MP" },
+ { 3264, 2448, "8MP" },
+ { 3648, 2736, "10MP"},
+ { 4032, 3024, "12MP"},
+};
+
+size_t length_capture_Size = ARRAY_SIZE(captureSize);
+
+
+outformat outputFormat[] = {
+ { OUTPUT_FORMAT_THREE_GPP, "3gp" },
+ { OUTPUT_FORMAT_MPEG_4, "mp4" },
+ };
+
+size_t length_outformat = ARRAY_SIZE(outputFormat);
+
+video_Codecs videoCodecs[] = {
+ { VIDEO_ENCODER_H263, "H263" },
+ { VIDEO_ENCODER_H264, "H264" },
+ { VIDEO_ENCODER_MPEG_4_SP, "MPEG4"}
+};
+
+size_t length_video_Codecs = ARRAY_SIZE(videoCodecs);
+
+audio_Codecs audioCodecs[] = {
+ { AUDIO_ENCODER_AMR_NB, "AMR_NB" },
+ { AUDIO_ENCODER_AMR_WB, "AMR_WB" },
+ { AUDIO_ENCODER_AAC, "AAC" },
+ { AUDIO_ENCODER_AAC_PLUS, "AAC+" },
+ { AUDIO_ENCODER_EAAC_PLUS, "EAAC+" }
+};
+
+size_t length_audio_Codecs = ARRAY_SIZE(audioCodecs);
+
+V_bitRate VbitRate[] = {
+ { 64000, "64K" },
+ { 128000, "128K" },
+ { 192000, "192K" },
+ { 240000, "240K" },
+ { 320000, "320K" },
+ { 360000, "360K" },
+ { 384000, "384K" },
+ { 420000, "420K" },
+ { 768000, "768K" },
+ { 1000000, "1M" },
+ { 1500000, "1.5M" },
+ { 2000000, "2M" },
+ { 4000000, "4M" },
+ { 6000000, "6M" },
+ { 8000000, "8M" },
+ { 10000000, "10M" },
+};
+
+size_t length_V_bitRate = ARRAY_SIZE(VbitRate);
+
+Zoom zoom[] = {
+ { 0, "1x" },
+ { 12, "1.5x"},
+ { 20, "2x" },
+ { 27, "2.5x"},
+ { 32, "3x" },
+ { 36, "3.5x"},
+ { 40, "4x" },
+ { 60, "8x" },
+};
+
+size_t length_Zoom = ARRAY_SIZE(zoom);
+
+fps_ranges fpsRanges[] = {
+ { "5000,30000", "[5:30]" },
+ { "5000,10000", "[5:10]" },
+ { "5000,15000", "[5:15]" },
+ { "5000,20000", "[5:20]" },
+};
+
+size_t length_fps_ranges = ARRAY_SIZE(fpsRanges);
+
+fpsConst_Ranges fpsConstRanges[] = {
+ { "5000,5000", "[5:5]", 5 },
+ { "10000,10000", "[10:10]", 10 },
+ { "15000,15000", "[15:15]", 15 },
+ { "20000,20000", "[20:20]", 20 },
+ { "25000,25000", "[25:25]", 25 },
+ { "30000,30000", "[30:30]", 30 },
+};
+
+size_t length_fpsConst_Ranges = ARRAY_SIZE(fpsConstRanges);
+
+fpsConst_RangesSec fpsConstRangesSec[] = {
+ { "5000,5000", "[5:5]", 5 },
+ { "10000,10000", "[10:10]", 10 },
+ { "15000,15000", "[15:15]", 15 },
+ { "20000,20000", "[20:20]", 20 },
+ { "25000,25000", "[25:25]", 25 },
+ { "27000,27000", "[27:27]", 27 },
+};
+
+size_t length_fpsConst_RangesSec = ARRAY_SIZE(fpsConstRangesSec);
+
+const char *antibanding[] = {
+ "off",
+ "auto",
+ "50hz",
+ "60hz",
+};
+int antibanding_mode = 0;
+const char *focus[] = {
+ "auto",
+ "infinity",
+ "macro",
+ "continuous-video",
+ "extended",
+ "portrait",
+};
+int focus_mode = 0;
+pixel_format pixelformat[] = {
+ { HAL_PIXEL_FORMAT_YCbCr_422_I, CameraParameters::PIXEL_FORMAT_YUV422I },
+ { HAL_PIXEL_FORMAT_YCrCb_420_SP, CameraParameters::PIXEL_FORMAT_YUV420SP },
+ { HAL_PIXEL_FORMAT_RGB_565, CameraParameters::PIXEL_FORMAT_RGB565 },
+ { -1, CameraParameters::PIXEL_FORMAT_JPEG },
+ { -1, "raw" },
+ };
+
+const char *codingformat[] = {"yuv422i-yuyv", "yuv420sp", "rgb565", "jpeg", "raw", "jps", "mpo", "raw+jpeg", "raw+mpo"};
+const char *gbce[] = {"disable", "enable"};
+int pictureFormat = 3; // jpeg
+const char *exposure[] = {"auto", "macro", "portrait", "landscape", "sports", "night", "night-portrait", "backlighting", "manual"};
+const char *capture[] = { "high-performance", "high-quality", "video-mode" };
+const char *autoconvergencemode[] = { "mode-disable", "mode-frame", "mode-center", "mode-fft", "mode-manual" };
+const char *manualconvergencevalues[] = { "-100", "-50", "-30", "-25", "0", "25", "50", "100" };
+
+const struct {
+ int fps;
+} frameRate[] = {
+ {0},
+ {5},
+ {10},
+ {15},
+ {20},
+ {25},
+ {30}
+};
+
+int thumbSizeIDX = 3;
+int previewSizeIDX = ARRAY_SIZE(previewSize) - 1;
+int captureSizeIDX = ARRAY_SIZE(captureSize) - 1;
+int frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1;
+int frameRateIDXSec = ARRAY_SIZE(fpsConstRangesSec) - 1;
+int VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 1;
+int VbitRateIDX = ARRAY_SIZE(VbitRate) - 1;
+
+static unsigned int recording_counter = 1;
+
+int dump_preview = 0;
+int bufferStarvationTest = 0;
+bool showfps = false;
+
+const char *metering[] = {
+ "center",
+ "average",
+};
+int meter_mode = 0;
+bool bLogSysLinkTrace = true;
+bool stressTest = false;
+bool stopScript = false;
+int restartCount = 0;
+
+/** Calculate delay from a reference time */
+unsigned long long timeval_delay(const timeval *ref) {
+ unsigned long long st, end, delay;
+ timeval current_time;
+
+ gettimeofday(¤t_time, 0);
+
+ st = ref->tv_sec * 1000000 + ref->tv_usec;
+ end = current_time.tv_sec * 1000000 + current_time.tv_usec;
+ delay = end - st;
+
+ return delay;
+}
+
+/** Callback for takePicture() */
+void my_raw_callback(const sp<IMemory>& mem) {
+
+ static int counter = 1;
+ unsigned char *buff = NULL;
+ int size;
+ int fd = -1;
+ char fn[256];
+
+ LOG_FUNCTION_NAME;
+
+ if (mem == NULL)
+ goto out;
+
+ //Start preview after capture.
+ camera->startPreview();
+
+ fn[0] = 0;
+ sprintf(fn, "/sdcard/img%03d.raw", counter);
+ fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
+
+ if (fd < 0)
+ goto out;
+
+ size = mem->size();
+
+ if (size <= 0)
+ goto out;
+
+ buff = (unsigned char *)mem->pointer();
+
+ if (!buff)
+ goto out;
+
+ if (size != write(fd, buff, size))
+ printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
+
+ counter++;
+ printf("%s: buffer=%08X, size=%d stored at %s\n",
+ __FUNCTION__, (int)buff, size, fn);
+
+out:
+
+ if (fd >= 0)
+ close(fd);
+
+ LOG_FUNCTION_NAME_EXIT;
+}
+
+void saveFile(const sp<IMemory>& mem) {
+ static int counter = 1;
+ unsigned char *buff = NULL;
+ int size;
+ int fd = -1;
+ char fn[256];
+
+ LOG_FUNCTION_NAME;
+
+ if (mem == NULL)
+ goto out;
+
+ fn[0] = 0;
+ sprintf(fn, "/sdcard/preview%03d.yuv", counter);
+ fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
+ if(fd < 0) {
+ LOGE("Unable to open file %s: %s", fn, strerror(fd));
+ goto out;
+ }
+
+ size = mem->size();
+ if (size <= 0) {
+ LOGE("IMemory object is of zero size");
+ goto out;
+ }
+
+ buff = (unsigned char *)mem->pointer();
+ if (!buff) {
+ LOGE("Buffer pointer is invalid");
+ goto out;
+ }
+
+ if (size != write(fd, buff, size))
+ printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
+
+ counter++;
+ printf("%s: buffer=%08X, size=%d\n",
+ __FUNCTION__, (int)buff, size);
+
+out:
+
+ if (fd >= 0)
+ close(fd);
+
+ LOG_FUNCTION_NAME_EXIT;
+}
+
+
+void debugShowFPS()
+{
+ static int mFrameCount = 0;
+ static int mLastFrameCount = 0;
+ static nsecs_t mLastFpsTime = 0;
+ static float mFps = 0;
+ mFrameCount++;
+ if ( ( mFrameCount % 30 ) == 0 ) {
+ nsecs_t now = systemTime();
+ nsecs_t diff = now - mLastFpsTime;
+ mFps = ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff;
+ mLastFpsTime = now;
+ mLastFrameCount = mFrameCount;
+ printf("####### [%d] Frames, %f FPS", mFrameCount, mFps);
+ }
+}
+
+/** Callback for startPreview() */
+void my_preview_callback(const sp<IMemory>& mem) {
+
+ printf("PREVIEW Callback 0x%x", ( unsigned int ) mem->pointer());
+ if (dump_preview) {
+
+ if(prevcnt==50)
+ saveFile(mem);
+
+ prevcnt++;
+
+ uint8_t *ptr = (uint8_t*) mem->pointer();
+
+ 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]);
+
+ }
+
+ debugShowFPS();
+}
+
+/** Callback for takePicture() */
+void my_jpeg_callback(const sp<IMemory>& mem) {
+ static int counter = 1;
+ unsigned char *buff = NULL;
+ int size;
+ int fd = -1;
+ char fn[256];
+
+ LOG_FUNCTION_NAME;
+
+ //Start preview after capture.
+ camera->startPreview();
+
+ if (mem == NULL)
+ goto out;
+
+ fn[0] = 0;
+ sprintf(fn, "%s/img%03d.jpg", dir_path,counter);
+ fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
+
+ if(fd < 0) {
+ LOGE("Unable to open file %s: %s", fn, strerror(fd));
+ goto out;
+ }
+
+ size = mem->size();
+ if (size <= 0) {
+ LOGE("IMemory object is of zero size");
+ goto out;
+ }
+
+ buff = (unsigned char *)mem->pointer();
+ if (!buff) {
+ LOGE("Buffer pointer is invalid");
+ goto out;
+ }
+
+ if (size != write(fd, buff, size))
+ printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
+
+ counter++;
+ printf("%s: buffer=%08X, size=%d stored at %s\n",
+ __FUNCTION__, (int)buff, size, fn);
+
+out:
+
+ if (fd >= 0)
+ close(fd);
+
+ LOG_FUNCTION_NAME_EXIT;
+}
+
+void my_face_callback(camera_frame_metadata_t *metadata) {
+ int idx;
+
+ if ( NULL == metadata ) {
+ return;
+ }
+
+ for ( idx = 0 ; idx < metadata->number_of_faces ; idx++ ) {
+ printf("Face %d at %d,%d %d,%d \n",
+ idx,
+ metadata->faces[idx].rect[0],
+ metadata->faces[idx].rect[1],
+ metadata->faces[idx].rect[2],
+ metadata->faces[idx].rect[3]);
+ }
+
+}
+
+void CameraHandler::notify(int32_t msgType, int32_t ext1, int32_t ext2) {
+
+ printf("Notify cb: %d %d %d\n", msgType, ext1, ext2);
+
+ if ( msgType & CAMERA_MSG_FOCUS )
+ printf("AutoFocus %s in %llu us\n", (ext1) ? "OK" : "FAIL", timeval_delay(&autofocus_start));
+
+ if ( msgType & CAMERA_MSG_SHUTTER )
+ printf("Shutter done in %llu us\n", timeval_delay(&picture_start));
+
+ if ( msgType & CAMERA_MSG_ERROR && (ext1 == 1))
+ {
+ printf("Camera Test CAMERA_MSG_ERROR.....\n");
+ if (stressTest)
+ {
+ printf("Camera Test Notified of Error Restarting.....\n");
+ stopScript = true;
+ }
+ else
+ {
+ printf("Camera Test Notified of Error Stopping.....\n");
+ stopScript =false;
+ stopPreview();
+
+ if (recordingMode)
+ {
+ stopRecording();
+ closeRecorder();
+ recordingMode = false;
+ }
+ }
+ }
+}
+
+void CameraHandler::postData(int32_t msgType,
+ const sp<IMemory>& dataPtr,
+ camera_frame_metadata_t *metadata) {
+ printf("Data cb: %d\n", msgType);
+
+ if ( msgType & CAMERA_MSG_PREVIEW_FRAME )
+ my_preview_callback(dataPtr);
+
+ if ( msgType & CAMERA_MSG_RAW_IMAGE ) {
+ printf("RAW done in %llu us\n", timeval_delay(&picture_start));
+ my_raw_callback(dataPtr);
+ }
+
+ if (msgType & CAMERA_MSG_POSTVIEW_FRAME) {
+ printf("Postview frame %llu us\n", timeval_delay(&picture_start));
+ }
+
+ if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) {
+ printf("JPEG done in %llu us\n", timeval_delay(&picture_start));
+ my_jpeg_callback(dataPtr);
+ }
+
+ if ( ( msgType & CAMERA_MSG_PREVIEW_METADATA ) &&
+ ( NULL != metadata ) ) {
+ printf("Face detected %d \n", metadata->number_of_faces);
+ my_face_callback(metadata);
+ }
+}
+
+void CameraHandler::postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
+
+{
+ printf("Recording cb: %d %lld %p\n", msgType, timestamp, dataPtr.get());
+
+ static uint32_t count = 0;
+
+ //if(count==100)
+ //saveFile(dataPtr);
+
+ count++;
+
+ uint8_t *ptr = (uint8_t*) dataPtr->pointer();
+
+ 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]);
+
+ camera->releaseRecordingFrame(dataPtr);
+}
+
+int createPreviewSurface(unsigned int width, unsigned int height, int32_t pixFormat) {
+ unsigned int previewWidth, previewHeight;
+
+ if ( MAX_PREVIEW_SURFACE_WIDTH < width ) {
+ previewWidth = MAX_PREVIEW_SURFACE_WIDTH;
+ } else {
+ previewWidth = width;
+ }
+
+ if ( MAX_PREVIEW_SURFACE_HEIGHT < height ) {
+ previewHeight = MAX_PREVIEW_SURFACE_HEIGHT;
+ } else {
+ previewHeight = height;
+ }
+
+ client = new SurfaceComposerClient();
+
+ if ( NULL == client.get() ) {
+ printf("Unable to establish connection to Surface Composer \n");
+
+ return -1;
+ }
+
+ surfaceControl = client->createSurface(0,
+ previewWidth,
+ previewHeight,
+ pixFormat);
+
+ previewSurface = surfaceControl->getSurface();
+
+ client->openGlobalTransaction();
+ surfaceControl->setLayer(100000);
+ surfaceControl->setPosition(0, 0);
+ surfaceControl->setSize(previewWidth, previewHeight);
+ surfaceControl->show();
+ client->closeGlobalTransaction();
+
+ return 0;
+}
+
+void printSupportedParams()
+{
+ printf("\n\r\tSupported Cameras: %s", params.get("camera-indexes"));
+ printf("\n\r\tSupported Picture Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES));
+ printf("\n\r\tSupported Picture Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS));
+ printf("\n\r\tSupported Preview Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
+ printf("\n\r\tSupported Preview Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS));
+ printf("\n\r\tSupported Preview Frame Rates: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES));
+ printf("\n\r\tSupported Thumbnail Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES));
+ printf("\n\r\tSupported Whitebalance Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE));
+ printf("\n\r\tSupported Effects: %s", params.get(CameraParameters::KEY_SUPPORTED_EFFECTS));
+ printf("\n\r\tSupported Scene Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES));
+ printf("\n\r\tSupported Focus Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES));
+ printf("\n\r\tSupported Antibanding Options: %s", params.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING));
+ printf("\n\r\tSupported Flash Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES));
+ printf("\n\r\tSupported Focus Areas: %d", params.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS));
+
+ if ( NULL != params.get(CameraParameters::KEY_FOCUS_DISTANCES) ) {
+ printf("\n\r\tFocus Distances: %s \n", params.get(CameraParameters::KEY_FOCUS_DISTANCES));
+ }
+
+ return;
+}
+
+
+int destroyPreviewSurface() {
+
+ if ( NULL != previewSurface.get() ) {
+ previewSurface.clear();
+ }
+
+ if ( NULL != surfaceControl.get() ) {
+ surfaceControl->clear();
+ surfaceControl.clear();
+ }
+
+ if ( NULL != client.get() ) {
+ client->dispose();
+ client.clear();
+ }
+
+ return 0;
+}
+
+int openRecorder() {
+ recorder = new MediaRecorder();
+
+ if ( NULL == recorder.get() ) {
+ printf("Error while creating MediaRecorder\n");
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int closeRecorder() {
+ if ( NULL == recorder.get() ) {
+ printf("invalid recorder reference\n");
+
+ return -1;
+ }
+
+ if ( recorder->init() < 0 ) {
+ printf("recorder failed to initialize\n");
+
+ return -1;
+ }
+
+ if ( recorder->close() < 0 ) {
+ printf("recorder failed to close\n");
+
+ return -1;
+ }
+
+ if ( recorder->release() < 0 ) {
+ printf("error while releasing recorder\n");
+
+ return -1;
+ }
+
+ recorder.clear();
+
+ return 0;
+}
+
+int configureRecorder() {
+
+ char videoFile[256],vbit_string[50];
+ videoFd = -1;
+
+ if ( ( NULL == recorder.get() ) || ( NULL == camera.get() ) ) {
+ printf("invalid recorder and/or camera references\n");
+
+ return -1;
+ }
+
+ camera->unlock();
+
+ sprintf(vbit_string,"video-param-encoding-bitrate=%u", VbitRate[VbitRateIDX].bit_rate);
+ String8 bit_rate(vbit_string);
+ if ( recorder->setParameters(bit_rate) < 0 ) {
+ printf("error while configuring bit rate\n");
+
+ return -1;
+ }
+
+ if ( recorder->setCamera(camera->remote(), camera->getRecordingProxy()) < 0 ) {
+ printf("error while setting the camera\n");
+
+ return -1;
+ }
+
+ if ( recorder->setVideoSource(VIDEO_SOURCE_CAMERA) < 0 ) {
+ printf("error while configuring camera video source\n");
+
+ return -1;
+ }
+
+
+ if ( recorder->setAudioSource(AUDIO_SOURCE_MIC) < 0 ) {
+ printf("error while configuring camera audio source\n");
+
+ return -1;
+ }
+
+ if ( recorder->setOutputFormat(outputFormat[outputFormatIDX].type) < 0 ) {
+ printf("error while configuring output format\n");
+
+ return -1;
+ }
+
+ if(mkdir("/mnt/sdcard/videos",0777) == -1)
+ printf("\n Directory --videos-- was not created \n");
+ sprintf(videoFile, "/mnt/sdcard/videos/video%d.%s", recording_counter,outputFormat[outputFormatIDX].desc);
+
+ videoFd = open(videoFile, O_CREAT | O_RDWR);
+
+ if(videoFd < 0){
+ printf("Error while creating video filename\n");
+
+ return -1;
+ }
+
+ if ( recorder->setOutputFile(videoFd, 0, 0) < 0 ) {
+ printf("error while configuring video filename\n");
+
+ return -1;
+ }
+
+ recording_counter++;
+
+ if (camera_index == 0) {
+ if ( recorder->setVideoFrameRate(fpsConstRanges[frameRateIDX].constFramerate) < 0 ) {
+ printf("error while configuring video framerate\n");
+ return -1;
+ }
+ }
+ else {
+ if ( recorder->setVideoFrameRate(fpsConstRangesSec[frameRateIDXSec].constFramerate) < 0 ) {
+ printf("error while configuring video framerate\n");
+ return -1;
+ }
+ }
+
+ if ( recorder->setVideoSize(VcaptureSize[VcaptureSizeIDX].width, VcaptureSize[VcaptureSizeIDX].height) < 0 ) {
+ printf("error while configuring video size\n");
+
+ return -1;
+ }
+
+ if ( recorder->setVideoEncoder(videoCodecs[videoCodecIDX].type) < 0 ) {
+ printf("error while configuring video codec\n");
+
+ return -1;
+ }
+
+ if ( recorder->setAudioEncoder(audioCodecs[audioCodecIDX].type) < 0 ) {
+ printf("error while configuring audio codec\n");
+
+ return -1;
+ }
+
+ if ( recorder->setPreviewSurface( surfaceControl->getSurface() ) < 0 ) {
+ printf("error while configuring preview surface\n");
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int startRecording() {
+ if ( ( NULL == recorder.get() ) || ( NULL == camera.get() ) ) {
+ printf("invalid recorder and/or camera references\n");
+
+ return -1;
+ }
+
+ camera->unlock();
+
+ if ( recorder->prepare() < 0 ) {
+ printf("recorder prepare failed\n");
+
+ return -1;
+ }
+
+ if ( recorder->start() < 0 ) {
+ printf("recorder start failed\n");
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int stopRecording() {
+ if ( NULL == recorder.get() ) {
+ printf("invalid recorder reference\n");
+
+ return -1;
+ }
+
+ if ( recorder->stop() < 0 ) {
+ printf("recorder failed to stop\n");
+
+ return -1;
+ }
+
+ if ( 0 < videoFd ) {
+ close(videoFd);
+ }
+
+ return 0;
+}
+
+int openCamera() {
+ printf("openCamera(camera_index=%d)\n", camera_index);
+ camera = Camera::connect(camera_index);
+
+ if ( NULL == camera.get() ) {
+ printf("Unable to connect to CameraService\n");
+ printf("Retrying... \n");
+ sleep(1);
+ camera = Camera::connect(camera_index);
+
+ if ( NULL == camera.get() ) {
+ printf("Giving up!! \n");
+ return -1;
+ }
+ }
+
+ params = camera->getParameters();
+ camera->setParameters(params.flatten());
+
+ camera->setListener(new CameraHandler());
+
+ hardwareActive = true;
+
+ return 0;
+}
+
+int closeCamera() {
+ if ( NULL == camera.get() ) {
+ printf("invalid camera reference\n");
+
+ return -1;
+ }
+
+ camera->disconnect();
+ camera.clear();
+
+ hardwareActive = false;
+
+ return 0;
+}
+
+//Workaround for an issue seen with ICS SurfaceFlinger.
+//The last surface created is not getting rendered on screen,
+//in our case this is the preview surface. Here we artificially wait
+//for the preview to start and create a new temporary surface, which
+//gets destroyed immediately.
+int surfaceWorkaround(unsigned int width, unsigned int height, int32_t pixFormat) {
+ sleep(1);
+
+ if ( NULL == client.get() ) {
+ return NO_INIT;
+ }
+
+ sp<SurfaceControl> tmpSurface = client->createSurface(0,
+ width,
+ height,
+ pixFormat);
+
+ if ( NULL != tmpSurface.get() ) {
+ tmpSurface->clear();
+ tmpSurface.clear();
+ } else {
+ return -ENOMEM;
+ }
+
+ return NO_ERROR;
+}
+
+int startPreview() {
+ int previewWidth, previewHeight;
+ if (reSizePreview) {
+
+ if(recordingMode)
+ {
+ previewWidth = VcaptureSize[VcaptureSizeIDX].width;
+ previewHeight = VcaptureSize[VcaptureSizeIDX].height;
+ }else
+ {
+ previewWidth = previewSize[previewSizeIDX].width;
+ previewHeight = previewSize[previewSizeIDX].height;
+ }
+
+ if ( createPreviewSurface(previewWidth,
+ previewHeight,
+ pixelformat[previewFormat].pixelFormatDesc) < 0 ) {
+ printf("Error while creating preview surface\n");
+ return -1;
+ }
+
+ if ( !hardwareActive ) {
+ openCamera();
+ }
+
+ params.setPreviewSize(previewWidth, previewHeight);
+ params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
+
+ camera->setParameters(params.flatten());
+ camera->setPreviewDisplay(previewSurface);
+
+ if(!hardwareActive) prevcnt = 0;
+
+ camera->startPreview();
+
+ previewRunning = true;
+ reSizePreview = false;
+
+ surfaceWorkaround( previewWidth, previewHeight, pixelformat[previewFormat].pixelFormatDesc);
+ }
+
+ return 0;
+}
+
+void stopPreview() {
+ if ( hardwareActive ) {
+ camera->stopPreview();
+
+ destroyPreviewSurface();
+
+ previewRunning = false;
+ reSizePreview = true;
+ closeCamera();
+ }
+}
+
+void initDefaults() {
+ camera_index = 0;
+ antibanding_mode = 0;
+ focus_mode = 0;
+ fpsRangeIdx = 0;
+ previewSizeIDX = 1; /* Default resolution set to WVGA */
+ captureSizeIDX = 3; /* Default capture resolution is 8MP */
+ frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1; /* Default frame rate is 30 FPS */
+#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+ VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 6;/* Default video record is WVGA */
+#else
+ VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 2;/* Default video record is WVGA */
+#endif
+ VbitRateIDX = ARRAY_SIZE(VbitRate) - 4; /*Default video bit rate is 4M */
+ thumbSizeIDX = 0;
+ compensation = 0.0;
+ awb_mode = 0;
+ effects_mode = 0;
+ scene_mode = 0;
+ caf_mode = 0;
+ vnf_mode = 0;
+ vstab_mode = 0;
+ expBracketIdx = 0;
+ flashIdx = 0;
+ rotation = 0;
+ zoomIDX = 0;
+ videoCodecIDX = 0;
+ gbceIDX = 0;
+#ifdef TARGET_OMAP4
+ ///Temporary fix until OMAP3 and OMAP4 3A values are synced
+ contrast = 90;
+ brightness = 50;
+ sharpness = 0;
+ saturation = 50;
+#else
+ contrast = 100;
+ brightness = 100;
+ sharpness = 0;
+ saturation = 100;
+#endif
+ iso_mode = 0;
+ capture_mode = 0;
+ exposure_mode = 0;
+ ippIDX = 0;//set the ipp to ldc-nsf as the capture mode is set to HQ by default
+ ippIDX_old = ippIDX;
+ jpegQuality = 85;
+ bufferStarvationTest = 0;
+ meter_mode = 0;
+ previewFormat = 1;
+ pictureFormat = 3; // jpeg
+ params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height);
+ params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
+ params.set(CameraParameters::KEY_ROTATION, rotation);
+ params.set(KEY_COMPENSATION, (int) (compensation * 10));
+ params.set(params.KEY_WHITE_BALANCE, strawb_mode[awb_mode]);
+ params.set(KEY_MODE, (capture[capture_mode]));
+ params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
+ params.set(KEY_CAF, caf_mode);
+ params.set(KEY_ISO, iso_mode);
+ params.set(KEY_GBCE, gbce[gbceIDX]);
+ params.set(KEY_SHARPNESS, sharpness);
+ params.set(KEY_CONTRAST, contrast);
+ params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
+ params.set(KEY_EXPOSURE, exposure[exposure_mode]);
+ params.set(KEY_BRIGHTNESS, brightness);
+ params.set(KEY_SATURATION, saturation);
+ params.set(params.KEY_EFFECT, effects[effects_mode]);
+ params.setPreviewFrameRate(frameRate[ARRAY_SIZE(frameRate) - 1].fps);
+ params.set(params.KEY_ANTIBANDING, antibanding[antibanding_mode]);
+ params.set(params.KEY_FOCUS_MODE, focus[focus_mode]);
+ params.set(KEY_IPP, ippIDX);
+ params.set(CameraParameters::KEY_JPEG_QUALITY, jpegQuality);
+ params.setPreviewFormat(pixelformat[previewFormat].pixformat);
+ params.setPictureFormat(codingformat[pictureFormat]);
+ params.set(KEY_BUFF_STARV, bufferStarvationTest); //enable buffer starvation
+ params.set(KEY_METERING_MODE, metering[meter_mode]);
+ params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, previewSize[thumbSizeIDX].width);
+ params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, previewSize[thumbSizeIDX].height);
+ ManualConvergenceValuesIDX = ManualConvergenceDefaultValueIDX;
+ params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
+ params.set(KEY_S3D2D_PREVIEW_MODE, "off");
+ params.set(KEY_STEREO_CAMERA, "false");
+ params.set(KEY_EXIF_MODEL, MODEL);
+ params.set(KEY_EXIF_MAKE, MAKE);
+}
+
+int menu_gps() {
+ char ch;
+ char coord_str[100];
+
+ if (print_menu) {
+ printf("\n\n== GPS MENU ============================\n\n");
+ printf(" e. Latitude: %.7lf\n", latitude);
+ printf(" d. Longitude: %.7lf\n", longitude);
+ printf(" c. Altitude: %.7lf\n", altitude);
+ printf("\n");
+ printf(" q. Return to main menu\n");
+ printf("\n");
+ printf(" Choice: ");
+ }
+
+ ch = getchar();
+ printf("%c", ch);
+
+ print_menu = 1;
+
+ switch (ch) {
+
+ case 'e':
+ latitude += degree_by_step;
+
+ if (latitude > 90.0) {
+ latitude -= 180.0;
+ }
+
+ snprintf(coord_str, 7, "%.7lf", latitude);
+ params.set(params.KEY_GPS_LATITUDE, coord_str);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'd':
+ longitude += degree_by_step;
+
+ if (longitude > 180.0) {
+ longitude -= 360.0;
+ }
+
+ snprintf(coord_str, 7, "%.7lf", longitude);
+ params.set(params.KEY_GPS_LONGITUDE, coord_str);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'c':
+ altitude += 12345.67890123456789;
+
+ if (altitude > 100000.0) {
+ altitude -= 200000.0;
+ }
+
+ snprintf(coord_str, 100, "%.20lf", altitude);
+ params.set(params.KEY_GPS_ALTITUDE, coord_str);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'Q':
+ case 'q':
+ return -1;
+
+ default:
+ print_menu = 0;
+ break;
+ }
+
+ return 0;
+}
+
+int functional_menu() {
+ char ch;
+
+ if (print_menu) {
+
+ printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n");
+
+ printf(" \n\nSTART / STOP / GENERAL SERVICES \n");
+ printf(" -----------------------------\n");
+ printf(" A Select Camera %s\n", cameras[camera_index]);
+ printf(" [. Resume Preview after capture\n");
+ printf(" 0. Reset to defaults\n");
+ printf(" q. Quit\n");
+ printf(" @. Disconnect and Reconnect to CameraService \n");
+ printf(" /. Enable/Disable showfps: %s\n", ((showfps)? "Enabled":"Disabled"));
+ printf(" a. GEO tagging settings menu\n");
+ printf(" E. Camera Capability Dump");
+
+
+ printf(" \n\n PREVIEW SUB MENU \n");
+ printf(" -----------------------------\n");
+ printf(" 1. Start Preview\n");
+ printf(" 2. Stop Preview\n");
+ printf(" ~. Preview format %s\n", pixelformat[previewFormat].pixformat);
+#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+ printf(" 4. Preview size: %4d x %4d - %s\n",previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height, previewSize[previewSizeIDX].desc);
+#else
+ 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);
+#endif
+ printf(" R. Preview framerate range: %s\n", fpsRanges[fpsRangeIdx].rangeDescription);
+ printf(" &. Dump a preview frame\n");
+ printf(" _. Auto Convergence mode: %s\n", autoconvergencemode[AutoConvergenceModeIDX]);
+ printf(" ^. Manual Convergence Value: %s\n", manualconvergencevalues[ManualConvergenceValuesIDX]);
+ printf(" {. 2D Preview in 3D Stereo Mode: %s\n", params.get(KEY_S3D2D_PREVIEW_MODE));
+
+ printf(" \n\n IMAGE CAPTURE SUB MENU \n");
+ printf(" -----------------------------\n");
+ printf(" p. Take picture/Full Press\n");
+ printf(" H. Exposure Bracketing: %s\n", expBracketing[expBracketIdx]);
+ printf(" U. Temporal Bracketing: %s\n", tempBracketing[tempBracketIdx]);
+ printf(" W. Temporal Bracketing Range: [-%d;+%d]\n", tempBracketRange, tempBracketRange);
+ printf(" $. Picture Format: %s\n", codingformat[pictureFormat]);
+ printf(" 3. Picture Rotation: %3d degree\n", rotation );
+ printf(" 5. Picture size: %4d x %4d - %s\n",captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height, captureSize[captureSizeIDX].name);
+ printf(" i. ISO mode: %s\n", iso[iso_mode]);
+ printf(" u. Capture Mode: %s\n", capture[capture_mode]);
+ printf(" k. IPP Mode: %s\n", ipp_mode[ippIDX]);
+ printf(" K. GBCE: %s\n", gbce[gbceIDX]);
+ printf(" o. Jpeg Quality: %d\n", jpegQuality);
+ printf(" #. Burst Images: %3d\n", burst);
+ printf(" :. Thumbnail Size: %4d x %4d - %s\n",previewSize[thumbSizeIDX].width, previewSize[thumbSizeIDX].height, previewSize[thumbSizeIDX].desc);
+ printf(" ': Thumbnail Quality %d\n", thumbQuality);
+
+ printf(" \n\n VIDEO CAPTURE SUB MENU \n");
+ printf(" -----------------------------\n");
+
+ printf(" 6. Start Video Recording\n");
+ printf(" 2. Stop Recording\n");
+ printf(" l. Video Capture resolution: %4d x %4d - %s\n",VcaptureSize[VcaptureSizeIDX].width,VcaptureSize[VcaptureSizeIDX].height, VcaptureSize[VcaptureSizeIDX].desc);
+ printf(" ]. Video Bit rate : %s\n", VbitRate[VbitRateIDX].desc);
+ printf(" 9. Video Codec: %s\n", videoCodecs[videoCodecIDX].desc);
+ printf(" D. Audio Codec: %s\n", audioCodecs[audioCodecIDX].desc);
+ printf(" v. Output Format: %s\n", outputFormat[outputFormatIDX].desc);
+
+ if (camera_index == 1) {
+ printf(" r. Framerate: %d\n", fpsConstRangesSec[frameRateIDXSec].constFramerate);
+ }
+ else {
+ printf(" r. Framerate: %d\n", fpsConstRanges[frameRateIDX].constFramerate);
+ }
+ printf(" *. Start Video Recording dump ( 1 raw frame ) \n");
+ printf(" B VNF %s \n", vnf[vnf_mode]);
+ printf(" C VSTAB %s", vstab[vstab_mode]);
+
+ printf(" \n\n 3A SETTING SUB MENU \n");
+ printf(" -----------------------------\n");
+
+ printf(" M. Measurement Data: %s\n", measurement[measurementIdx]);
+ printf(" F. Start face detection \n");
+ printf(" T. Stop face detection \n");
+ printf(" G. Touch/Focus area AF\n");
+ printf(" f. Auto Focus/Half Press\n");
+ printf(" J.Flash: %s\n", flashModes[flashIdx]);
+ printf(" 7. EV offset: %4.1f\n", compensation);
+ printf(" 8. AWB mode: %s\n", strawb_mode[awb_mode]);
+ printf(" z. Zoom %s\n", zoom[zoomIDX].zoom_description);
+ printf(" j. Exposure %s\n", exposure[exposure_mode]);
+ printf(" e. Effect: %s\n", effects[effects_mode]);
+ printf(" w. Scene: %s\n", scene[scene_mode]);
+ printf(" s. Saturation: %d\n", saturation);
+ printf(" c. Contrast: %d\n", contrast);
+ printf(" h. Sharpness: %d\n", sharpness);
+ printf(" b. Brightness: %d\n", brightness);
+ printf(" x. Antibanding: %s\n", antibanding[antibanding_mode]);
+ printf(" g. Focus mode: %s\n", focus[focus_mode]);
+ printf(" m. Metering mode: %s\n" , metering[meter_mode]);
+ printf(" <. Exposure Lock: %s\n", lock[elockidx]);
+ printf(" >. WhiteBalance Lock: %s\n",lock[wblockidx]);
+ printf("\n");
+ printf(" Choice: ");
+ }
+
+ ch = getchar();
+ printf("%c", ch);
+
+ print_menu = 1;
+
+ switch (ch) {
+
+ case '_':
+ AutoConvergenceModeIDX++;
+ AutoConvergenceModeIDX %= ARRAY_SIZE(autoconvergencemode);
+ params.set(KEY_AUTOCONVERGENCE, autoconvergencemode[AutoConvergenceModeIDX]);
+ if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], AUTOCONVERGENCE_MODE_MANUAL) == 0) {
+ params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
+ }
+ else {
+ params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceDefaultValueIDX]);
+ ManualConvergenceValuesIDX = ManualConvergenceDefaultValueIDX;
+ }
+ camera->setParameters(params.flatten());
+
+ break;
+ case '^':
+ if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], AUTOCONVERGENCE_MODE_MANUAL) == 0) {
+ ManualConvergenceValuesIDX++;
+ ManualConvergenceValuesIDX %= ARRAY_SIZE(manualconvergencevalues);
+ params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
+ camera->setParameters(params.flatten());
+ }
+ break;
+ case 'A':
+ camera_index++;
+ camera_index %= ARRAY_SIZE(cameras);
+ if ( camera_index == 2) {
+ params.set(KEY_STEREO_CAMERA, "true");
+ } else {
+ params.set(KEY_STEREO_CAMERA, "false");
+ }
+ closeCamera();
+
+ openCamera();
+
+ if (camera_index == 0) {
+ params.setPreviewFrameRate(30);
+ } else {
+ params.setPreviewFrameRate(27);
+ }
+
+
+ break;
+ case '[':
+ if ( hardwareActive ) {
+ camera->setParameters(params.flatten());
+ camera->startPreview();
+ }
+ break;
+
+ case '0':
+ initDefaults();
+ break;
+
+ case '1':
+
+ if ( startPreview() < 0 ) {
+ printf("Error while starting preview\n");
+
+ return -1;
+ }
+
+ break;
+
+ case '2':
+ stopPreview();
+
+ if ( recordingMode ) {
+ camera->disconnect();
+ camera.clear();
+ stopRecording();
+ closeRecorder();
+
+ camera = Camera::connect(camera_index);
+ if ( NULL == camera.get() ) {
+ sleep(1);
+ camera = Camera::connect(camera_index);
+ if ( NULL == camera.get() ) {
+ return -1;
+ }
+ }
+ camera->setListener(new CameraHandler());
+ camera->setParameters(params.flatten());
+ recordingMode = false;
+ }
+
+ break;
+
+ case '3':
+ rotation += 90;
+ rotation %= 360;
+ params.set(CameraParameters::KEY_ROTATION, rotation);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case '4':
+ previewSizeIDX += 1;
+ previewSizeIDX %= ARRAY_SIZE(previewSize);
+ if ( strcmp(params.get(KEY_STEREO_CAMERA), "false") == 0 ) {
+ params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height);
+ } else {
+ params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height*2);
+ }
+ reSizePreview = true;
+
+ if ( hardwareActive && previewRunning ) {
+ camera->stopPreview();
+ camera->setParameters(params.flatten());
+ camera->startPreview();
+ } else if ( hardwareActive ) {
+ camera->setParameters(params.flatten());
+ }
+
+ break;
+
+ case '5':
+ captureSizeIDX += 1;
+ captureSizeIDX %= ARRAY_SIZE(captureSize);
+ params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'l':
+ case 'L':
+ VcaptureSizeIDX++;
+ VcaptureSizeIDX %= ARRAY_SIZE(VcaptureSize);
+ break;
+
+ case ']':
+ VbitRateIDX++;
+ VbitRateIDX %= ARRAY_SIZE(VbitRate);
+ break;
+
+
+ case '6':
+
+ if ( !recordingMode ) {
+
+ recordingMode = true;
+
+ if ( startPreview() < 0 ) {
+ printf("Error while starting preview\n");
+
+ return -1;
+ }
+
+ if ( openRecorder() < 0 ) {
+ printf("Error while openning video recorder\n");
+
+ return -1;
+ }
+
+ if ( configureRecorder() < 0 ) {
+ printf("Error while configuring video recorder\n");
+
+ return -1;
+ }
+
+ if ( startRecording() < 0 ) {
+ printf("Error while starting video recording\n");
+
+ return -1;
+ }
+ }
+
+ break;
+
+ case '7':
+
+ if ( compensation > 2.0) {
+ compensation = -2.0;
+ } else {
+ compensation += 0.1;
+ }
+
+ params.set(KEY_COMPENSATION, (int) (compensation * 10));
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case '8':
+ awb_mode++;
+ awb_mode %= ARRAY_SIZE(strawb_mode);
+ params.set(params.KEY_WHITE_BALANCE, strawb_mode[awb_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case '9':
+ videoCodecIDX++;
+ videoCodecIDX %= ARRAY_SIZE(videoCodecs);
+ break;
+ case '~':
+ previewFormat += 1;
+ previewFormat %= ARRAY_SIZE(pixelformat) - 1;
+ params.setPreviewFormat(pixelformat[previewFormat].pixformat);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+ case '$':
+ pictureFormat += 1;
+ if ( strcmp(params.get(KEY_STEREO_CAMERA), "false") == 0 && pictureFormat > 4 )
+ pictureFormat = 0;
+ pictureFormat %= ARRAY_SIZE(codingformat);
+ params.setPictureFormat(codingformat[pictureFormat]);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case '?' :
+ ///Set mode=3 to select video mode
+ params.set(KEY_MODE, 3);
+ params.set(KEY_VNF, 1);
+ params.set(KEY_VSTAB, 1);
+ break;
+
+ case ':':
+ thumbSizeIDX += 1;
+ thumbSizeIDX %= ARRAY_SIZE(previewSize);
+ params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, previewSize[thumbSizeIDX].width);
+ params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, previewSize[thumbSizeIDX].height);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case '\'':
+ if ( thumbQuality >= 100) {
+ thumbQuality = 0;
+ } else {
+ thumbQuality += 5;
+ }
+
+ params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, thumbQuality);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'B' :
+ vnf_mode++;
+ vnf_mode %= ARRAY_SIZE(vnf);
+ params.set(KEY_VNF, vnf_mode);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'C' :
+ vstab_mode++;
+ vstab_mode %= ARRAY_SIZE(vstab);
+ params.set(KEY_VSTAB, vstab_mode);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'E':
+ if(hardwareActive)
+ params.unflatten(camera->getParameters());
+ printSupportedParams();
+ break;
+
+ case '*':
+ if ( hardwareActive )
+ camera->startRecording();
+ break;
+
+ case 'o':
+ if ( jpegQuality >= 100) {
+ jpegQuality = 0;
+ } else {
+ jpegQuality += 5;
+ }
+
+ params.set(CameraParameters::KEY_JPEG_QUALITY, jpegQuality);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'M':
+ measurementIdx = (measurementIdx + 1)%ARRAY_SIZE(measurement);
+ params.set(KEY_MEASUREMENT, measurement[measurementIdx]);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+ case 'm':
+ {
+ meter_mode = (meter_mode + 1)%ARRAY_SIZE(metering);
+ params.set(KEY_METERING_MODE, metering[meter_mode]);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+ }
+
+ case 'k':
+ ippIDX += 1;
+ ippIDX %= ARRAY_SIZE(ipp_mode);
+ ippIDX_old = ippIDX;
+
+#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
+ params.set(KEY_IPP, ipp_mode[ippIDX]);
+#else
+ params.set(KEY_IPP, ippIDX);
+#endif
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'K':
+ gbceIDX+= 1;
+ gbceIDX %= ARRAY_SIZE(gbce);
+ params.set(KEY_GBCE, gbce[gbceIDX]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'F':
+ if ( hardwareActive )
+ camera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, 0, 0);
+
+ break;
+
+ case 'T':
+
+ if ( hardwareActive )
+ camera->sendCommand(CAMERA_CMD_STOP_FACE_DETECTION, 0, 0);
+
+ break;
+
+ case '@':
+ if ( hardwareActive ) {
+
+ closeCamera();
+
+ if ( 0 >= openCamera() ) {
+ printf( "Reconnected to CameraService \n");
+ }
+ }
+
+ break;
+
+ case '#':
+
+ if ( burst >= MAX_BURST ) {
+ burst = 0;
+ } else {
+ burst += BURST_INC;
+ }
+ params.set(KEY_BURST, burst);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'J':
+ flashIdx++;
+ flashIdx %= ARRAY_SIZE(flashModes);
+ params.set(CameraParameters::KEY_FLASH_MODE, (flashModes[flashIdx]));
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'u':
+ capture_mode++;
+ capture_mode %= ARRAY_SIZE(capture);
+
+ // HQ should always be in ldc-nsf
+ // if not HQ, then return the ipp to its previous state
+ if( !strcmp(capture[capture_mode], "high-quality") ) {
+ ippIDX_old = ippIDX;
+ ippIDX = 3;
+ params.set(KEY_IPP, ipp_mode[ippIDX]);
+ } else {
+ ippIDX = ippIDX_old;
+ }
+
+ params.set(KEY_MODE, (capture[capture_mode]));
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'U':
+ tempBracketIdx++;
+ tempBracketIdx %= ARRAY_SIZE(tempBracketing);
+ params.set(KEY_TEMP_BRACKETING, tempBracketing[tempBracketIdx]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'H':
+ expBracketIdx++;
+ expBracketIdx %= ARRAY_SIZE(expBracketing);
+
+ params.set(KEY_EXP_BRACKETING_RANGE, expBracketingRange[expBracketIdx]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'W':
+ tempBracketRange++;
+ tempBracketRange %= TEMP_BRACKETING_MAX_RANGE;
+ if ( 0 == tempBracketRange ) {
+ tempBracketRange = 1;
+ }
+
+ params.set(KEY_TEMP_BRACKETING_NEG, tempBracketRange);
+ params.set(KEY_TEMP_BRACKETING_POS, tempBracketRange);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'w':
+ scene_mode++;
+ scene_mode %= ARRAY_SIZE(scene);
+ params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'i':
+ iso_mode++;
+ iso_mode %= ARRAY_SIZE(iso);
+ params.set(KEY_ISO, iso[iso_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'h':
+ if ( sharpness >= 100) {
+ sharpness = 0;
+ } else {
+ sharpness += 10;
+ }
+ params.set(KEY_SHARPNESS, sharpness);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'D':
+ {
+ audioCodecIDX++;
+ audioCodecIDX %= ARRAY_SIZE(audioCodecs);
+ break;
+ }
+
+ case 'v':
+ {
+ outputFormatIDX++;
+ outputFormatIDX %= ARRAY_SIZE(outputFormat);
+ break;
+ }
+
+ case 'z':
+ zoomIDX++;
+ zoomIDX %= ARRAY_SIZE(zoom);
+ params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'j':
+ exposure_mode++;
+ exposure_mode %= ARRAY_SIZE(exposure);
+ params.set(KEY_EXPOSURE, exposure[exposure_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'c':
+ if( contrast >= 200){
+ contrast = 0;
+ } else {
+ contrast += 10;
+ }
+ params.set(KEY_CONTRAST, contrast);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+ case 'b':
+ if ( brightness >= 200) {
+ brightness = 0;
+ } else {
+ brightness += 10;
+ }
+
+ params.set(KEY_BRIGHTNESS, brightness);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 's':
+ case 'S':
+ if ( saturation >= 100) {
+ saturation = 0;
+ } else {
+ saturation += 10;
+ }
+
+ params.set(KEY_SATURATION, saturation);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'e':
+ effects_mode++;
+ effects_mode %= ARRAY_SIZE(effects);
+ params.set(params.KEY_EFFECT, effects[effects_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'r':
+
+
+ if (camera_index == 0) {
+ frameRateIDX += 1;
+ frameRateIDX %= ARRAY_SIZE(fpsConstRanges);
+ params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsConstRanges[frameRateIDX].range);
+ } else
+ {
+ frameRateIDXSec += 1;
+ frameRateIDXSec %= ARRAY_SIZE(fpsConstRangesSec);
+ params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsConstRangesSec[frameRateIDXSec].range);
+
+
+ }
+
+ if ( hardwareActive ) {
+ camera->setParameters(params.flatten());
+ }
+
+ break;
+
+ case 'R':
+ fpsRangeIdx += 1;
+ fpsRangeIdx %= ARRAY_SIZE(fpsRanges);
+ params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsRanges[fpsRangeIdx].range);
+
+ if ( hardwareActive ) {
+ camera->setParameters(params.flatten());
+ }
+
+ break;
+
+ case 'x':
+ antibanding_mode++;
+ antibanding_mode %= ARRAY_SIZE(antibanding);
+ params.set(params.KEY_ANTIBANDING, antibanding[antibanding_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'g':
+ focus_mode++;
+ focus_mode %= ARRAY_SIZE(focus);
+ params.set(params.KEY_FOCUS_MODE, focus[focus_mode]);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ break;
+
+ case 'G':
+
+ params.set(CameraParameters::KEY_FOCUS_AREAS, TEST_FOCUS_AREA);
+
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+
+ params.remove(CameraParameters::KEY_FOCUS_AREAS);
+
+ case 'f':
+
+ gettimeofday(&autofocus_start, 0);
+
+ if ( hardwareActive )
+ camera->autoFocus();
+
+ break;
+
+ case 'p':
+
+ gettimeofday(&picture_start, 0);
+
+ if ( hardwareActive )
+ camera->takePicture(CAMERA_MSG_COMPRESSED_IMAGE|CAMERA_MSG_RAW_IMAGE);
+
+ break;
+
+ case '&':
+ printf("Enabling Preview Callback");
+ dump_preview = 1;
+ if ( hardwareActive )
+ camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
+ break;
+
+ case '{':
+ if ( strcmp(params.get(KEY_S3D2D_PREVIEW_MODE), "off") == 0 )
+ {
+ params.set(KEY_S3D2D_PREVIEW_MODE, "on");
+ }
+ else
+ {
+ params.set(KEY_S3D2D_PREVIEW_MODE, "off");
+ }
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case 'a':
+
+ while (1) {
+ if ( menu_gps() < 0)
+ break;
+ };
+
+ break;
+
+ case 'q':
+
+ stopPreview();
+
+ return -1;
+
+ case '/':
+ {
+ if (showfps)
+ {
+ property_set("debug.image.showfps", "0");
+ showfps = false;
+ }
+ else
+ {
+ property_set("debug.image.showfps", "1");
+ showfps = true;
+ }
+ break;
+ }
+
+ case '<':
+ elockidx += 1;
+ elockidx %= ARRAY_SIZE(lock);
+ params.set(KEY_AUTO_EXPOSURE_LOCK, lock[elockidx]);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ case '>':
+ wblockidx += 1;
+ wblockidx %= ARRAY_SIZE(lock);
+ params.set(KEY_AUTO_WHITEBALANCE_LOCK, lock[wblockidx]);
+ if ( hardwareActive )
+ camera->setParameters(params.flatten());
+ break;
+
+ default:
+ print_menu = 0;
+
+ break;
+ }
+
+ return 0;
+}
+
+void print_usage() {
+ printf(" USAGE: camera_test <param> <script>\n");
+ printf(" <param>\n-----------\n\n");
+ printf(" F or f -> Functional tests \n");
+ printf(" A or a -> API tests \n");
+ printf(" E or e -> Error scenario tests \n");
+ printf(" S or s -> Stress tests; with syslink trace \n");
+ printf(" SN or sn -> Stress tests; No syslink trace \n\n");
+ printf(" <script>\n----------\n");
+ printf("Script name (Only for stress tests)\n\n");
+ return;
+}
+
+int error_scenario() {
+ char ch;
+ status_t stat = NO_ERROR;
+
+ if (print_menu) {
+ printf(" 0. Buffer need\n");
+ printf(" 1. Not enough memory\n");
+ printf(" 2. Media server crash\n");
+ printf(" 3. Overlay object request\n");
+ printf(" 4. Pass unsupported preview&picture format\n");
+ printf(" 5. Pass unsupported preview&picture resolution\n");
+ printf(" 6. Pass unsupported preview framerate\n");
+
+ printf(" q. Quit\n");
+ printf(" Choice: ");
+ }
+
+ print_menu = 1;
+ ch = getchar();
+ printf("%c\n", ch);
+
+ switch (ch) {
+ case '0': {
+ printf("Case0:Buffer need\n");
+ bufferStarvationTest = 1;
+ params.set(KEY_BUFF_STARV, bufferStarvationTest); //enable buffer starvation
+
+ if ( !recordingMode ) {
+ recordingMode = true;
+ if ( startPreview() < 0 ) {
+ printf("Error while starting preview\n");
+
+ return -1;
+ }
+
+ if ( openRecorder() < 0 ) {
+ printf("Error while openning video recorder\n");
+
+ return -1;
+ }
+
+ if ( configureRecorder() < 0 ) {
+ printf("Error while configuring video recorder\n");
+
+ return -1;
+ }
+
+ if ( startRecording() < 0 ) {
+ printf("Error while starting video recording\n");
+
+ return -1;
+ }
+
+ }
+
+ usleep(1000000);//1s
+
+ stopPreview();
+
+ if ( recordingMode ) {
+ stopRecording();
+ closeRecorder();
+
+ recordingMode = false;
+ }
+
+ break;
+ }
+
+ case '1': {
+ printf("Case1:Not enough memory\n");
+ int* tMemoryEater = new int[999999999];
+
+ if (!tMemoryEater) {
+ printf("Not enough memory\n");
+ return -1;
+ } else {
+ delete tMemoryEater;
+ }
+
+ break;
+ }
+
+ case '2': {
+ printf("Case2:Media server crash\n");
+ //camera = Camera::connect();
+
+ if ( NULL == camera.get() ) {
+ printf("Unable to connect to CameraService\n");
+ return -1;
+ }
+
+ break;
+ }
+
+ case '3': {
+ printf("Case3:Overlay object request\n");
+ int err = 0;
+
+ err = open("/dev/video5", O_RDWR);
+
+ if (err < 0) {
+ printf("Could not open the camera device5: %d\n", err );
+ return err;
+ }
+
+ if ( startPreview() < 0 ) {
+ printf("Error while starting preview\n");
+ return -1;
+ }
+
+ usleep(1000000);//1s
+
+ stopPreview();
+
+ close(err);
+ break;
+ }
+
+ case '4': {
+
+ if ( hardwareActive ) {
+
+ params.setPictureFormat("invalid-format");
+ params.setPreviewFormat("invalid-format");
+
+ stat = camera->setParameters(params.flatten());
+
+ if ( NO_ERROR != stat ) {
+ printf("Test passed!\n");
+ } else {
+ printf("Test failed!\n");
+ }
+
+ initDefaults();
+ }
+
+ break;
+ }
+
+ case '5': {
+
+ if ( hardwareActive ) {
+
+ params.setPictureSize(-1, -1);
+ params.setPreviewSize(-1, -1);
+
+ stat = camera->setParameters(params.flatten());
+
+ if ( NO_ERROR != stat ) {
+ printf("Test passed!\n");
+ } else {
+ printf("Test failed!\n");
+ }
+
+ initDefaults();
+ }
+
+ break;
+ }
+
+ case '6': {
+
+ if ( hardwareActive ) {
+
+ params.setPreviewFrameRate(-1);
+
+ stat = camera->setParameters(params.flatten());
+
+ if ( NO_ERROR != stat ) {
+ printf("Test passed!\n");
+ } else {
+ printf("Test failed!\n");
+ }
+
+ initDefaults();
+ }
+
+
+ break;
+ }
+
+ case 'q': {
+ return -1;
+ }
+
+ default: {
+ print_menu = 0;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int restartCamera() {
+
+ const char dir_path_name[80] = SDCARD_PATH;
+
+ printf("+++Restarting Camera After Error+++\n");
+ stopPreview();
+
+ if (recordingMode) {
+ stopRecording();
+ closeRecorder();
+
+ recordingMode = false;
+ }
+
+ sleep(3); //Wait a bit before restarting
+
+ restartCount++;
+
+ if (strcpy(dir_path, dir_path_name) == NULL)
+ {
+ printf("Error reseting dir name");
+ return -1;
+ }
+
+ if ( openCamera() < 0 )
+ {
+ printf("+++Camera Restarted Failed+++\n");
+ system("echo camerahal_test > /sys/power/wake_unlock");
+ return -1;
+ }
+
+ initDefaults();
+
+ stopScript = false;
+
+ printf("+++Camera Restarted Successfully+++\n");
+ return 0;
+}
+
+int main(int argc, char *argv[]) {
+ char *cmd;
+ int pid;
+ sp<ProcessState> proc(ProcessState::self());
+
+ unsigned long long st, end, delay;
+ timeval current_time;
+
+ gettimeofday(¤t_time, 0);
+
+ st = current_time.tv_sec * 1000000 + current_time.tv_usec;
+
+ cmd = NULL;
+
+ if ( argc < 2 ) {
+ printf(" Please enter atleast 1 argument\n");
+ print_usage();
+
+ return 0;
+ }
+ system("echo camerahal_test > /sys/power/wake_lock");
+ if ( argc < 3 ) {
+ switch (*argv[1]) {
+ case 'S':
+ case 's':
+ printf("This is stress / regression tests \n");
+ printf("Provide script file as 2nd argument\n");
+
+ break;
+
+ case 'F':
+ case 'f':
+ ProcessState::self()->startThreadPool();
+
+ if ( openCamera() < 0 ) {
+ printf("Camera initialization failed\n");
+ system("echo camerahal_test > /sys/power/wake_unlock");
+ return -1;
+ }
+
+ initDefaults();
+ print_menu = 1;
+
+ while ( 1 ) {
+ if ( functional_menu() < 0 )
+ break;
+ };
+
+ break;
+
+ case 'A':
+ case 'a':
+ printf("API level test cases coming soon ... \n");
+
+ break;
+
+ case 'E':
+ case 'e': {
+ ProcessState::self()->startThreadPool();
+
+ if ( openCamera() < 0 ) {
+ printf("Camera initialization failed\n");
+ system("echo camerahal_test > /sys/power/wake_unlock");
+ return -1;
+ }
+
+ initDefaults();
+ print_menu = 1;
+
+ while (1) {
+ if (error_scenario() < 0) {
+ break;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ printf("INVALID OPTION USED\n");
+ print_usage();
+
+ break;
+ }
+ } else if ( ( argc == 3) && ( ( *argv[1] == 'S' ) || ( *argv[1] == 's') ) ) {
+
+ if((argv[1][1] == 'N') || (argv[1][1] == 'n')) {
+ bLogSysLinkTrace = false;
+ }
+
+ ProcessState::self()->startThreadPool();
+
+ if ( openCamera() < 0 ) {
+ printf("Camera initialization failed\n");
+ system("echo camerahal_test > /sys/power/wake_unlock");
+ return -1;
+ }
+
+ initDefaults();
+
+ cmd = load_script(argv[2]);
+
+ if ( cmd != NULL) {
+ start_logging(argv[2], pid);
+ stressTest = true;
+
+ while (1)
+ {
+ if ( execute_functional_script(cmd) == 0 )
+ {
+ break;
+ }
+ else
+ {
+ printf("CameraTest Restarting Camera...\n");
+
+ free(cmd);
+ cmd = NULL;
+
+ if ( (restartCamera() != 0) || ((cmd = load_script(argv[2])) == NULL) )
+ {
+ printf("ERROR::CameraTest Restarting Camera...\n");
+ break;
+ }
+ }
+ }
+ free(cmd);
+ stop_logging(pid);
+ }
+ } else if ( ( argc == 3) && ( ( *argv[1] == 'E' ) || ( *argv[1] == 'e') ) ) {
+
+ ProcessState::self()->startThreadPool();
+
+ if ( openCamera() < 0 ) {
+ printf("Camera initialization failed\n");
+ system("echo camerahal_test > /sys/power/wake_unlock");
+ return -1;
+ }
+
+ initDefaults();
+
+ cmd = load_script(argv[2]);
+
+ if ( cmd != NULL) {
+ start_logging(argv[2], pid);
+ execute_error_script(cmd);
+ free(cmd);
+ stop_logging(pid);
+ }
+
+ } else {
+ printf("INVALID OPTION USED\n");
+ print_usage();
+ }
+
+ gettimeofday(¤t_time, 0);
+ end = current_time.tv_sec * 1000000 + current_time.tv_usec;
+ delay = end - st;
+ printf("Application clossed after: %llu ms\n", delay);
+ system("echo camerahal_test > /sys/power/wake_unlock");
+ return 0;
+}
+