From d4154a99430bf73bc501bafc26de80cb1498626c Mon Sep 17 00:00:00 2001 From: Dave Stevenson 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 --- .../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; }