From 6d3f9920349986e9492c577243bf2b3b202bf3d7 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 6 Apr 2022 16:02:47 +0200 Subject: [PATCH] Add `start decoder` --- cmd/camera_decoder.c | 7 +++++-- hw/device.c | 14 ++++++++++++++ hw/device.h | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cmd/camera_decoder.c b/cmd/camera_decoder.c index c0f3d95..b9ab125 100644 --- a/cmd/camera_decoder.c +++ b/cmd/camera_decoder.c @@ -11,8 +11,7 @@ int camera_configure_decoder(camera_t *camera) { buffer_list_t *src = camera->camera->capture_list; - - device_video_force_key(camera->decoder); + device_video_force_key(camera->camera); camera->decoder = device_open("DECODER", "/dev/video10"); @@ -21,6 +20,10 @@ int camera_configure_decoder(camera_t *camera) return -1; } + if (device_set_decoder_start(camera->decoder, true) < 0) { + return -1; + } + src = camera->decoder->capture_list; if (camera->options.format != V4L2_PIX_FMT_MJPEG && camera->options.format != V4L2_PIX_FMT_JPEG) { diff --git a/hw/device.c b/hw/device.c index 386c4e4..629d9e3 100644 --- a/hw/device.c +++ b/hw/device.c @@ -166,6 +166,20 @@ int device_set_stream(device_t *dev, bool do_on) return 0; } +int device_set_decoder_start(device_t *dev, bool do_on) +{ + struct v4l2_decoder_cmd cmd = {0}; + + cmd.cmd = do_on ? V4L2_DEC_CMD_START : V4L2_DEC_CMD_STOP; + + E_LOG_DEBUG(dev, "Setting decoder state %s...", do_on ? "Start" : "Stop"); + E_XIOCTL(dev, dev->fd, VIDIOC_DECODER_CMD, &cmd, "Cannot set decoder state"); + return 0; + +error: + return -1; +} + int device_consume_event(device_t *dev) { struct v4l2_event event; diff --git a/hw/device.h b/hw/device.h index 4049d76..332f459 100644 --- a/hw/device.h +++ b/hw/device.h @@ -28,6 +28,7 @@ int device_open_buffer_list_capture(device_t *dev, struct buffer_list_s *output_ int device_consume_event(device_t *device); int device_set_stream(device_t *dev, bool do_on); +int device_set_decoder_start(device_t *dev, bool do_on); int device_video_force_key(device_t *dev); int device_set_pad_format(device_t *device, unsigned width, unsigned height, unsigned format); int device_set_option(device_t *dev, const char *name, uint32_t id, int32_t value);