mirror of
https://github.com/sipeed/MaixCDK.git
synced 2026-09-10 21:59:54 -05:00
1751 lines
65 KiB
C++
1751 lines
65 KiB
C++
#ifndef __AX_MIDDLEWARE_HPP__
|
|
#define __AX_MIDDLEWARE_HPP__
|
|
|
|
#include <stdint.h>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <linux/i2c-dev.h>
|
|
#include <linux/i2c.h>
|
|
#include <sys/ioctl.h>
|
|
#include "maix_basic.hpp"
|
|
#include "maix_image.hpp"
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#include "ax_venc_api.h"
|
|
#include "ax_vdec_api.h"
|
|
#include "ax_ivps_api.h"
|
|
#include "ax_isp_api.h"
|
|
#include "ax_global_type.h"
|
|
#include "ax_isp_api.h"
|
|
#include "ax_buffer_tool.h"
|
|
#include "ax_vin_error_code.h"
|
|
#include "ax_vo_api.h"
|
|
#include "ax_ai_api.h"
|
|
#include "ax_ao_api.h"
|
|
#include "ax_aenc_api.h"
|
|
#include "ax_adec_api.h"
|
|
#include "ax_isp_3a_api.h"
|
|
#include "ax_acodec_api.h"
|
|
#include "common_sys.h"
|
|
#include "common_venc.h"
|
|
#include "common_vin.h"
|
|
#include "common_cam.h"
|
|
#include "common_nt.h"
|
|
#include "common_isp.h"
|
|
#include "common_vo.h"
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
using namespace maix;
|
|
|
|
namespace maix::middleware::maixcam2 {
|
|
class Frame;
|
|
class SYS;
|
|
class VENC;
|
|
class ENGINE;
|
|
err::Err ax_jpg_enc_init(void);
|
|
err::Err ax_jpg_enc_deinit(void);
|
|
maixcam2::Frame *ax_jpg_enc_once(maixcam2::Frame *frame, int quality);
|
|
#define VO_MAX_LAYER (3)
|
|
#define VO_MAX_CHANNELS (3)
|
|
typedef enum {
|
|
AX_VENC_TYPE_JPG = 0,
|
|
AX_VENC_TYPE_H264,
|
|
AX_VENC_TYPE_H265,
|
|
AX_VENC_TYPE_MJPG,
|
|
} ax_venc_type_e;
|
|
|
|
typedef enum
|
|
{
|
|
AX_VENC_RCMODE_CBR = 0,
|
|
AX_VENC_RCMODE_VBR,
|
|
AX_VENC_RCMODE_FIXQP,
|
|
AX_VENC_RCMODE_MAX,
|
|
} ax_venc_rc_mode_e;
|
|
|
|
typedef enum {
|
|
AX_VDEC_TYPE_JPG = 0,
|
|
AX_VDEC_TYPE_H264,
|
|
AX_VDEC_TYPE_H265,
|
|
AX_VDEC_TYPE_MJPG,
|
|
} ax_vdec_type_e;
|
|
|
|
typedef struct {
|
|
int width;
|
|
int height;
|
|
int format_in;
|
|
int format_out;
|
|
int fps;
|
|
int depth;
|
|
int mirror;
|
|
int vflip;
|
|
int fit;
|
|
int rotate;
|
|
int pool_num_in;
|
|
int pool_num_out;
|
|
} ax_vo_channel_param_t;
|
|
|
|
typedef struct {
|
|
SAMPLE_VO_CONFIG_S vo_cfg;
|
|
AX_VO_SYNC_INFO_T sync_info;
|
|
} ax_vo_param_t;
|
|
|
|
typedef struct {
|
|
bool en;
|
|
ax_venc_type_e type;
|
|
ax_venc_rc_mode_e rc_mode;
|
|
int w;
|
|
int h;
|
|
AX_IMG_FORMAT_E fmt;
|
|
union {
|
|
struct {
|
|
int input_fps;
|
|
int output_fps;
|
|
} jpg;
|
|
|
|
struct {
|
|
int first_frame_start_qp;
|
|
int stat_time;
|
|
int bitrate;
|
|
int qp_min;
|
|
int qp_max;
|
|
} mjpg;
|
|
struct {
|
|
int first_frame_start_qp;
|
|
int gop;
|
|
int input_fps;
|
|
int output_fps;
|
|
int bitrate;
|
|
int min_qp;
|
|
int max_qp;
|
|
int min_iqp;
|
|
int max_iqp;
|
|
int intra_qp_delta;
|
|
int de_breath_qp_delta;
|
|
int min_iprop;
|
|
int max_iprop;
|
|
} h264;
|
|
struct {
|
|
int first_frame_start_qp;
|
|
int gop;
|
|
int input_fps;
|
|
int output_fps;
|
|
int bitrate;
|
|
int min_qp;
|
|
int max_qp;
|
|
int min_iqp;
|
|
int max_iqp;
|
|
int intra_qp_delta;
|
|
int de_breath_qp_delta;
|
|
int min_iprop;
|
|
int max_iprop;
|
|
int qp_delta_rgn;
|
|
AX_VENC_QPMAP_QP_TYPE_E qp_map_type;
|
|
AX_VENC_QPMAP_BLOCK_TYPE_E qp_map_blk_type;
|
|
AX_VENC_QPMAP_BLOCK_UNIT_E qp_map_block_unit;
|
|
AX_VENC_RC_CTBRC_MODE_E ctb_rc_mode;
|
|
} h265;
|
|
};
|
|
} ax_venc_param_t;
|
|
|
|
typedef struct {
|
|
bool en;
|
|
ax_vdec_type_e type;
|
|
int w;
|
|
int h;
|
|
AX_IMG_FORMAT_E fmt;
|
|
int blk_cnt;
|
|
int blk_size;
|
|
AX_POOL pool_id;
|
|
} ax_vdec_param_t;
|
|
|
|
typedef struct {
|
|
int channels;
|
|
int rate;
|
|
int encode_rate;
|
|
AX_AUDIO_BIT_WIDTH_E bits;
|
|
AX_AI_LAYOUT_MODE_E layout;
|
|
AX_PAYLOAD_TYPE_E payload_type;
|
|
unsigned int period_size;
|
|
unsigned int period_count;
|
|
bool cfg_pool_en;
|
|
AX_POOL_CONFIG_T pool_cfg;
|
|
bool cfg_pub_attr;
|
|
AX_AI_ATTR_T pub_attr;
|
|
bool vqe_en;
|
|
AX_AP_UPTALKVQE_ATTR_T vqe_attr;
|
|
bool ns_en;
|
|
AX_NS_CONFIG_T ns_attr;
|
|
bool hpf_en;
|
|
AX_ACODEC_FREQ_ATTR_T hpf_attr;
|
|
bool lpf_en;
|
|
AX_ACODEC_FREQ_ATTR_T lpf_attr;
|
|
bool eq_en;
|
|
AX_ACODEC_EQ_ATTR_T eq_attr;
|
|
bool aed_en;
|
|
AX_AED_ATTR_T aed_attr;
|
|
} ax_audio_in_param_t;
|
|
|
|
typedef struct {
|
|
int channels;
|
|
int rate;
|
|
int encode_rate;
|
|
AX_AUDIO_BIT_WIDTH_E bits;
|
|
AX_PAYLOAD_TYPE_E payload_type;
|
|
unsigned int period_size;
|
|
unsigned int period_count;
|
|
bool insert_silence;
|
|
bool cfg_pool_en;
|
|
AX_POOL_CONFIG_T pool_cfg;
|
|
bool cfg_pub_attr;
|
|
AX_AO_ATTR_T pub_attr;
|
|
bool vqe_en;
|
|
AX_AP_DNVQE_ATTR_T vqe_attr;
|
|
bool hpf_en;
|
|
AX_ACODEC_FREQ_ATTR_T hpf_attr;
|
|
bool lpf_en;
|
|
AX_ACODEC_FREQ_ATTR_T lpf_attr;
|
|
bool eq_en;
|
|
AX_ACODEC_EQ_ATTR_T eq_attr;
|
|
} ax_audio_out_param_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
COMMON_SYS_ARGS_T tCommonArgs;
|
|
COMMON_SYS_ARGS_T tPrivArgs;
|
|
} ax_sys_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
AX_ENGINE_NPU_MODE_T mode;
|
|
} ax_engine_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
ax_vdec_param_t vdec[AX_VDEC_MAX_GRP_NUM];
|
|
} ax_vdec_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
ax_venc_param_t venc[AX_MAX_VENC_CHN_NUM];
|
|
} ax_venc_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
SYS *sys;
|
|
VENC *venc;
|
|
} ax_jpg_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
AX_CAMERA_T cams[MAX_CAMERAS];
|
|
int init_count2;
|
|
AX_S32 nGrpId;
|
|
AX_S32 nChnNum;
|
|
AX_S32 nGroupInputWidth;
|
|
AX_S32 nGroupInputHeight;
|
|
AX_IMG_FORMAT_E nGroupInputFormat;
|
|
AX_IVPS_GRP_ATTR_T stGrpAttr;
|
|
AX_IVPS_ROTATION_E eRotAngle;
|
|
AX_IVPS_PIPELINE_ATTR_T stPipelineAttr;
|
|
COMMON_SYS_ARGS_T tCommonArgs;
|
|
COMMON_SYS_ARGS_T tPrivArgs;
|
|
AX_U32 VinId;
|
|
AX_U32 IvpsId;
|
|
ENGINE *engine;
|
|
struct {
|
|
int w;
|
|
int h;
|
|
AX_IMG_FORMAT_E fmt;
|
|
int fps;
|
|
int depth;
|
|
AX_BOOL mirror;
|
|
AX_BOOL flip;
|
|
int fit; // fit = 0, width to new width, height to new height, may be stretch
|
|
// fit = 1, keep aspect ratio, fill blank area with black color
|
|
// fit = 2, keep aspect ratio, crop image to fit new size
|
|
} chn_out[AX_IVPS_MAX_OUTCHN_NUM];
|
|
} ax_vi_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
int init_count2;
|
|
IVPS_GRP nGrpId;
|
|
AX_S32 nChnNum;
|
|
AX_IVPS_GRP_ATTR_T stGrpAttr;
|
|
AX_IVPS_PIPELINE_ATTR_T stPipelineAttr;
|
|
ax_vo_param_t vo_param;
|
|
bool used_channels[VO_MAX_LAYER][VO_MAX_CHANNELS]; // video layer:0, graphic layer:1, cursor layer:2
|
|
ax_vo_channel_param_t channel_param[VO_MAX_LAYER][VO_MAX_CHANNELS];
|
|
int fb_fd[VO_MAX_CHANNELS];
|
|
bool global_mirror;
|
|
bool global_flip;
|
|
} ax_vo_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
int card;
|
|
int device;
|
|
AX_POOL pool_id;
|
|
ax_audio_in_param_t param;
|
|
bool eq_en;
|
|
bool hpf_en;
|
|
bool lpf_en;
|
|
bool aed_en;
|
|
AX_AI_ATTR_T attr;
|
|
} ax_ai_mod_t;
|
|
|
|
typedef struct {
|
|
pthread_mutex_t lock;
|
|
int init_count;
|
|
int card;
|
|
int device;
|
|
SYS *sys;
|
|
AX_POOL pool_id;
|
|
ax_audio_out_param_t param;
|
|
bool eq_en;
|
|
bool hpf_en;
|
|
bool lpf_en;
|
|
AX_AO_ATTR_T attr;
|
|
} ax_ao_mod_t;
|
|
|
|
typedef enum {
|
|
AX_MOD_SYS,
|
|
AX_MOD_ENGINE,
|
|
AX_MOD_VI,
|
|
AX_MOD_VO,
|
|
AX_MOD_VENC,
|
|
AX_MOD_VDEC,
|
|
AX_MOD_JPG,
|
|
AX_MOD_AI,
|
|
AX_MOD_AO,
|
|
AX_MOD_MAX,
|
|
} ax_mod_e;
|
|
|
|
class AxModuleParam {
|
|
public:
|
|
static AxModuleParam& getInstance() {
|
|
static AxModuleParam instance; // **C++11 线程安全**
|
|
return instance;
|
|
}
|
|
|
|
void lock(ax_mod_e mod) {
|
|
switch (mod) {
|
|
case AX_MOD_SYS:
|
|
pthread_mutex_lock(&__sys_mod.lock);
|
|
break;
|
|
case AX_MOD_ENGINE:
|
|
pthread_mutex_lock(&__engine_mod.lock);
|
|
break;
|
|
case AX_MOD_VI:
|
|
pthread_mutex_lock(&__vi_mod.lock);
|
|
break;
|
|
case AX_MOD_VO:
|
|
pthread_mutex_lock(&__vo_mod.lock);
|
|
break;
|
|
case AX_MOD_VENC:
|
|
pthread_mutex_lock(&__venc_mod.lock);
|
|
break;
|
|
case AX_MOD_VDEC:
|
|
pthread_mutex_lock(&__vdec_mod.lock);
|
|
break;
|
|
case AX_MOD_JPG:
|
|
pthread_mutex_lock(&__jpg_mod.lock);
|
|
break;
|
|
case AX_MOD_AI:
|
|
pthread_mutex_lock(&__ai_mod.lock);
|
|
break;
|
|
case AX_MOD_AO:
|
|
pthread_mutex_lock(&__ao_mod.lock);
|
|
break;
|
|
default:
|
|
err::check_raise(err::ERR_RUNTIME, "unknown ax module");
|
|
break;
|
|
}
|
|
}
|
|
|
|
void *get_param(ax_mod_e mod) {
|
|
switch (mod) {
|
|
case AX_MOD_SYS:
|
|
return &__sys_mod;
|
|
break;
|
|
case AX_MOD_ENGINE:
|
|
return &__engine_mod;
|
|
break;
|
|
case AX_MOD_VI:
|
|
return &__vi_mod;
|
|
break;
|
|
case AX_MOD_VO:
|
|
return &__vo_mod;
|
|
break;
|
|
case AX_MOD_VENC:
|
|
return &__venc_mod;
|
|
break;
|
|
case AX_MOD_VDEC:
|
|
return &__vdec_mod;
|
|
break;
|
|
case AX_MOD_JPG:
|
|
return &__jpg_mod;
|
|
break;
|
|
case AX_MOD_AI:
|
|
return &__ai_mod;
|
|
break;
|
|
case AX_MOD_AO:
|
|
return &__ao_mod;
|
|
break;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
void unlock(ax_mod_e mod) {
|
|
switch (mod) {
|
|
case AX_MOD_SYS:
|
|
pthread_mutex_unlock(&__sys_mod.lock);
|
|
break;
|
|
case AX_MOD_ENGINE:
|
|
pthread_mutex_unlock(&__engine_mod.lock);
|
|
break;
|
|
case AX_MOD_VI:
|
|
pthread_mutex_unlock(&__vi_mod.lock);
|
|
break;
|
|
case AX_MOD_VO:
|
|
pthread_mutex_unlock(&__vo_mod.lock);
|
|
break;
|
|
case AX_MOD_VENC:
|
|
pthread_mutex_unlock(&__venc_mod.lock);
|
|
break;
|
|
case AX_MOD_VDEC:
|
|
pthread_mutex_unlock(&__vdec_mod.lock);
|
|
break;
|
|
case AX_MOD_JPG:
|
|
pthread_mutex_unlock(&__jpg_mod.lock);
|
|
break;
|
|
case AX_MOD_AI:
|
|
pthread_mutex_unlock(&__ai_mod.lock);
|
|
break;
|
|
case AX_MOD_AO:
|
|
pthread_mutex_unlock(&__ao_mod.lock);
|
|
break;
|
|
default:
|
|
err::check_raise(err::ERR_RUNTIME, "unknown ax module");
|
|
break;
|
|
}
|
|
}
|
|
private:
|
|
ax_sys_mod_t __sys_mod;
|
|
ax_engine_mod_t __engine_mod;
|
|
ax_vi_mod_t __vi_mod;
|
|
ax_vo_mod_t __vo_mod;
|
|
ax_venc_mod_t __venc_mod;
|
|
ax_vdec_mod_t __vdec_mod;
|
|
ax_jpg_mod_t __jpg_mod;
|
|
ax_ai_mod_t __ai_mod;
|
|
ax_ao_mod_t __ao_mod;
|
|
AxModuleParam() {
|
|
__sys_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__engine_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__vi_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__vo_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__venc_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__vdec_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__jpg_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__ai_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
__ao_mod.lock = PTHREAD_MUTEX_INITIALIZER;
|
|
}
|
|
~AxModuleParam() = default;
|
|
AxModuleParam(const AxModuleParam &) = delete;
|
|
AxModuleParam& operator=(const AxModuleParam &) = delete;
|
|
};
|
|
|
|
inline image::Format get_maix_fmt_from_ax(AX_IMG_FORMAT_E format) {
|
|
switch (format) {
|
|
case AX_FORMAT_YUV400:
|
|
return image::FMT_GRAYSCALE;
|
|
case AX_FORMAT_RGB888:
|
|
return image::FMT_BGR888; // actualy is rgb888
|
|
case AX_FORMAT_BGR888:
|
|
return image::FMT_RGB888; // actualy is bgr888
|
|
case AX_FORMAT_ARGB8888:
|
|
return image::FMT_BGRA8888; // actualy is rgba8888
|
|
case AX_FORMAT_ABGR8888:
|
|
return image::FMT_RGBA8888; // actualy is bgra8888
|
|
case AX_FORMAT_YUV420_SEMIPLANAR:
|
|
return image::FMT_YUV420SP;
|
|
case AX_FORMAT_YUV420_SEMIPLANAR_VU:
|
|
return image::FMT_YVU420SP;
|
|
default:
|
|
return image::FMT_INVALID;
|
|
}
|
|
}
|
|
|
|
inline AX_IMG_FORMAT_E get_ax_fmt_from_maix(image::Format format) {
|
|
switch (format)
|
|
{
|
|
case image::FMT_GRAYSCALE:
|
|
return AX_FORMAT_YUV400;
|
|
case image::FMT_RGB888:
|
|
return AX_FORMAT_BGR888; // actualy is rgb888
|
|
case image::FMT_BGR888:
|
|
return AX_FORMAT_RGB888; // actualy is bgr888
|
|
case image::FMT_RGBA8888:
|
|
return AX_FORMAT_ABGR8888; // actualy is rgba8888
|
|
case image::FMT_BGRA8888:
|
|
return AX_FORMAT_ARGB8888; // actualy is bgra8888
|
|
case image::FMT_YUV420SP:
|
|
return AX_FORMAT_YUV420_SEMIPLANAR;
|
|
case image::FMT_YVU420SP:
|
|
return AX_FORMAT_YUV420_SEMIPLANAR_VU;
|
|
default:
|
|
return AX_FORMAT_INVALID;
|
|
}
|
|
}
|
|
|
|
typedef enum {
|
|
SAMPLE_VIN_NONE = -1,
|
|
SAMPLE_VIN_SINGLE_DUMMY = 0,
|
|
SAMPLE_VIN_SINGLE_OS04A10 = 1,
|
|
SAMPLE_VIN_SINGLE_SC450AI = 2,
|
|
SAMPLE_VIN_SINGLE_SC850SL = 3,
|
|
SAMPLE_VIN_SINGLE_OS04D10 = 4,
|
|
SAMPLE_VIN_SINGLE_SC850SL_1080P60 = 5,
|
|
SAMPLE_VIN_SINGLE_OS04D10_720P60 = 6,
|
|
SAMPLE_VIN_BUTT
|
|
} SAMPLE_VIN_CASE_E;
|
|
|
|
typedef struct {
|
|
SAMPLE_VIN_CASE_E eSysCase;
|
|
COMMON_VIN_MODE_E eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode;
|
|
SAMPLE_LOAD_RAW_NODE_E eLoadRawNode;
|
|
AX_BOOL bAiispEnable;
|
|
AX_S32 nDumpFrameNum;
|
|
AX_S32 nPipeId; /* For VIN */
|
|
AX_S32 nGrpId; /* For IVPS */
|
|
AX_S32 nOutChnNum;
|
|
char *pFrameInfo;
|
|
AX_VIN_IVPS_MODE_E eMode;
|
|
AX_IVPS_ROTATION_E eRotAngle;
|
|
AX_U32 statDeltaPtsFrmNum;
|
|
} SAMPLE_VIN_PARAM_T;
|
|
|
|
/* comm pool */
|
|
static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleDummySdr[] = {
|
|
{2688, 1520, 2688, AX_FORMAT_BAYER_RAW_16BPP, 10}, /* vin raw16 use */
|
|
{2688, 1520, 2688, AX_FORMAT_YUV420_SEMIPLANAR, 10}, /* vin nv21/nv21 use */
|
|
{2688, 1520, 2688, AX_FORMAT_YUV420_SEMIPLANAR, 3, AX_COMPRESS_MODE_LOSSY, 4}, /* vin nv21/nv21 use */
|
|
};
|
|
|
|
static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs04a10Sdr[] = {
|
|
{2688, 1520, 2688, AX_FORMAT_YUV420_SEMIPLANAR, 3, AX_COMPRESS_MODE_LOSSY, 4}, /* vin nv21/nv21 use */
|
|
{2688, 1520, 2688, AX_FORMAT_YUV420_SEMIPLANAR, 4}, /* vin nv21/nv21 use */
|
|
{1920, 1080, 1920, AX_FORMAT_YUV420_SEMIPLANAR, 3}, /* vin nv21/nv21 use */
|
|
{720, 576, 720, AX_FORMAT_YUV420_SEMIPLANAR, 3}, /* vin nv21/nv21 use */
|
|
};
|
|
|
|
/* private pool */
|
|
static COMMON_SYS_POOL_CFG_T gtPrivatePoolSingleDummySdr[] = {
|
|
{2688, 1520, 2688, AX_FORMAT_BAYER_RAW_16BPP, 10},
|
|
};
|
|
|
|
static COMMON_SYS_POOL_CFG_T gtPrivatePoolSingleOs04a10Sdr[] = {
|
|
{2688, 1520, 2688, AX_FORMAT_BAYER_RAW_10BPP_PACKED, 12, AX_COMPRESS_MODE_NONE, 4}, /* vin raw16 use */
|
|
};
|
|
|
|
// SC450AI
|
|
static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs450aiSdr[] = {
|
|
{2688, 1520, 2688, AX_FORMAT_YUV420_SEMIPLANAR, 3, AX_COMPRESS_MODE_LOSSY, 4}, /* vin nv21/nv21 use */
|
|
{2688, 1520, 2688, AX_FORMAT_YUV420_SEMIPLANAR, 4}, /* vin nv21/nv21 use */
|
|
{1920, 1080, 1920, AX_FORMAT_YUV420_SEMIPLANAR, 3}, /* vin nv21/nv21 use */
|
|
{720, 576, 720, AX_FORMAT_YUV420_SEMIPLANAR, 3}, /* vin nv21/nv21 use */
|
|
};
|
|
|
|
static COMMON_SYS_POOL_CFG_T gtPrivatePoolSingleOs450aiSdr[] = {
|
|
{2688, 1520, 2688, AX_FORMAT_BAYER_RAW_10BPP_PACKED, 8, AX_COMPRESS_MODE_LOSSY, 4}, /* vin raw10 use */
|
|
};
|
|
|
|
// OS04D10
|
|
static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs04d10Sdr[] = {
|
|
{2560, 1440, 2560, AX_FORMAT_YUV420_SEMIPLANAR, 6, AX_COMPRESS_MODE_LOSSY, 4}, /* vin nv21/nv21 use */
|
|
{2560, 1440, 2560, AX_FORMAT_YUV420_SEMIPLANAR, 5}, /* vin nv21/nv21 use */
|
|
{1920, 1080, 1920, AX_FORMAT_YUV420_SEMIPLANAR, 3}, /* vin nv21/nv21 use */
|
|
{720, 576, 720, AX_FORMAT_YUV420_SEMIPLANAR, 3}, /* vin nv21/nv21 use */
|
|
};
|
|
|
|
static COMMON_SYS_POOL_CFG_T gtPrivatePoolSingleOs04d10Sdr[] = {
|
|
{2560, 1440, 2560, AX_FORMAT_BAYER_RAW_10BPP_PACKED, 16, AX_COMPRESS_MODE_NONE, 4}, /* vin raw16 use */
|
|
};
|
|
|
|
static AX_MIPI_RX_ATTR_T gOs04d10_720P60_MipiAttr = {
|
|
.ePhyMode = AX_MIPI_PHY_TYPE_DPHY,
|
|
.eLaneNum = AX_MIPI_DATA_LANE_2,
|
|
.nDataRate = 720,
|
|
.nDataLaneMap = {2, 1, -1, -1},
|
|
.nClkLane = {0, 5},
|
|
};
|
|
|
|
static AX_SNS_ATTR_T gOs04d10_720P60_SnsAttr = {
|
|
.nWidth = 1280,
|
|
.nHeight = 720,
|
|
.fFrameRate = 60,
|
|
.eSnsMode = AX_SNS_LINEAR_MODE,
|
|
.eRawType = AX_RT_RAW10,
|
|
.eBayerPattern = AX_BP_BGGR,
|
|
.bTestPatternEnable = AX_FALSE,
|
|
// .nSettingIndex = 12,
|
|
};
|
|
|
|
static AX_VIN_DEV_ATTR_T gOs04d10_720P60_DevAttr = {
|
|
.eDevMode = AX_VIN_DEV_ONLINE,
|
|
.bImgDataEnable = AX_TRUE,
|
|
.bNonImgDataEnable = AX_FALSE,
|
|
.eSnsIntfType = AX_SNS_INTF_TYPE_MIPI_RAW,
|
|
|
|
/* When users transfer special data, they need to configure VC&DT for szImgVc/szImgDt/szInfoVc/szInfoDt */
|
|
//.tMipiIntfAttr.szImgVc[0] = 0,
|
|
//.tMipiIntfAttr.szImgDt[0] = MIPI_CSI_DT_RAW10,
|
|
//.tMipiIntfAttr.szImgVc[1] = 1,
|
|
//.tMipiIntfAttr.szImgDt[1] = MIPI_CSI_DT_RAW10,
|
|
|
|
.eSnsMode = AX_SNS_LINEAR_MODE,
|
|
.eBayerPattern = AX_BP_BGGR,
|
|
.ePixelFmt = AX_FORMAT_BAYER_RAW_10BPP_PACKED,
|
|
.tDevImgRgn = {{0, 0, 1280, 720},
|
|
{0, 0, 1280, 720},
|
|
{0, 0, 1280, 720},
|
|
{0, 0, 1280, 720},},
|
|
.eSnsOutputMode = AX_SNS_NORMAL,
|
|
.tFrameRateCtrl= {AX_INVALID_FRMRATE, AX_INVALID_FRMRATE},
|
|
.tCompressInfo = {AX_COMPRESS_MODE_NONE, 0},
|
|
};
|
|
|
|
static AX_VIN_PIPE_ATTR_T gOs04d10_720P60_PipeAttr = {
|
|
.ePipeWorkMode = AX_VIN_PIPE_NORMAL_MODE1,
|
|
.tPipeImgRgn = {0, 0, 1280, 720},
|
|
.nWidthStride = 1280,
|
|
.eBayerPattern = AX_BP_BGGR,
|
|
.ePixelFmt = AX_FORMAT_BAYER_RAW_10BPP_PACKED,
|
|
.eSnsMode = AX_SNS_LINEAR_MODE,
|
|
.tCompressInfo = {AX_COMPRESS_MODE_LOSSY, 0},
|
|
.tNrAttr = {{AX_FALSE, {AX_COMPRESS_MODE_LOSSLESS, 0}}, {AX_FALSE, {AX_COMPRESS_MODE_NONE, 0}}},
|
|
.tFrameRateCtrl = {AX_INVALID_FRMRATE, AX_INVALID_FRMRATE},
|
|
};
|
|
|
|
static AX_VIN_CHN_ATTR_T gOs04d10_720P60_Chn0Attr = {
|
|
.nWidth = 1280,
|
|
.nHeight = 720,
|
|
.nWidthStride = 1280,
|
|
.eImgFormat = AX_FORMAT_YUV420_SEMIPLANAR,
|
|
.nDepth = 1,
|
|
.tCompressInfo = {AX_COMPRESS_MODE_LOSSY, 4},
|
|
.tFrameRateCtrl = {AX_INVALID_FRMRATE, AX_INVALID_FRMRATE},
|
|
};
|
|
|
|
// SC850SL
|
|
static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleSc850slSdr[] = {
|
|
{3840, 2160, 3840, AX_FORMAT_YUV420_SEMIPLANAR, 4, AX_COMPRESS_MODE_LOSSY, 4}, /* vin nv21/nv21 use */
|
|
{3840, 2160, 3840, AX_FORMAT_YUV420_SEMIPLANAR, 4},
|
|
};
|
|
|
|
static COMMON_SYS_POOL_CFG_T gtPrivatePoolSingleSc850slSdr[] = {
|
|
{3840, 2160, 3840, AX_FORMAT_BAYER_RAW_10BPP_PACKED, 5, AX_COMPRESS_MODE_NONE, 4}, /* vin raw10 use */
|
|
};
|
|
|
|
static AX_SNS_ATTR_T gSc850sl_1080P60_SnsAttr = {
|
|
.nWidth = 1920,
|
|
.nHeight = 1080,
|
|
.fFrameRate = 60,
|
|
.eSnsMode = AX_SNS_LINEAR_MODE,
|
|
.eRawType = AX_RT_RAW10,
|
|
.eBayerPattern = AX_BP_RGGB,
|
|
.bTestPatternEnable = AX_FALSE,
|
|
// .nSettingIndex = 12,
|
|
};
|
|
|
|
static AX_MIPI_RX_ATTR_T gSc850sl_1080P60_MipiAttr = {
|
|
.ePhyMode = AX_MIPI_PHY_TYPE_DPHY,
|
|
.eLaneNum = AX_MIPI_DATA_LANE_2,
|
|
.nDataRate = 1080,
|
|
.nDataLaneMap = {3, 1, 4, 0},
|
|
.nClkLane = {2, 5},
|
|
};
|
|
|
|
static AX_VIN_DEV_ATTR_T gSc850sl_1080P60_DevAttr = {
|
|
.eDevMode = AX_VIN_DEV_ONLINE,
|
|
.bImgDataEnable = AX_TRUE,
|
|
.bNonImgDataEnable = AX_FALSE,
|
|
.eSnsIntfType = AX_SNS_INTF_TYPE_MIPI_RAW,
|
|
|
|
/* When users transfer special data, they need to configure VC&DT for szImgVc/szImgDt/szInfoVc/szInfoDt */
|
|
//.tMipiIntfAttr.szImgVc[0] = 0,
|
|
//.tMipiIntfAttr.szImgDt[0] = MIPI_CSI_DT_RAW10,
|
|
//.tMipiIntfAttr.szImgVc[1] = 1,
|
|
//.tMipiIntfAttr.szImgDt[1] = MIPI_CSI_DT_RAW10,
|
|
|
|
.eSnsMode = AX_SNS_LINEAR_MODE,
|
|
.eBayerPattern = AX_BP_RGGB,
|
|
.ePixelFmt = AX_FORMAT_BAYER_RAW_10BPP_PACKED,
|
|
.tDevImgRgn = {{0, 0, 1920, 1080},
|
|
{0, 0, 1920, 1080},
|
|
{0, 0, 1920, 1080},
|
|
{0, 0, 1920, 1080},},
|
|
.eSnsOutputMode = AX_SNS_NORMAL,
|
|
.tFrameRateCtrl= {AX_INVALID_FRMRATE, AX_INVALID_FRMRATE},
|
|
.tCompressInfo = {AX_COMPRESS_MODE_NONE, 0},
|
|
};
|
|
|
|
static AX_VIN_PIPE_ATTR_T gSc850sl_1080P60_PipeAttr = {
|
|
.ePipeWorkMode = AX_VIN_PIPE_NORMAL_MODE1,
|
|
.tPipeImgRgn = {.nStartX = 0, .nStartY = 0, .nWidth = 1920, .nHeight = 1080},
|
|
.nWidthStride = 1920,
|
|
.eBayerPattern = AX_BP_RGGB,
|
|
.ePixelFmt = AX_FORMAT_BAYER_RAW_10BPP_PACKED,
|
|
.eSnsMode = AX_SNS_LINEAR_MODE,
|
|
.tCompressInfo = {AX_COMPRESS_MODE_LOSSY, 0},
|
|
.tNrAttr = {{AX_FALSE, {AX_COMPRESS_MODE_LOSSLESS, 0}}, {AX_FALSE, {AX_COMPRESS_MODE_NONE, 0}}},
|
|
.tFrameRateCtrl = {AX_INVALID_FRMRATE, AX_INVALID_FRMRATE},
|
|
};
|
|
|
|
static AX_VIN_CHN_ATTR_T gSc850sl_1080P60_Chn0Attr = {
|
|
.nWidth = 1920,
|
|
.nHeight = 1080,
|
|
.nWidthStride = 1920,
|
|
.eImgFormat = AX_FORMAT_YUV420_SEMIPLANAR,
|
|
.nDepth = 1,
|
|
.tCompressInfo = {AX_COMPRESS_MODE_LOSSY, 4},
|
|
.tFrameRateCtrl = {AX_INVALID_FRMRATE, AX_INVALID_FRMRATE},
|
|
};
|
|
|
|
static AX_VOID __cal_dump_pool(COMMON_SYS_POOL_CFG_T pool[], AX_SNS_HDR_MODE_E eHdrMode, AX_S32 nFrameNum)
|
|
{
|
|
if (NULL == pool) {
|
|
return;
|
|
}
|
|
if (nFrameNum > 0) {
|
|
switch (eHdrMode) {
|
|
case AX_SNS_LINEAR_MODE:
|
|
pool[0].nBlkCnt += nFrameNum;
|
|
break;
|
|
|
|
case AX_SNS_HDR_2X_MODE:
|
|
pool[0].nBlkCnt += nFrameNum * 2;
|
|
break;
|
|
|
|
case AX_SNS_HDR_3X_MODE:
|
|
pool[0].nBlkCnt += nFrameNum * 3;
|
|
break;
|
|
|
|
case AX_SNS_HDR_4X_MODE:
|
|
pool[0].nBlkCnt += nFrameNum * 4;
|
|
break;
|
|
|
|
default:
|
|
pool[0].nBlkCnt += nFrameNum;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static AX_VOID __set_pipe_hdr_mode(AX_U32 *pHdrSel, AX_SNS_HDR_MODE_E eHdrMode)
|
|
{
|
|
if (NULL == pHdrSel) {
|
|
return;
|
|
}
|
|
|
|
switch (eHdrMode) {
|
|
case AX_SNS_LINEAR_MODE:
|
|
*pHdrSel = 0x1;
|
|
break;
|
|
|
|
case AX_SNS_HDR_2X_MODE:
|
|
*pHdrSel = 0x1 | 0x2;
|
|
break;
|
|
|
|
case AX_SNS_HDR_3X_MODE:
|
|
*pHdrSel = 0x1 | 0x2 | 0x4;
|
|
break;
|
|
|
|
case AX_SNS_HDR_4X_MODE:
|
|
*pHdrSel = 0x1 | 0x2 | 0x4 | 0x8;
|
|
break;
|
|
|
|
default:
|
|
*pHdrSel = 0x1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
static AX_VOID __set_vin_attr(AX_CAMERA_T *pCam, SAMPLE_SNS_TYPE_E eSnsType, AX_SNS_HDR_MODE_E eHdrMode,
|
|
COMMON_VIN_MODE_E eSysMode, AX_BOOL bAiispEnable)
|
|
{
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->tSnsAttr.eSnsMode = eHdrMode;
|
|
pCam->tDevAttr.eSnsMode = eHdrMode;
|
|
pCam->eHdrMode = eHdrMode;
|
|
pCam->eSysMode = eSysMode;
|
|
pCam->tPipeAttr[pCam->nPipeId].eSnsMode = eHdrMode;
|
|
pCam->tPipeAttr[pCam->nPipeId].bAiIspEnable = bAiispEnable;
|
|
if (eHdrMode > AX_SNS_LINEAR_MODE) {
|
|
pCam->tDevAttr.eSnsOutputMode = AX_SNS_DOL_HDR;
|
|
}
|
|
|
|
if (COMMON_VIN_TPG == eSysMode) {
|
|
pCam->tDevAttr.eSnsIntfType = AX_SNS_INTF_TYPE_TPG;
|
|
}
|
|
|
|
if (COMMON_VIN_LOADRAW == eSysMode) {
|
|
pCam->bEnableDev = AX_FALSE;
|
|
} else {
|
|
pCam->bEnableDev = AX_TRUE;
|
|
}
|
|
pCam->bChnEn[0] = AX_TRUE;
|
|
pCam->bRegisterSns = AX_TRUE;
|
|
|
|
return;
|
|
}
|
|
|
|
static void __vi_get_sns_config(SAMPLE_SNS_TYPE_E eSnsType,
|
|
AX_MIPI_RX_ATTR_T *ptMipiAttr, AX_SNS_ATTR_T *ptSnsAttr,
|
|
AX_SNS_CLK_ATTR_T *ptSnsClkAttr, AX_VIN_DEV_ATTR_T *pDevAttr,
|
|
AX_VIN_PIPE_ATTR_T *pPipeAttr, AX_VIN_CHN_ATTR_T *pChnAttr) {
|
|
COMMON_VIN_GetSnsConfig(eSnsType, ptMipiAttr, ptSnsAttr, ptSnsClkAttr, pDevAttr, pPipeAttr, pChnAttr);
|
|
switch (eSnsType) {
|
|
case SMARTSENS_SC450AI:
|
|
{
|
|
// auto chn0_attr = &pChnAttr[0];
|
|
// chn0_attr->eImgFormat = AX_FORMAT_YUV420_SEMIPLANAR_VU;
|
|
// chn0_attr->tCompressInfo = {AX_COMPRESS_MODE_NONE, 0};
|
|
}
|
|
break;
|
|
default:break;
|
|
}
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
static AX_SENSOR_REGISTER_FUNC_T *COMMON_ISP_GetSnsObj_User(SAMPLE_SNS_TYPE_E eSnsType)
|
|
{
|
|
#if CONFIG_MAIXCAM_LOAD_SENSOR_LIBRARY_WITHOUT_DLOPEN
|
|
AX_SENSOR_REGISTER_FUNC_T *ptSnsHdl = NULL;
|
|
switch (eSnsType) {
|
|
#if CONFIG_AX620E_MSP_ENABLE_SENSOR_LIB
|
|
case OMNIVISION_OS04A10:
|
|
extern AX_SENSOR_REGISTER_FUNC_T gSnsos04a10Obj;
|
|
ptSnsHdl = &gSnsos04a10Obj;
|
|
break;
|
|
case SMARTSENS_SC450AI:
|
|
extern AX_SENSOR_REGISTER_FUNC_T gSnssc450aiObj;
|
|
ptSnsHdl = &gSnssc450aiObj;
|
|
break;
|
|
#endif
|
|
default:
|
|
err::check_raise(err::ERR_NOT_IMPL, "No supported sensor library found");
|
|
break;
|
|
}
|
|
|
|
return ptSnsHdl;
|
|
#else
|
|
return COMMON_ISP_GetSnsObj(eSnsType);
|
|
#endif
|
|
}
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
static AX_U32 __sample_case_single_dummy(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_S32 i = 0;
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
SAMPLE_LOAD_RAW_NODE_E eLoadRawNode = pVinParam->eLoadRawNode;
|
|
pCam = &pCamList[0];
|
|
pCommonArgs->nCamCnt = 1;
|
|
|
|
for (i = 0; i < pCommonArgs->nCamCnt; i++) {
|
|
pCam = &pCamList[i];
|
|
pCam->nPipeId = 0;
|
|
__vi_get_sns_config(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj_User(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eLoadRawNode = eLoadRawNode;
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_0;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (AX_S32 j = 0; j < AX_VIN_MAX_PIPE_NUM; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "null.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_single_os04a10(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
AX_U32 j = 0;
|
|
pCommonArgs->nCamCnt = 1;
|
|
pCam = &pCamList[0];
|
|
__vi_get_sns_config(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->nPipeId = 0;
|
|
pCam->nI2cAddr = 0x36;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj_User(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_0;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (j = 0; j < pCam->tDevBindPipe.nNum; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "null.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_single_sc450ai(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
AX_U32 j = 0;
|
|
SAMPLE_LOAD_RAW_NODE_E eLoadRawNode = pVinParam->eLoadRawNode;
|
|
pCommonArgs->nCamCnt = 1;
|
|
|
|
pCam = &pCamList[0];
|
|
pCam->nPipeId = 0;
|
|
__vi_get_sns_config(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->nI2cAddr = 0x30;
|
|
pCam->nI2cNode = 0;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->eLoadRawNode = eLoadRawNode;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj_User(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eInputMode = AX_INPUT_MODE_MIPI;
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_0;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (j = 0; j < pCam->tDevBindPipe.nNum; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
if (pCam->tPipeInfo[j].bAiispEnable) {
|
|
if (eHdrMode <= AX_SNS_LINEAR_MODE) {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc450ai_sdr_dual3dnr.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
} else {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc450ai_hdr_2x_ainr.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
} else {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "null.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_single_os04d10_720p60(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
AX_S32 j = 0;
|
|
pCommonArgs->nCamCnt = 1;
|
|
pCam = &pCamList[0];
|
|
COMMON_VIN_GetSnsConfig(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
::memcpy(&pCam->tMipiAttr, &gOs04d10_720P60_MipiAttr, sizeof(pCam->tMipiAttr));
|
|
::memcpy(&pCam->tSnsAttr, &gOs04d10_720P60_SnsAttr, sizeof(pCam->tSnsAttr));
|
|
::memcpy(&pCam->tDevAttr, &gOs04d10_720P60_DevAttr, sizeof(pCam->tDevAttr));
|
|
::memcpy(&pCam->tPipeAttr[pCam->nPipeId], &gOs04d10_720P60_PipeAttr, sizeof(pCam->tPipeAttr[pCam->nPipeId]));
|
|
::memcpy(&pCam->tChnAttr, &gOs04d10_720P60_Chn0Attr, sizeof(pCam->tChnAttr));
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->nPipeId = 0;
|
|
pCam->nI2cAddr = 0x3c;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_1;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (j = 0; j < (AX_S32)pCam->tDevBindPipe.nNum; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/os04d10_sipeed_sdr_2lane_720p60.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_single_os04d10(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
AX_S32 j = 0;
|
|
pCommonArgs->nCamCnt = 1;
|
|
pCam = &pCamList[0];
|
|
COMMON_VIN_GetSnsConfig(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->nPipeId = 0;
|
|
pCam->nI2cAddr = 0x3c;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_1;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (j = 0; j < (AX_S32)pCam->tDevBindPipe.nNum; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/os04d10_sipeed_sdr_2lane_1440p30.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_single_sc850sl_1080p60(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
AX_S32 j = 0;
|
|
SAMPLE_LOAD_RAW_NODE_E eLoadRawNode = pVinParam->eLoadRawNode;
|
|
pCommonArgs->nCamCnt = 1;
|
|
|
|
pCam = &pCamList[0];
|
|
pCam->nPipeId = 0;
|
|
COMMON_VIN_GetSnsConfig(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
::memcpy(&pCam->tMipiAttr, &gSc850sl_1080P60_MipiAttr, sizeof(pCam->tMipiAttr));
|
|
::memcpy(&pCam->tSnsAttr, &gSc850sl_1080P60_SnsAttr, sizeof(pCam->tSnsAttr));
|
|
::memcpy(&pCam->tDevAttr, &gSc850sl_1080P60_DevAttr, sizeof(pCam->tDevAttr));
|
|
::memcpy(&pCam->tPipeAttr[pCam->nPipeId], &gSc850sl_1080P60_PipeAttr, sizeof(pCam->tPipeAttr[pCam->nPipeId]));
|
|
::memcpy(&pCam->tChnAttr, &gSc850sl_1080P60_Chn0Attr, sizeof(pCam->tChnAttr));
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->nI2cAddr = 0x30;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->eLoadRawNode = eLoadRawNode;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eInputMode = AX_INPUT_MODE_MIPI;
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_0;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (j = 0; j < (AX_S32)pCam->tDevBindPipe.nNum; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
if (pCam->tPipeInfo[j].bAiispEnable) {
|
|
if (eHdrMode <= AX_SNS_LINEAR_MODE) {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc850sl_sipeed_sdr_2lane_1080p60.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
} else {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc850sl_hdr_2x_ainr.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
} else {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc850sl_sipeed_sdr_2lane_1080p60.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_single_sc850sl(AX_CAMERA_T *pCamList, SAMPLE_SNS_TYPE_E eSnsType,
|
|
SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_CAMERA_T *pCam = NULL;
|
|
COMMON_VIN_MODE_E eSysMode = pVinParam->eSysMode;
|
|
AX_SNS_HDR_MODE_E eHdrMode = pVinParam->eHdrMode;
|
|
AX_S32 j = 0;
|
|
SAMPLE_LOAD_RAW_NODE_E eLoadRawNode = pVinParam->eLoadRawNode;
|
|
pCommonArgs->nCamCnt = 1;
|
|
|
|
pCam = &pCamList[0];
|
|
pCam->nPipeId = 0;
|
|
COMMON_VIN_GetSnsConfig(eSnsType, &pCam->tMipiAttr, &pCam->tSnsAttr,
|
|
&pCam->tSnsClkAttr, &pCam->tDevAttr,
|
|
&pCam->tPipeAttr[pCam->nPipeId], pCam->tChnAttr);
|
|
pCam->nDevId = 0;
|
|
pCam->nRxDev = 0;
|
|
pCam->nI2cAddr = 0x30;
|
|
pCam->tSnsClkAttr.nSnsClkIdx = 0;
|
|
pCam->tDevBindPipe.nNum = 1;
|
|
pCam->eSnsType = eSnsType;
|
|
pCam->eLoadRawNode = eLoadRawNode;
|
|
pCam->tDevBindPipe.nPipeId[0] = pCam->nPipeId;
|
|
pCam->ptSnsHdl[pCam->nPipeId] = COMMON_ISP_GetSnsObj(eSnsType);
|
|
pCam->eBusType = COMMON_ISP_GetSnsBusType(eSnsType);
|
|
pCam->eInputMode = AX_INPUT_MODE_MIPI;
|
|
pCam->eLaneComboMode = AX_LANE_COMBO_MODE_0;
|
|
__set_pipe_hdr_mode(&pCam->tDevBindPipe.nHDRSel[0], eHdrMode);
|
|
__set_vin_attr(pCam, eSnsType, eHdrMode, eSysMode, pVinParam->bAiispEnable);
|
|
for (j = 0; j < (AX_S32)pCam->tDevBindPipe.nNum; j++) {
|
|
pCam->tPipeInfo[j].ePipeMode = SAMPLE_PIPE_MODE_VIDEO;
|
|
pCam->tPipeInfo[j].bAiispEnable = pVinParam->bAiispEnable;
|
|
if (pCam->tPipeInfo[j].bAiispEnable) {
|
|
if (eHdrMode <= AX_SNS_LINEAR_MODE) {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc850sl_sipeed_sdr_4lane_2160p30.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
} else {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc850sl_hdr_2x_ainr.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
} else {
|
|
strncpy(pCam->tPipeInfo[j].szBinPath, "/opt/etc/sc850sl_sipeed_sdr_4lane_2160p30.bin", sizeof(pCam->tPipeInfo[j].szBinPath));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static AX_U32 __sample_case_config(SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs,
|
|
COMMON_SYS_ARGS_T *pPrivArgs)
|
|
{
|
|
auto &mod_param = AxModuleParam::getInstance();
|
|
mod_param.lock(AX_MOD_VI);
|
|
auto vi_param = (ax_vi_mod_t *)mod_param.get_param(AX_MOD_VI);
|
|
AX_CAMERA_T *pCamList = &vi_param->cams[0];
|
|
SAMPLE_SNS_TYPE_E eSnsType = OMNIVISION_OS04A10;
|
|
|
|
// printf("eSysCase %d, eSysMode %d, eLoadRawNode %d, eHdrMode %d, bAiispEnable %d\r\n", pVinParam->eSysCase,
|
|
// pVinParam->eSysMode,
|
|
// pVinParam->eLoadRawNode, pVinParam->eHdrMode, pVinParam->bAiispEnable);
|
|
|
|
switch (pVinParam->eSysCase) {
|
|
case SAMPLE_VIN_SINGLE_OS04A10:
|
|
eSnsType = OMNIVISION_OS04A10;
|
|
/* comm pool config */
|
|
__cal_dump_pool(gtSysCommPoolSingleOs04a10Sdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04a10Sdr) / sizeof(gtSysCommPoolSingleOs04a10Sdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleOs04a10Sdr;
|
|
|
|
/* private pool config */
|
|
__cal_dump_pool(gtPrivatePoolSingleOs04a10Sdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleOs04a10Sdr) / sizeof(gtPrivatePoolSingleOs04a10Sdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleOs04a10Sdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_os04a10(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
case SAMPLE_VIN_SINGLE_SC450AI:
|
|
eSnsType = SMARTSENS_SC450AI;
|
|
/* comm pool config */
|
|
__cal_dump_pool(gtSysCommPoolSingleOs450aiSdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs450aiSdr) / sizeof(gtSysCommPoolSingleOs450aiSdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleOs450aiSdr;
|
|
|
|
/* private pool config */
|
|
__cal_dump_pool(gtPrivatePoolSingleOs450aiSdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleOs450aiSdr) / sizeof(gtPrivatePoolSingleOs450aiSdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleOs450aiSdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_sc450ai(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
case SAMPLE_VIN_SINGLE_OS04D10:
|
|
eSnsType = OMNIVISION_OS04D10;
|
|
/* comm pool config */
|
|
__cal_dump_pool(gtSysCommPoolSingleOs04d10Sdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04d10Sdr) / sizeof(gtSysCommPoolSingleOs04d10Sdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleOs04d10Sdr;
|
|
|
|
/* private pool config */
|
|
__cal_dump_pool(gtPrivatePoolSingleOs04d10Sdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleOs04d10Sdr) / sizeof(gtPrivatePoolSingleOs04d10Sdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleOs04d10Sdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_os04d10(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
case SAMPLE_VIN_SINGLE_OS04D10_720P60:
|
|
eSnsType = OMNIVISION_OS04D10;
|
|
/* comm pool config */
|
|
__cal_dump_pool(gtSysCommPoolSingleOs04d10Sdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04d10Sdr) / sizeof(gtSysCommPoolSingleOs04d10Sdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleOs04d10Sdr;
|
|
|
|
/* private pool config */
|
|
__cal_dump_pool(gtPrivatePoolSingleOs04d10Sdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleOs04d10Sdr) / sizeof(gtPrivatePoolSingleOs04d10Sdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleOs04d10Sdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_os04d10_720p60(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
case SAMPLE_VIN_SINGLE_SC850SL:
|
|
eSnsType = SMARTSENS_SC850SL;
|
|
/* comm pool config */
|
|
__cal_dump_pool(gtSysCommPoolSingleSc850slSdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleSc850slSdr) / sizeof(gtSysCommPoolSingleSc850slSdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleSc850slSdr;
|
|
|
|
/* private pool config */
|
|
__cal_dump_pool(gtPrivatePoolSingleSc850slSdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleSc850slSdr) / sizeof(gtPrivatePoolSingleSc850slSdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleSc850slSdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_sc850sl(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
case SAMPLE_VIN_SINGLE_SC850SL_1080P60:
|
|
eSnsType = SMARTSENS_SC850SL;
|
|
/* comm pool config */
|
|
__cal_dump_pool(gtSysCommPoolSingleSc850slSdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleSc850slSdr) / sizeof(gtSysCommPoolSingleSc850slSdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleSc850slSdr;
|
|
|
|
/* private pool config */
|
|
__cal_dump_pool(gtPrivatePoolSingleSc850slSdr, pVinParam->eHdrMode, pVinParam->nDumpFrameNum);
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleSc850slSdr) / sizeof(gtPrivatePoolSingleSc850slSdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleSc850slSdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_sc850sl_1080p60(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
default:
|
|
eSnsType = SAMPLE_SNS_DUMMY;
|
|
/* pool config */
|
|
pCommonArgs->nPoolCfgCnt = sizeof(gtSysCommPoolSingleDummySdr) / sizeof(gtSysCommPoolSingleDummySdr[0]);
|
|
pCommonArgs->pPoolCfg = gtSysCommPoolSingleDummySdr;
|
|
|
|
/* private pool config */
|
|
pPrivArgs->nPoolCfgCnt = sizeof(gtPrivatePoolSingleDummySdr) / sizeof(gtPrivatePoolSingleDummySdr[0]);
|
|
pPrivArgs->pPoolCfg = gtPrivatePoolSingleDummySdr;
|
|
|
|
/* cams config */
|
|
__sample_case_single_dummy(pCamList, eSnsType, pVinParam, pCommonArgs);
|
|
break;
|
|
}
|
|
mod_param.unlock(AX_MOD_VI);
|
|
return 0;
|
|
}
|
|
|
|
static SAMPLE_VIN_CASE_E __get_vi_case(char *sensor_name, int &w, int &h, int &fps) {
|
|
if (strcmp(sensor_name, "os04a10") == 0) {
|
|
w = 2688;
|
|
h = 1520;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_OS04A10;
|
|
} else if (strcmp(sensor_name, "sc450ai") == 0) {
|
|
w = 2688;
|
|
h = 1520;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_SC450AI;
|
|
} else if (strcmp(sensor_name, "sc850sl") == 0) {
|
|
if (w == -1 || h == -1) {
|
|
w = 3840;
|
|
h = 2160;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_SC850SL;
|
|
}
|
|
|
|
if (fps > 30 || fps <= 0) {
|
|
if (w > 1920 || h > 1080) {
|
|
w = 3840;
|
|
h = 2160;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_SC850SL;
|
|
} else {
|
|
w = 1920;
|
|
h = 1080;
|
|
fps = 60;
|
|
return SAMPLE_VIN_SINGLE_SC850SL_1080P60;
|
|
}
|
|
} else {
|
|
w = 3840;
|
|
h = 2160;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_SC850SL;
|
|
}
|
|
} else if (strcmp(sensor_name, "os04d10") == 0) {
|
|
if (w == -1 || h == -1) {
|
|
w = 2560;
|
|
h = 1440;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_OS04D10;
|
|
}
|
|
|
|
if (fps > 30 || fps <= 0) {
|
|
if (w > 1280 || h > 720) {
|
|
w = 2560;
|
|
h = 1440;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_OS04D10;
|
|
} else {
|
|
w = 1280;
|
|
h = 720;
|
|
fps = 60;
|
|
return SAMPLE_VIN_SINGLE_OS04D10_720P60;
|
|
}
|
|
} else {
|
|
w = 2560;
|
|
h = 1440;
|
|
fps = 30;
|
|
return SAMPLE_VIN_SINGLE_OS04D10;
|
|
}
|
|
} else {
|
|
log::error("Can't find sensor %s", sensor_name);
|
|
return SAMPLE_VIN_NONE;
|
|
}
|
|
}
|
|
|
|
static AX_S32 COMMON_SYS_Init2(COMMON_SYS_ARGS_T *pCommonArgs)
|
|
{
|
|
AX_S32 axRet = 0;
|
|
AX_POOL_FLOORPLAN_T tPoolFloorPlan = {0};
|
|
|
|
axRet = AX_SYS_Init();
|
|
if (0 != axRet) {
|
|
COMM_SYS_PRT("AX_SYS_Init failed, ret=0x%x.\n", axRet);
|
|
return -1;
|
|
}
|
|
|
|
/* Release last Pool */
|
|
axRet = AX_POOL_Exit();
|
|
if (0 != axRet) {
|
|
COMM_SYS_PRT("AX_POOL_Exit fail!!Error Code:0x%X\n", axRet);
|
|
}
|
|
|
|
/* Calc Pool BlkSize/BlkCnt */
|
|
axRet = COMMON_SYS_CalcPool(pCommonArgs->pPoolCfg, pCommonArgs->nPoolCfgCnt, &tPoolFloorPlan);
|
|
if (0 != axRet) {
|
|
COMM_SYS_PRT("COMMON_SYS_CalcPool failed, ret=0x%x.\n", axRet);
|
|
return -1;
|
|
}
|
|
|
|
axRet = AX_POOL_SetConfig(&tPoolFloorPlan);
|
|
if (0 != axRet) {
|
|
COMM_SYS_PRT("AX_POOL_SetConfig fail!Error Code:0x%X\n", axRet);
|
|
}
|
|
|
|
axRet = AX_POOL_GetConfig(&tPoolFloorPlan);
|
|
if (0 != axRet) {
|
|
COMM_SYS_PRT("AX_POOL_GetConfig fail!Error Code:0x%X\n", axRet);
|
|
}
|
|
// for (int i = 0; i < AX_MAX_COMM_POOLS; i++) {
|
|
// if (tPoolFloorPlan.CommPool[i].BlkCnt > 0) {
|
|
// printf("CommPool[%d].MetaSize:%lld\r\n", i, tPoolFloorPlan.CommPool[i].MetaSize);
|
|
// printf("CommPool[%d].BlkSize:%lld\r\n", i, tPoolFloorPlan.CommPool[i].BlkSize);
|
|
// printf("CommPool[%d].BlkCnt:%d\r\n", i, tPoolFloorPlan.CommPool[i].BlkCnt);
|
|
// printf("CommPool[%d].IsMergeMode:%d\r\n", i, tPoolFloorPlan.CommPool[i].IsMergeMode);
|
|
// printf("CommPool[%d].CacheMode:%d\r\n", i, tPoolFloorPlan.CommPool[i].CacheMode);
|
|
// printf("CommPool[%d].PartitionName:%s\r\n", i, tPoolFloorPlan.CommPool[i].PartitionName);
|
|
// printf("CommPool[%d].PoolName:%s\r\n", i, tPoolFloorPlan.CommPool[i].PoolName);
|
|
// }
|
|
// }
|
|
|
|
axRet = AX_POOL_Init();
|
|
if (0 != axRet) {
|
|
COMM_SYS_PRT("AX_POOL_Init fail!!Error Code:0x%X\n", axRet);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static std::vector<int> __scan_i2c_addr(int id)
|
|
{
|
|
char buf[32];
|
|
std::vector<int> data;
|
|
int addr_start = 0x08;
|
|
int addr_end = 0x77;
|
|
|
|
snprintf(buf, sizeof(buf), "/dev/i2c-%d", id);
|
|
int fd = ::open(buf, O_RDWR);
|
|
if (fd < 0)
|
|
{
|
|
::close(fd);
|
|
throw err::Exception(err::Err::ERR_IO, "open " + std::string(buf) + " failed");
|
|
}
|
|
|
|
for (int address = addr_start; address <= addr_end; ++address)
|
|
{
|
|
if (::ioctl(fd, I2C_SLAVE, address) < 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
unsigned char buffer[1];
|
|
if (::read(fd, buffer, sizeof(buffer)) >= 0)
|
|
{
|
|
data.push_back(address);
|
|
}
|
|
}
|
|
|
|
::close(fd);
|
|
return data;
|
|
}
|
|
|
|
static std::pair<bool, std::string> __get_sensor_name(void) {
|
|
// char name[30];
|
|
std::string name;
|
|
// scan iic list
|
|
std::vector<int> addr_list = __scan_i2c_addr(0);
|
|
for (size_t i = 0; i < addr_list.size(); i++) {
|
|
// log::info("i2c4 addr: 0x%02x", addr_list[i]);
|
|
switch (addr_list[i]) {
|
|
case 0x30:
|
|
// log::info("find sc850sl, addr %#x", addr_list[i]);
|
|
name = "sc850sl";
|
|
return {true, name};
|
|
case 0x36:
|
|
name = "os04a10";
|
|
return {true, name};
|
|
case 0x3c:
|
|
name = "os04d10";
|
|
return {true, name};
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// AX_ISP_CloseSnsClk(0);
|
|
// return {false, ""};
|
|
return {true, "sc850sl"};
|
|
}
|
|
|
|
class SYS {
|
|
bool __is_inited;
|
|
bool __raw;
|
|
public:
|
|
SYS(bool raw = false) {
|
|
__raw = raw;
|
|
__is_inited = false;
|
|
}
|
|
~SYS() {
|
|
if (__is_inited) {
|
|
deinit();
|
|
}
|
|
|
|
// release jpg
|
|
ax_sys_mod_t *sys_param = nullptr;
|
|
auto &mod_param = AxModuleParam::getInstance();
|
|
|
|
mod_param.lock(AX_MOD_SYS);
|
|
sys_param = (ax_sys_mod_t *)mod_param.get_param(AX_MOD_SYS);
|
|
auto sys_init_count = sys_param->init_count;
|
|
mod_param.unlock(AX_MOD_SYS);
|
|
|
|
mod_param.lock(AX_MOD_JPG);
|
|
auto jpg_param = (ax_jpg_mod_t *)mod_param.get_param(AX_MOD_JPG);
|
|
auto jpg_init_count = jpg_param->init_count;
|
|
mod_param.unlock(AX_MOD_JPG);
|
|
|
|
if (sys_init_count == 1 && jpg_init_count > 0) {
|
|
auto err = ax_jpg_enc_deinit();
|
|
if (err != err::ERR_NONE) {
|
|
log::error("ax_jpg_enc_deinit failed, err: %d", err);
|
|
}
|
|
}
|
|
}
|
|
|
|
err::Err init() {
|
|
if (__is_inited) return err::ERR_NONE;
|
|
ax_sys_mod_t *sys_param = nullptr;
|
|
auto &mod_param = AxModuleParam::getInstance();
|
|
mod_param.lock(AX_MOD_SYS);
|
|
sys_param = (ax_sys_mod_t *)mod_param.get_param(AX_MOD_SYS);
|
|
if (sys_param->init_count > 0) {
|
|
sys_param->init_count ++;
|
|
} else {
|
|
COMMON_SYS_ARGS_T tCommonArgs = {0};
|
|
COMMON_SYS_ARGS_T tPrivArgs = {0};
|
|
SAMPLE_VIN_PARAM_T tVinParam = {
|
|
.eSysCase = SAMPLE_VIN_SINGLE_SC450AI,
|
|
.eSysMode = COMMON_VIN_SENSOR,
|
|
.eHdrMode = AX_SNS_LINEAR_MODE,
|
|
.eLoadRawNode = LOAD_RAW_IFE,
|
|
.bAiispEnable = AX_FALSE,
|
|
.statDeltaPtsFrmNum = 0,
|
|
};
|
|
|
|
auto get_sensor_res = __get_sensor_name();
|
|
if (!get_sensor_res.first) {
|
|
log::error("get sensor name failed");
|
|
return err::ERR_RUNTIME;
|
|
}
|
|
|
|
int w = -1, h = -1, fps = 30;
|
|
tVinParam.eSysCase = __get_vi_case((char *)get_sensor_res.second.c_str(), w, h, fps);
|
|
|
|
// check if enable ai-isp
|
|
AX_BOOL ai_isp_on = app::get_sys_config_kv("npu", "ai_isp", "1") == "1" ? AX_TRUE : AX_FALSE;
|
|
tVinParam.bAiispEnable = ai_isp_on;
|
|
|
|
__sample_case_config(&tVinParam, &tCommonArgs, &tPrivArgs);
|
|
::memcpy(&sys_param->tCommonArgs, &tCommonArgs, sizeof(COMMON_SYS_ARGS_T));
|
|
::memcpy(&sys_param->tPrivArgs, &tPrivArgs, sizeof(COMMON_SYS_ARGS_T));
|
|
AX_S32 axRet = COMMON_SYS_Init2(&sys_param->tCommonArgs);
|
|
if (axRet) {
|
|
mod_param.unlock(AX_MOD_SYS);
|
|
COMM_ISP_PRT("COMMON_SYS_Init fail, ret:0x%x", axRet);
|
|
return err::ERR_RUNTIME;
|
|
}
|
|
sys_param->init_count = 1;
|
|
}
|
|
mod_param.unlock(AX_MOD_SYS);
|
|
|
|
log::info("maix multi-media driver used count: %d", sys_param->init_count);
|
|
__is_inited = true;
|
|
return err::ERR_NONE;
|
|
}
|
|
|
|
void deinit() {
|
|
if (!__is_inited) return;
|
|
ax_sys_mod_t *sys_param = nullptr;
|
|
auto &mod_param = AxModuleParam::getInstance();
|
|
mod_param.lock(AX_MOD_SYS);
|
|
sys_param = (ax_sys_mod_t *)mod_param.get_param(AX_MOD_SYS);
|
|
err::check_null_raise(sys_param, "Get ax sys parameter failed!");
|
|
if (sys_param->init_count > 1) {
|
|
sys_param->init_count --;
|
|
// log::info("sys deinit success, count:%d", sys_param->init_count);
|
|
} else {
|
|
sys_param->init_count = 0;
|
|
AX_S32 axRet = AX_POOL_Exit();
|
|
// if (axRet != AX_SUCCESS) {
|
|
// log::error("AX_POOL_Exit failed, ret:%#x", axRet);
|
|
// }
|
|
|
|
axRet = AX_SYS_Deinit();
|
|
if (axRet != AX_SUCCESS) {
|
|
log::error("AX_SYS_Deinit failed, ret:%#x", axRet);
|
|
}
|
|
// printf("maix multi-media driver released.\r\n");
|
|
}
|
|
log::info("maix multi-media driver used count: %d%s", sys_param->init_count, sys_param->init_count == 0 ? ", driver released." : "");
|
|
mod_param.unlock(AX_MOD_SYS);
|
|
__is_inited = false;
|
|
}
|
|
};
|
|
|
|
typedef enum {
|
|
FRAME_FROM_IVPS_CHN = 0,
|
|
FRAME_FROM_SYS_MEM_ALLOC,
|
|
FRAME_FROM_VENC_GET_STREAM,
|
|
FRAME_FROM_GET_BLOCK,
|
|
FRAME_FROM_MALLOC,
|
|
FRAME_FROM_VDEC_GET_STREAM,
|
|
FRAME_FROM_AX_MALLOC,
|
|
FRAME_FROM_AUDIO_GET_FRAME,
|
|
FRAME_FROM_AUDIO_FRAME,
|
|
FRAME_FROM_GET_RAW_FRAME,
|
|
} frame_from_e;
|
|
|
|
class Frame {
|
|
public:
|
|
void *data;
|
|
uint64_t phy_addr;
|
|
int len;
|
|
int w;
|
|
int h;
|
|
AX_IMG_FORMAT_E fmt;
|
|
void *frame;
|
|
void *__param;
|
|
Frame(IVPS_GRP IvpsGrp, IVPS_CHN IvpsChn, AX_VIDEO_FRAME_T *ptFrame, frame_from_e from = FRAME_FROM_IVPS_CHN, AX_IMG_FORMAT_E invert_fmt = AX_FORMAT_INVALID);
|
|
Frame(int venc_ch, AX_VENC_STREAM_T *frame, frame_from_e from = FRAME_FROM_VENC_GET_STREAM);
|
|
Frame(int vdec_ch, AX_VIDEO_FRAME_INFO_T *frame, frame_from_e from = FRAME_FROM_VDEC_GET_STREAM);
|
|
Frame(int w, int h, void *data, int data_size, AX_IMG_FORMAT_E fmt);
|
|
Frame(int pool_id, int w, int h, void *data, int data_size, AX_IMG_FORMAT_E fmt);
|
|
Frame(void *data, int data_size, frame_from_e from = FRAME_FROM_MALLOC);
|
|
Frame(int card, int device, AX_AUDIO_FRAME_T *frame, frame_from_e from = FRAME_FROM_AUDIO_GET_FRAME);
|
|
Frame(int card, int device, void *data, int data_size, AX_AUDIO_BIT_WIDTH_E bit_width, AX_AUDIO_SOUND_MODE_E sound_mode, frame_from_e from = FRAME_FROM_AUDIO_FRAME);
|
|
Frame(AX_U8 nPipeId, AX_VIN_PIPE_DUMP_NODE_E eRawId, AX_SNS_HDR_FRAME_E eSnsFrame, AX_IMG_INFO_T *pImgInfo, frame_from_e from = FRAME_FROM_GET_RAW_FRAME);
|
|
~Frame();
|
|
frame_from_e from();
|
|
err::Err get_video_frame(AX_VIDEO_FRAME_T * frame);
|
|
err::Err set_video_frame(AX_VIDEO_FRAME_T * frame);
|
|
err::Err get_audio_frame(AX_AUDIO_FRAME_T * frame);
|
|
err::Err set_audio_frame(AX_AUDIO_FRAME_T * frame);
|
|
err::Err get_venc_stream(AX_VENC_STREAM_T * stream);
|
|
err::Err set_venc_stream(AX_VENC_STREAM_T * stream);
|
|
err::Err get_video_frame_info(AX_VIDEO_FRAME_INFO_T * stream);
|
|
err::Err set_video_frame_info(AX_VIDEO_FRAME_INFO_T * stream);
|
|
};
|
|
|
|
class ENGINE {
|
|
bool __is_inited;
|
|
AX_ENGINE_NPU_MODE_T __mode;
|
|
public:
|
|
ENGINE(AX_ENGINE_NPU_MODE_T mode);
|
|
~ENGINE();
|
|
err::Err init();
|
|
void deinit();
|
|
};
|
|
|
|
class VI {
|
|
public:
|
|
VI();
|
|
~VI();
|
|
|
|
std::pair<bool, std::string> get_sensor_name(void) {
|
|
return __get_sensor_name();
|
|
}
|
|
|
|
SAMPLE_VIN_CASE_E get_vi_case(char *sensor_name, int &w, int &h, int &fps) {
|
|
return __get_vi_case(sensor_name, w, h, fps);
|
|
}
|
|
|
|
AX_U32 config_sample_case(SAMPLE_VIN_PARAM_T *pVinParam, COMMON_SYS_ARGS_T *pCommonArgs,
|
|
COMMON_SYS_ARGS_T *pPrivArgs) {
|
|
return __sample_case_config(pVinParam, pCommonArgs, pPrivArgs);
|
|
}
|
|
|
|
err::Err init();
|
|
err::Err deinit();
|
|
int get_unused_channel();
|
|
err::Err add_channel(int ch, int width, int height, AX_IMG_FORMAT_E format, int fps, int depth, bool mirror, bool vflip, int fit);
|
|
err::Err del_channel(int ch);
|
|
err::Err del_channel_all();
|
|
err::Err set_windowing(int ch, int x, int y, int w, int h);
|
|
maixcam2::Frame *pop(int ch, int32_t timeout_ms = 1000);
|
|
maixcam2::Frame *pop_raw(int ch, int32_t timeout_ms = 1000);
|
|
int set_and_get_exposure(int value); // input -1: get only
|
|
int set_and_get_gain(int value); // input -1: get only
|
|
int set_and_get_luma(int value); // input -1: get only
|
|
int set_and_get_saturation(int value); // input -1: get only
|
|
int set_and_get_constrast(int value); // input -1: get only
|
|
int set_and_get_hue(int value); // input -1: get only
|
|
int set_and_get_mirror(int ch, int value); // input -1: get only
|
|
int set_and_get_flip(int ch, int value); // input -1: get only
|
|
int set_and_get_awb_mode(int value); // input -1: get only
|
|
int set_and_get_exp_mode(int value); // input -1: get only
|
|
private:
|
|
// void *_param = nullptr;
|
|
};
|
|
|
|
class VO {
|
|
int __layer;
|
|
int __ch;
|
|
bool __is_inited;
|
|
public:
|
|
VO();
|
|
~VO();
|
|
err::Err init(ax_vo_param_t *param);
|
|
void deinit();
|
|
int get_unused_channel(int layer);
|
|
err::Err get_channel_param(int layer, int ch, ax_vo_channel_param_t *param);
|
|
err::Err add_channel(int layer, int ch, ax_vo_channel_param_t *param);
|
|
err::Err del_channel(int layer, int ch);
|
|
err::Err del_channel_all();
|
|
err::Err push(int layer, int ch, maixcam2::Frame *frame);
|
|
};
|
|
|
|
class VENC {
|
|
public:
|
|
VENC(ax_venc_param_t *cfg);
|
|
~VENC();
|
|
err::Err push(maixcam2::Frame *frame, int32_t timeout_ms);
|
|
maixcam2::Frame * pop(int32_t timeout_ms);
|
|
err::Err get_config(ax_venc_param_t *cfg);
|
|
int get_channel() {
|
|
return _ch;
|
|
}
|
|
private:
|
|
int _ch;
|
|
};
|
|
|
|
class VDEC {
|
|
public:
|
|
VDEC(ax_vdec_param_t *cfg);
|
|
~VDEC();
|
|
err::Err push(maixcam2::Frame *frame, int32_t timeout_ms);
|
|
maixcam2::Frame * pop(int32_t timeout_ms);
|
|
err::Err get_config(ax_vdec_param_t *cfg);
|
|
int get_channel() {
|
|
return _ch;
|
|
}
|
|
private:
|
|
int _ch;
|
|
void *param;
|
|
};
|
|
|
|
class AudioIn {
|
|
public:
|
|
AudioIn(ax_audio_in_param_t *cfg);
|
|
~AudioIn();
|
|
err::Err init();
|
|
err::Err deinit();
|
|
maixcam2::Frame *read(int32_t timeout_ms = -1);
|
|
float volume(float volume);
|
|
err::Err reset();
|
|
int period_size(int size);
|
|
int period_count(int count);
|
|
private:
|
|
void *param;
|
|
};
|
|
|
|
class AudioOut {
|
|
public:
|
|
AudioOut(ax_audio_out_param_t *cfg);
|
|
~AudioOut();
|
|
err::Err init();
|
|
err::Err deinit();
|
|
bool mute(int mute); // mute = -1, get mute, mute = 0, mute, mute = 1, unmute
|
|
float volume(float volume); // volume = -1, get volume, volume = 0~1, set volume
|
|
err::Err pause();
|
|
err::Err resume();
|
|
err::Err write(maixcam2::Frame *frame, int32_t timeout_ms = -1);
|
|
err::Err clear(void);
|
|
err::Err wait(int32_t timeout_ms = -1);
|
|
err::Err state(int &total_num, int &free_num, int &busy_num, int &pcm_delay);
|
|
int period_size(int size = -1);
|
|
int period_count(int count = -1);
|
|
private:
|
|
void *param;
|
|
};
|
|
};
|
|
|
|
#endif
|