#define LOG_TAG “usb-Camera”
#define LOG_NDEBUG 0
#include <hardware/camera3.h>
#include <camera/CameraMetadata.h>
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/gralloc.h>
#include <ui/Rect.h>
#include <ui/GraphicBufferMapper.h>
#include <ui/Fence.h>
#include <assert.h>
#include “DbgUtils.h”
#include “Camera.h”
#include “ImageConverter.h”
#include “libyuv.h”
//#include <sprd_exvideo.h>
#include <cutils/properties.h>
#include
#include
namespace android {
/**
* \class Camera
*
* Android’s Camera 3 device implementation.
*
* Declaration of camera capabilities, frame request handling, etc. This code
* is what Android framework talks to.
*/
-
Camera::Camera()
- mStaticCharacteristics(NULL)
, mCallbackOps(NULL)
, mJpegBufferSize(0) {
ALOGI(“Camera() start”);
DBGUTILS_AUTOLOGCALL(__func__);
for(size_t i = 0; i < NELEM(mDefaultRequestSettings); i++) {
mDefaultRequestSettings[i] = NULL;
}
common.tag = HARDWARE_DEVICE_TAG;
common.version = CAMERA_DEVICE_API_VERSION_3_2;//CAMERA_DEVICE_API_VERSION_3_0;
common.module = &HAL_MODULE_INFO_SYM.common;
common.close = Camera::sClose;
ops = &sOps;
priv = NULL;
mValid = true;
mFrameBuffer = new uint8_t[640*480*4];
rszbuffer = new uint8_t[640*480*4];
mDev = new V4l2Device();
if(!mDev) {
mValid = false;
}
}
Camera::~Camera() {
DBGUTILS_AUTOLOGCALL(__func__);
gWorkers.stop();
mDev->disconnect();
delete[] mFrameBuffer;
delete[] rszbuffer;
delete mDev;
}
status_t Camera::cameraInfo(struct camera_info *info) {
DBGUTILS_AUTOLOGCALL(__func__);
ALOGI(“Camera::cameraInfo entry”);
ALOGE(“Camera::cameraInfo entry”);
Mutex::Autolock lock(mMutex);
info->facing = CAMERA_FACING_FRONT;//BACK;//FRONT;
info->orientation = 0;
info->device_version = CAMERA_DEVICE_API_VERSION_3_2;//CAMERA_DEVICE_API_VERSION_3_0;//CAMERA_DEVICE_API_VERSION_3_4;
info->static_camera_characteristics = staticCharacteristics();
return NO_ERROR;
}
int Camera::openDevice(hw_device_t **device) {
ALOGI("%s",__FUNCTION__);
DBGUTILS_AUTOLOGCALL(__func__);
Mutex::Autolock lock(mMutex);
char enableTimesTamp[PROPERTY_VALUE_MAX];
char enableAVI[PROPERTY_VALUE_MAX];
mDev->connect();
*device = &common;
gWorkers.start();
return NO_ERROR;
}
int Camera::closeDevice() {
ALOGI("%s",__FUNCTION__);
DBGUTILS_AUTOLOGCALL(__func__);
Mutex::Autolock lock(mMutex);
gWorkers.stop();
mDev->disconnect();
return NO_ERROR;
}
camera_metadata_t *Camera::staticCharacteristics() {
if(mStaticCharacteristics)
return mStaticCharacteristics;
CameraMetadata cm;
auto &resolutions = mDev->availableResolutions();
auto &previewResolutions = resolutions;
auto sensorRes = mDev->sensorResolution();
/***********************************\
|* START OF CAMERA CHARACTERISTICS *|
\***********************************/
/* fake, but valid aspect ratio */
const float sensorInfoPhysicalSize[] = {
5.0f,
5.0f * (float)sensorRes.height / (float)sensorRes.width
};
cm.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, sensorInfoPhysicalSize, NELEM(sensorInfoPhysicalSize));
/* fake */
static const float lensInfoAvailableFocalLengths[] = {3.30f};
cm.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, lensInfoAvailableFocalLengths, NELEM(lensInfoAvailableFocalLengths));
static const uint8_t lensFacing = ANDROID_LENS_FACING_FRONT;
cm.update(ANDROID_LENS_FACING, &lensFacing, 1);
const int32_t sensorInfoPixelArraySize[] = {
(int32_t)sensorRes.width,
(int32_t)sensorRes.height
};
cm.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, sensorInfoPixelArraySize, NELEM(sensorInfoPixelArraySize));
const int32_t sensorInfoActiveArraySize[] = {
0, 0,
(int32_t)sensorRes.width, (int32_t)sensorRes.height
};
cm.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, sensorInfoActiveArraySize, NELEM(sensorInfoActiveArraySize));
static const int32_t scalerAvailableFormats[] = {
HAL_PIXEL_FORMAT_RGBA_8888, //预览流
HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,//预览流
/* Non-preview one, must be last - see following code */
HAL_PIXEL_FORMAT_BLOB//拍照流
};
cm.update(ANDROID_SCALER_AVAILABLE_FORMATS, scalerAvailableFormats, NELEM(scalerAvailableFormats));
/* Only for HAL_PIXEL_FORMAT_BLOB */
const size_t mainStreamConfigsCount = resolutions.size();
/* For all other supported pixel formats */
const size_t previewStreamConfigsCount = previewResolutions.size() * (NELEM(scalerAvailableFormats) - 1);
const size_t streamConfigsCount = mainStreamConfigsCount + previewStreamConfigsCount;
int32_t scalerAvailableStreamConfigurations[streamConfigsCount * 4];
int64_t scalerAvailableMinFrameDurations[streamConfigsCount * 4];
int32_t scalerAvailableProcessedSizes[previewResolutions.size() * 2];
int64_t scalerAvailableProcessedMinDurations[previewResolutions.size()];
int32_t scalerAvailableJpegSizes[resolutions.size() * 2];
int64_t scalerAvailableJpegMinDurations[resolutions.size()];
size_t i4 = 0;
size_t i2 = 0;
size_t i1 = 0;
/* Main stream configurations */
for(size_t resId = 0; resId < resolutions.size(); ++resId) {
scalerAvailableStreamConfigurations[i4 + 0] = HAL_PIXEL_FORMAT_BLOB;
scalerAvailableStreamConfigurations[i4 + 1] = (int32_t)resolutions[resId].width;
scalerAvailableStreamConfigurations[i4 + 2] = (int32_t)resolutions[resId].height;
scalerAvailableStreamConfigurations[i4 + 3] = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
scalerAvailableMinFrameDurations[i4 + 0] = HAL_PIXEL_FORMAT_BLOB;
scalerAvailableMinFrameDurations[i4 + 1] = (int32_t)resolutions[resId].width;
scalerAvailableMinFrameDurations[i4 + 2] = (int32_t)resolutions[resId].height;
scalerAvailableMinFrameDurations[i4 + 3] = 1000000000 / 30; /* TODO: read from the device */
scalerAvailableJpegSizes[i2 + 0] = (int32_t)resolutions[resId].width;
scalerAvailableJpegSizes[i2 + 1] = (int32_t)resolutions[resId].height;
scalerAvailableJpegMinDurations[i1] = 1000000000 / 30; /* TODO: read from the device */
i4 += 4;
i2 += 2;
i1 += 1;
}
i2 = 0;
i1 = 0;
/* Preview stream configurations */
for(size_t resId = 0; resId < previewResolutions.size(); ++resId) {
for(size_t fmtId = 0; fmtId < NELEM(scalerAvailableFormats) - 1; ++fmtId) {
scalerAvailableStreamConfigurations[i4 + 0] = scalerAvailableFormats[fmtId];
scalerAvailableStreamConfigurations[i4 + 1] = (int32_t)previewResolutions[resId].width;
scalerAvailableStreamConfigurations[i4 + 2] = (int32_t)previewResolutions[resId].height;
scalerAvailableStreamConfigurations[i4 + 3] = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
scalerAvailableMinFrameDurations[i4 + 0] = scalerAvailableFormats[fmtId];
scalerAvailableMinFrameDurations[i4 + 1] = (int32_t)previewResolutions[resId].width;
scalerAvailableMinFrameDurations[i4 + 2] = (int32_t)previewResolutions[resId].height;
scalerAvailableMinFrameDurations[i4 + 3] = 1000000000 / 10; /* TODO: read from the device */
i4 += 4;