From fd3a6710bbcf875c85e6a2f3513c6eb4c46adeaa Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 24 Jul 2018 12:08:29 +0100 Subject: [PATCH] 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 --- .../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 @@ -380,6 +380,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) {