493 lines
17 KiB
C++
493 lines
17 KiB
C++
#ifndef CAMERA_TEST_H
|
|
#define CAMERA_TEST_H
|
|
|
|
#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_TI_BURST "burst-capture"
|
|
#define KEY_EXPOSURE "exposure"
|
|
#define KEY_CONTRAST "contrast"
|
|
#define KEY_SHARPNESS "sharpness"
|
|
#define KEY_ISO "iso"
|
|
#define KEY_CAF "caf"
|
|
#define KEY_MODE "mode"
|
|
#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-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_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_EXTERNAL_GAMMA "ti-algo-external-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 KEY_GAMMA_TABLE "gamma-table"
|
|
|
|
#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
|
|
#define TEMP_BRACKETING_MAX_RANGE 4
|
|
|
|
#define MEDIASERVER_DUMP "procmem -w $(ps | grep mediaserver | grep -Eo '[0-9]+' | head -n 1) | grep \"\\(Name\\|libcamera.so\\|libOMX\\|libomxcameraadapter.so\\|librcm.so\\|libnotify.so\\|libipcutils.so\\|libipc.so\\|libsysmgr.so\\|TOTAL\\)\""
|
|
#define MEMORY_DUMP "procrank -u"
|
|
#define KEY_METERING_MODE "meter-mode"
|
|
|
|
#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 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:
|
|
virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2);
|
|
virtual void postData(int32_t msgType,
|
|
const sp<IMemory>& dataPtr,
|
|
camera_frame_metadata_t *metadata);
|
|
|
|
virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
|
|
};
|
|
|
|
};
|
|
|
|
using namespace android;
|
|
|
|
|
|
typedef struct pixel_format_t {
|
|
int32_t pixelFormatDesc;
|
|
const char *pixformat;
|
|
}pixel_format;
|
|
|
|
typedef struct output_format_t {
|
|
output_format type;
|
|
const char *desc;
|
|
} outformat;
|
|
|
|
typedef struct Vcapture_size_t {
|
|
int width, height;
|
|
const char *desc;
|
|
} Vcapture_size;
|
|
|
|
typedef struct param_Array_t {
|
|
int width, height;
|
|
char name[60];
|
|
} param_Array;
|
|
|
|
typedef struct video_Codecs_t {
|
|
video_encoder type;
|
|
const char *desc;
|
|
} video_Codecs;
|
|
|
|
typedef struct audio_Codecs_t {
|
|
audio_encoder type;
|
|
const char *desc;
|
|
} audio_Codecs;
|
|
|
|
typedef struct V_bitRate_t {
|
|
uint32_t bit_rate;
|
|
const char *desc;
|
|
} V_bitRate;
|
|
|
|
typedef struct zoom_t {
|
|
int idx;
|
|
const char *zoom_description;
|
|
} Zoom;
|
|
|
|
typedef struct fps_ranges_t {
|
|
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;
|
|
|
|
typedef struct param_GammaTblList_t {
|
|
const char *desc;
|
|
const char *r;
|
|
const char *g;
|
|
const char *b;
|
|
} param_GammaTblList;
|
|
|
|
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
|