From a740e59bf8099d1f5b5b29be3e9993fbd51e729a Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 6 Jul 2018 17:43:03 +0100 Subject: [PATCH 388/454] Revert "bcm2835-camera: Fix timestamp calculation problem (#2214)" This reverts commit 90ac037dbeecbb514b677e43b53bc5b1a452ea22. This has been fixed in an alternate format upstream, so adopt that. Signed-off-by: Dave Stevenson --- .../bcm2835-camera/bcm2835-camera.c | 41 ++++++++++++++----- .../bcm2835-camera/bcm2835-camera.h | 2 +- 2 files changed, 32 insertions(+), 11 deletions(-) --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c @@ -374,17 +374,37 @@ static void buffer_cb(struct vchiq_mmal_ buf->vb.vb2_buf.timestamp); } else if(pts != 0) { + struct timeval timestamp; s64 runtime_us = pts - dev->capture.vc_start_timestamp; - buf->vb.vb2_buf.timestamp = (runtime_us * NSEC_PER_USEC) + - dev->capture.kernel_start_timestamp; + u32 div = 0; + u32 rem = 0; + + div = + div_u64_rem(runtime_us, USEC_PER_SEC, &rem); + timestamp.tv_sec = + dev->capture.kernel_start_ts.tv_sec + div; + timestamp.tv_usec = + dev->capture.kernel_start_ts.tv_usec + rem; + + if (timestamp.tv_usec >= + USEC_PER_SEC) { + timestamp.tv_sec++; + timestamp.tv_usec -= + USEC_PER_SEC; + } v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Buffer time set as converted timestamp - %llu " - "= (pts [%lld usec] - vc start time [%llu usec]) " - "+ kernel start time [%llu nsec]\n", - buf->vb.vb2_buf.timestamp, - pts, dev->capture.vc_start_timestamp, - dev->capture.kernel_start_timestamp); + "Convert start time %d.%06d and %llu " + "with offset %llu to %d.%06d\n", + (int)dev->capture.kernel_start_ts. + tv_sec, + (int)dev->capture.kernel_start_ts. + tv_usec, + dev->capture.vc_start_timestamp, pts, + (int)timestamp.tv_sec, + (int)timestamp.tv_usec); + buf->vb.vb2_buf.timestamp = timestamp.tv_sec * 1000000000ULL + + timestamp.tv_usec * 1000ULL; } else { if (dev->capture.last_timestamp) { buf->vb.vb2_buf.timestamp = dev->capture.last_timestamp; @@ -394,7 +414,8 @@ static void buffer_cb(struct vchiq_mmal_ } else { buf->vb.vb2_buf.timestamp = - dev->capture.kernel_start_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); @@ -575,7 +596,7 @@ static int start_streaming(struct vb2_qu dev->capture.last_timestamp = 0; - dev->capture.kernel_start_timestamp = ktime_get_ns(); + v4l2_get_timestamp(&dev->capture.kernel_start_ts); /* enable the camera port */ dev->capture.port->cb_ctx = dev; --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.h +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.h @@ -92,7 +92,7 @@ struct bm2835_mmal_dev { /* VC start timestamp for streaming */ s64 vc_start_timestamp; /* Kernel start timestamp for streaming */ - u64 kernel_start_timestamp; + struct timeval kernel_start_ts; /* Timestamp of last frame */ u64 last_timestamp;