/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * uvc-gadget API * * Copyright (C) 2020 Rockchip Electronics Co., Ltd. * * Author: Bin Yang */ #ifndef __UVC_GADGET_H__ #define __UVC_GADGET_H__ #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include "list.h" #include "tools.h" /* SRC_Args bit map */ #define SRC_INITIALIZE_FLAG BIT(0) #define SRC_FILL_TYPE_IS_V4L2 BIT(1) #define SRC_MEM_TYPE_IS_MMAP BIT(2) #define SRC_FMT_TYPE_IS_YUYV BIT(3) #define SRC_BUF_TYPE_IS_ENC BIT(4) #define SRC_BUF_ASYNC_PROCESS BIT(5) #define SRC_BUF_SYNC_PROCESS BIT(6) #define SRC_FIXED_RESOLUTION BIT(7) #define SRC_MEDIA_LINK BIT(8) #define SRC_ENABLE_RKAIQ BIT(9) #define SRC_ENABLE_CROP BIT(10) #define SINK_USER_SET_MODE BIT(16) #define SINK_TRAN_MODE_BULK BIT(17) #define SINK_BULK_BUF_STATIC BIT(18) #define SINK_FMT_OUTPUT_H265 BIT(19) enum src_func_type { SRC_DEVICE_OPEN = 0, SRC_DEVICE_CLOSE, SRC_STREAM_ON, SRC_STREAM_OFF, SRC_START_CTRL, SRC_RGA_INIT, SRC_RGA_DEINIT, SRC_RGA_PROC }; enum uvc_gadget_state { UVC_STA_START = 0, UVC_STA_DONE, UVC_STA_RESET, UVC_STA_STOP, UVC_STA_ERR }; struct uvc_pix_size { unsigned int width; unsigned int height; }; struct uvc_src_size { struct uvc_pix_size src; struct uvc_pix_size max; struct uvc_pix_size pre; }; /* * * struct video_buffer - Video buffer information * @index: Zero-based buffer index, limited to the number of buffers minus one * @size: Size of the video memory, in bytes * @bytesused: Number of bytes used by video data, smaller or equal to @size * @timestamp: Time stamp at which the buffer has been captured * @error: True if an error occured while capturing video data for the buffer * @allocated: True if memory for the buffer has been allocated * @mem: Video data memory * @dmabuf: Video data dmabuf handle */ struct video_buffer { void *rga_ctx; void *allocator; struct v4l2_pix_format *fmt; unsigned int index; unsigned int size; unsigned int bytesused; struct timeval timestamp; bool error; void *mem; int dmabuf; bool readable; struct list_entry list; }; struct rga_video_buffer { struct video_buffer *src; struct video_buffer *dest; }; struct video_source { char *cap_device; struct video_source *psrc; const struct video_source_ops *ops; struct events *events; pthread_mutex_t mutex; pthread_cond_t cond; unsigned int width; unsigned int height; unsigned int max_width; unsigned int max_height; unsigned int index; bool pre_flag; bool crop; }; struct uvc_source { struct video_source *src; const struct video_encode_ops *enc_ops; FILE *source_fp; void *func; void *context; void *udev; pthread_mutex_t mutex; pthread_cond_t cond; enum uvc_gadget_state uvc_state; unsigned int SRC_Args; int log_level; bool stream_on; }; struct video_encode_ops { int(*init)(struct uvc_source *src, struct v4l2_pix_format *fmt); int(*exit)(struct uvc_source *src); int(*process)(struct uvc_source *src, struct video_buffer *src_buffer, struct video_buffer *sink_buffer); }; #define to_first_source(s) ((s) ? s->src : NULL) #define to_pre_source(s) ((s && s->src) ? s->src->psrc : NULL) typedef int(*uvc_source_func_t)(struct uvc_source *, void *); int uvc_source_func_register(struct uvc_source *src, enum src_func_type type, uvc_source_func_t func); void uvc_source_func_unregister(struct uvc_source *src); struct uvc_source *uvc_source_create(unsigned int SRC_Args, char *cap_device); void uvc_source_destroy(struct uvc_source *src); int uvc_set_source_size(struct uvc_source *src, struct uvc_src_size src_size); int uvc_gadget_create(struct uvc_source *src); int uvc_gadget_wait_complete(struct uvc_source *src, bool force); int uvc_buffer_export(struct uvc_source *src, int imagesize, int flags, struct video_buffer **buffer); int uvc_buffer_submit(struct uvc_source *src, struct video_buffer *buf); int uvc_stream_get(struct uvc_source *src, unsigned int index, struct video_buffer **buffer); void uvc_set_source_log_level(struct uvc_source *src, int log_level); struct v4l2_pix_format *uvc_get_format(struct uvc_source *src); struct v4l2_pix_format *uvc_get_dest_format(struct uvc_source *src); struct v4l2_pix_format *uvc_get_uvc_format(struct uvc_source *src); int uvc_get_frame_rate(struct uvc_source *src); char *uvc_get_device(struct uvc_source *src); bool uvc_get_stream_on(struct uvc_source *src); void uvc_gadget_fixed_function(bool fixed_uvc); void uvc_use_dma_buffer(struct uvc_source *src); bool uvc_get_dma_buffer(struct uvc_source *src); int uvc_video_buffer_alloc(struct uvc_source *src, size_t size, struct video_buffer **buf); void uvc_video_buffer_free(struct uvc_source *src, struct video_buffer *buf); #ifdef __cplusplus } #endif #endif /* __UVC_GADGET_H__ */