diff options
Diffstat (limited to 'test/CameraHal/camera_test.h')
-rw-r--r-- | test/CameraHal/camera_test.h | 429 |
1 files changed, 376 insertions, 53 deletions
diff --git a/test/CameraHal/camera_test.h b/test/CameraHal/camera_test.h index df44833..f23ad3d 100644 --- a/test/CameraHal/camera_test.h +++ b/test/CameraHal/camera_test.h @@ -1,15 +1,37 @@ #ifndef CAMERA_TEST_H #define CAMERA_TEST_H -#define PRINTOVER(arg...) ALOGD(#arg) -#define LOG_FUNCTION_NAME ALOGD("%d: %s() ENTER", __LINE__, __FUNCTION__); -#define LOG_FUNCTION_NAME_EXIT ALOGD("%d: %s() EXIT", __LINE__, __FUNCTION__); +#ifdef ANDROID_API_JB_OR_LATER +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> +#else +#include <surfaceflinger/Surface.h> +#include <surfaceflinger/ISurface.h> +#include <surfaceflinger/ISurfaceComposer.h> +#include <surfaceflinger/ISurfaceComposerClient.h> +#include <surfaceflinger/SurfaceComposerClient.h> +#endif + +#ifdef ANDROID_API_JB_OR_LATER +# define CAMHAL_LOGV ALOGV +# define CAMHAL_LOGE ALOGE +# define PRINTOVER(arg...) ALOGD(#arg) +# define LOG_FUNCTION_NAME ALOGD("%d: %s() ENTER", __LINE__, __FUNCTION__); +# define LOG_FUNCTION_NAME_EXIT ALOGD("%d: %s() EXIT", __LINE__, __FUNCTION__); +#else +# define CAMHAL_LOGV LOGV +# define CAMHAL_LOGE LOGE +# define PRINTOVER(arg...) LOGD(#arg) +# define LOG_FUNCTION_NAME LOGD("%d: %s() ENTER", __LINE__, __FUNCTION__); +# define LOG_FUNCTION_NAME_EXIT LOGD("%d: %s() EXIT", __LINE__, __FUNCTION__); +#endif + #define KEY_GBCE "gbce" #define KEY_GLBCE "glbce" #define KEY_CAMERA "camera-index" #define KEY_SATURATION "saturation" #define KEY_BRIGHTNESS "brightness" -#define KEY_BURST "burst-capture" +#define KEY_TI_BURST "burst-capture" #define KEY_EXPOSURE "exposure" #define KEY_CONTRAST "contrast" #define KEY_SHARPNESS "sharpness" @@ -19,28 +41,50 @@ #define KEY_VNF "vnf" #define KEY_VSTAB "vstab" #define KEY_COMPENSATION "exposure-compensation" +#define KEY_SENSOR_ORIENTATION "sensor-orientation" #define KEY_IPP "ipp" #define KEY_BUFF_STARV "buff-starvation" #define KEY_METERING_MODE "meter-mode" -#define KEY_AUTOCONVERGENCE "auto-convergence" -#define KEY_MANUALCONVERGENCE_VALUES "manual-convergence-values" -#define AUTOCONVERGENCE_MODE_MANUAL "mode-manual" +#define KEY_AUTOCONVERGENCE "auto-convergence-mode" +#define KEY_MANUAL_CONVERGENCE "manual-convergence" #define KEY_EXP_BRACKETING_RANGE "exp-bracketing-range" +#define KEY_EXP_GAIN_BRACKETING_RANGE "exp-gain-bracketing-range" #define KEY_TEMP_BRACKETING "temporal-bracketing" #define KEY_TEMP_BRACKETING_POS "temporal-bracketing-range-positive" #define KEY_TEMP_BRACKETING_NEG "temporal-bracketing-range-negative" #define KEY_MEASUREMENT "measurement" #define KEY_S3D2D_PREVIEW_MODE "s3d2d-preview" -#define KEY_STEREO_CAMERA "s3d-supported" +#define KEY_S3D_PRV_FRAME_LAYOUT "s3d-prv-frame-layout" +#define KEY_S3D_CAP_FRAME_LAYOUT "s3d-cap-frame-layout" #define KEY_EXIF_MODEL "exif-model" #define KEY_EXIF_MAKE "exif-make" +#define KEY_AF_TIMEOUT "af-timeout" #define KEY_AUTO_EXPOSURE_LOCK "auto-exposure-lock" #define KEY_AUTO_WHITEBALANCE_LOCK "auto-whitebalance-lock" +#define KEY_MECHANICAL_MISALIGNMENT_CORRECTION "mechanical-misalignment-correction" + +//TI extensions for enable/disable algos +#define KEY_ALGO_FIXED_GAMMA "ti-algo-fixed-gamma" +#define KEY_ALGO_NSF1 "ti-algo-nsf1" +#define KEY_ALGO_NSF2 "ti-algo-nsf2" +#define KEY_ALGO_SHARPENING "ti-algo-sharpening" +#define KEY_ALGO_THREELINCOLORMAP "ti-algo-threelinecolormap" +#define KEY_ALGO_GIC "ti-algo-gic" + +#define KEY_TAP_OUT_SURFACES "tap-out" +#define KEY_TAP_IN_SURFACE "tap-in" + +#define BRACKETING_IDX_DEFAULT 0 +#define BRACKETING_IDX_STREAM 1 +#define BRACKETING_STREAM_BUFFERS 9 + #define SDCARD_PATH "/sdcard/" +#define SECONDARY_SENSOR "_SEC" +#define S3D_SENSOR "_S3D" #define MAX_BURST 15 #define BURST_INC 5 @@ -50,19 +94,64 @@ #define MEMORY_DUMP "procrank -u" #define KEY_METERING_MODE "meter-mode" -#define TEST_FOCUS_AREA "(0,0,1000,1000,300),(-1000,-1000,1000,1000,300),(0,0,0,0,0)" +#define TEST_FOCUS_AREA "(-1000,500,-500,1000,1000),(500,500,1000,1000,1)" +#define TEST_METERING_AREA "(-1000,500,-500,1000,1000),(500,500,1000,1000,1)" +#define TEST_METERING_AREA_CENTER "(-250,-250,250,250,1000)" +#define TEST_METERING_AREA_AVERAGE "(-1000,-1000,1000,1000,1000)" #define COMPENSATION_OFFSET 20 #define DELIMITER "|" -#define MAX_PREVIEW_SURFACE_WIDTH 800 -#define MAX_PREVIEW_SURFACE_HEIGHT 480 - #define MODEL "camera_test" #define MAKE "camera_test" +#define BLAZE 0 +#define BLAZE_TABLET1 1 +#define BLAZE_TABLET2 2 + +#define MAX_LINES 80 +#define MAX_SYMBOLS 65 + #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +typedef enum test_type { + TEST_TYPE_REGRESSION, + TEST_TYPE_FUNCTIONAL, + TEST_TYPE_API, + TEST_TYPE_ERROR, +} test_type_t; + +typedef enum param_ExpBracketParamType_t { + PARAM_EXP_BRACKET_PARAM_NONE, + PARAM_EXP_BRACKET_PARAM_COMP, + PARAM_EXP_BRACKET_PARAM_PAIR, +} param_ExpBracketParamType; + +typedef enum param_ExpBracketValueType_t { + PARAM_EXP_BRACKET_VALUE_NONE, + PARAM_EXP_BRACKET_VALUE_ABS, + PARAM_EXP_BRACKET_VALUE_REL, +} param_ExpBracketValueType; + +typedef enum param_ExpBracketApplyType_t { + PARAM_EXP_BRACKET_APPLY_NONE, + PARAM_EXP_BRACKET_APPLY_ADJUST, + PARAM_EXP_BRACKET_APPLY_FORCED, +} param_ExpBracketApplyType; + +enum logging { + LOGGING_LOGCAT = 0x01, + LOGGING_SYSLINK = 0x02 +}; + +typedef struct cmd_args { + test_type_t test_type; + const char *script_file_name; + const char *output_path; + int platform_id; + int logging; +} cmd_args_t; + namespace android { class CameraHandler: public CameraListener { public: @@ -78,24 +167,6 @@ namespace android { using namespace android; -char * get_cycle_cmd(const char *aSrc); -int execute_functional_script(char *script); -status_t dump_mem_status(); -int openCamera(); -int closeCamera(); -void initDefaults(); -int startPreview(); -void stopPreview(); -int startRecording(); -int stopRecording(); -int closeRecorder(); -int openRecorder(); -int configureRecorder(); -void printSupportedParams(); -char *load_script(char *config); -int start_logging(char *config, int &pid); -int stop_logging(int &pid); -int execute_error_script(char *script); typedef struct pixel_format_t { int32_t pixelFormatDesc; @@ -107,20 +178,15 @@ typedef struct output_format_t { const char *desc; } outformat; -typedef struct preview_size_t { - int width, height; - const char *desc; -} preview_size; - typedef struct Vcapture_size_t { int width, height; const char *desc; } Vcapture_size; -typedef struct capture_Size_t { +typedef struct param_Array_t { int width, height; - const char *name; -} capture_Size; + char name[60]; +} param_Array; typedef struct video_Codecs_t { video_encoder type; @@ -143,20 +209,277 @@ typedef struct zoom_t { } Zoom; typedef struct fps_ranges_t { - const char *range; - const char *rangeDescription; -} fps_ranges; - -typedef struct fpsConst_Ranges_t { - const char *range; - const char *rangeDescription; - int constFramerate; -} fpsConst_Ranges; - -typedef struct fpsConst_RangesSec_t { - const char *range; - const char *rangeDescription; - int constFramerate; -} fpsConst_RangesSec; + int rangeMin; + int rangeMax; +} fps_Array; + +typedef struct buffer_info { + int size; + int width; + int height; + int format; + size_t offset; + Rect crop; + sp<GraphicBuffer> buf; +} buffer_info_t; + +typedef struct param_NamedExpBracketList_t { + const char *desc; + param_ExpBracketParamType_t param_type; + param_ExpBracketValueType_t value_type; + param_ExpBracketApplyType_t apply_type; + const char *value; +} param_NamedExpBracketList; + + +char * get_cycle_cmd(const char *aSrc); +void trim_script_cmd(char *cmd); +int execute_functional_script(char *script); +status_t dump_mem_status(); +int openCamera(); +int closeCamera(); +void createBufferOutputSource(); +void createBufferInputSource(); +void requestBufferSourceReset(); +void initDefaults(); +void setDefaultExpGainPreset(ShotParameters ¶ms, int idx); +void setSingleExpGainPreset(ShotParameters ¶ms, int idx, int exp, int gain); +void setExpGainPreset(ShotParameters ¶ms, const char *input, bool force, param_ExpBracketParamType_t type, bool flush); +void calcNextSingleExpGainPreset(int idx, int &exp, int &gain); +void updateShotConfigFlushParam(); +int startPreview(); +void stopPreview(); +int startRecording(); +int stopRecording(); +int closeRecorder(); +int openRecorder(); +int configureRecorder(); +void printSupportedParams(); +char *load_script(const char *config); +int start_logging(int flags, int &pid); +int stop_logging(int flags, int &pid); +int execute_error_script(char *script); +int getParametersFromCapabilities(); +void getSizeParametersFromCapabilities(); +int getDefaultParameter(const char* val, int numOptions, char **array); +int getDefaultParameterResol(const char* val, int numOptions, param_Array **array); +int getSupportedParameters(char* parameters, int* optionsCount, char ***elem); +int getSupportedParametersCaptureSize(char* parameters, int *optionsCount, param_Array array[], int arraySize); +int getSupportedParametersVideoCaptureSize(char* parameters, int *optionsCount, param_Array array[], int arraySize); +int getSupportedParametersPreviewSize(char* parameters, int *optionsCount, param_Array array[], int arraySize); +int getSupportedParametersThumbnailSize(char* parameters, int *optionsCount, param_Array array[], int arraySize); +int getSupportedParametersNames(int width, int height, param_Array array[], int arraySize); +int checkSupportedParamScript(char **array, int size, char *param); +int checkSupportedParamScriptLayout(char **array, int size, char *param,int *index); +int checkSupportedParamScriptResol(param_Array **array, int size, char *param, int *num); +int checkSupportedParamScriptResol(param_Array **array, int size, int w, int h, int *num); +int getSupportedParametersfps(char* parameters, int *optionsCount); +int checkSupportedParamScriptfpsConst(int *array, int size, char *param, int *num); +int checkSupportedParamScriptfpsRange(char **array, int size, char *param, int *num); +int trySetVideoStabilization(bool toggle); +int trySetVideoNoiseFilter(bool toggle); +int trySetAutoExposureLock(bool toggle); +int trySetAutoWhiteBalanceLock(bool toggle); +bool isRawPixelFormat (const char *format); +int deleteAllocatedMemory(); +void initDefaultsSec(); + +const char KEY_S3D_PRV_FRAME_LAYOUT_VALUES[] = "s3d-prv-frame-layout-values"; +const char KEY_S3D_CAP_FRAME_LAYOUT_VALUES[] = "s3d-cap-frame-layout-values"; + +const char KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES[] = "supported-picture-topbottom-size-values"; +const char KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES[] = "supported-preview-topbottom-size-values"; +const char KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES[] = "supported-picture-sidebyside-size-values"; +const char KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES[] = "supported-preview-sidebyside-size-values"; +const char KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES[] = "supported-picture-subsampled-size-values"; +const char KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES[] = "supported-preview-subsampled-size-values"; + +const char KEY_AUTOCONVERGENCE_MODE[] = "auto-convergence-mode"; +const char KEY_AUTOCONVERGENCE_MODE_VALUES[] = "auto-convergence-mode-values"; + +const char KEY_MANUAL_EXPOSURE[] = "manual-exposure"; +const char KEY_MANUAL_GAIN_ISO[] = "manual-gain-iso"; +const char KEY_MANUAL_EXPOSURE_RIGHT[] = "manual-exposure-right"; +const char KEY_MANUAL_GAIN_ISO_RIGHT[] = "manual-gain-iso-right"; + +const char KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN[] = "supported-manual-convergence-min"; +const char KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX[] = "supported-manual-convergence-max"; +const char KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP[] = "supported-manual-convergence-step"; + +const char KEY_SUPPORTED_MANUAL_EXPOSURE_MIN[] = "supported-manual-exposure-min"; +const char KEY_SUPPORTED_MANUAL_EXPOSURE_MAX[] = "supported-manual-exposure-max"; +const char KEY_SUPPORTED_MANUAL_EXPOSURE_STEP[] = "supported-manual-exposure-step"; + +const char KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN[] = "supported-manual-gain-iso-min"; +const char KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX[] = "supported-manual-gain-iso-max"; +const char KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP[] = "supported-manual-gain-iso-step"; +class BufferSourceThread : public Thread { +public: + class Defer : public Thread { + private: + struct DeferContainer { + sp<GraphicBuffer> graphicBuffer; + uint8_t *mappedBuffer; + unsigned int count; + unsigned int slot; + Rect crop; + }; + public: + Defer(BufferSourceThread* bst) : + Thread(false), mBST(bst), mExiting(false) { } + virtual ~Defer() { + Mutex::Autolock lock(mFrameQueueMutex); + mExiting = true; + while (!mDeferQueue.isEmpty()) { + DeferContainer defer = mDeferQueue.itemAt(0); + defer.graphicBuffer->unlock(); + mDeferQueue.removeAt(0); + } + mFrameQueueCondition.signal(); + } + + virtual void requestExit() { + Thread::requestExit(); + + mExiting = true; + mFrameQueueCondition.signal(); + } + + virtual bool threadLoop() { + Mutex::Autolock lock(mFrameQueueMutex); + while (mDeferQueue.isEmpty() && !mExiting) { + mFrameQueueCondition.wait(mFrameQueueMutex); + } + + if (!mExiting) { + DeferContainer defer = mDeferQueue.itemAt(0); + printf ("=== handling buffer %d\n", defer.count); + mBST->handleBuffer(defer.graphicBuffer, defer.mappedBuffer, + defer.count, defer.crop); + defer.graphicBuffer->unlock(); + mDeferQueue.removeAt(0); + mBST->onHandled(defer.graphicBuffer, defer.slot); + return true; + } + return false; + } + void add(sp<GraphicBuffer> &gbuf, const Rect &crop, + unsigned int count, unsigned int slot = 0) { + Mutex::Autolock lock(mFrameQueueMutex); + DeferContainer defer; + defer.graphicBuffer = gbuf; + defer.count = count; + defer.slot = slot; + defer.crop = crop; + gbuf->lock(GRALLOC_USAGE_SW_READ_RARELY, (void**) &defer.mappedBuffer); + mDeferQueue.add(defer); + mFrameQueueCondition.signal(); + } + private: + Vector<DeferContainer> mDeferQueue; + Mutex mFrameQueueMutex; + Condition mFrameQueueCondition; + BufferSourceThread* mBST; + bool mExiting; + }; +public: + BufferSourceThread(sp<Camera> camera) : + Thread(false), mCamera(camera), + mDestroying(false), mRestartCapture(false), + mExpBracketIdx(BRACKETING_IDX_DEFAULT), mExp(0), mGain(0), mCounter(0), + kReturnedBuffersMaxCapacity(6) { + + mDeferThread = new Defer(this); + mDeferThread->run(); + } + + virtual ~BufferSourceThread() { + mDestroying = true; + + for (unsigned int i = 0; i < mReturnedBuffers.size(); i++) { + buffer_info_t info = mReturnedBuffers.itemAt(i); + mReturnedBuffers.removeAt(i); + } + mDeferThread->requestExit(); + mDeferThread.clear(); + } + + virtual bool threadLoop() { return false;} + virtual void requestExit() {}; + virtual void setBuffer(android::ShotParameters ¶ms) {}; + virtual void onHandled(sp<GraphicBuffer> &g, unsigned int slot) {}; + + bool setStreamCapture(bool restart, int expBracketIdx) { + Mutex::Autolock lock(mToggleStateMutex); + mExpBracketIdx = expBracketIdx; + mRestartCapture = restart; + return mRestartCapture; + } + + buffer_info_t popBuffer() { + buffer_info_t buffer; + Mutex::Autolock lock(mReturnedBuffersMutex); + if (!mReturnedBuffers.isEmpty()) { + buffer = mReturnedBuffers.itemAt(0); + mReturnedBuffers.removeAt(0); + } + return buffer; + } + + bool hasBuffer() { + Mutex::Autolock lock(mReturnedBuffersMutex); + return !mReturnedBuffers.isEmpty(); + } + + void handleBuffer(sp<GraphicBuffer> &, uint8_t *, unsigned int, const Rect &); + Rect getCrop(sp<GraphicBuffer> &buffer, const float *mtx); + void showMetadata(sp<IMemory> data); +protected: + void restartCapture() { + Mutex::Autolock lock(mToggleStateMutex); + if (mRestartCapture) { + ShotParameters shotParams; + calcNextSingleExpGainPreset(mExpBracketIdx, mExp, mGain), + setSingleExpGainPreset(shotParams, mExpBracketIdx, mExp, mGain); + shotParams.set(ShotParameters::KEY_BURST, 1); + mCamera->takePictureWithParameters(0, shotParams.flatten()); + } + } +protected: + sp<Camera> mCamera; + bool mDestroying; + bool mRestartCapture; + int mExpBracketIdx; + int mExp; + int mGain; + sp<Defer> mDeferThread; + unsigned int mCounter; +private: + Vector<buffer_info_t> mReturnedBuffers; + Mutex mReturnedBuffersMutex; + Mutex mToggleStateMutex; + const unsigned int kReturnedBuffersMaxCapacity; +}; + + +class BufferSourceInput : public RefBase { +public: + BufferSourceInput(sp<Camera> camera) : mCamera(camera) { + mTapOut = new BufferSourceThread(camera); + mTapOut->run(); + } + + virtual ~BufferSourceInput() { + mTapOut->requestExit(); + mTapOut.clear(); + } + + virtual void setInput(buffer_info_t, const char *format, ShotParameters ¶ms); + +protected: + sp<BufferSourceThread> mTapOut; + sp<ANativeWindow> mWindowTapIn; + sp<Camera> mCamera; +}; #endif |