blob: 181036f865875602e6dad9f18f09c1d8038d554d [file] [log] [blame]
#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 <string.h>
#include <assert.h>
#include <climits>
#include <ui/DisplayInfo.h>
#include <gui/GLConsumer.h>
#include <gui/Surface.h>
#include <ui/GraphicBuffer.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 <camera/ShotParameters.h>
#include <system/audio.h>
#include <system/camera.h>
#include <binder/IMemory.h>
#include <binder/MemoryBase.h>
#include <binder/MemoryHeapBase.h>
#include <cutils/memory.h>
#include <utils/Log.h>
#include <sys/wait.h>
#include "camera_test.h"
#include "camera_test_surfacetexture.h"
#ifdef ANDROID_API_JB_OR_LATER
#include "camera_test_bufferqueue.h"
#endif
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;
sp<BufferSourceThread> bufferSourceOutputThread;
sp<BufferSourceInput> bufferSourceInput;
CameraParameters params;
ShotParameters shotParams;
float compensation = 0.0;
double latitude = 0.0;
double longitude = 0.0;
double degree_by_step = 17.5609756;
double altitude = 0.0;
int awb_mode = 0;
int effects_mode = 0;
int scene_mode = 0;
int caf_mode = 0;
int tempBracketRange = 1;
int tempBracketIdx = 0;
int measurementIdx = 0;
int expBracketIdx = BRACKETING_IDX_DEFAULT;
int AutoConvergenceModeIDX = 0;
int gbceIDX = 0;
int glbceIDX = 0;
int rotation = 0;
int previewRotation = 0;
bool reSizePreview = true;
bool hardwareActive = false;
bool recordingMode = false;
bool previewRunning = false;
bool vstabtoggle = false;
bool AutoExposureLocktoggle = false;
bool AutoWhiteBalanceLocktoggle = false;
bool vnftoggle = false;
bool faceDetectToggle = false;
bool metaDataToggle = false;
bool shotConfigFlush = false;
bool streamCapture = 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;
unsigned int burstCount = 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 pictureFormat = 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 afTimeoutIdx = 0;
int platformID = BLAZE_TABLET2;
int numAntibanding = 0;
int numEffects = 0;
int numcaptureSize = 0;
int nummodevalues = 0;
int numVcaptureSize = 0;
int numpreviewSize = 0;
int numthumbnailSize = 0;
int numawb = 0;
int numscene = 0;
int numfocus = 0;
int numflash = 0;
int numExposureMode = 0;
int numisoMode = 0;
int antibanding_mode = 0;
int effectsStrLenght = 0;
int numfps = 0;
int numpreviewFormat = 0;
int numpictureFormat = 0;
int *constFramerate = 0;
int rangeCnt = 0;
int constCnt = 0;
int focus_mode = 0;
int thumbSizeIDX = 0;
int previewSizeIDX = 1;
int captureSizeIDX = 0;
int VcaptureSizeIDX = 1;
int frameRateIDX = 0;
char *str;
char *param;
char *antibandStr = 0;
char *exposureModeStr = 0;
char *isoModeStr = 0;
char *effectssStr = 0;
char *captureSizeStr = 0;
char *modevaluesstr = 0;
char *videosnapshotstr = 0;
char *autoconvergencestr = 0;
char *VcaptureSizeStr = 0;
char *thumbnailSizeStr = 0;
char *vstabstr = 0;
char *vnfstr = 0;
char *zoomstr = 0;
char *smoothzoomstr = 0;
char *AutoExposureLockstr = 0;
char *AutoWhiteBalanceLockstr = 0;
char *previewSizeStr = 0;
char *awbStr = 0;
char *sceneStr = 0;
char *focusStr = 0;
char *flashStr = 0;
char *fpsstr = 0;
char *previewFormatStr = 0;
char *pictureFormatStr = 0;
char **modevalues = 0;
char **elem;
char **antiband = 0;
char **effectss = 0;
char **awb = 0;
char **scene = 0;
char **focus = 0;
char **flash = 0;
char **exposureMode = 0;
char **isoMode = 0;
char **previewFormatArray = 0;
char **pictureFormatArray = 0;
char **fps_const_str = 0;
char **rangeDescription = 0;
char **fps_range_str = 0;
param_Array ** capture_Array = 0;
param_Array ** Vcapture_Array = 0;
param_Array ** preview_Array = 0;
param_Array ** thumbnail_Array = 0;
fps_Array * fpsArray = 0;
int enableMisalignmentCorrectionIdx = 0;
char **autoconvergencemode = 0;
int numAutoConvergence = 0;
const char MeteringAreas[] = "(-656,-671,188,454,1)";
char **stereoLayout;
int numLay = 0;
char **stereoCapLayout;
int numCLay = 0;
int stereoLayoutIDX = 1;
int stereoCapLayoutIDX = 0;
char *layoutstr =0;
char *capturelayoutstr =0;
char output_dir_path[256];
char videos_dir_path[256 + 8];
char images_dir_path[256 + 8];
const char *cameras[] = {"Primary Camera", "Secondary Camera 1", "Stereo Camera"};
const char *measurement[] = {"disable", "enable"};
param_NamedExpBracketList_t expBracketing[] = {
{
"Disabled",
PARAM_EXP_BRACKET_PARAM_NONE,
PARAM_EXP_BRACKET_VALUE_NONE,
PARAM_EXP_BRACKET_APPLY_NONE,
"0"
},
{
"Relative exposure compensation",
PARAM_EXP_BRACKET_PARAM_COMP,
PARAM_EXP_BRACKET_VALUE_REL,
PARAM_EXP_BRACKET_APPLY_ADJUST,
"-300,-150,0,150,300,150,0,-150,-300"
},
{
"Relative exposure compensation (forced)",
PARAM_EXP_BRACKET_PARAM_COMP,
PARAM_EXP_BRACKET_VALUE_REL,
PARAM_EXP_BRACKET_APPLY_FORCED,
"-300F,-150F,0F,150F,300F,150F,0F,-150F,-300F"
},
{
"Absolute exposure and gain",
PARAM_EXP_BRACKET_PARAM_PAIR,
PARAM_EXP_BRACKET_VALUE_ABS,
PARAM_EXP_BRACKET_APPLY_ADJUST,
"(33000,10),(0,70),(33000,100),(0,130),(33000,160),(0,180),(33000,200),(0,130),(33000,200)"
},
{
"Absolute exposure and gain (forced)",
PARAM_EXP_BRACKET_PARAM_PAIR,
PARAM_EXP_BRACKET_VALUE_ABS,
PARAM_EXP_BRACKET_APPLY_FORCED,
"(33000,10)F,(0,70)F,(33000,100)F,(0,130)F,(33000,160)F,(0,180)F,(33000,200)F,(0,130)F,(33000,200)F"
},
{
"Relative exposure and gain",
PARAM_EXP_BRACKET_PARAM_PAIR,
PARAM_EXP_BRACKET_VALUE_REL,
PARAM_EXP_BRACKET_APPLY_ADJUST,
"(-300,-100),(-300,+0),(-100, +0),(-100,+100),(+0,+0),(+100,-100),(+100,+0),(+300,+0),(+300,+100)"
},
{
"Relative exposure and gain (forced)",
PARAM_EXP_BRACKET_PARAM_PAIR,
PARAM_EXP_BRACKET_VALUE_REL,
PARAM_EXP_BRACKET_APPLY_FORCED,
"(-300,-100)F,(-300,+0)F,(-100, +0)F,(-100,+100)F,(+0,+0)F,(+100,-100)F,(+100,+0)F,(+300,+0)F,(+300,+100)F"
},
};
const char *tempBracketing[] = {"false", "true"};
const char *faceDetection[] = {"disable", "enable"};
const char *afTimeout[] = {"enable", "disable" };
const char *misalignmentCorrection[] = {"enable", "disable" };
#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 *caf [] = { "Off", "On" };
int numCamera = 0;
bool stereoMode = false;
int manualExp = 0;
int manualExpMin = 0;
int manualExpMax = 0;
int manualExpStep = 0;
int manualGain = 0;
int manualGainMin = 0;
int manualGainMax = 0;
int manualGainStep = 0;
int manualConv = 0;
int manualConvMin = 0;
int manualConvMax = 0;
int manualConvStep = 0;
param_Array 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"},
{ 240, 160,"240x160"},
{ 768, 576, "768x576" },
{ 960, 720, "960x720"},
{ 256, 96,"SQCIF"},// stereo
{ 128, 192, "SQCIF"},
{ 352, 144,"QCIF"},
{ 176, 288, "QCIF"},
{ 480, 160, "240x160"},
{ 240, 320, "240x160"},
{ 704, 288, "CIF"},
{ 352, 576, "CIF"},
{ 640, 240,"QVGA"},
{ 320, 480, "QVGA"},
{ 1280, 480,"VGA"},
{ 640, 960, "VGA"},
{ 1536, 576,"768x576"},
{ 768, 1152, "768x576"},
{ 1440, 480,"NTSC"},
{ 720, 960,"NTSC"},
{ 1440, 576, "PAL"},
{ 720, 1152, "PAL"},
{ 1600, 480, "WVGA"},
{ 800, 960,"WVGA"},
{ 2560, 720, "HD"},
{ 1280, 1440, "HD"}
};
size_t length_previewSize = ARRAY_SIZE(previewSize);
param_Array thumbnailSize [] = {
{ 0, 0, "NULL"},
{ 128, 96, "SQCIF" },
{ 176, 144, "QCIF" },
{ 352, 288, "CIF" },
{ 320, 240, "QVGA" },
{ 352, 288, "CIF" },
{ 640, 480, "VGA" },
};
size_t length_thumbnailSize = ARRAY_SIZE(thumbnailSize);
param_Array VcaptureSize [] = {
{ 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" },
#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
{ 848, 480, "WVGA2"},
{ 864, 480, "WVGA3"},
{ 992, 560, "WVGA4"},
#endif
{ 1280, 720, "HD" },
{ 1920, 1080, "FULLHD"},
{ 240, 160,"240x160"},
{ 768, 576, "768x576" },
{ 960, 720, "960x720"},
{ 256, 96,"SQCIF"},// stereo
{ 128, 192, "SQCIF"},
{ 352, 144,"QCIF"},
{ 176, 288, "QCIF"},
{ 480, 160, "240x160"},
{ 240, 320, "240x160"},
{ 704, 288, "CIF"},
{ 352, 576, "CIF"},
{ 640, 240,"QVGA"},
{ 320, 480, "QVGA"},
{ 1280, 480,"VGA"},
{ 640, 960, "VGA"},
{ 1536, 576,"768x576"},
{ 768, 1152, "768x576"},
{ 1440, 480,"NTSC"},
{ 720, 960,"NTSC"},
{ 1440, 576, "PAL"},
{ 720, 1152, "PAL"},
{ 1600, 480, "WVGA"},
{ 800, 960,"WVGA"},
{ 2560, 720, "HD"},
{ 1280, 1440, "HD"}
};
size_t lenght_Vcapture_size = ARRAY_SIZE(VcaptureSize);
param_Array captureSize[] = {
{ 320, 240, "QVGA" },
{ 640, 480, "VGA" },
{ 800, 600, "SVGA" },
{ 1152, 864, "1MP" },
{ 1280, 1024, "1.3MP" },
{ 1600, 1200, "2MP" },
{ 2016, 1512, "3MP" },
{ 2592, 1944, "5MP" },
{ 2608, 1960, "5MP" },
{ 3264, 2448, "8MP" },
{ 3648, 2736, "10MP"},
{ 4032, 3024, "12MP"},
{ 640, 240, "QVGA"}, //stereo
{ 320, 480, "QVGA"},
{ 1280, 480, "VGA"},
{ 640, 960, "VGA"},
{ 2560, 960, "1280x960"},
{ 1280, 1920, "1280x960"},
{ 2304, 864, "1MP"},
{ 1152, 1728, "1MP"},
{ 2560, 1024, "1.3MP"},
{ 1280, 2048, "1.3MP"},
{ 3200, 1200, "2MP"},
{ 1600, 2400, "2MP"},
{ 4096, 1536, "3MP"},
{ 2048, 3072, "3MP"}
};
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" },
{ 28, "2.5x"},
{ 32, "3x" },
{ 36, "3.5x"},
{ 40, "4x" },
{ 60, "8x" },
};
size_t length_Zoom = ARRAY_SIZE(zoom);
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, CameraParameters::PIXEL_FORMAT_BAYER_RGGB },
};
const char *gbce[] = {"disable", "enable"};
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 stressTest = false;
bool stopScript = false;
int restartCount = 0;
bool firstTime = true;
bool firstTimeStereo = true;
//TI extensions for enable/disable algos
const char *algoFixedGamma[] = {CameraParameters::FALSE, CameraParameters::TRUE};
const char *algoNSF1[] = {CameraParameters::FALSE, CameraParameters::TRUE};
const char *algoNSF2[] = {CameraParameters::FALSE, CameraParameters::TRUE};
const char *algoSharpening[] = {CameraParameters::FALSE, CameraParameters::TRUE};
const char *algoThreeLinColorMap[] = {CameraParameters::FALSE, CameraParameters::TRUE};
const char *algoGIC[] = {CameraParameters::FALSE, CameraParameters::TRUE};
int algoFixedGammaIDX = 1;
int algoNSF1IDX = 1;
int algoNSF2IDX = 1;
int algoSharpeningIDX = 1;
int algoThreeLinColorMapIDX = 1;
int algoGICIDX = 1;
/** Buffer source reset */
bool bufferSourceInputReset = false;
bool bufferSourceOutputReset = false;
/** Calculate delay from a reference time */
unsigned long long timeval_delay(const timeval *ref) {
unsigned long long st, end, delay;
timeval current_time;
gettimeofday(&current_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[384];
LOG_FUNCTION_NAME;
if (mem == NULL)
goto out;
if( strcmp(modevalues[capture_mode], "cp-cam") ) {
//Start preview after capture.
camera->startPreview();
}
fn[0] = 0;
sprintf(fn, "%s/img%03d.raw", images_dir_path, 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<IMemory>& mem) {
static int counter = 1;
unsigned char *buff = NULL;
int size;
int fd = -1;
char fn[384];
LOG_FUNCTION_NAME;
if (mem == NULL)
goto out;
fn[0] = 0;
sprintf(fn, "%s/preview%03d.yuv", images_dir_path, counter);
fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777);
if(fd < 0) {
CAMHAL_LOGE("Unable to open file %s: %s", fn, strerror(fd));
goto out;
}
size = mem->size();
if (size <= 0) {
CAMHAL_LOGE("IMemory object is of zero size");
goto out;
}
buff = (unsigned char *)mem->pointer();
if (!buff) {
CAMHAL_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[384];
LOG_FUNCTION_NAME;
if( strcmp(modevalues[capture_mode], "cp-cam")) {
if(burstCount > 1) {
burstCount --;
// Restart preview if taking a single capture
// or after the last iteration of burstCount
} else if(burstCount == 0 || burstCount == 1) {
camera->startPreview();
burstCount = burst;
}
}
if (mem == NULL)
goto out;
fn[0] = 0;
sprintf(fn, "%s/img%03d.jpg", images_dir_path, counter);
fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777);
if(fd < 0) {
CAMHAL_LOGE("Unable to open file %s: %s", fn, strerror(fd));
goto out;
}
size = mem->size();
if (size <= 0) {
CAMHAL_LOGE("IMemory object is of zero size");
goto out;
}
buff = (unsigned char *)mem->pointer();
if (!buff) {
CAMHAL_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) {
int32_t msgMask;
printf("Data cb: %d\n", msgType);
if ( msgType & CAMERA_MSG_PREVIEW_FRAME )
my_preview_callback(dataPtr);
msgMask = CAMERA_MSG_RAW_IMAGE;
#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
msgMask |= CAMERA_MSG_RAW_BURST;
#endif
if ( msgType & msgMask) {
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 ) ) {
if (metaDataToggle) {
printf("Preview exposure: %6d Preview gain: %4d\n",
metadata->exposure_time, metadata->analog_gain);
}
if (faceDetectToggle) {
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)
{
static uint32_t count = 0;
//if(count==100)
//saveFile(dataPtr);
count++;
uint8_t *ptr = (uint8_t*) dataPtr->pointer();
#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
if ( msgType & CAMERA_MSG_RAW_BURST) {
printf("RAW done timestamp: %llu\n", timestamp);
my_raw_callback(dataPtr);
} else
#endif
{
printf("Recording cb: %d %lld %p\n", msgType, timestamp, dataPtr.get());
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;
DisplayInfo dinfo;
SurfaceComposerClient::getDisplayInfo(0, &dinfo);
const unsigned MAX_PREVIEW_SURFACE_WIDTH = dinfo.w;
const unsigned MAX_PREVIEW_SURFACE_HEIGHT = dinfo.h;
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(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 Video Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
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 ISO Modes: %s", params.get("iso-mode-values"));
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));
printf("\n\r\tSupported Metering Areas: %d", params.getInt(CameraParameters::KEY_MAX_NUM_METERING_AREAS));
printf("\n\r\tSupported Preview FPS Range: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE));
printf("\n\r\tSupported Exposure modes: %s", params.get("exposure-mode-values"));
printf("\n\r\tSupported VSTAB modes: %s", params.get(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED));
printf("\n\r\tSupported VNF modes: %s", params.get("vnf-supported"));
printf("\n\r\tSupported AutoExposureLock: %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED));
printf("\n\r\tSupported AutoWhiteBalanceLock: %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED));
printf("\n\r\tSupported Zoom: %s", params.get(CameraParameters::KEY_ZOOM_SUPPORTED));
printf("\n\r\tSupported Smooth Zoom: %s", params.get(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED));
printf("\n\r\tSupported Video Snapshot: %s", params.get(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED));
printf("\n\r\tSupported Capture modes: %s", params.get("mode-values"));
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[384],vbit_string[50];
videoFd = -1;
struct CameraInfo cameraInfo;
camera->getCameraInfo(camera_index, &cameraInfo);
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;
}
sprintf(videoFile, "%s/video%d.%s", videos_dir_path, 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 (cameraInfo.orientation == 90 || cameraInfo.orientation == 270 ) {
if ( recorder->setVideoSize(Vcapture_Array[VcaptureSizeIDX]->height, Vcapture_Array[VcaptureSizeIDX]->width) < 0 ) {
printf("error while configuring video size\n");
return -1;
}
} else {
if ( recorder->setVideoSize(Vcapture_Array[VcaptureSizeIDX]->width, Vcapture_Array[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()->getIGraphicBufferProducer() ) < 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() {
antibandStr = new char [256];
effectssStr = new char [256];
exposureModeStr = new char [256];
captureSizeStr = new char [500];
VcaptureSizeStr = new char [500];
previewSizeStr = new char [500];
thumbnailSizeStr = new char [500];
awbStr = new char [400];
sceneStr = new char [400];
isoModeStr = new char [256];
focusStr = new char [256];
flashStr = new char [256];
fpsstr = new char [256];
previewFormatStr = new char [256];
pictureFormatStr = new char [256];
constFramerate = new int[32];
vstabstr = new char[256];
vnfstr = new char[256];
AutoExposureLockstr = new char[256];
AutoWhiteBalanceLockstr = new char[256];
zoomstr = new char[256];
smoothzoomstr = new char[256];
modevaluesstr = new char[256];
videosnapshotstr = new char[256];
autoconvergencestr = new char[256];
layoutstr = new char[256];
capturelayoutstr = new char[256];
requestBufferSourceReset();
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;
}
}
if ( firstTime ) {
params = camera->getParameters();
firstTime = false;
}
getParametersFromCapabilities();
getSizeParametersFromCapabilities();
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;
}
deleteAllocatedMemory();
camera->disconnect();
camera.clear();
hardwareActive = false;
return 0;
}
void createBufferOutputSource() {
if(bufferSourceOutputThread.get() && bufferSourceOutputReset) {
bufferSourceOutputThread->requestExit();
bufferSourceOutputThread.clear();
}
if(!bufferSourceOutputThread.get()) {
#ifdef ANDROID_API_JB_OR_LATER
bufferSourceOutputThread = new BQ_BufferSourceThread(123, camera);
#else
bufferSourceOutputThread = new ST_BufferSourceThread(false, 123, camera);
#endif
bufferSourceOutputThread->run();
}
bufferSourceOutputReset = false;
}
void createBufferInputSource() {
if (bufferSourceInput.get() && bufferSourceInputReset) {
bufferSourceInput.clear();
}
if (!bufferSourceInput.get()) {
#ifdef ANDROID_API_JB_OR_LATER
bufferSourceInput = new BQ_BufferSourceInput(1234, camera);
#else
bufferSourceInput = new ST_BufferSourceInput(1234, camera);
#endif
}
bufferSourceInputReset = false;
}
void requestBufferSourceReset() {
bufferSourceInputReset = true;
bufferSourceOutputReset = true;
}
int startPreview() {
int previewWidth, previewHeight;
struct CameraInfo cameraInfo;
DisplayInfo dinfo;
int orientation;
unsigned int correctedHeight;
SurfaceComposerClient::getDisplayInfo(0, &dinfo);
printf ("dinfo.orientation = %d\n", dinfo.orientation);
printf ("dinfo.w = %d\n", dinfo.w);
printf ("dinfo.h = %d\n", dinfo.h);
// calculate display orientation from sensor orientation
camera->getCameraInfo(camera_index, &cameraInfo);
if (cameraInfo.facing == CAMERA_FACING_FRONT) {
orientation = (cameraInfo.orientation + dinfo.orientation) % 360;
orientation = (360 - orientation) % 360; // compensate the mirror
} else { // back-facing
orientation = (cameraInfo.orientation - dinfo.orientation + 360) % 360;
}
if (reSizePreview) {
int orientedWidth, orientedHeight;
if(recordingMode)
{
previewWidth = Vcapture_Array[VcaptureSizeIDX]->width;
previewHeight = Vcapture_Array[VcaptureSizeIDX]->height;
}else
{
previewWidth = preview_Array[previewSizeIDX]->width;
previewHeight = preview_Array[previewSizeIDX]->height;
}
// corrected height for aspect ratio
if ((orientation == 90) || (orientation == 270)) {
orientedHeight = previewWidth;
orientedWidth = previewHeight;
} else {
orientedHeight = previewHeight;
orientedWidth = previewWidth;
}
correctedHeight = (dinfo.w * orientedHeight) / orientedWidth;
printf("correctedHeight = %d", correctedHeight);
if ( createPreviewSurface(dinfo.w, correctedHeight,
pixelformat[previewFormat].pixelFormatDesc) < 0 ) {
printf("Error while creating preview surface\n");
return -1;
}
if ( !hardwareActive ) {
openCamera();
}
if(stereoMode && firstTimeStereo)
{
params.set(KEY_S3D_PRV_FRAME_LAYOUT, stereoLayout[stereoLayoutIDX]);
params.set(KEY_S3D_CAP_FRAME_LAYOUT, stereoCapLayout[stereoCapLayoutIDX]);
}
if ((cameraInfo.orientation == 90 || cameraInfo.orientation == 270) && recordingMode) {
params.setPreviewSize(previewHeight, previewWidth);
} else {
params.setPreviewSize(previewWidth, previewHeight);
}
params.setPictureSize(capture_Array[captureSizeIDX]->width, capture_Array[captureSizeIDX]->height);
// calculate display orientation from sensor orientation
camera->getCameraInfo(camera_index, &cameraInfo);
if (cameraInfo.facing == CAMERA_FACING_FRONT) {
orientation = (cameraInfo.orientation + dinfo.orientation) % 360;
orientation= (360 - orientation) % 360; // compensate the mirror
} else { // back-facing
orientation = (cameraInfo.orientation - dinfo.orientation + 360) % 360;
}
if(!strcmp(params.get(KEY_MODE), "video-mode") ) {
orientation = 0;
}
camera->sendCommand(CAMERA_CMD_SET_DISPLAY_ORIENTATION, orientation, 0);
camera->setParameters(params.flatten());
camera->setPreviewTexture(previewSurface->getIGraphicBufferProducer());
}
if(hardwareActive) prevcnt = 0;
camera->startPreview();
previewRunning = true;
reSizePreview = false;
const char *format = params.getPictureFormat();
if((NULL != format) && isRawPixelFormat(format)) {
createBufferOutputSource();
createBufferInputSource();
}
return 0;
}
int getParametersFromCapabilities() {
const char *valstr = NULL;
numCamera = camera->getNumberOfCameras();
params.unflatten(camera->getParameters());
valstr = params.get(KEY_AUTOCONVERGENCE_MODE_VALUES);
if (NULL != valstr) {
strcpy(autoconvergencestr, valstr);
getSupportedParameters(autoconvergencestr,&numAutoConvergence,(char***)&autoconvergencemode);
} else {
printf("no supported parameteters for autoconvergence\n\t");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_EFFECTS);
if (NULL != valstr) {
strcpy(effectssStr, valstr);
getSupportedParameters(effectssStr, &numEffects, (char***)&effectss);
} else {
printf("Color effects are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING);
if (NULL != valstr) {
strcpy(antibandStr, valstr);
getSupportedParameters(antibandStr, &numAntibanding, (char***)&antiband);
} else {
printf("Antibanding not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE);
if (NULL != valstr) {
strcpy(awbStr, valstr);
getSupportedParameters(awbStr, &numawb, (char***)&awb);
} else {
printf("White balance is not supported\n");
}
valstr = params.get(KEY_S3D_PRV_FRAME_LAYOUT_VALUES);
if ((NULL != valstr) && (0 != strcmp(valstr, "none"))) {
stereoMode = true;
strcpy(layoutstr, valstr);
getSupportedParameters(layoutstr,&numLay,(char***)&stereoLayout);
} else {
stereoMode = false;
printf("layout is not supported\n");
}
valstr = params.get(KEY_S3D_CAP_FRAME_LAYOUT_VALUES);
if ((NULL != valstr) && (0 != strcmp(valstr, "none"))) {
strcpy(capturelayoutstr, valstr);
getSupportedParameters(capturelayoutstr,&numCLay,(char***)&stereoCapLayout);
} else {
printf("capture layout is not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES);
if (NULL != valstr) {
strcpy(sceneStr, valstr);
getSupportedParameters(sceneStr, &numscene, (char***)&scene);
} else {
printf("Scene modes are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES);
if (NULL != valstr) {
strcpy(focusStr, valstr);
getSupportedParameters(focusStr, &numfocus, (char***)&focus);
} else {
printf("Focus modes are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
if (NULL != valstr) {
strcpy(flashStr, valstr);
getSupportedParameters(flashStr, &numflash, (char***)&flash);
} else {
printf("Flash modes are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
if (NULL != valstr) {
strcpy(VcaptureSizeStr, valstr);
getSupportedParametersVideoCaptureSize(VcaptureSizeStr, &numVcaptureSize, VcaptureSize, lenght_Vcapture_size);
} else {
printf("Preview sizes are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE);
if (NULL != valstr) {
strcpy(fpsstr, valstr);
getSupportedParametersfps(fpsstr, &numfps);
} else {
printf("Preview fps range is not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS);
if (NULL != valstr) {
strcpy(previewFormatStr, valstr);
getSupportedParameters(previewFormatStr, &numpreviewFormat, (char ***)&previewFormatArray);
} else {
printf("Preview formats are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS);
if (NULL != valstr) {
strcpy(pictureFormatStr, valstr);
getSupportedParameters(pictureFormatStr, &numpictureFormat, (char ***)&pictureFormatArray);
} else {
printf("Picture formats are not supported\n");
}
valstr = params.get("exposure-mode-values");
if (NULL != valstr) {
strcpy(exposureModeStr, valstr);
getSupportedParameters(exposureModeStr, &numExposureMode, (char***)&exposureMode);
} else {
printf("Exposure modes are not supported\n");
}
valstr = params.get("iso-mode-values");
if (NULL != valstr) {
strcpy(isoModeStr, valstr);
getSupportedParameters(isoModeStr, &numisoMode , (char***)&isoMode);
} else {
printf("iso modes are not supported\n");
}
valstr = params.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES);
if (NULL != valstr) {
strcpy(thumbnailSizeStr, valstr);
getSupportedParametersThumbnailSize(thumbnailSizeStr, &numthumbnailSize, thumbnailSize, length_thumbnailSize);
} else {
printf("Thumbnail sizes are not supported\n");
}
valstr = params.get(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED);
if (NULL != valstr) {
strcpy(vstabstr, valstr);
} else {
printf("VSTAB is not supported\n");
}
valstr = params.get("vnf-supported");
if (NULL != valstr) {
strcpy(vnfstr, valstr);
} else {
printf("VNF is not supported\n");
}
valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED);
if (NULL != valstr) {
strcpy(AutoExposureLockstr, valstr);
} else {
printf("AutoExposureLock is not supported\n");
}
valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED);
if (NULL != valstr) {
strcpy(AutoWhiteBalanceLockstr, valstr);
} else {
printf("AutoWhiteBalanceLock is not supported\n");
}
valstr = params.get(CameraParameters::KEY_ZOOM_SUPPORTED);
if (NULL != valstr) {
strcpy(zoomstr, valstr);
} else {
printf("Zoom is not supported\n");
}
valstr = params.get(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED);
if (NULL != valstr) {
strcpy(smoothzoomstr, valstr);
} else {
printf("SmoothZoom is not supported\n");
}
valstr = params.get("mode-values");
if (NULL != valstr) {
strcpy(modevaluesstr, valstr);
getSupportedParameters(modevaluesstr, &nummodevalues , (char***)&modevalues);
} else {
printf("Mode values is not supported\n");
}
valstr = params.get(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED);
if (NULL != valstr) {
strcpy(videosnapshotstr, valstr);
} else {
printf("Video Snapshot is not supported\n");
}
if (params.get(KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN) != NULL) {
manualConvMin = params.getInt(KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN);
} else {
printf("no supported parameteters for manual convergence min\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX) != NULL) {
manualConvMax = params.getInt(KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX);
} else {
printf("no supported parameteters for manual convergence max\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP) != NULL) {
manualConvStep = params.getInt(KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP);
} else {
printf("no supported parameteters for manual convergence step\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) != NULL) {
manualExpMin = params.getInt(KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
} else {
printf("no supported parameteters for manual exposure min\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_EXPOSURE_MAX) != NULL) {
manualExpMax = params.getInt(KEY_SUPPORTED_MANUAL_EXPOSURE_MAX);
} else {
printf("no supported parameteters for manual exposure max\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_EXPOSURE_STEP) != NULL) {
manualExpStep = params.getInt(KEY_SUPPORTED_MANUAL_EXPOSURE_STEP);
} else {
printf("no supported parameteters for manual exposure step\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) != NULL) {
manualGainMin = params.getInt(KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
} else {
printf("no supported parameteters for manual gain min\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX) != NULL) {
manualGainMax = params.getInt(KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX);
} else {
printf("no supported parameteters for manual gain max\n\t");
}
if (params.get(KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP) != NULL) {
manualGainStep = params.getInt(KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP);
} else {
printf("no supported parameteters for manual gain step\n\t");
}
return 0;
}
void getSizeParametersFromCapabilities() {
if(!stereoMode) {
if (params.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES) != NULL) {
strcpy(captureSizeStr, params.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES));
} else {
printf("Picture sizes are not supported\n");
}
if (params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES) != NULL) {
strcpy(previewSizeStr, params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
strcpy(VcaptureSizeStr, params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
} else {
printf("Preview sizes are not supported\n");
}
} else { //stereo
if(strcmp(stereoLayout[stereoLayoutIDX],"tb-full") == 0)
{
if (params.get(KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES) != NULL) {
strcpy(previewSizeStr, params.get(KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
strcpy(VcaptureSizeStr, params.get(KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
} else {
printf("Preview sizes are not supported\n");
}
}
else if(strcmp(stereoLayout[stereoLayoutIDX],"ss-full") == 0)
{
if (params.get(KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES) != NULL) {
strcpy(previewSizeStr, params.get(KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
strcpy(VcaptureSizeStr, params.get(KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
} else {
printf("Preview sizes are not supported\n");
}
}
else if(strcmp(stereoLayout[stereoLayoutIDX],"tb-subsampled") == 0)
{
if (params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES) != NULL) {
strcpy(previewSizeStr, params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
strcpy(VcaptureSizeStr, params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
} else {
printf("Preview sizes are not supported\n");
}
}
else if(strcmp(stereoLayout[stereoLayoutIDX],"ss-subsampled") == 0)
{
if (params.get(KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES) != NULL) {
strcpy(previewSizeStr, params.get(KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
strcpy(VcaptureSizeStr, params.get(KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
} else {
printf("Preview sizes are not supported\n");
}
}
else
{
printf("Preview sizes are not supported\n");
}
if(strcmp(stereoCapLayout[stereoCapLayoutIDX],"tb-full") == 0)
{
if (params.get(KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES) != NULL) {
strcpy(captureSizeStr, params.get(KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
} else {
printf("Picture sizes are not supported\n");
}
}
else if(strcmp(stereoCapLayout[stereoCapLayoutIDX],"ss-full") == 0)
{
if (params.get(KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES) != NULL) {
strcpy(captureSizeStr, params.get(KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
} else {
printf("Picture sizes are not supported\n");
}
}
else
{
printf("Picture sizes are not supported\n");
}
}
getSupportedParametersCaptureSize(captureSizeStr, &numcaptureSize, captureSize, length_capture_Size);
getSupportedParametersPreviewSize(previewSizeStr, &numpreviewSize, previewSize, length_previewSize);
getSupportedParametersVideoCaptureSize(VcaptureSizeStr, &numVcaptureSize, VcaptureSize, lenght_Vcapture_size);
}
int getDefaultParameter(const char* val, int numOptions, char **array) {
int cnt = 0;
if ((NULL == val) || (NULL == array)) {
printf("Some default parameters are not valid");
return 0;
}
for(cnt=0;cnt<numOptions;cnt++) {
if (NULL == array[cnt]) {
printf("Some parameter arrays are not valid");
continue;
}
if (strcmp(val, array[cnt]) ==0 ) {
return cnt;
}
}
return 0;
}
int getDefaultParameterResol(const char* val, int numOptions, param_Array **array) {
int cnt = 0;
for(cnt=0;cnt<numOptions;cnt++) {
if (strcmp(val, array[cnt]->name) ==0 ) {
return cnt;
}
}
return 0;
}
int getSupportedParameters(char* parameters, int *optionsCount, char ***elem) {
str = new char [400];
param = new char [400];
int cnt = 0;
strcpy(str, parameters);
param = strtok(str, ",");
*elem = new char*[30];
while (param != NULL) {
(*elem)[cnt] = new char[strlen(param) + 1];
strcpy((*elem)[cnt], param);
param = strtok (NULL, ",");
cnt++;
}
*optionsCount = cnt;
return 0;
}
int getSupportedParametersfps(char* parameters, int *optionsCount) {
str = new char [400];
param = new char [400];
int cnt = 0;
constCnt = 0;
rangeCnt = 0;
strcpy(str, parameters);
fps_const_str = new char*[32];
fps_range_str = new char*[32];
rangeDescription = new char*[32];
fpsArray = new fps_Array[50];
param = strtok(str, "(,)");
while (param != NULL) {
fps_const_str[constCnt] = new char;
fps_range_str[rangeCnt] = new char;
rangeDescription[rangeCnt] = new char;
fpsArray[cnt].rangeMin = atoi(param);
param = strtok (NULL, "(,)");
fpsArray[cnt].rangeMax = atoi(param);
param = strtok (NULL, "(,)");
if (fpsArray[cnt].rangeMin == fpsArray[cnt].rangeMax) {
sprintf(fps_const_str[constCnt], "%d,%d", fpsArray[cnt].rangeMin, fpsArray[cnt].rangeMax);
constFramerate[constCnt] = fpsArray[cnt].rangeMin/1000;
sprintf(fps_range_str[rangeCnt], "%d,%d", fpsArray[cnt].rangeMin, fpsArray[cnt].rangeMax);
sprintf(rangeDescription[rangeCnt], "[%d:%d]", fpsArray[cnt].rangeMin/1000, fpsArray[cnt].rangeMax/1000);
constCnt ++;
rangeCnt ++;
} else {
sprintf(fps_range_str[rangeCnt], "%d,%d", fpsArray[cnt].rangeMin, fpsArray[cnt].rangeMax);
sprintf(rangeDescription[rangeCnt], "[%d:%d]", fpsArray[cnt].rangeMin/1000, fpsArray[cnt].rangeMax/1000);
rangeCnt ++;
}
cnt++;
}
*optionsCount = cnt;
return 0;
}
int getSupportedParametersCaptureSize(char* parameters, int *optionsCount, param_Array array[], int arraySize) {
str = new char [400];
param = new char [400];
int cnt = 0;
strcpy(str, parameters);
param = strtok(str, ",x");
capture_Array = new param_Array*[50];
while (param != NULL) {
capture_Array[cnt] = new param_Array;
capture_Array[cnt]->width = atoi(param);
param = strtok (NULL, ",x");
capture_Array[cnt]->height = atoi(param);
param = strtok (NULL, ",x");
int x = getSupportedParametersNames(capture_Array[cnt]->width,
capture_Array[cnt]->height, array, arraySize);
if (x > -1) {
strcpy(capture_Array[cnt]->name, array[x].name);
} else {
strcpy(capture_Array[cnt]->name, "Needs to be added/Not supported");
}
cnt++;
}
*optionsCount = cnt;
return 0;
}
int getSupportedParametersVideoCaptureSize(char* parameters, int *optionsCount, param_Array array[], int arraySize) {
str = new char [800];
param = new char [800];
int cnt = 0;
strcpy(str, parameters);
param = strtok(str, ",x");
Vcapture_Array = new param_Array*[100];
while (param != NULL) {
Vcapture_Array[cnt] = new param_Array;
Vcapture_Array[cnt]->width = atoi(param);
param = strtok (NULL, ",x");
Vcapture_Array[cnt]->height = atoi(param);
param = strtok (NULL, ",x");
int x = getSupportedParametersNames(Vcapture_Array[cnt]->width,
Vcapture_Array[cnt]->height, array, arraySize);
if (x > -1) {
strcpy(Vcapture_Array[cnt]->name, array[x].name);
} else {
strcpy(Vcapture_Array[cnt]->name, "Needs to be added/Not supported");
}
cnt++;
}
*optionsCount = cnt;
return 0;
}
int getSupportedParametersPreviewSize(char* parameters, int *optionsCount, param_Array array[], int arraySize) {
str = new char [500];
param = new char [500];
int cnt = 0;
strcpy(str, parameters);
param = strtok(str, ",x");
preview_Array = new param_Array*[60];
while (param != NULL) {
preview_Array[cnt] = new param_Array;
preview_Array[cnt]->width = atoi(param);
param = strtok (NULL, ",x");
preview_Array[cnt]->height = atoi(param);
param = strtok (NULL, ",x");
int x = getSupportedParametersNames(preview_Array[cnt]->width,
preview_Array[cnt]->height, array, arraySize);
if (x > -1) {
strcpy(preview_Array[cnt]->name, array[x].name);
} else {
strcpy(preview_Array[cnt]->name, "Needs to be added/Not supported");
}
cnt++;
}
*optionsCount = cnt;
return 0;
}
int getSupportedParametersThumbnailSize(char* parameters, int *optionsCount, param_Array array[], int arraySize) {
str = new char [500];
param = new char [500];
int cnt = 0;
strcpy(str, parameters);
param = strtok(str, ",x");
thumbnail_Array = new param_Array*[60];
while (param != NULL) {
thumbnail_Array[cnt] = new param_Array;
thumbnail_Array[cnt]->width = atoi(param);
param = strtok (NULL, ",x");
thumbnail_Array[cnt]->height = atoi(param);
param = strtok (NULL, ",x");
int x = getSupportedParametersNames(thumbnail_Array[cnt]->width,
thumbnail_Array[cnt]->height, array, arraySize);
if (x > -1) {
strcpy(thumbnail_Array[cnt]->name, array[x].name);
} else {
strcpy(thumbnail_Array[cnt]->name, "Needs to be added/Not supported");
}
cnt++;
}
*optionsCount = cnt;
return 0;
}
int getSupportedParametersNames(int width, int height, param_Array array[], int arraySize) {
for (int i = 0; i<arraySize; i++) {
if ((width == array[i].width) && (height == array[i].height)) {
return (i);
}
}
return -1;
}
int deleteAllocatedMemory() {
int i;
for (i=0; i<numAntibanding; i++){
delete [] antiband[i];
}
for (i=0; i<numEffects; i++){
delete [] effectss[i];
}
for (i=0; i<numExposureMode; i++){
delete [] exposureMode[i];
}
for (i=0; i<numawb; i++) {
delete [] awb[i];
}
for (i=0; i<numscene; i++){
delete [] scene[i];
}
for (i=0; i<numfocus; i++){
delete [] focus[i];
}
for (i=0; i<numflash; i++){
delete [] flash[i];
}
for (i=0; i<numpreviewSize; i++){
delete [] preview_Array[i];
}
for (i=0; i<numcaptureSize; i++){
delete [] capture_Array[i];
}
for (i=0; i<numVcaptureSize; i++){
delete [] Vcapture_Array[i];
}
for (i=0; i<numthumbnailSize; i++){
delete [] thumbnail_Array[i];
}
for (i=0; i<constCnt; i++){
delete [] fps_const_str[i];
}
for (i=0; i<rangeCnt; i++){
delete [] fps_range_str[i];
}
for (i=0; i<rangeCnt; i++){
delete [] rangeDescription[i];
}
for (i=0; i<numpreviewFormat; i++){
delete [] previewFormatArray[i];
}
for (i=0; i<numpictureFormat; i++){
delete [] pictureFormatArray[i];
}
for (i=0; i<nummodevalues; i++){
delete [] modevalues[i];
}
if (numLay) {
for (i = 0; i < numLay; i++) {
delete [] stereoLayout[i];
}
numLay = 0;
}
if (numCLay) {
for (i = 0; i < numCLay; i++) {
delete [] stereoCapLayout[i];
}
numCLay = 0;
}
delete [] antibandStr;
delete [] effectssStr;
delete [] exposureModeStr;
delete [] awbStr;
delete [] sceneStr;
delete [] focusStr;
delete [] flashStr;
delete [] previewSizeStr;
delete [] captureSizeStr;
delete [] VcaptureSizeStr;
delete [] thumbnailSizeStr;
delete [] fpsstr;
delete [] previewFormatStr;
delete [] pictureFormatStr;
delete [] fpsArray;
delete [] vstabstr;
delete [] vnfstr;
delete [] isoModeStr;
delete [] AutoExposureLockstr;
delete [] AutoWhiteBalanceLockstr;
delete [] zoomstr;
delete [] smoothzoomstr;
delete [] modevaluesstr;
delete [] videosnapshotstr;
delete [] autoconvergencestr;
delete [] layoutstr;
delete [] capturelayoutstr;
// Release buffer sources if any
if (bufferSourceOutputThread.get()) {
bufferSourceOutputThread->requestExit();
bufferSourceOutputThread.clear();
}
if ( bufferSourceInput.get() ) {
bufferSourceInput.clear();
}
return 0;
}
int trySetVideoStabilization(bool toggle) {
if (strcmp(vstabstr, "true") == 0) {
params.set(params.KEY_VIDEO_STABILIZATION, toggle ? params.TRUE : params.FALSE);
return 0;
}
return 0;
}
int trySetVideoNoiseFilter(bool toggle) {
if (strcmp(vnfstr, "true") == 0) {
params.set("vnf", toggle ? params.TRUE : params.FALSE);
return 0;
}
return 0;
}
int trySetAutoExposureLock(bool toggle) {
if (strcmp(AutoExposureLockstr, "true") == 0) {
params.set(KEY_AUTO_EXPOSURE_LOCK, toggle ? params.TRUE : params.FALSE);
return 0;
}
return 0;
}
int trySetAutoWhiteBalanceLock(bool toggle) {
if (strcmp(AutoWhiteBalanceLockstr, "true") == 0) {
params.set(KEY_AUTO_WHITEBALANCE_LOCK, toggle ? params.TRUE : params.FALSE);
return 0;
}
return 0;
}
bool isRawPixelFormat (const char *format) {
bool ret = false;
if ((0 == strcmp (format, CameraParameters::PIXEL_FORMAT_YUV422I)) ||
(0 == strcmp (format, CameraParameters::PIXEL_FORMAT_YUV420SP)) ||
(0 == strcmp (format, CameraParameters::PIXEL_FORMAT_RGB565)) ||
(0 == strcmp (format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB))) {
ret = true;
}
return ret;
}
void stopPreview() {
if ( hardwareActive ) {
camera->stopPreview();
destroyPreviewSurface();
previewRunning = false;
reSizePreview = true;
}
}
void initDefaults() {
struct CameraInfo cameraInfo;
camera->getCameraInfo(camera_index, &cameraInfo);
if (cameraInfo.facing == CAMERA_FACING_FRONT) {
rotation = cameraInfo.orientation;
} else { // back-facing
rotation = cameraInfo.orientation;
}
antibanding_mode = getDefaultParameter("off", numAntibanding, antiband);
focus_mode = getDefaultParameter("auto", numfocus, focus);
fpsRangeIdx = getDefaultParameter("5000,30000", rangeCnt, fps_range_str);
afTimeoutIdx = 0;
previewSizeIDX = getDefaultParameterResol("VGA", numpreviewSize, preview_Array);
captureSizeIDX = getDefaultParameterResol("12MP", numcaptureSize, capture_Array);
frameRateIDX = getDefaultParameter("30000,30000", constCnt, fps_const_str);
VcaptureSizeIDX = getDefaultParameterResol("HD", numVcaptureSize, Vcapture_Array);
VbitRateIDX = 0;
thumbSizeIDX = getDefaultParameterResol("VGA", numthumbnailSize, thumbnail_Array);
compensation = 0.0;
awb_mode = getDefaultParameter("auto", numawb, awb);
effects_mode = getDefaultParameter("none", numEffects, effectss);
scene_mode = getDefaultParameter("auto", numscene, scene);
caf_mode = 0;
shotConfigFlush = false;
streamCapture = false;
vstabtoggle = false;
vnftoggle = false;
AutoExposureLocktoggle = false;
AutoWhiteBalanceLocktoggle = false;
faceDetectToggle = false;
metaDataToggle = false;
expBracketIdx = BRACKETING_IDX_DEFAULT;
flashIdx = getDefaultParameter("off", numflash, flash);
previewRotation = 0;
zoomIDX = 0;
videoCodecIDX = 0;
gbceIDX = 0;
glbceIDX = 0;
contrast = 100;
#ifdef TARGET_OMAP4
///Temporary fix until OMAP3 and OMAP4 3A values are synced
brightness = 50;
sharpness = 100;
#else
brightness = 100;
sharpness = 0;
#endif
saturation = 100;
iso_mode = getDefaultParameter("auto", numisoMode, isoMode);
capture_mode = getDefaultParameter("high-quality", nummodevalues, modevalues);
exposure_mode = getDefaultParameter("auto", numExposureMode, exposureMode);
ippIDX = 0;
ippIDX_old = ippIDX;
jpegQuality = 85;
bufferStarvationTest = 0;
meter_mode = 0;
previewFormat = getDefaultParameter("yuv420sp", numpreviewFormat, previewFormatArray);
pictureFormat = getDefaultParameter("jpeg", numpictureFormat, pictureFormatArray);
stereoCapLayoutIDX = 0;
stereoLayoutIDX = 1;
manualConv = 0;
manualExp = manualExpMin;
manualGain = manualGainMin;
algoFixedGammaIDX = 1;
algoNSF1IDX = 1;
algoNSF2IDX = 1;
algoSharpeningIDX = 1;
algoThreeLinColorMapIDX = 1;
algoGICIDX = 1;
params.set(params.KEY_VIDEO_STABILIZATION, params.FALSE);
params.set("vnf", params.FALSE);
params.setPreviewSize(preview_Array[previewSizeIDX]->width, preview_Array[previewSizeIDX]->height);
params.setPictureSize(capture_Array[captureSizeIDX]->width, capture_Array[captureSizeIDX]->height);
params.set(CameraParameters::KEY_ROTATION, rotation);
params.set(KEY_SENSOR_ORIENTATION, previewRotation);
params.set(KEY_COMPENSATION, (int) (compensation * 10));
params.set(params.KEY_WHITE_BALANCE, awb[awb_mode]);
params.set(KEY_MODE, (modevalues[capture_mode]));
params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
params.set(KEY_CAF, caf_mode);
params.set(KEY_ISO, isoMode[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, exposureMode[exposure_mode]);
params.set(KEY_BRIGHTNESS, brightness);
params.set(KEY_SATURATION, saturation);
params.set(params.KEY_EFFECT, effectss[effects_mode]);
params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fps_const_str[frameRateIDX]);
params.set(params.KEY_ANTIBANDING, antiband[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(previewFormatArray[previewFormat]);
params.setPictureFormat(pictureFormatArray[pictureFormat]);
params.set(KEY_BUFF_STARV, bufferStarvationTest);
params.set(KEY_METERING_MODE, metering[meter_mode]);
params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, thumbnail_Array[thumbSizeIDX]->width);
params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, thumbnail_Array[thumbSizeIDX]->height);
params.set(KEY_MANUAL_CONVERGENCE, manualConv);
params.set(KEY_MANUAL_EXPOSURE, manualExp);
params.set(KEY_MANUAL_GAIN_ISO, manualGain);
params.set(KEY_MANUAL_EXPOSURE_RIGHT, manualExp);
params.set(KEY_MANUAL_GAIN_ISO_RIGHT, manualGain);
params.set(KEY_S3D2D_PREVIEW_MODE, "off");
params.set(KEY_EXIF_MODEL, MODEL);
params.set(KEY_EXIF_MAKE, MAKE);
setDefaultExpGainPreset(shotParams, expBracketIdx);
}
void setDefaultExpGainPreset(ShotParameters &params, int idx) {
if ( ((int)ARRAY_SIZE(expBracketing) > idx) && (0 <= idx) ) {
setExpGainPreset(params, expBracketing[idx].value, false, expBracketing[idx].param_type, shotConfigFlush);
} else {
printf("setDefaultExpGainPreset: Index (%d) is out of range 0 ~ %u\n", idx, ARRAY_SIZE(expBracketing) - 1);
}
}
void setSingleExpGainPreset(ShotParameters &params, int idx, int exp, int gain) {
String8 val;
if (PARAM_EXP_BRACKET_PARAM_PAIR == expBracketing[idx].param_type) {
val.append("(");
}
if (PARAM_EXP_BRACKET_VALUE_REL == expBracketing[idx].value_type) {
val.appendFormat("%+d", exp);
} else {
val.appendFormat("%u", (unsigned int) exp);
}
if (PARAM_EXP_BRACKET_PARAM_PAIR == expBracketing[idx].param_type) {
if (PARAM_EXP_BRACKET_VALUE_REL == expBracketing[idx].value_type) {
val.appendFormat(",%+d)", gain);
} else {
val.appendFormat(",%u)", (unsigned int) gain);
}
}
if (PARAM_EXP_BRACKET_APPLY_FORCED == expBracketing[idx].apply_type) {
val.append("F");
}
setExpGainPreset(params, val, false, expBracketing[idx].param_type, false);
}
void setExpGainPreset(ShotParameters &params, const char *input, bool force, param_ExpBracketParamType_t type, bool flush) {
const char *startPtr = NULL;
size_t i = 0;
if (NULL == input) {
printf("setExpGainPreset: missing input string\n");
} else if ( (force && (NULL == strpbrk(input, "()"))) ||
(PARAM_EXP_BRACKET_PARAM_COMP == type) ) {
// parse for the number of inputs (count the number of ',' + 1)
startPtr = strchr(input, ',');
while (startPtr != NULL) {
i++;
startPtr = strchr(startPtr + 1, ',');
}
i++;
printf("relative EV input: \"%s\"\nnumber of relative EV values: %d (%s)\n",
input, i, flush ? "reset" : "append");
burst = i;
burstCount = i;
params.set(ShotParameters::KEY_BURST, burst);
params.set(ShotParameters::KEY_EXP_COMPENSATION, input);
params.remove(ShotParameters::KEY_EXP_GAIN_PAIRS);
params.set(ShotParameters::KEY_FLUSH_CONFIG,
flush ? ShotParameters::TRUE : ShotParameters::FALSE);
} else if ( force || (PARAM_EXP_BRACKET_PARAM_PAIR == type) ) {
// parse for the number of inputs (count the number of '(')
startPtr = strchr(input, '(');
while (startPtr != NULL) {
i++;
startPtr = strchr(startPtr + 1, '(');
}
printf("absolute exposure,gain input: \"%s\"\nNumber of brackets: %d (%s)\n",
input, i, flush ? "reset" : "append");
burst = i;
burstCount = i;
params.set(ShotParameters::KEY_BURST, burst);
params.set(ShotParameters::KEY_EXP_GAIN_PAIRS, input);
params.remove(ShotParameters::KEY_EXP_COMPENSATION);
params.set(ShotParameters::KEY_FLUSH_CONFIG,
flush ? ShotParameters::TRUE : ShotParameters::FALSE);
} else {
printf("no bracketing input: \"%s\"\n", input);
params.remove(ShotParameters::KEY_EXP_GAIN_PAIRS);
params.remove(ShotParameters::KEY_EXP_COMPENSATION);
params.remove(ShotParameters::KEY_BURST);
params.remove(ShotParameters::KEY_FLUSH_CONFIG);
}
}
void calcNextSingleExpGainPreset(int idx, int &exp, int &gain) {
if (PARAM_EXP_BRACKET_VALUE_ABS == expBracketing[idx].value_type) {
// absolute
if ( (0 == exp) && (0 == gain) ) {
exp=100;
gain = 150;
printf("Streaming: Init default absolute exp./gain: %d,%d\n", exp, gain);
}
exp *= 2;
if (1000000 < exp) {
exp = 100;
gain += 50;
if(400 < gain) {
gain = 50;
}
}
} else {
// relative
exp += 50;
if (200 < exp) {
exp = -200;
gain += 50;
if(200 < gain) {
gain = -200;
}
}
}
}
void updateShotConfigFlushParam() {
// Will update flush shot config parameter if already present
// Otherwise, keep empty (will be set later in setExpGainPreset())
if (NULL != shotParams.get(ShotParameters::KEY_FLUSH_CONFIG)) {
shotParams.set(ShotParameters::KEY_FLUSH_CONFIG,
shotConfigFlush ? ShotParameters::TRUE : ShotParameters::FALSE);
}
}
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':
return -1;
default:
print_menu = 0;
break;
}
return 0;
}
int menu_algo() {
char ch;
if (print_menu) {
printf("\n\n== ALGO ENABLE/DISABLE MENU ============\n\n");
printf(" a. Fixed Gamma: %s\n", algoFixedGamma[algoFixedGammaIDX]);
printf(" s. NSF1: %s\n", algoNSF1[algoNSF1IDX]);
printf(" d. NSF2: %s\n", algoNSF2[algoNSF2IDX]);
printf(" f. Sharpening: %s\n", algoSharpening[algoSharpeningIDX]);
printf(" g. Color Conversion: %s\n", algoThreeLinColorMap[algoThreeLinColorMapIDX]);
printf(" h. Green Inballance Correction: %s\n", algoGIC[algoGICIDX]);
printf("\n");
printf(" q. Return to main menu\n");
printf("\n");
printf(" Choice: ");
}
ch = getchar();
printf("%c", ch);
print_menu = 1;
switch (ch) {
case 'a':
case 'A':
algoFixedGammaIDX++;
algoFixedGammaIDX %= ARRAY_SIZE(algoFixedGamma);
params.set(KEY_ALGO_FIXED_GAMMA, (algoFixedGamma[algoFixedGammaIDX]));
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 's':
case 'S':
algoNSF1IDX++;
algoNSF1IDX %= ARRAY_SIZE(algoNSF1);
params.set(KEY_ALGO_NSF1, (algoNSF1[algoNSF1IDX]));
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'd':
case 'D':
algoNSF2IDX++;
algoNSF2IDX %= ARRAY_SIZE(algoNSF2);
params.set(KEY_ALGO_NSF2, (algoNSF2[algoNSF2IDX]));
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'f':
case 'F':
algoSharpeningIDX++;
algoSharpeningIDX %= ARRAY_SIZE(algoSharpening);
params.set(KEY_ALGO_SHARPENING, (algoSharpening[algoSharpeningIDX]));
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'g':
case 'G':
algoThreeLinColorMapIDX++;
algoThreeLinColorMapIDX %= ARRAY_SIZE(algoThreeLinColorMap);
params.set(KEY_ALGO_THREELINCOLORMAP, (algoThreeLinColorMap[algoThreeLinColorMapIDX]));
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'h':
case 'H':
algoGICIDX++;
algoGICIDX %= ARRAY_SIZE(algoGIC);
params.set(KEY_ALGO_GIC, (algoGIC[algoGICIDX]));
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;
char area1[MAX_LINES][MAX_SYMBOLS+1];
char area2[MAX_LINES][MAX_SYMBOLS+1];
int j = 0;
int k = 0;
const char *valstr = NULL;
struct CameraInfo cameraInfo;
bool queueEmpty = true;
memset(area1, '\0', MAX_LINES*(MAX_SYMBOLS+1));
memset(area2, '\0', MAX_LINES*(MAX_SYMBOLS+1));
if (print_menu) {
printf("\n========================================= FUNCTIONAL TEST MENU =========================================\n");
snprintf(area1[j++], MAX_SYMBOLS, " START / STOP / GENERAL SERVICES");
snprintf(area1[j++], MAX_SYMBOLS, " -----------------------------");
snprintf(area1[j++], MAX_SYMBOLS, "A Select Camera %s", cameras[camera_index]);
snprintf(area1[j++], MAX_SYMBOLS, "[. Resume Preview after capture");
snprintf(area1[j++], MAX_SYMBOLS, "0. Reset to defaults");
snprintf(area1[j++], MAX_SYMBOLS, "q. Quit");
snprintf(area1[j++], MAX_SYMBOLS, "@. Disconnect and Reconnect to CameraService");
snprintf(area1[j++], MAX_SYMBOLS, "/. Enable/Disable showfps: %s", ((showfps)? "Enabled":"Disabled"));
snprintf(area1[j++], MAX_SYMBOLS, "a. GEO tagging settings menu");
snprintf(area1[j++], MAX_SYMBOLS, "E. Camera Capability Dump");
snprintf(area1[j++], MAX_SYMBOLS, " PREVIEW SUB MENU");
snprintf(area1[j++], MAX_SYMBOLS, " -----------------------------");
snprintf(area1[j++], MAX_SYMBOLS, "1. Start Preview");
snprintf(area1[j++], MAX_SYMBOLS, "2. Stop Preview");
snprintf(area1[j++], MAX_SYMBOLS, "~. Preview format %s", previewFormatArray[previewFormat]);
#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
snprintf(area1[j++], MAX_SYMBOLS, "4. Preview size: %4d x %4d - %s",preview_Array[previewSizeIDX]->width, preview_Array[previewSizeIDX]->height, preview_Array[previewSizeIDX]->name);
#else
snprintf(area1[j++], MAX_SYMBOLS, "4. Preview size: %4d x %4d - %s",preview_Array[previewSizeIDX]->width, stereoMode ? preview_Array[previewSizeIDX]->height*2 : preview_Array[previewSizeIDX]->height, preview_Array[previewSizeIDX]->name);
#endif
snprintf(area1[j++], MAX_SYMBOLS, "R. Preview framerate range: %s", rangeDescription[fpsRangeIdx]);
snprintf(area1[j++], MAX_SYMBOLS, "&. Dump a preview frame");
if (stereoMode) {
snprintf(area1[j++], MAX_SYMBOLS, "_. Auto Convergence mode: %s", autoconvergencemode[AutoConvergenceModeIDX]);
snprintf(area1[j++], MAX_SYMBOLS, "^. Manual Convergence Value: %d\n", manualConv);
snprintf(area1[j++], MAX_SYMBOLS, "L. Stereo Preview Layout: %s\n", stereoLayout[stereoLayoutIDX]);
snprintf(area1[j++], MAX_SYMBOLS, ". Stereo Capture Layout: %s\n", stereoCapLayout[stereoCapLayoutIDX]);
}
snprintf(area1[j++], MAX_SYMBOLS, "{. 2D Preview in 3D Stereo Mode: %s", params.get(KEY_S3D2D_PREVIEW_MODE));
snprintf(area1[j++], MAX_SYMBOLS, " IMAGE CAPTURE SUB MENU");
snprintf(area1[j++], MAX_SYMBOLS, " -----------------------------");
snprintf(area1[j++], MAX_SYMBOLS, "p. Take picture/Full Press");
snprintf(area1[j++], MAX_SYMBOLS, "n. Flush shot config queue: %s", shotConfigFlush ? "On" : "Off");
snprintf(area1[j++], MAX_SYMBOLS, "H. Exposure Bracketing: %s", expBracketing[expBracketIdx].desc);
snprintf(area1[j++], MAX_SYMBOLS, "U. Temporal Bracketing: %s", tempBracketing[tempBracketIdx]);
snprintf(area1[j++], MAX_SYMBOLS, "W. Temporal Bracketing Range: [-%d;+%d]", tempBracketRange, tempBracketRange);
snprintf(area1[j++], MAX_SYMBOLS, "$. Picture Format: %s", pictureFormatArray[pictureFormat]);
snprintf(area1[j++], MAX_SYMBOLS, "3. Picture Rotation: %3d degree", rotation );
snprintf(area1[j++], MAX_SYMBOLS, "V. Preview Rotation: %3d degree", previewRotation );
snprintf(area1[j++], MAX_SYMBOLS, "5. Picture size: %4d x %4d - %s",capture_Array[captureSizeIDX]->width, capture_Array[captureSizeIDX]->height, capture_Array[captureSizeIDX]->name);
snprintf(area1[j++], MAX_SYMBOLS, "i. ISO mode: %s", isoMode[iso_mode]);
snprintf(area1[j++], MAX_SYMBOLS, ", Manual gain iso value = %d\n", manualGain);
snprintf(area1[j++], MAX_SYMBOLS, "u. Capture Mode: %s", modevalues[capture_mode]);
snprintf(area1[j++], MAX_SYMBOLS, "k. IPP Mode: %s", ipp_mode[ippIDX]);
snprintf(area1[j++], MAX_SYMBOLS, "K. GBCE: %s", gbce[gbceIDX]);
snprintf(area1[j++], MAX_SYMBOLS, "O. GLBCE %s", gbce[glbceIDX]);
snprintf(area1[j++], MAX_SYMBOLS, "o. Jpeg Quality: %d", jpegQuality);
snprintf(area1[j++], MAX_SYMBOLS, "#. Burst Images: %3d", burst);
snprintf(area1[j++], MAX_SYMBOLS, ":. Thumbnail Size: %4d x %4d - %s",thumbnail_Array[thumbSizeIDX]->width, thumbnail_Array[thumbSizeIDX]->height, thumbnail_Array[thumbSizeIDX]->name);
snprintf(area1[j++], MAX_SYMBOLS, "': Thumbnail Quality %d", thumbQuality);
snprintf(area2[k++], MAX_SYMBOLS, " VIDEO CAPTURE SUB MENU");
snprintf(area2[k++], MAX_SYMBOLS, " -----------------------------");
snprintf(area2[k++], MAX_SYMBOLS, "6. Start Video Recording");
snprintf(area2[k++], MAX_SYMBOLS, "2. Stop Recording");
snprintf(area2[k++], MAX_SYMBOLS, "l. Video Capture resolution: %4d x %4d - %s",Vcapture_Array[VcaptureSizeIDX]->width,Vcapture_Array[VcaptureSizeIDX]->height, Vcapture_Array[VcaptureSizeIDX]->name);
snprintf(area2[k++], MAX_SYMBOLS, "]. Video Bit rate : %s", VbitRate[VbitRateIDX].desc);
snprintf(area2[k++], MAX_SYMBOLS, "9. Video Codec: %s", videoCodecs[videoCodecIDX].desc);
snprintf(area2[k++], MAX_SYMBOLS, "D. Audio Codec: %s", audioCodecs[audioCodecIDX].desc);
snprintf(area2[k++], MAX_SYMBOLS, "v. Output Format: %s", outputFormat[outputFormatIDX].desc);
snprintf(area2[k++], MAX_SYMBOLS, "r. Framerate: %d", constFramerate[frameRateIDX]);
snprintf(area2[k++], MAX_SYMBOLS, "*. Start Video Recording dump ( 1 raw frame )");
snprintf(area2[k++], MAX_SYMBOLS, "B VNF %s", vnftoggle? "On" : "Off");
snprintf(area2[k++], MAX_SYMBOLS, "C VSTAB %s", vstabtoggle? "On" : "Off");
snprintf(area2[k++], MAX_SYMBOLS, " 3A SETTING SUB MENU");
snprintf(area2[k++], MAX_SYMBOLS, " -----------------------------");
snprintf(area2[k++], MAX_SYMBOLS, "M. Measurement Data: %s", measurement[measurementIdx]);
snprintf(area2[k++], MAX_SYMBOLS, "F. Toggle face detection: %s", faceDetectToggle ? "On" : "Off");
snprintf(area2[k++], MAX_SYMBOLS, "T. Toggle metadata: %s", metaDataToggle ? "On" : "Off");
snprintf(area2[k++], MAX_SYMBOLS, "G. Touch/Focus area AF");
snprintf(area2[k++], MAX_SYMBOLS, "y. Metering area");
snprintf(area2[k++], MAX_SYMBOLS, "Y. Metering area center");
snprintf(area2[k++], MAX_SYMBOLS, "N. Metering area average");
snprintf(area2[k++], MAX_SYMBOLS, "f. Auto Focus/Half Press");
snprintf(area2[k++], MAX_SYMBOLS, "I. AF Timeout %s", afTimeout[afTimeoutIdx]);
snprintf(area2[k++], MAX_SYMBOLS, "J.Flash: %s", flash[flashIdx]);
snprintf(area2[k++], MAX_SYMBOLS, "7. EV offset: %4.1f", compensation);
snprintf(area2[k++], MAX_SYMBOLS, "8. AWB mode: %s", awb[awb_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "z. Zoom %s", zoom[zoomIDX].zoom_description);
snprintf(area2[k++], MAX_SYMBOLS, "Z. Smooth Zoom %s", zoom[zoomIDX].zoom_description);
snprintf(area2[k++], MAX_SYMBOLS, "j. Exposure %s", exposureMode[exposure_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "Q. manual exposure value = %d\n", manualExp);
snprintf(area2[k++], MAX_SYMBOLS, "e. Effect: %s", effectss[effects_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "w. Scene: %s", scene[scene_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "s. Saturation: %d", saturation);
snprintf(area2[k++], MAX_SYMBOLS, "c. Contrast: %d", contrast);
snprintf(area2[k++], MAX_SYMBOLS, "h. Sharpness: %d", sharpness);
snprintf(area2[k++], MAX_SYMBOLS, "b. Brightness: %d", brightness);
snprintf(area2[k++], MAX_SYMBOLS, "x. Antibanding: %s", antiband[antibanding_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "g. Focus mode: %s", focus[focus_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "m. Metering mode: %s" , metering[meter_mode]);
snprintf(area2[k++], MAX_SYMBOLS, "<. Exposure Lock: %s", AutoExposureLocktoggle ? "On" : "Off");
snprintf(area2[k++], MAX_SYMBOLS, ">. WhiteBalance Lock: %s",AutoWhiteBalanceLocktoggle ? "On": "Off");
snprintf(area2[k++], MAX_SYMBOLS, "). Mechanical Misalignment Correction: %s",misalignmentCorrection[enableMisalignmentCorrectionIdx]);
snprintf(area2[k++], MAX_SYMBOLS, "d. Algo enable/disable functions menu");
printf("\n");
for (int i=0; (i<j || i < k) && i<MAX_LINES; i++) {
printf("%-65s \t %-65s\n", area1[i], area2[i]);
}
printf(" Choice:");
}
ch = getchar();
printf("%c", ch);
print_menu = 1;
switch (ch) {
case '_':
AutoConvergenceModeIDX++;
AutoConvergenceModeIDX %= numAutoConvergence;
params.set(KEY_AUTOCONVERGENCE, autoconvergencemode[AutoConvergenceModeIDX]);
if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], "manual") == 0) {
params.set(KEY_MANUAL_CONVERGENCE, manualConv);
} else {
if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], "touch") == 0) {
params.set(CameraParameters::KEY_METERING_AREAS, MeteringAreas);
}
manualConv = 0;
params.set(KEY_MANUAL_CONVERGENCE, manualConv);
}
camera->setParameters(params.flatten());
break;
case '^':
if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], "manual") == 0) {
manualConv += manualConvStep;
if( manualConv > manualConvMax) {
manualConv = manualConvMin;
}
params.set(KEY_MANUAL_CONVERGENCE, manualConv);
camera->setParameters(params.flatten());
}
break;
case 'A':
camera_index++;
camera_index %= numCamera;
firstTime = true;
closeCamera();
openCamera();
initDefaults();
break;
case '[':
if ( hardwareActive ) {
camera->setParameters(params.flatten());
camera->startPreview();
}
break;
case '0':
initDefaults();
camera_index = 0;
break;
case '1':
if ( startPreview() < 0 ) {
printf("Error while starting preview\n");
return -1;
}
break;
case '2':
if ( recordingMode ) {
stopRecording();
stopPreview();
closeRecorder();
camera->disconnect();
camera.clear();
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;
} else {
stopPreview();
}
break;
case '3':
rotation += 90;
rotation %= 360;
params.set(CameraParameters::KEY_ROTATION, rotation);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'V':
previewRotation += 90;
previewRotation %= 360;
params.set(KEY_SENSOR_ORIENTATION, previewRotation);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case '4':
previewSizeIDX += 1;
previewSizeIDX %= numpreviewSize;
params.setPreviewSize(preview_Array[previewSizeIDX]->width, preview_Array[previewSizeIDX]->height);
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 %= numcaptureSize;
printf("CaptureSizeIDX %d \n", captureSizeIDX);
params.setPictureSize(capture_Array[captureSizeIDX]->width, capture_Array[captureSizeIDX]->height);
if ( hardwareActive )
camera->setParameters(params.flatten());
requestBufferSourceReset();
break;
case 'l':
VcaptureSizeIDX++;
VcaptureSizeIDX %= numVcaptureSize;
break;
case 'L' :
stereoLayoutIDX++;
stereoLayoutIDX %= numLay;
if (stereoMode) {
firstTimeStereo = false;
params.set(KEY_S3D_PRV_FRAME_LAYOUT, stereoLayout[stereoLayoutIDX]);
}
getSizeParametersFromCapabilities();
if (hardwareActive && previewRunning) {
stopPreview();
camera->setParameters(params.flatten());
startPreview();
} else if (hardwareActive) {
camera->setParameters(params.flatten());
}
break;
case '.' :
stereoCapLayoutIDX++;
stereoCapLayoutIDX %= numCLay;
if (stereoMode) {
firstTimeStereo = false;
params.set(KEY_S3D_CAP_FRAME_LAYOUT, stereoCapLayout[stereoCapLayoutIDX]);
}
getSizeParametersFromCapabilities();
if (hardwareActive && previewRunning) {
stopPreview();
camera->setParameters(params.flatten());
startPreview();
} else if (hardwareActive) {
camera->setParameters(params.flatten());
}
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 %= numawb;
params.set(params.KEY_WHITE_BALANCE, awb[awb_mode]);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case '9':
videoCodecIDX++;
videoCodecIDX %= ARRAY_SIZE(videoCodecs);
break;
case '~':
previewFormat += 1;
previewFormat %= numpreviewFormat;
params.setPreviewFormat(previewFormatArray[previewFormat]);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case '$':
pictureFormat += 1;
pictureFormat %= numpictureFormat;
printf("pictureFormat %d\n", pictureFormat);
printf("numpreviewFormat %d\n", numpictureFormat);
params.setPictureFormat(pictureFormatArray[pictureFormat]);
queueEmpty = true;
if ( bufferSourceOutputThread.get() ) {
if ( 0 < bufferSourceOutputThread->hasBuffer() ) {
queueEmpty = false;
}
}
if ( hardwareActive && queueEmpty )
camera->setParameters(params.flatten());
break;
case ':':
thumbSizeIDX += 1;
thumbSizeIDX %= numthumbnailSize;
printf("ThumbnailSizeIDX %d \n", thumbSizeIDX);
params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, thumbnail_Array[thumbSizeIDX]->width);
params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,thumbnail_Array[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' :
if(strcmp(vnfstr, "true") == 0) {
if(vnftoggle == false) {
trySetVideoNoiseFilter(true);
vnftoggle = true;
} else {
trySetVideoNoiseFilter(false);
vnftoggle = false;
}
}else {
trySetVideoNoiseFilter(false);
vnftoggle = false;
printf("VNF is not supported\n");
}
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'C' :
if(strcmp(vstabstr, "true") == 0) {
if(vstabtoggle == false) {
trySetVideoStabilization(true);
vstabtoggle = true;
} else {
trySetVideoStabilization(false);
vstabtoggle = false;
}
} else {
trySetVideoStabilization(false);
vstabtoggle = false;
printf("VSTAB is not supported\n");
}
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());
requestBufferSourceReset();
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':
faceDetectToggle = !faceDetectToggle;
if ( hardwareActive ) {
if (faceDetectToggle)
camera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, 0, 0);
else
camera->sendCommand(CAMERA_CMD_STOP_FACE_DETECTION, 0, 0);
}
break;
case 'I':
afTimeoutIdx++;
afTimeoutIdx %= ARRAY_SIZE(afTimeout);
params.set(KEY_AF_TIMEOUT, afTimeout[afTimeoutIdx]);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'T':
metaDataToggle = !metaDataToggle;
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;
}
burstCount = burst;
params.set(KEY_TI_BURST, burst);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'J':
flashIdx++;
flashIdx %= numflash;
params.set(CameraParameters::KEY_FLASH_MODE, (flash[flashIdx]));
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'u':
capture_mode++;
capture_mode %= nummodevalues;
// HQ should always be in ldc-nsf
// if not HQ, then return the ipp to its previous state
if( !strcmp(modevalues[capture_mode], "high-quality") ) {
ippIDX_old = ippIDX;
ippIDX = 3;
params.set(KEY_IPP, ipp_mode[ippIDX]);
params.set(CameraParameters::KEY_RECORDING_HINT, CameraParameters::FALSE);
previewRotation = 0;
params.set(KEY_SENSOR_ORIENTATION, previewRotation);
} else if ( !strcmp(modevalues[capture_mode], "video-mode") ) {
params.set(CameraParameters::KEY_RECORDING_HINT, CameraParameters::TRUE);
camera->getCameraInfo(camera_index, &cameraInfo);
previewRotation = ((360-cameraInfo.orientation)%360);
if (previewRotation >= 0 || previewRotation <=360) {
params.set(KEY_SENSOR_ORIENTATION, previewRotation);
}
} else {
ippIDX = ippIDX_old;
params.set(CameraParameters::KEY_RECORDING_HINT, CameraParameters::FALSE);
previewRotation = 0;
params.set(KEY_SENSOR_ORIENTATION, previewRotation);
}
params.set(KEY_MODE, (modevalues[capture_mode]));
if ( hardwareActive ) {
if (previewRunning) {
stopPreview();
}
camera->setParameters(params.flatten());
// Get parameters from capabilities for the new capture mode
params = camera->getParameters();
getSizeParametersFromCapabilities();
getParametersFromCapabilities();
// Set framerate 30fps and 12MP capture resolution if available for the new capture mode.
// If not available set framerate and capture mode under index 0 from fps_const_str and capture_Array.
frameRateIDX = getDefaultParameter("30000,30000", constCnt, fps_const_str);
captureSizeIDX = getDefaultParameterResol("12MP", numcaptureSize, capture_Array);
params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fps_const_str[frameRateIDX]);
params.setPictureSize(capture_Array[captureSizeIDX]->width, capture_Array[captureSizeIDX]->height);
camera->setParameters(params.flatten());
}
requestBufferSourceReset();
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);
setDefaultExpGainPreset(shotParams, expBracketIdx);
break;
case 'n':
if (shotConfigFlush)
shotConfigFlush = false;
else
shotConfigFlush = true;
updateShotConfigFlushParam();
break;
case '(':
{
char input[256];
input[0] = ch;
scanf("%254s", input+1);
setExpGainPreset(shotParams, input, true, PARAM_EXP_BRACKET_PARAM_NONE, shotConfigFlush);
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 %= numscene;
params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'i':
iso_mode++;
iso_mode %= numisoMode;
params.set(KEY_ISO, isoMode[iso_mode]);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'h':
#ifdef TARGET_OMAP4
if ( sharpness >= 200)
#else
if ( sharpness >= 100)
#endif
{
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':
if(strcmp(zoomstr, "true") == 0) {
zoomIDX++;
zoomIDX %= ARRAY_SIZE(zoom);
params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
if ( hardwareActive )
camera->setParameters(params.flatten());
}
break;
case 'Z':
if(strcmp(smoothzoomstr, "true") == 0) {
zoomIDX++;
zoomIDX %= ARRAY_SIZE(zoom);
if ( hardwareActive )
camera->sendCommand(CAMERA_CMD_START_SMOOTH_ZOOM, zoom[zoomIDX].idx, 0);
}
break;
case 'j':
exposure_mode++;
exposure_mode %= numExposureMode;
params.set(KEY_EXPOSURE, exposureMode[exposure_mode]);
if ( strcmp (exposureMode[exposure_mode], "manual") == 0) {
params.set(KEY_MANUAL_EXPOSURE, manualExp);
params.set(KEY_MANUAL_GAIN_ISO, manualGain);
params.set(KEY_MANUAL_EXPOSURE_RIGHT, manualExp);
params.set(KEY_MANUAL_GAIN_ISO_RIGHT, manualGain);
}
else
{
manualExp = manualExpMin;
params.set(KEY_MANUAL_EXPOSURE, manualExp);
params.set(KEY_MANUAL_EXPOSURE_RIGHT, manualExp);
manualGain = manualGainMin;
params.set(KEY_MANUAL_GAIN_ISO, manualGain);
params.set(KEY_MANUAL_GAIN_ISO_RIGHT, manualGain);
}
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'Q':
if ( strcmp (exposureMode[exposure_mode], "manual") == 0) {
manualExp += manualExpStep;
if( manualExp > manualExpMax) {
manualExp = manualExpMin;
}
params.set(KEY_MANUAL_EXPOSURE, manualExp);
params.set(KEY_MANUAL_EXPOSURE_RIGHT, manualExp);
camera->setParameters(params.flatten());
}
break;
case ',':
if ( strcmp (exposureMode[exposure_mode], "manual") == 0) {
manualGain += manualGainStep;
if( manualGain > manualGainMax) {
manualGain = manualGainMin;
}
params.set(KEY_MANUAL_GAIN_ISO, manualGain);
params.set(KEY_MANUAL_GAIN_ISO_RIGHT, manualGain);
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':
#ifdef TARGET_OMAP4
if ( brightness >= 100)
#else
if ( brightness >= 200)
#endif
{
brightness = 0;
} else {
brightness += 10;
}
params.set(KEY_BRIGHTNESS, brightness);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 's':
if ( saturation >= 200) {
saturation = 0;
} else {
saturation += 10;
}
params.set(KEY_SATURATION, saturation);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'e':
effects_mode++;
effects_mode %= numEffects;
printf("%d", numEffects);
params.set(params.KEY_EFFECT, effectss[effects_mode]);
printf("Effects_mode %d", effects_mode);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'r':
frameRateIDX++;
frameRateIDX %= constCnt;
params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fps_const_str[frameRateIDX]);
printf("fps_const_str[frameRateIDX] %s\n", fps_const_str[frameRateIDX]);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'R':
fpsRangeIdx += 1;
fpsRangeIdx %= rangeCnt;
params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fps_range_str[fpsRangeIdx]);
printf("fps_range_str[fpsRangeIdx] %s\n", fps_range_str[fpsRangeIdx]);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'x':
antibanding_mode++;
antibanding_mode %= numAntibanding;
printf("%d", numAntibanding);
params.set(params.KEY_ANTIBANDING, antiband[antibanding_mode]);
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'g':
focus_mode++;
focus_mode %= numfocus;
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());
break;
case 'y':
params.set(CameraParameters::KEY_METERING_AREAS, TEST_METERING_AREA);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'Y':
params.set(CameraParameters::KEY_METERING_AREAS, TEST_METERING_AREA_CENTER);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'N':
params.set(CameraParameters::KEY_METERING_AREAS, TEST_METERING_AREA_AVERAGE);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'f':
gettimeofday(&autofocus_start, 0);
if ( hardwareActive )
camera->autoFocus();
break;
case 'p':
{
int msgType = 0;
if((0 == strcmp(modevalues[capture_mode], "video-mode")) &&
(0 != strcmp(videosnapshotstr, "true"))) {
printf("Video Snapshot is not supported\n");
} else if ( hardwareActive ) {
if(isRawPixelFormat(pictureFormatArray[pictureFormat])) {
createBufferOutputSource();
if (bufferSourceOutputThread.get()) {
bufferSourceOutputThread->setBuffer(shotParams);
bufferSourceOutputThread->setStreamCapture(streamCapture, expBracketIdx);
}
} else {
msgType = CAMERA_MSG_COMPRESSED_IMAGE |
CAMERA_MSG_RAW_IMAGE;
#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
msgType |= CAMERA_MSG_RAW_BURST;
#endif
}
gettimeofday(&picture_start, 0);
camera->setParameters(params.flatten());
camera->takePictureWithParameters(msgType, shotParams.flatten());
}
break;
}
case 'S':
{
if (streamCapture) {
streamCapture = false;
setDefaultExpGainPreset(shotParams, expBracketIdx);
// Stop streaming
if (bufferSourceOutputThread.get()) {
bufferSourceOutputThread->setStreamCapture(streamCapture, expBracketIdx);
}
} else {
streamCapture = true;
setSingleExpGainPreset(shotParams, expBracketIdx, 0, 0);
// Queue more frames initially
shotParams.set(ShotParameters::KEY_BURST, BRACKETING_STREAM_BUFFERS);
}
break;
}
case 'P':
{
int msgType = CAMERA_MSG_COMPRESSED_IMAGE;
ShotParameters reprocParams;
gettimeofday(&picture_start, 0);
createBufferInputSource();
if (bufferSourceOutputThread.get() &&
bufferSourceOutputThread->hasBuffer())
{
bufferSourceOutputThread->setStreamCapture(false, expBracketIdx);
if (hardwareActive) camera->setParameters(params.flatten());
if (bufferSourceInput.get()) {
buffer_info_t info = bufferSourceOutputThread->popBuffer();
bufferSourceInput->setInput(info, pictureFormatArray[pictureFormat], reprocParams);
if (hardwareActive) camera->reprocess(msgType, reprocParams.flatten());
}
}
break;
}
case '&':
printf("Enabling Preview Callback");
dump_preview = 1;
if ( hardwareActive )
camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
break;
case '{':
valstr = params.get(KEY_S3D2D_PREVIEW_MODE);
if ( (NULL != valstr) && (0 == strcmp(valstr, "on")) )
{
params.set(KEY_S3D2D_PREVIEW_MODE, "off");
}
else
{
params.set(KEY_S3D2D_PREVIEW_MODE, "on");
}
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case 'a':
while (1) {
if ( menu_gps() < 0)
break;
};
break;
case 'q':
stopPreview();
deleteAllocatedMemory();
return -1;
case '/':
{
if (showfps)
{
property_set("debug.image.showfps", "0");
showfps = false;
}
else
{
property_set("debug.image.showfps", "1");
showfps = true;
}
break;
}
case '<':
if(strcmp(AutoExposureLockstr, "true") == 0) {
if(AutoExposureLocktoggle == false) {
trySetAutoExposureLock(true);
AutoExposureLocktoggle = true;
} else {
trySetAutoExposureLock(false);
AutoExposureLocktoggle = false;
printf("ExposureLock is not supported\n");
}
}
if ( hardwareActive )
camera->setParameters(params.flatten());
break;
case '>':
if(strcmp(AutoWhiteBalanceLockstr, "true") == 0) {
if(AutoWhiteBalanceLocktoggle == false) {
trySetAutoWhiteBalanceLock(true);
AutoWhiteBalanceLocktoggle = true;
} else {
trySetAutoWhiteBalanceLock(false);
AutoWhiteBalanceLocktoggle = false;
printf("ExposureLock is not supported\n");
}
}
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case ')':
enableMisalignmentCorrectionIdx++;
enableMisalignmentCorrectionIdx %= ARRAY_SIZE(misalignmentCorrection);
params.set(KEY_MECHANICAL_MISALIGNMENT_CORRECTION, misalignmentCorrection[enableMisalignmentCorrectionIdx]);
if ( hardwareActive ) {
camera->setParameters(params.flatten());
}
break;
case 'd':
while (1) {
if ( menu_algo() < 0)
break;
}
break;
default:
print_menu = 0;
break;
}
return 0;
}
void print_usage() {
printf(" USAGE: camera_test <options>\n");
printf(" <options> (case insensitive)\n");
printf("-----------\n");
printf(" -f -> Functional tests.\n");
printf(" -a -> API tests.\n");
printf(" -e [<script>] -> Error scenario tests. If no script file is provided\n");
printf(" the test is run in interactive mode.\n");
printf(" -s <script> -c <sensorID> -> Stress / regression tests.\n");
printf(" -l [<flags>] -> Enable different kinds of logging capture. Multiple flags\n");
printf(" should be combined into a string. If flags are not provided\n");
printf(" no logs are captured.\n");
printf(" <flags>\n");
printf(" ---------\n");
printf(" l -> logcat [default]\n");
printf(" s -> syslink [default]\n");
printf(" -o <path> -> Output directory to store the test results. Image and video\n");
printf(" files are stored in corresponding sub-directories.\n");
printf(" -p <platform> -> Target platform. Only for stress tests.\n");
printf(" <platform>\n");
printf(" ------------\n");
printf(" blaze or B -> BLAZE\n");
printf(" tablet1 or T1 -> Blaze TABLET-1\n");
printf(" tablet2 or T2 -> Blaze TABLET-2 [default]\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() {
printf("+++Restarting Camera After Error+++\n");
stopPreview();
if (recordingMode) {
stopRecording();
closeRecorder();
recordingMode = false;
}
sleep(3); //Wait a bit before restarting
restartCount++;
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 parseCommandLine(int argc, char *argv[], cmd_args_t *cmd_args) {
if (argc < 2) {
printf("Please enter at least 1 argument\n");
return -2;
}
// Set defaults
memset(cmd_args, 0, sizeof(*cmd_args));
cmd_args->logging = LOGGING_LOGCAT | LOGGING_SYSLINK;
cmd_args->platform_id = BLAZE_TABLET2;
for (int a = 1; a < argc; a++) {
const char * const arg = argv[a];
if (arg[0] != '-') {
printf("Error: Invalid argument \"%s\"\n", arg);
return -2;
}
switch (arg[1]) {
case 's':
cmd_args->test_type = TEST_TYPE_REGRESSION;
if (a < argc - 1) {
cmd_args->script_file_name = argv[++a];
} else {
printf("Error: No script is specified for stress / regression test.\n");
return -2;
}
break;
case 'f':
cmd_args->test_type = TEST_TYPE_FUNCTIONAL;
break;
case 'a':
cmd_args->test_type = TEST_TYPE_API;
break;
case 'e':
cmd_args->test_type = TEST_TYPE_ERROR;
if (a < argc - 1) {
cmd_args->script_file_name = argv[++a];
}
break;
case 'l':
cmd_args->logging = 0;
if (a < argc - 1 && argv[a + 1][0] != '-') {
const char *flags = argv[++a];
while (*flags) {
char flag = *flags++;
switch (flag) {
case 'l':
cmd_args->logging |= LOGGING_LOGCAT;
break;
case 's':
cmd_args->logging |= LOGGING_SYSLINK;
break;
default:
printf("Error: Unknown logging type \"%c\"\n", flag);
return -2;
}
}
}
break;
case 'p':
if (a < argc - 1) {
const char *platform = argv[++a];
if( strcasecmp(platform,"blaze") == 0 || strcasecmp(platform,"B") == 0 ){
cmd_args->platform_id = BLAZE;
}
else if( (strcasecmp(platform,"tablet1") == 0) || (strcasecmp(platform,"T1") == 0) ) {
cmd_args->platform_id = BLAZE_TABLET1;
}
else if( (strcasecmp(platform,"tablet2") == 0) || (strcasecmp(platform,"T2") == 0) ) {
cmd_args->platform_id = BLAZE_TABLET2;
}
else {
printf("Error: Unknown argument for platform ID.\n");
return -2;
}
} else {
printf("Error: No argument is specified for platform ID.\n");
return -2;
}
break;
case 'o':
if (a < argc - 1) {
cmd_args->output_path = argv[++a];
} else {
printf("Error: No output path is specified.\n");
return -2;
}
break;
case 'c':
if (a < argc -1) {
camera_index = atoi(argv[++a]);
} else {
printf("Error: No sensorID is specified.\n");
return -2;
}
break;
default:
printf("Error: Unknown option \"%s\"\n", argv[a]);
return -2;
}
}
return 0;
}
int setOutputDirPath(cmd_args_t *cmd_args, int restart_count) {
if ((cmd_args->output_path != NULL) &&
(strlen(cmd_args->output_path) < sizeof(output_dir_path))) {
strcpy(output_dir_path, cmd_args->output_path);
} else {
strcpy(output_dir_path, SDCARD_PATH);
if (cmd_args->script_file_name != NULL) {
const char *config = cmd_args->script_file_name;
char dir_name[40];
size_t count = 0;
char *p;
// remove just the '.txt' part of the config
while ((config[count] != '.') && ((count + 1) < sizeof(dir_name))) {
count++;
}
strncpy(dir_name, config, count);
dir_name[count] = NULL;
p = dir_name;
while (*p != '\0') {
if (*p == '/') {
printf("SDCARD_PATH is not added to the output directory.\n");
// Needed when camera_test script is executed using the OTC
strcpy(output_dir_path, "");
break;
}
}
strcat(output_dir_path, dir_name);
if (camera_index == 1) {
strcat(output_dir_path, SECONDARY_SENSOR);
}else if (camera_index == 2) {
strcat(output_dir_path, S3D_SENSOR);
}
}
}
if (restart_count && (strlen(output_dir_path) + 16) < sizeof(output_dir_path)) {
char count[16];
sprintf(count, "_%d", restart_count);
strcat(output_dir_path, count);
}
if (access(output_dir_path, F_OK) == -1) {
if (mkdir(output_dir_path, 0777) == -1) {
printf("\nError: Output directory \"%s\" was not created\n", output_dir_path);
return -1;
}
}
sprintf(videos_dir_path, "%s/videos", output_dir_path);
if (access(videos_dir_path, F_OK) == -1) {
if (mkdir(videos_dir_path, 0777) == -1) {
printf("\nError: Videos directory \"%s\" was not created\n", videos_dir_path);
return -1;
}
}
sprintf(images_dir_path, "%s/images", output_dir_path);
if (access(images_dir_path, F_OK) == -1) {
if (mkdir(images_dir_path, 0777) == -1) {
printf("\nError: Images directory \"%s\" was not created\n", images_dir_path);
return -1;
}
}
return 0;
}
int startTest() {
ProcessState::self()->startThreadPool();
if (openCamera() < 0) {
printf("Camera initialization failed\n");
return -1;
}
initDefaults();
return 0;
}
int runRegressionTest(cmd_args_t *cmd_args) {
char *cmd;
int pid;
platformID = cmd_args->platform_id;
int res = startTest();
if (res != 0) {
return res;
}
cmd = load_script(cmd_args->script_file_name);
if (cmd != NULL) {
start_logging(cmd_args->logging, pid);
stressTest = true;
while (1) {
if (execute_functional_script(cmd) == 0) {
break;
}
printf("CameraTest Restarting Camera...\n");
free(cmd);
cmd = NULL;
if ( (restartCamera() != 0) || ((cmd = load_script(cmd_args->script_file_name)) == NULL) ) {
printf("ERROR::CameraTest Restarting Camera...\n");
res = -1;
break;
}
res = setOutputDirPath(cmd_args, restartCount);
if (res != 0) {
break;
}
}
free(cmd);
stop_logging(cmd_args->logging, pid);
}
return 0;
}
int runFunctionalTest() {
int res = startTest();
if (res != 0) {
return res;
}
print_menu = 1;
while (1) {
if (functional_menu() < 0) {
break;
}
}
return 0;
}
int runApiTest() {
printf("API level test cases coming soon ... \n");
return 0;
}
int runErrorTest(cmd_args_t *cmd_args) {
int res = startTest();
if (res != 0) {
return res;
}
if (cmd_args->script_file_name != NULL) {
char *cmd;
int pid;
cmd = load_script(cmd_args->script_file_name);
if (cmd != NULL) {
start_logging(cmd_args->logging, pid);
execute_error_script(cmd);
free(cmd);
stop_logging(cmd_args->logging, pid);
}
} else {
print_menu = 1;
while (1) {
if (error_scenario() < 0) {
break;
}
}
}
return 0;
}
int main(int argc, char *argv[]) {
sp<ProcessState> proc(ProcessState::self());
unsigned long long st, end, delay;
timeval current_time;
cmd_args_t cmd_args;
int res;
res = parseCommandLine(argc, argv, &cmd_args);
if (res != 0) {
print_usage();
return res;
}
res = setOutputDirPath(&cmd_args, 0);
if (res != 0) {
return res;
}
gettimeofday(&current_time, 0);
st = current_time.tv_sec * 1000000 + current_time.tv_usec;
system("echo camerahal_test > /sys/power/wake_lock");
switch (cmd_args.test_type) {
case TEST_TYPE_REGRESSION:
res = runRegressionTest(&cmd_args);
break;
case TEST_TYPE_FUNCTIONAL:
res = runFunctionalTest();
break;
case TEST_TYPE_API:
res = runApiTest();
break;
case TEST_TYPE_ERROR:
res = runErrorTest(&cmd_args);
break;
}
system("echo camerahal_test > /sys/power/wake_unlock");
gettimeofday(&current_time, 0);
end = current_time.tv_sec * 1000000 + current_time.tv_usec;
delay = end - st;
printf("Application closed after: %llu ms\n", delay);
return res;
}