OpenWrt – Rev 1

Subversion Repositories:
Rev:
From d93df875705016c8b767b679ad6d16bf26b2d132 Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
Date: Tue, 24 Jul 2018 12:08:29 +0100
Subject: [PATCH 408/454] staging: bcm2835-camera: Ensure timestamps never go
 backwards.

There is an awkward situation with H264 header bytes. Currently
they are returned with a PTS of 0 because they aren't associated
with a timestamped frame to encode. These are handled by either
returning the timestamp of the last buffer to have been received,
or in the case of the first buffer the timestamp taken at
start_streaming.
This results in a race where the current frame may have started
before we take the start time, which results in the first encoded
frame having an earlier timestamp than the header bytes.

Ensure that we never return a negative delta to the user by checking
against the previous timestamp.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
---
 .../staging/vc04_services/bcm2835-camera/bcm2835-camera.c    | 5 +++++
 1 file changed, 5 insertions(+)

--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
@@ -400,6 +400,11 @@ static void buffer_cb(struct vchiq_mmal_
                         ktime_to_ns(dev->capture.kernel_start_ts),
                         dev->capture.vc_start_timestamp, pts,
                         ktime_to_ns(timestamp));
+               if (timestamp < dev->capture.last_timestamp) {
+                       v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
+                                "Negative delta - using last time\n");
+                       timestamp = dev->capture.last_timestamp;
+               }
                buf->vb.vb2_buf.timestamp = ktime_to_ns(timestamp);
        } else {
                if (dev->capture.last_timestamp) {