diff --git a/device/camera.c b/device/camera.c index b05aaae..940e28c 100644 --- a/device/camera.c +++ b/device/camera.c @@ -39,7 +39,7 @@ camera_t *camera_open(camera_options_t *options) camera->name = "CAMERA"; camera->options = *options; - camera->camera = device_open(camera->name, camera->options.path); + camera->camera = device_v4l2_open(camera->name, camera->options.path); if (!camera->camera) { goto error; } diff --git a/device/camera_decoder.c b/device/camera_decoder.c index dc101f3..40432c8 100644 --- a/device/camera_decoder.c +++ b/device/camera_decoder.c @@ -14,7 +14,7 @@ int camera_configure_decoder(camera_t *camera) buffer_list_t *src = camera_src; device_video_force_key(camera->camera); - camera->decoder = device_open("DECODER", "/dev/video10"); + camera->decoder = device_v4l2_open("DECODER", "/dev/video10"); if (device_open_buffer_list_output(camera->decoder, src) < 0) { return -1; @@ -31,7 +31,7 @@ int camera_configure_decoder(camera_t *camera) src = camera->decoder->capture_list; if (camera_src->fmt_format != V4L2_PIX_FMT_MJPEG && camera_src->fmt_format != V4L2_PIX_FMT_JPEG) { - camera->codec_jpeg = device_open("JPEG", "/dev/video31"); + camera->codec_jpeg = device_v4l2_open("JPEG", "/dev/video31"); if (device_open_buffer_list_output(camera->codec_jpeg, src) < 0 || device_open_buffer_list_capture(camera->codec_jpeg, src, 1.0, V4L2_PIX_FMT_JPEG, true) < 0) { @@ -40,7 +40,7 @@ int camera_configure_decoder(camera_t *camera) } if (camera_src->fmt_format != V4L2_PIX_FMT_H264) { - camera->codec_h264 = device_open("H264", "/dev/video11"); + camera->codec_h264 = device_v4l2_open("H264", "/dev/video11"); if (device_open_buffer_list_output(camera->codec_h264, src) < 0 || device_open_buffer_list_capture(camera->codec_h264, src, 1.0, V4L2_PIX_FMT_H264, true) < 0) { diff --git a/device/camera_direct.c b/device/camera_direct.c index dfcdf3a..461ab9c 100644 --- a/device/camera_direct.c +++ b/device/camera_direct.c @@ -12,8 +12,8 @@ int camera_configure_direct(camera_t *camera) { buffer_list_t *src = camera->camera->capture_list; - camera->codec_jpeg = device_open("JPEG", "/dev/video31"); - camera->codec_h264 = device_open("H264", "/dev/video11"); + camera->codec_jpeg = device_v4l2_open("JPEG", "/dev/video31"); + camera->codec_h264 = device_v4l2_open("H264", "/dev/video11"); if (device_open_buffer_list_output(camera->codec_jpeg, src) < 0 || device_open_buffer_list_capture(camera->codec_jpeg, src, 1.0, V4L2_PIX_FMT_JPEG, true) < 0) { diff --git a/device/camera_isp.c b/device/camera_isp.c index c256888..aa6fbd4 100644 --- a/device/camera_isp.c +++ b/device/camera_isp.c @@ -12,10 +12,10 @@ void write_yuvu(buffer_t *buffer); int camera_configure_isp(camera_t *camera, float high_div, float low_div) { - camera->isp_srgb = device_open("ISP", "/dev/video13"); - camera->isp_yuuv = device_open("ISP-YUUV", "/dev/video14"); - camera->codec_jpeg = device_open("JPEG", "/dev/video31"); - camera->codec_h264 = device_open("H264", "/dev/video11"); + camera->isp_srgb = device_v4l2_open("ISP", "/dev/video13"); + camera->isp_yuuv = device_v4l2_open("ISP-YUUV", "/dev/video14"); + camera->codec_jpeg = device_v4l2_open("JPEG", "/dev/video31"); + camera->codec_h264 = device_v4l2_open("H264", "/dev/video11"); if (device_open_buffer_list_output(camera->isp_srgb, camera->camera->capture_list) < 0 || device_open_buffer_list_capture(camera->isp_yuuv, camera->camera->capture_list, high_div, V4L2_PIX_FMT_YUYV, true) < 0) { @@ -48,9 +48,9 @@ int camera_configure_isp(camera_t *camera, float high_div, float low_div) return 0; } - camera->isp_yuuv_lowres = device_open("ISP-YUUV-LOW", "/dev/video15"); - camera->codec_jpeg_lowres = device_open("JPEG-LOW", "/dev/video31"); - camera->codec_h264_lowres = device_open("H264-LOW", "/dev/video11"); + camera->isp_yuuv_lowres = device_v4l2_open("ISP-YUUV-LOW", "/dev/video15"); + camera->codec_jpeg_lowres = device_v4l2_open("JPEG-LOW", "/dev/video31"); + camera->codec_h264_lowres = device_v4l2_open("H264-LOW", "/dev/video11"); if (device_open_buffer_list_capture(camera->isp_yuuv_lowres, camera->camera->capture_list, low_div, V4L2_PIX_FMT_YUYV, true) < 0) { return -1; diff --git a/device/camera_legacy_isp.c b/device/camera_legacy_isp.c index b5f9844..4f57ccc 100644 --- a/device/camera_legacy_isp.c +++ b/device/camera_legacy_isp.c @@ -24,9 +24,9 @@ int camera_configure_legacy_isp(camera_t *camera, float div) { buffer_list_t *src = camera->camera->capture_list; - camera->legacy_isp = device_open("ISP", "/dev/video12"); - camera->codec_jpeg = device_open("JPEG", "/dev/video31"); - camera->codec_h264 = device_open("H264", "/dev/video11"); + camera->legacy_isp = device_v4l2_open("ISP", "/dev/video12"); + camera->codec_jpeg = device_v4l2_open("JPEG", "/dev/video31"); + camera->codec_h264 = device_v4l2_open("H264", "/dev/video11"); if (device_open_buffer_list_output(camera->legacy_isp, src) < 0 || device_open_buffer_list_capture(camera->legacy_isp, src, div, V4L2_PIX_FMT_YUYV, true) < 0) { diff --git a/device/hw/device.c b/device/hw/device.c index 959e24a..c67b8ed 100644 --- a/device/hw/device.c +++ b/device/hw/device.c @@ -3,10 +3,11 @@ #include "device/hw/buffer_list.h" #include "device/hw/v4l2.h" -device_t *device_open(const char *name, const char *path) { +device_t *device_open(const char *name, const char *path, device_hw_t *hw) { device_t *dev = calloc(1, sizeof(device_t)); dev->name = strdup(name); dev->path = strdup(path); + dev->hw = hw; dev->fd = open(path, O_RDWR|O_NONBLOCK); dev->subdev_fd = -1; dev->allow_dma = true; diff --git a/device/hw/device.h b/device/hw/device.h index 52d3fc1..c452bb4 100644 --- a/device/hw/device.h +++ b/device/hw/device.h @@ -7,6 +7,11 @@ typedef struct buffer_list_s buffer_list_t; typedef struct device_s device_t; +typedef struct device_hw_s { + int (*device_hw_open)(device_t *device); + int (*device_hw_close)(device_t *device); +} device_hw_t; + typedef struct device_s { char *name; char *path; @@ -15,6 +20,7 @@ typedef struct device_s { struct v4l2_capability v4l2_cap; bool allow_dma; + device_hw_t *hw; buffer_list_t *capture_list; buffer_list_t *output_list; @@ -23,7 +29,8 @@ typedef struct device_s { bool decoder_started; } device_t; -device_t *device_open(const char *name, const char *path); +device_t *device_open(const char *name, const char *path, device_hw_t *hw); +device_t *device_v4l2_open(const char *name, const char *path); int device_open_media_device(device_t *dev); int device_open_v4l2_subdev(device_t *dev, int subdev); void device_close(device_t *device); diff --git a/device/v4l2/device.c b/device/v4l2/device.c new file mode 100644 index 0000000..825b3dd --- /dev/null +++ b/device/v4l2/device.c @@ -0,0 +1,9 @@ +#include "device/hw/v4l2.h" +#include "device/hw/device.h" + +extern device_hw_t device_hw_v4l2; + +device_t *device_v4l2_open(const char *name, const char *path) +{ + return device_open(name, path, &device_hw_v4l2); +}