#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "camera_test.h" using namespace android; int camera_index = 0; int print_menu; sp camera; sp recorder; sp client; sp surfaceControl; sp 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 glbceIDX = 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_HE_AAC, "AAC+" }, { AUDIO_ENCODER_LIST_END, "disabled"}, }; 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& 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_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& 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_TRUNC, 0777); if(fd < 0) { ALOGE("Unable to open file %s: %s", fn, strerror(fd)); goto out; } size = mem->size(); if (size <= 0) { ALOGE("IMemory object is of zero size"); goto out; } buff = (unsigned char *)mem->pointer(); if (!buff) { ALOGE("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& 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& 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_TRUNC, 0777); if(fd < 0) { ALOGE("Unable to open file %s: %s", fn, strerror(fd)); goto out; } size = mem->size(); if (size <= 0) { ALOGE("IMemory object is of zero size"); goto out; } buff = (unsigned char *)mem->pointer(); if (!buff) { ALOGE("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& 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& 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(String8("camera_test_menu"), previewWidth, previewHeight, pixFormat, 0); previewSurface = surfaceControl->getSurface(); client->openGlobalTransaction(); surfaceControl->setLayer(0x7fffffff); 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 ( AUDIO_ENCODER_LIST_END != audioCodecs[audioCodecIDX].type ) { if ( recorder->setAudioSource(AUDIO_SOURCE_DEFAULT) < 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 ( AUDIO_ENCODER_LIST_END != audioCodecs[audioCodecIDX].type ) { 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; } 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; } 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; glbceIDX = 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_GLBCE, gbce[glbceIDX]); 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, ipp_mode[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. GLBCE %s\n", gbce[glbceIDX]); 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 ( NULL != params.get(KEY_STEREO_CAMERA) ) { 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 ( NULL != params.get(KEY_STEREO_CAMERA) ) { 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; params.set(KEY_IPP, ipp_mode[ippIDX]); 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 'O': glbceIDX+= 1; glbceIDX %= ARRAY_SIZE(gbce); params.set(KEY_GLBCE, gbce[glbceIDX]); 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