You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.3 KiB
192 lines
6.3 KiB
From d4154a99430bf73bc501bafc26de80cb1498626c 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 393/454] 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 | 132 +++++++++---------
|
|
1 file changed, 68 insertions(+), 64 deletions(-)
|
|
|
|
--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
|
+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
|
@@ -342,7 +342,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 (buf) {
|
|
/* this should only ever happen if the port is
|
|
@@ -365,70 +367,72 @@ static void buffer_cb(struct vchiq_mmal_
|
|
/* signal frame completion */
|
|
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 =
|
|
- dev->capture.kernel_start_ts.tv_sec * 1000000000ULL +
|
|
- dev->capture.kernel_start_ts.tv_usec * 1000ULL;
|
|
- 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)
|
|
@@ -823,27 +827,27 @@ 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;
|
|
+ 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;
|
|
}
|
|
|
|
|