初版
This commit is contained in:
@@ -0,0 +1,648 @@
|
||||
#ifndef DEVICE_VIDEO_H
|
||||
#define DEVICE_VIDEO_H
|
||||
|
||||
#include "video_ioctl.h"
|
||||
#include "device/device.h"
|
||||
|
||||
#define VIDEO_DEFAULT_BUF_MODE 0x0
|
||||
#define VIDEO_PPBUF_MODE 0x1
|
||||
|
||||
#define VIDEO_TAG_UVC VIDEO_TAG('u', 'v', 'c', ' ')
|
||||
#define VIDEO_TAG(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
||||
|
||||
struct videobuf_queue {
|
||||
u8 ref;
|
||||
u8 streaming;
|
||||
u16 align;
|
||||
const char *name;
|
||||
OS_SEM sem;
|
||||
void *buf;
|
||||
struct lbuff_head *lbuf;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
enum {
|
||||
VIDREQ_GET_OVERLAY_BUFFER,
|
||||
VIDREQ_PUT_OVERLAY_BUFFER,
|
||||
VIDREQ_FREE_OVERLAY_BUFFER,
|
||||
VIDREQ_GET_CAPTURE_BUFFER,
|
||||
VIDREQ_SET_CAPTURE_BUFFER,
|
||||
VIDREQ_PUT_CAPTURE_BUFFER,
|
||||
VIDREQ_FREE_CAPTURE_BUFFER,
|
||||
VIDREQ_GET_IMAGE_CAPTURE_BUFFER,
|
||||
VIDREQ_PUT_IMAGE_CAPTURE_BUFFER,
|
||||
VIDREQ_IMAGE_CAPTURE_COMPLETED,
|
||||
VIDREQ_IMAGE_ZOOM, // 10
|
||||
/*VIDREQ_IMAGE_DISP_ZOOM,*/
|
||||
VIDREQ_IMAGE_ENC_START,
|
||||
/*VIDREQ_GET_DISP_CAPABILITY,*/
|
||||
VIDREQ_GET_ENCODER_CHANNEL,
|
||||
/*VIDREQ_PUT_IMAGE_TO_BUFFER, // 15*/
|
||||
/*VIDREQ_RESET_DISP_IMAGE,*/
|
||||
VIDREQ_RESET_CBUFFER,
|
||||
/*VIDREQ_PUT_DEC_DATA,*/
|
||||
VIDREQ_GET_DEC_DATA,
|
||||
VIDREQ_RESET_DOWN_CBUFFER, //20
|
||||
VIDREQ_RESET_UP_CBUFFER,
|
||||
VIDREQ_RESET_ENCODER,
|
||||
VIDREQ_REKSTART_ENCODER,
|
||||
VIDREQ_WAIT_ENC_END_STOP_IMC,
|
||||
VIDREQ_GET_FNUM,
|
||||
VIDREQ_PAUSE_ENC,
|
||||
VIDREQ_CONTINUE_ENC,
|
||||
VIDREQ_PAUSE_ENC_CHANNEL,
|
||||
VIDREQ_CONTINUE_ENC_CHANNEL,
|
||||
VIDREQ_GET_TIME_LABEL,
|
||||
VIDREQ_SET_SOFT_IMAGE_LABEL,
|
||||
VIDREQ_CAMERA_OUT,
|
||||
VIDREQ_RESET_UVC_ENC,
|
||||
VIDREQ_ENCODE_ONE_IMAGE,
|
||||
VIDREQ_SET_JPG_THUMBNAILS,
|
||||
VIDREQ_ASYNC_PUT_DEC_DATA,
|
||||
VIDREQ_BUFF_MOVE,
|
||||
VIDREQ_GET_MANUAL_ENC_YUV,
|
||||
VIDREQ_MANUAL_ENC_STREAM,
|
||||
VIDREQ_GET_SRC_FMT,
|
||||
VIDREQ_FLUSHINV_DEC_DATA,
|
||||
VIDREQ_INSERT_WATERMARKIGN,
|
||||
VIDREQ_MANUAL_DISP_PUTMAP,
|
||||
VIDREQ_KICK_UP_ONE_FRMAE,
|
||||
VIDREQ_GET_CORRECT_SIZE,
|
||||
};
|
||||
|
||||
enum video_rec_quality {
|
||||
VIDEO_LOW_Q,
|
||||
VIDEO_MID_Q,
|
||||
VIDEO_HIG_Q,
|
||||
};
|
||||
|
||||
enum video_camera_type {
|
||||
VIDEO_CAMERA_NORMAL = 0,
|
||||
VIDEO_CAMERA_UVC,
|
||||
VIDEO_CAMERA_VIRTUAL,
|
||||
VIDEO_CAMERA_JLC,
|
||||
VIDEO_CAMERA_MUX,
|
||||
};
|
||||
|
||||
|
||||
#define VIDEO_DIR_NONE 0
|
||||
#define VIDEO_HOR_MIRROR BIT(0)
|
||||
#define VIDEO_VER_MIRROR BIT(1)
|
||||
|
||||
|
||||
struct YUV_frame_data {
|
||||
u16 width;
|
||||
u16 height;
|
||||
u16 line_num;
|
||||
u16 data_height;
|
||||
int pixformat;
|
||||
u8 *y;
|
||||
u8 *u;
|
||||
u8 *v;
|
||||
};
|
||||
|
||||
struct video_frame_yuv {
|
||||
u16 width;
|
||||
u16 height;
|
||||
u8 *y;
|
||||
u8 *u;
|
||||
u8 *v;
|
||||
};
|
||||
|
||||
struct video_yuv_buffer {
|
||||
u8 *y;
|
||||
u8 *u;
|
||||
u8 *v;
|
||||
};
|
||||
|
||||
struct image_scale_data {
|
||||
u8 zstate;
|
||||
u32 src_reg_data;
|
||||
u16 out_width;
|
||||
u16 out_height;
|
||||
u8 *output_buf;
|
||||
struct YUV_frame_data input_frame;
|
||||
};
|
||||
|
||||
struct video_image_enc {
|
||||
u8 mkstart;
|
||||
u16 img_width;
|
||||
u16 img_height;
|
||||
u16 blk_width;
|
||||
u16 blk_height;
|
||||
struct video_yuv_buffer *blk_buf;
|
||||
};
|
||||
|
||||
struct video_image_dec {
|
||||
u8 fkstart;
|
||||
u16 width;
|
||||
u16 height;
|
||||
u8 *buf;
|
||||
u32 size;
|
||||
struct video_yuv_buffer *blk_buf;
|
||||
};
|
||||
|
||||
struct video_decode_frame {
|
||||
u8 type;
|
||||
unsigned int reset : 1;
|
||||
unsigned int mode : 7; //0 -- display, 1 -- encode
|
||||
u16 width;
|
||||
int line;
|
||||
u8 *buf;
|
||||
u8 *circle_y;
|
||||
u8 *circle_u;
|
||||
u8 *circle_v;
|
||||
int cnt;
|
||||
};
|
||||
|
||||
struct video_encode_frame {
|
||||
u8 type;
|
||||
u8 reset;
|
||||
u8 *buf;
|
||||
int cnt;
|
||||
int lines;
|
||||
};
|
||||
|
||||
struct video_cap_buffer {
|
||||
u8 num;
|
||||
u32 size;
|
||||
u8 *buf;
|
||||
u8 *buf2;
|
||||
u8 ch_num;
|
||||
u8 ch_busy;
|
||||
u8 ch_lock;
|
||||
};
|
||||
|
||||
|
||||
struct video_subdevice;
|
||||
struct video_var_param_info;
|
||||
|
||||
struct video_subdevice_data {
|
||||
int tag;
|
||||
void *data;
|
||||
};
|
||||
|
||||
struct video_platform_data {
|
||||
int num;
|
||||
const struct video_subdevice_data *data;
|
||||
};
|
||||
|
||||
struct roi_cfg {
|
||||
u32 roio_xy;
|
||||
u32 roi1_xy;
|
||||
u32 roi2_xy;
|
||||
u32 roi3_xy;
|
||||
u32 roio_ratio;
|
||||
u32 roio_ratio1;
|
||||
u32 roio_ratio2;
|
||||
u32 roio_ratio3;
|
||||
u32 roio_config;
|
||||
};
|
||||
|
||||
struct jpg_q_table {
|
||||
u16 YQT_DCT[0x40] ;
|
||||
u16 UVQT_DCT[0x40];
|
||||
u8 DQT[138]; //file header
|
||||
};
|
||||
|
||||
enum video_pix_format {
|
||||
VID_PIX_FMT_H264,
|
||||
VID_PIX_FMT_MJPG,
|
||||
VID_PIX_FMT_IMG,
|
||||
VID_PIX_FMT_YUV,
|
||||
};
|
||||
|
||||
enum image_pix_format {
|
||||
IMG_PIX_FMT_JPG,
|
||||
IMG_PIX_FMT_YUV,
|
||||
};
|
||||
|
||||
struct h264_user_data {
|
||||
u8 *data;
|
||||
u32 len;
|
||||
};
|
||||
|
||||
struct h264_s_attr {
|
||||
u8 quality;
|
||||
u8 IP_interval;
|
||||
u8 std_head;
|
||||
u16 width;
|
||||
u16 height;
|
||||
/*u32 i_bitrate;*/
|
||||
u32 gap_fps;
|
||||
};
|
||||
|
||||
struct h264_qp {
|
||||
u8 static_min;
|
||||
u8 static_max;
|
||||
u8 dynamic_min;
|
||||
u8 dynamic_max;
|
||||
u8 enable_change_qp;
|
||||
};
|
||||
|
||||
struct h264_d_attr {
|
||||
u32 abr_kbps;
|
||||
struct roi_cfg roi;
|
||||
struct h264_qp qp;
|
||||
|
||||
};
|
||||
|
||||
struct mjpg_s_attr {
|
||||
u8 enc_mode;//0 -- 整帧, 1 -- 帧分段
|
||||
u8 quality;
|
||||
u8 samp_fmt;
|
||||
u8 source;
|
||||
int head_len;
|
||||
u16 width;
|
||||
u16 height;
|
||||
u32 abr_kbps;
|
||||
u32 div_size;
|
||||
|
||||
u8 *exif;
|
||||
int exif_size;
|
||||
u8 dri_en; //jpeg位流分段使能
|
||||
u32 jpeg_dri_mcu_cnt; //jpeg分段位流 mcu配置
|
||||
|
||||
|
||||
};
|
||||
|
||||
struct mjpg_d_attr {
|
||||
struct jpg_q_table *qt;
|
||||
u8 *thumbnails;
|
||||
int thumb_len;
|
||||
};
|
||||
|
||||
struct icap_auxiliary_mem {
|
||||
u8 *addr;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct image_s_attr {
|
||||
u8 quality;
|
||||
u16 width;
|
||||
u16 height;
|
||||
enum image_pix_format format;
|
||||
int aligned_width;
|
||||
struct jpg_q_table *jpg_qt;
|
||||
struct icap_auxiliary_mem *aux_mem;
|
||||
struct jpg_thumbnail *thumb;
|
||||
|
||||
u8 *exif;
|
||||
int exif_size;
|
||||
};
|
||||
|
||||
struct jpg_dec_mem {
|
||||
u8 *addr;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct jpg_dec_s_attr {
|
||||
u16 max_o_width;
|
||||
u16 max_o_height;
|
||||
u16 src_width;
|
||||
u16 src_height;
|
||||
u16 dec_width;
|
||||
u16 dec_height;
|
||||
struct jpg_dec_mem dec_mem;
|
||||
};
|
||||
|
||||
struct video_enc_attr {
|
||||
enum video_pix_format format;
|
||||
void *attr;
|
||||
};
|
||||
|
||||
struct video_dec_attr {
|
||||
enum video_pix_format format;
|
||||
void *attr;
|
||||
};
|
||||
|
||||
struct yuv_image {
|
||||
u8 format;
|
||||
u16 width;
|
||||
u16 height;
|
||||
u8 *addr;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct video_dev_fps {
|
||||
u8 camera_fps;
|
||||
u8 real_fps; //imc real fps !!!
|
||||
u8 target_fps;
|
||||
int tlp_time;
|
||||
};
|
||||
|
||||
struct video_osd {
|
||||
|
||||
u16 x ;//起始地址
|
||||
u16 y ;//结束地址
|
||||
// u32 osd_yuv;//osd颜色
|
||||
u32 color[3]; //2bit图像yuv颜色配置
|
||||
|
||||
//注意:下面的字符串地址必须是全局的,然后年是yyyy,月是nn,日是dd,时是hh,分是mm,秒是ss,其他字符是英文字母&&符号&&汉字
|
||||
char *osd_str; //用户自定义格式,例如 "yyyy-nn-dd\hh:mm:ss" 或者 "hh:mm:ss"
|
||||
char *osd_matrix_str; //用户自定义字模字符串,例如“abcd....0123..”
|
||||
u8 *osd_matrix_base; //用户自定义字模的起始地址
|
||||
u32 osd_matrix_len;//用户自定义字模数组的长度,no str len!!!
|
||||
u8 osd_w;//用户自定义字体大小,8的倍数
|
||||
u8 osd_h;//8的倍数
|
||||
};
|
||||
|
||||
struct image_capture_info {
|
||||
u8 multi_scale;
|
||||
struct video_image_capture *icap;
|
||||
};
|
||||
#if 1
|
||||
enum video_osd_mode {
|
||||
VID_OSD_TEXT = 0,
|
||||
VID_OSD_GRAPH,
|
||||
};
|
||||
|
||||
enum video_osd_type {
|
||||
VIDEO_STREAM_OSD,
|
||||
VIDEO_IMAGE_OSD,
|
||||
};
|
||||
|
||||
struct video_text_osd {
|
||||
u16 x;//起始地址
|
||||
u16 y;//结束地址
|
||||
// u32 osd_yuv;//osd颜色
|
||||
u32 color[3]; //2bit图像yuv颜色配置
|
||||
//注意:下面的字符串地址必须是全局的,然后年是yyyy,月是nn,日是dd,时是hh,分是mm,秒是ss,其他字符是英文字母&&符号&&汉字
|
||||
char *text_format; //用户自定义格式,例如 "yyyy-nn-dd\hh:mm:ss" 或者 "hh:mm:ss"
|
||||
char *font_matrix_table; //用户自定义字模字符串,例如“abcd....0123..”
|
||||
u8 *font_matrix_base; //用户自定义字模的起始地址
|
||||
u32 font_matrix_len;//用户自定义字模数组的长度,no str len!!!
|
||||
u8 font_w;//用户自定义字体大小,8的倍数
|
||||
u8 font_h;//8的倍数
|
||||
u8 direction; //0 -- 顺向, 1 -- 逆向
|
||||
u8 bit_mode; //2 - 2bit 1 - 1bit
|
||||
};
|
||||
|
||||
struct video_graph_osd {
|
||||
u8 bit_mode; //2 - 2bit, 16 - 16bit
|
||||
u16 x;
|
||||
u16 y;
|
||||
u32 color[3]; //2bit图像yuv颜色配置
|
||||
u16 width;
|
||||
u16 height;
|
||||
u8 *icon; //图形内容buffer
|
||||
int icon_size;
|
||||
};
|
||||
|
||||
struct video_osd_config {
|
||||
struct video_text_osd text_osd;
|
||||
struct video_graph_osd icon_osd;
|
||||
};
|
||||
|
||||
struct video_osd_attr {
|
||||
u32 enable;
|
||||
u32 ability;
|
||||
enum video_osd_type type;
|
||||
struct video_text_osd *text_osd;
|
||||
struct video_graph_osd *graph_osd;
|
||||
};
|
||||
|
||||
struct app_enc_info {
|
||||
u8 user_cfg_enable;
|
||||
|
||||
int qp_offset_low;
|
||||
int qp_offset_high;
|
||||
float f_aq_strength;
|
||||
|
||||
u8 dsw_size;
|
||||
int fs_x_points;
|
||||
int fs_y_points;
|
||||
|
||||
int nr_reduction;
|
||||
|
||||
int pre_pskip_limit_flag;
|
||||
int common_pskip_limit_flag;
|
||||
int pre_pskip_th;
|
||||
int common_pskip_th;
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
#define VIDEO_REC_NUM 2 //double rec or single rec
|
||||
|
||||
#define VIDEO_PLATFORM_DATA_BEGIN(vdata) \
|
||||
static const struct video_platform_data vdata = { \
|
||||
|
||||
|
||||
#define VIDEO_PLATFORM_DATA_END() \
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct image_capability {
|
||||
u8 zoom;
|
||||
u16 width;
|
||||
u16 height;
|
||||
struct video_image_capture *icap;
|
||||
};
|
||||
|
||||
struct video_subdevice_ops {
|
||||
int (*init)(const char *name, struct video_platform_data *);
|
||||
|
||||
bool (*online)(const char *name);
|
||||
|
||||
int (*get_fmt)(struct video_format *f);
|
||||
|
||||
int (*set_fmt)(struct video_format *f);
|
||||
|
||||
struct video_endpoint *(*open)(struct video_var_param_info *);
|
||||
|
||||
int (*overlay)(struct video_endpoint *, int i);
|
||||
|
||||
int (*streamon)(struct video_endpoint *);
|
||||
|
||||
int (*streamoff)(struct video_endpoint *);
|
||||
|
||||
int (*get_image_capability)(struct video_endpoint *, struct image_capability *);
|
||||
int (*image_capture)(struct video_endpoint *, struct image_capability *);
|
||||
|
||||
int (*response)(struct video_endpoint *, int cmd, void *);
|
||||
|
||||
int (*write)(struct video_endpoint *, void *buf, u32 len);
|
||||
|
||||
int (*close)(struct video_endpoint *);
|
||||
|
||||
int (*querycap)(struct video_endpoint *, struct video_capability *cap);
|
||||
|
||||
int (*ioctrl)(struct video_endpoint *, u32 cmd, void *arg);
|
||||
};
|
||||
|
||||
|
||||
#define MANUAL_CHANNEL 3
|
||||
struct video_var_param_info {
|
||||
u32 fps;
|
||||
u16 width;
|
||||
u16 height;
|
||||
|
||||
u8 ch;
|
||||
u8 channel;
|
||||
int source;
|
||||
struct video_format *f;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct video_subdevice {
|
||||
u8 subid;
|
||||
const char *name;
|
||||
// u32 input_pixelformat;
|
||||
u32 output_pixelformat;
|
||||
const struct video_subdevice_ops *ops;
|
||||
int (*request)(struct video_endpoint *, int cmd, void *);
|
||||
};
|
||||
|
||||
|
||||
struct video_endpoint {
|
||||
struct list_head entry;
|
||||
struct video_subdevice *dev;
|
||||
int inused;
|
||||
void *parent;
|
||||
void *private_data;
|
||||
void *imc_data;
|
||||
};
|
||||
|
||||
struct video_crop_ctrl {
|
||||
u16 crop_sx;
|
||||
u16 crop_ex;
|
||||
u16 crop_sy;
|
||||
u16 crop_ey;
|
||||
};
|
||||
|
||||
struct video_crop_sca {
|
||||
u16 src_w;
|
||||
u16 src_h;
|
||||
u16 crop_w;
|
||||
u16 crop_h;
|
||||
};
|
||||
|
||||
struct video_crop_tri {
|
||||
int (*do_crop)(void *priv, void *parm);
|
||||
void *priv;
|
||||
void *parm;
|
||||
};
|
||||
|
||||
|
||||
extern struct video_subdevice video_subdev_begin[];
|
||||
extern struct video_subdevice video_subdev_end[];
|
||||
|
||||
extern const struct device_operations video_dev_ops;
|
||||
extern const struct device_operations usb_cam_dev_ops;
|
||||
|
||||
#define REGISTER_VIDEO_SUBDEVICE(dev, id) \
|
||||
struct video_subdevice dev SEC_USED(.video_subdev.##id) = { \
|
||||
.subid = id, \
|
||||
.name = #dev, \
|
||||
|
||||
struct video_device;
|
||||
|
||||
struct video_device_ops {
|
||||
const char *name;
|
||||
bool (*online)(void *p);
|
||||
int (*init)(const char *name, const struct video_platform_data *data);
|
||||
int (*open)(struct video_device *);
|
||||
int (*set_fmt)(struct video_device *, struct video_format *);
|
||||
int (*overlay)(struct video_device *, int on);
|
||||
int (*streamon)(struct video_device *);
|
||||
int (*streamoff)(struct video_device *);
|
||||
int (*image_capture)(struct video_device *, struct video_image_capture *icap);
|
||||
int (*start_I_frame)(struct video_device *);
|
||||
int (*adjust_fps)(struct video_device *, void *);
|
||||
int (*ioctl)(struct video_device *, int cmd, u32 arg);
|
||||
int (*write)(struct video_device *, void *data, u32 len);
|
||||
int (*close)(struct video_device *);
|
||||
};
|
||||
|
||||
extern struct video_device_ops video_dev_begin[];
|
||||
extern struct video_device_ops video_dev_end[];
|
||||
|
||||
#define REGISTER_VIDEO_DEVICE(dev, _name) \
|
||||
struct video_device_ops dev SEC_USED(.video_device) = { \
|
||||
.name = _name, \
|
||||
|
||||
struct video_fill_frames {
|
||||
u8 reset_timer;
|
||||
u32 time_cnt;
|
||||
u32 o_frame_cnt;
|
||||
short interval;
|
||||
short fill_dly;
|
||||
char fps_remain;
|
||||
int lost_frames;
|
||||
int timer;
|
||||
int timer_one_frame;
|
||||
spinlock_t lock;
|
||||
int msg_post;
|
||||
};
|
||||
|
||||
struct video_device {
|
||||
struct device device;
|
||||
struct list_head endpoint;
|
||||
struct list_head entry;
|
||||
struct videobuf_queue video_q;
|
||||
struct video_var_param_info info;
|
||||
struct video_subdevice *subdev[4];
|
||||
struct video_image_capture *icap;
|
||||
struct video_device_ops *dev_ops;
|
||||
struct video_dev_fps fps;
|
||||
struct video_fill_frames ff;
|
||||
void *private_data;
|
||||
OS_SEM sem;
|
||||
u8 ref;
|
||||
u8 time_base;
|
||||
u8 streamon;
|
||||
u8 subdev_num;
|
||||
u8 major, mijor;
|
||||
u8 mal_dbuf;
|
||||
u8 stop_now;
|
||||
u32 frame_cnt;
|
||||
u32 stop_frame_cnt;
|
||||
u32 stop_frame_interval;
|
||||
u32 pixelformat;
|
||||
u32 stop_time;
|
||||
u32 stop_skip_frame;
|
||||
u32 start_time;
|
||||
u32 insert_frame_cnt;
|
||||
u32 last_insert_time;
|
||||
};
|
||||
|
||||
int video_subdevice_register(struct video_subdevice *dev);
|
||||
|
||||
|
||||
u32 video_buf_free_space(struct video_device *);
|
||||
|
||||
void *video_buf_malloc(struct video_device *, u32 size);
|
||||
|
||||
void *video_buf_realloc(struct video_device *, void *buf, int size);
|
||||
|
||||
void video_buf_free(struct video_device *, void *buf);
|
||||
|
||||
void *video_buf_ptr(void *buf);
|
||||
|
||||
u32 video_buf_size(void *buf);
|
||||
|
||||
void video_buf_stream_finish(struct video_device *, void *buf);
|
||||
|
||||
void video_check_stream_finish(struct video_device *video);
|
||||
|
||||
int video_buf_query(struct video_device *ep, struct videobuf_state *sta);
|
||||
|
||||
int video_subdev_request(struct video_endpoint *ep, int req, void *arg);
|
||||
|
||||
int video_dev_is_need_fill_frame(struct video_device *video);
|
||||
|
||||
int video_dev_need_fill_frame(struct video_device *);
|
||||
|
||||
void video_dev_fill_frames_reset(struct video_device *video);
|
||||
|
||||
void video_dev_real_frame_dec(struct video_device *);
|
||||
|
||||
void video_dev_reset_frame_interval_timer(struct video_device *);
|
||||
|
||||
int video_force_skip_frame(struct video_device *device);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user