/*
|
* Copyright (c) 2021 by Allwinnertech Co., Ltd.
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
#ifndef V4L2_CAMERA_HAL_CAMERA_STREAM_H_
|
#define V4L2_CAMERA_HAL_CAMERA_STREAM_H_
|
|
#include "common.h"
|
#ifdef LOG_NDEBUG
|
#undef LOG_NDEBUG
|
#endif
|
|
#if DBG_CAMERA_STREAM
|
#undef NDEBUG
|
#define LOG_NDEBUG 0
|
#else
|
#define LOG_NDEBUG 1
|
#endif
|
|
#include <utils/StrongPointer.h>
|
#include <utils/Thread.h>
|
|
#include <array>
|
#include <condition_variable>
|
#include <map>
|
#include <memory>
|
#include <queue>
|
#include <string>
|
|
#include "CameraMetadata.h"
|
#include "camera.h"
|
#include "metadata/metadata.h"
|
#include "type_camera.h"
|
|
namespace v4l2_camera_hal {
|
class V4L2Camera;
|
class V4L2Stream;
|
class StreamManager;
|
|
typedef enum {
|
CAM_FLASH_MODE_OFF,
|
CAM_FLASH_MODE_AUTO,
|
CAM_FLASH_MODE_ON,
|
CAM_FLASH_MODE_TORCH,
|
CAM_FLASH_MODE_SINGLE,
|
CAM_FLASH_MODE_VIDEO_OFF,
|
CAM_FLASH_MODE_MAX
|
} cam_flash_mode_t;
|
|
typedef struct {
|
int32_t x_min;
|
int32_t y_min;
|
int32_t x_max;
|
int32_t y_max;
|
} cam_rect_t;
|
|
typedef struct {
|
cam_rect_t rect;
|
int32_t weight;
|
} cam_area_t;
|
|
typedef struct {
|
int32_t left;
|
int32_t top;
|
int32_t width;
|
int32_t height;
|
} cam_crop_rect_t;
|
|
typedef enum {
|
CAM_FOCUS_MODE_OFF,
|
CAM_FOCUS_MODE_AUTO,
|
CAM_FOCUS_MODE_MACRO,
|
CAM_FOCUS_MODE_CONTINUOUS_VIDEO,
|
CAM_FOCUS_MODE_CONTINUOUS_PICTURE,
|
CAM_FOCUS_MODE_EDOF,
|
CAM_FOCUS_MODE_START,
|
CAM_FOCUS_MODE_STOP,
|
CAM_FOCUS_MODE_START_UP,
|
CAM_FOCUS_MODE_MAX
|
} cam_focus_mode_t;
|
|
typedef enum {
|
CAM_FOCUS_TRIGGER_IDLE,
|
CAM_FOCUS_TRIGGER_START,
|
CAM_FOCUS_TRIGGER_CANCLE,
|
CAM_FOCUS_TRIGGER_MAX
|
} cam_focus_trigger_t;
|
|
class CameraStream {
|
friend class StreamManager;
|
friend class V4L2Stream;
|
public:
|
static CameraStream* NewCameraStream(std::shared_ptr<V4L2Stream> stream,
|
int isBlob,
|
int isMirror);
|
CameraStream(std::shared_ptr<V4L2Stream> stream, int isBlob);
|
int configurateManager(StreamManager* manager);
|
void calProperRectSize(cam_crop_rect_t srcRect, cam_crop_rect_t* dstRect);
|
|
template <typename T>
|
int inRange(T low, T hight, T val);
|
|
virtual ~CameraStream();
|
virtual int start();
|
virtual int stop();
|
virtual int flush();
|
virtual int initialize(uint32_t width,
|
uint32_t height,
|
int format,
|
uint32_t usage,
|
bool mergeStreamFlag);
|
virtual int setFormat(uint32_t width,
|
uint32_t height,
|
int format,
|
uint32_t usage);
|
virtual int request(buffer_handle_t * buffer,
|
uint32_t frameNumber,
|
CameraMetadata* metadata);
|
virtual int getBuffer(buffer_handle_t ** buffer, uint32_t* frameNumber);
|
virtual int waitBuffer();
|
virtual int enqueueBuffer();
|
virtual int dequeueBuffer(void ** src_addr, struct timeval * ts);
|
virtual int encodebuffer(void * dst_addr,
|
void * src_addr,
|
unsigned long mJpegBufferSizes);
|
virtual int copy_ycbcr_buffer(
|
android_ycbcr* dst_addr_ycbcr, void * src_addr);
|
virtual int setIspFlash(int CameraFlashMode);
|
virtual int getFocusStatus();
|
virtual int setFocusInit();
|
virtual int setIspFocus(int cameraFocusMode);
|
virtual int setIspCrop(cam_crop_rect_t camCropRect);
|
virtual int setIspFocusRegions(cam_rect_t cam_regions);
|
|
protected:
|
int isBlobFlag;
|
bool initialized;
|
std::shared_ptr<V4L2Stream> stream_;
|
StreamManager* manager_;
|
std::condition_variable requests_available_;
|
bool mStreamOn;
|
CameraMetadata* mMetadata;
|
std::unique_ptr<CameraMetadata> mStaticMetadata;
|
|
uint32_t mWidth;
|
uint32_t mHeight;
|
int mFormat;
|
uint32_t mUsage;
|
std::string mStreamType;
|
|
typedef struct frame_bufferHandle_map_t{
|
uint32_t frameNum;
|
buffer_handle_t* bufferHandleptr;
|
} frame_bufferHandle_map_t;
|
|
std::mutex yuv_buffer_queue_lock_;
|
std::queue<frame_bufferHandle_map_t> frameNumber_buffers_map_queue_;
|
std::condition_variable yuv_buffer_availabl_queue_;
|
std::mutex blob_buffer_queue_lock_;
|
std::queue<frame_bufferHandle_map_t> blob_frameNumber_buffers_map_queue_;
|
std::condition_variable blob_buffer_availabl_queue_;
|
|
private:
|
DISALLOW_COPY_AND_ASSIGN(CameraStream);
|
};
|
|
class CameraMainStream : public CameraStream {
|
public:
|
CameraMainStream(std::shared_ptr<V4L2Stream> stream, int isBlob);
|
|
~CameraMainStream();
|
int start();
|
int stop();
|
int flush();
|
int initialize(uint32_t width,
|
uint32_t height,
|
int format,
|
uint32_t usage,
|
bool mergeStreamFlag);
|
int setFormat(uint32_t width, uint32_t height, int format, uint32_t usage);
|
int getBuffer(buffer_handle_t ** buffer, uint32_t* frameNumber);
|
int waitBuffer();
|
int request(
|
buffer_handle_t* buffer, uint32_t frameNumber, CameraMetadata* metadata);
|
int dequeueBuffer(void** src_addr, struct timeval* ts);
|
int enqueueBuffer();
|
int encodebuffer(
|
void* dst_addr, void* src_addr, unsigned long mJpegBufferSizes);
|
int copy_ycbcr_buffer(android_ycbcr* dst_addr_ycbcr, void* src_addr);
|
int setIspFlash(int CameraFlashMode);
|
int getFocusStatus();
|
int setFocusInit();
|
int setIspFocus(int cameraFocusMode);
|
int setIspCrop(cam_crop_rect_t camCropRect);
|
int setIspFocusRegions(cam_rect_t cam_regions);
|
|
private:
|
DISALLOW_COPY_AND_ASSIGN(CameraMainStream);
|
};
|
|
class CameraSubStream : public CameraStream {
|
public:
|
CameraSubStream(std::shared_ptr<V4L2Stream> stream, int isBlob);
|
int start();
|
int stop();
|
int flush();
|
int initialize(uint32_t width,
|
uint32_t height,
|
int format,
|
uint32_t usage,
|
bool mergeStreamFlag);
|
int setFormat(uint32_t width, uint32_t height, int format, uint32_t usage);
|
int getBuffer(buffer_handle_t** buffer, uint32_t* frameNumber);
|
int waitBuffer();
|
int request(
|
buffer_handle_t* buffer, uint32_t frameNumber, CameraMetadata* metadata);
|
int dequeueBuffer(void** src_addr, struct timeval* ts);
|
int enqueueBuffer();
|
int encodebuffer(
|
void* dst_addr, void* src_addr, unsigned long mJpegBufferSizes);
|
int copy_ycbcr_buffer(android_ycbcr* dst_addr_ycbcr, void* src_addr);
|
int setIspFlash(int CameraFlashMode);
|
int getFocusStatus();
|
int setFocusInit();
|
int setIspFocus(int cameraFocusMode);
|
int setIspCrop(cam_crop_rect_t camCropRect);
|
int setIspFocusRegions(cam_rect_t cam_regions);
|
|
~CameraSubStream();
|
|
private:
|
DISALLOW_COPY_AND_ASSIGN(CameraSubStream);
|
};
|
|
class CameraMainMirrorStream : public CameraStream {
|
public:
|
CameraMainMirrorStream(std::shared_ptr<V4L2Stream> stream, int isBlob);
|
~CameraMainMirrorStream();
|
int start();
|
int stop();
|
int flush();
|
int initialize(uint32_t width,
|
uint32_t height,
|
int format,
|
uint32_t usage,
|
bool mergeStreamFlag);
|
int setFormat(uint32_t width, uint32_t height, int format, uint32_t usage);
|
int getBuffer(buffer_handle_t** buffer, uint32_t* frameNumber);
|
int waitBuffer();
|
int request(
|
buffer_handle_t* buffer, uint32_t frameNumber, CameraMetadata* metadata);
|
int dequeueBuffer(void** src_addr, struct timeval* ts);
|
int enqueueBuffer();
|
int encodebuffer(
|
void* dst_addr, void* src_addr, unsigned long mJpegBufferSizes);
|
int copy_ycbcr_buffer(android_ycbcr* dst_addr_ycbcr, void* src_addr);
|
int setIspFlash(int CameraFlashMode);
|
int getFocusStatus();
|
int setFocusInit();
|
int setIspFocus(int cameraFocusMode);
|
int setIspCrop(cam_crop_rect_t camCropRect);
|
int setIspFocusRegions(cam_rect_t cam_regions);
|
|
DISALLOW_COPY_AND_ASSIGN(CameraMainMirrorStream);
|
};
|
|
class CameraSubMirrorStream : public CameraStream {
|
public:
|
CameraSubMirrorStream(std::shared_ptr<V4L2Stream> stream, int isBlob);
|
int start();
|
int stop();
|
int flush();
|
int initialize(uint32_t width,
|
uint32_t height,
|
int format,
|
uint32_t usage,
|
bool mergeStreamFlag);
|
int setScaleFlag();
|
int setFormat(uint32_t width, uint32_t height, int format, uint32_t usage);
|
int getBuffer(buffer_handle_t** buffer, uint32_t* frameNumber);
|
int waitBuffer();
|
int request(
|
buffer_handle_t* buffer, uint32_t frameNumber, CameraMetadata* metadata);
|
int dequeueBuffer(void** src_addr, struct timeval* ts);
|
int enqueueBuffer();
|
int encodebuffer(
|
void * dst_addr, void * src_addr, unsigned long mJpegBufferSizes);
|
int copy_ycbcr_buffer(android_ycbcr* dst_addr_ycbcr, void * src_addr);
|
int setIspFlash(int CameraFlashMode);
|
int getFocusStatus();
|
int setFocusInit();
|
int setIspFocus(int cameraFocusMode);
|
int setIspCrop(cam_crop_rect_t camCropRect);
|
int setIspFocusRegions(cam_rect_t cam_regions);
|
|
~CameraSubMirrorStream();
|
|
private:
|
int yuv420spDownScale(void* psrc, android_ycbcr* dst_addr_ycbcr,
|
int src_w, int src_h, int dst_w, int dst_h);
|
|
bool mScaleFlag;
|
|
DISALLOW_COPY_AND_ASSIGN(CameraSubMirrorStream);
|
};
|
|
} // namespace v4l2_camera_hal
|
|
#endif // V4L2_CAMERA_HAL_V4L2_CAMERA_H_
|