#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