diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.19/950-0254-staging-bcm2835-camera-Handle-empty-EOS-buffers-whil.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.19/950-0254-staging-bcm2835-camera-Handle-empty-EOS-buffers-whil.patch | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.19/950-0254-staging-bcm2835-camera-Handle-empty-EOS-buffers-whil.patch b/target/linux/brcm2708/patches-4.19/950-0254-staging-bcm2835-camera-Handle-empty-EOS-buffers-whil.patch new file mode 100644 index 0000000000..81153c9ff9 --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0254-staging-bcm2835-camera-Handle-empty-EOS-buffers-whil.patch @@ -0,0 +1,84 @@ +From 1da35962d95cdb8648cb85c4b6f3d3367be88601 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson <dave.stevenson@raspberrypi.org> +Date: Thu, 5 Jul 2018 16:17:03 +0100 +Subject: [PATCH 254/703] staging: bcm2835-camera: Handle empty EOS buffers + whilst streaming + +The change to mapping V4L2 to MMAL buffers 1:1 didn't handle +the condition we get with raw pixel buffers (eg YUV and RGB) +direct from the camera's stills port. That sends the pixel buffer +and then an empty buffer with the EOS flag set. The EOS buffer +wasn't handled and returned an error up the stack. + +Handle the condition correctly by returning it to the component +if streaming, or returning with an error if stopping streaming. + +Fixes: 9384167 "staging: bcm2835-camera: Remove V4L2/MMAL buffer remapping" + +Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org> +--- + .../bcm2835-camera/bcm2835-camera.c | 21 +++++++++++-------- + .../vc04_services/bcm2835-camera/mmal-vchiq.c | 5 +++-- + 2 files changed, 15 insertions(+), 11 deletions(-) + +--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c ++++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +@@ -339,16 +339,13 @@ static void buffer_cb(struct vchiq_mmal_ + + if (length == 0) { + /* stream ended */ +- if (buf) { +- /* this should only ever happen if the port is +- * disabled and there are buffers still queued ++ if (dev->capture.frame_count) { ++ /* empty buffer whilst capturing - expected to be an ++ * EOS, so grab another frame + */ +- vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); +- pr_debug("Empty buffer"); +- } else if (dev->capture.frame_count) { +- /* grab another frame */ + if (is_capturing(dev)) { +- pr_debug("Grab another frame"); ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Grab another frame"); + vchiq_mmal_port_parameter_set( + instance, + dev->capture.camera_port, +@@ -356,8 +353,14 @@ static void buffer_cb(struct vchiq_mmal_ + &dev->capture.frame_count, + sizeof(dev->capture.frame_count)); + } ++ if (vchiq_mmal_submit_buffer(instance, port, buf)) ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Failed to return EOS buffer"); + } else { +- /* signal frame completion */ ++ /* stopping streaming. ++ * return buffer, and signal frame completion ++ */ ++ vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); + complete(&dev->capture.frame_cmplt); + } + return; +--- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c ++++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c +@@ -332,8 +332,6 @@ static int bulk_receive(struct vchiq_mma + + /* store length */ + msg_context->u.bulk.buffer_used = rd_len; +- msg_context->u.bulk.mmal_flags = +- msg->u.buffer_from_host.buffer_header.flags; + msg_context->u.bulk.dts = msg->u.buffer_from_host.buffer_header.dts; + msg_context->u.bulk.pts = msg->u.buffer_from_host.buffer_header.pts; + +@@ -461,6 +459,9 @@ static void buffer_to_host_cb(struct vch + return; + } + ++ msg_context->u.bulk.mmal_flags = ++ msg->u.buffer_from_host.buffer_header.flags; ++ + if (msg->h.status != MMAL_MSG_STATUS_SUCCESS) { + /* message reception had an error */ + pr_warn("error %d in reply\n", msg->h.status); |