You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openwrt/target/linux/brcm2708/patches-4.19/950-0242-staging-bcm2835-ca...

197 lines
6.3 KiB
Diff

From 83ba21bb6043c5afc3d497e9be4e128b3e1adf93 Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
Date: Fri, 10 Mar 2017 17:27:56 +0000
Subject: [PATCH 242/703] staging: bcm2835-camera: Return early on errors
Fix several instances where it is easier to return
early on error conditions than handle it as an else
clause.
As requested by Mauro.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
---
.../bcm2835-camera/bcm2835-camera.c | 137 +++++++++---------
1 file changed, 71 insertions(+), 66 deletions(-)
--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
@@ -335,7 +335,9 @@ static void buffer_cb(struct vchiq_mmal_
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
}
return;
- } else if (length == 0) {
+ }
+
+ if (length == 0) {
/* stream ended */
if (dev->capture.frame_count) {
/* empty buffer whilst capturing - expected to be an
@@ -361,71 +363,72 @@ static void buffer_cb(struct vchiq_mmal_
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
complete(&dev->capture.frame_cmplt);
}
- } else {
- if (dev->capture.frame_count) {
- if (dev->capture.vc_start_timestamp == -1) {
- buf->vb.vb2_buf.timestamp = ktime_get_ns();
- v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
- "Buffer time set as current time - %lld",
- buf->vb.vb2_buf.timestamp);
-
- } else if (pts != 0) {
- ktime_t timestamp;
- s64 runtime_us = pts -
- dev->capture.vc_start_timestamp;
- timestamp = ktime_add_us(dev->capture.kernel_start_ts,
- runtime_us);
- v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
- "Convert start time %llu and %llu with offset %llu to %llu\n",
- ktime_to_ns(dev->capture.kernel_start_ts),
- dev->capture.vc_start_timestamp, pts,
- ktime_to_ns(timestamp));
- buf->vb.vb2_buf.timestamp = ktime_to_ns(timestamp);
- } else {
- if (dev->capture.last_timestamp) {
- buf->vb.vb2_buf.timestamp =
- dev->capture.last_timestamp;
- v4l2_dbg(1, bcm2835_v4l2_debug,
- &dev->v4l2_dev,
- "Buffer time set as last timestamp - %lld",
- buf->vb.vb2_buf.timestamp);
- } else {
- buf->vb.vb2_buf.timestamp =
- ktime_to_ns(dev->capture.kernel_start_ts);
- v4l2_dbg(1, bcm2835_v4l2_debug,
- &dev->v4l2_dev,
- "Buffer time set as start timestamp - %lld",
- buf->vb.vb2_buf.timestamp);
- }
- }
- dev->capture.last_timestamp = buf->vb.vb2_buf.timestamp;
+ return;
+ }
- vb2_set_plane_payload(&buf->vb.vb2_buf, 0, length);
- if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
- buf->vb.flags |= V4L2_BUF_FLAG_KEYFRAME;
+ if (!dev->capture.frame_count) {
+ /* signal frame completion */
+ vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
+ complete(&dev->capture.frame_cmplt);
+ return;
+ }
+ if (dev->capture.vc_start_timestamp == -1) {
+ /*
+ * VPU doesn't support MMAL_PARAMETER_SYSTEM_TIME, rely on
+ * kernel time, and have no latency compensation.
+ */
+ buf->vb.vb2_buf.timestamp = ktime_get_ns();
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Buffer time set as current time - %lld",
+ buf->vb.vb2_buf.timestamp);
+ } else if (pts != 0) {
+ ktime_t timestamp;
+ s64 runtime_us = pts -
+ dev->capture.vc_start_timestamp;
+ timestamp = ktime_add_us(dev->capture.kernel_start_ts,
+ runtime_us);
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Convert start time %llu and %llu with offset %llu to %llu\n",
+ ktime_to_ns(dev->capture.kernel_start_ts),
+ dev->capture.vc_start_timestamp, pts,
+ ktime_to_ns(timestamp));
+ buf->vb.vb2_buf.timestamp = ktime_to_ns(timestamp);
+ } else {
+ if (dev->capture.last_timestamp) {
+ buf->vb.vb2_buf.timestamp = dev->capture.last_timestamp;
v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
- "Buffer has ts %llu",
- dev->capture.last_timestamp);
- vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
-
- if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
- is_capturing(dev)) {
- v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
- "Grab another frame as buffer has EOS");
- vchiq_mmal_port_parameter_set(
- instance,
- dev->capture.camera_port,
- MMAL_PARAMETER_CAPTURE,
- &dev->capture.frame_count,
- sizeof(dev->capture.frame_count));
- }
+ "Buffer time set as last timestamp - %lld",
+ buf->vb.vb2_buf.timestamp);
} else {
- /* signal frame completion */
- vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
- complete(&dev->capture.frame_cmplt);
+ buf->vb.vb2_buf.timestamp =
+ ktime_to_ns(dev->capture.kernel_start_ts);
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Buffer time set as start timestamp - %lld",
+ buf->vb.vb2_buf.timestamp);
}
}
+ dev->capture.last_timestamp = buf->vb.vb2_buf.timestamp;
+
+ vb2_set_plane_payload(&buf->vb.vb2_buf, 0, length);
+ if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME)
+ buf->vb.flags |= V4L2_BUF_FLAG_KEYFRAME;
+
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Buffer has ts %llu",
+ dev->capture.last_timestamp);
+ vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
+
+ if (mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS &&
+ is_capturing(dev)) {
+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+ "Grab another frame as buffer has EOS");
+ vchiq_mmal_port_parameter_set(instance,
+ dev->capture.camera_port,
+ MMAL_PARAMETER_CAPTURE,
+ &dev->capture.frame_count,
+ sizeof(dev->capture.frame_count));
+ }
}
static int enable_camera(struct bm2835_mmal_dev *dev)
@@ -815,27 +818,29 @@ static int vidioc_overlay(struct file *f
ret = vchiq_mmal_port_set_format(dev->instance, src);
if (ret < 0)
- goto error;
+ return ret;
ret = set_overlay_params(dev, dst);
if (ret < 0)
- goto error;
+ return ret;
- if (enable_camera(dev) < 0)
- goto error;
+ if (enable_camera(dev) < 0) {
+ ret = -EINVAL;
+ return ret;
+ }
ret = vchiq_mmal_component_enable(
dev->instance,
dev->component[MMAL_COMPONENT_PREVIEW]);
if (ret < 0)
- goto error;
+ return ret;
v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "connecting %p to %p\n",
src, dst);
ret = vchiq_mmal_port_connect_tunnel(dev->instance, src, dst);
if (!ret)
ret = vchiq_mmal_port_enable(dev->instance, src, NULL);
-error:
+
return ret;
}