diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.19/950-0242-staging-bcm2835-camera-Return-early-on-errors.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.19/950-0242-staging-bcm2835-camera-Return-early-on-errors.patch | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.19/950-0242-staging-bcm2835-camera-Return-early-on-errors.patch b/target/linux/brcm2708/patches-4.19/950-0242-staging-bcm2835-camera-Return-early-on-errors.patch new file mode 100644 index 0000000000..5dc558a7e3 --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0242-staging-bcm2835-camera-Return-early-on-errors.patch @@ -0,0 +1,196 @@ +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 (buf) { + /* this should only ever happen if the port is +@@ -358,71 +360,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 = +- 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) +@@ -802,27 +805,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; + } + |