uvcvideo: Disable hardware timestamps by default
diff mbox

Message ID 1438006696-30678-1-git-send-email-laurent.pinchart@ideasonboard.com
State New
Headers show

Commit Message

Laurent Pinchart July 27, 2015, 2:18 p.m. UTC
The hardware timestamping implementation has been reported as not
working correctly on at least the Logitech C920. Until this can be
fixed, disable it by default.

Reported-by: Peter Rabbitson <rabbit@rabbit.us>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/media/usb/uvc/uvc_driver.c | 3 +++
 drivers/media/usb/uvc/uvc_video.c  | 3 +++
 drivers/media/usb/uvc/uvcvideo.h   | 1 +
 3 files changed, 7 insertions(+)

Peter, could you please test this ?

Comments

Paul Fertser July 30, 2015, 3:25 p.m. UTC | #1
Hello Laurent,

I was experimenting with a web-camera integrated in my laptop and was
extremely confused by non-monotonic timestamps coming from the uvc
driver. In fact, the very first timestamp was bigger then the second
every time I tried. This patch helped.

More details:

1. I'm testing with

avconv -f video4linux2 -i /dev/video0 -codec copy test.mkv

2. Prior to applying the patch I was always getting "Non-monotonous
DTS in output stream 0:0" errors

3. I'm using kernel version 3.6.8 (yes, that's old, I'm ready to
upgrade if you really need that for debugging)

4. The camera is 5986:0100 Acer, Inc Orbicam

Anything else I can do to help you with this issue? My real usecase is
having a single-board computer capturing a steady stream from a UVC
webcam (h264 pixel format) while keeping timestamps reasonably
accurate (within 0.1s) for the future processing and spending as
little CPU time as possible.

Thank you in advance.
Peter Rabbitson Aug. 3, 2015, 12:57 p.m. UTC | #2
On 07/27/2015 04:18 PM, Laurent Pinchart wrote:
> The hardware timestamping implementation has been reported as not
> working correctly on at least the Logitech C920. Until this can be
> fixed, disable it by default.

As stated earlier on freenode#v4l - this patch seems to do the job for 
me as well. Thanks a lot!

Are there extra steps necessary to get this merged into media_tree.git ?

Cheers



--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch
diff mbox

diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index d9ddddb50e4d..ca8acc6fd9ed 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -32,6 +32,7 @@ 
 #define DRIVER_DESC		"USB Video Class driver"
 
 unsigned int uvc_clock_param = CLOCK_MONOTONIC;
+unsigned int uvc_hw_timestamps_param;
 unsigned int uvc_no_drop_param;
 static unsigned int uvc_quirks_param = -1;
 unsigned int uvc_trace_param;
@@ -2090,6 +2091,8 @@  static int uvc_clock_param_set(const char *val, struct kernel_param *kp)
 module_param_call(clock, uvc_clock_param_set, uvc_clock_param_get,
 		  &uvc_clock_param, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(clock, "Video buffers timestamp clock");
+module_param_named(hwtimestamps, uvc_hw_timestamps_param, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(hwtimestamps, "Use hardware timestamps");
 module_param_named(nodrop, uvc_no_drop_param, uint, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(nodrop, "Don't drop incomplete frames");
 module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR);
diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
index 25ea8cf1b8b3..85d99882a5ca 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -667,6 +667,9 @@  void uvc_video_clock_update(struct uvc_streaming *stream,
 	u32 rem;
 	u64 y;
 
+	if (!uvc_hw_timestamps_param)
+		return;
+
 	spin_lock_irqsave(&clock->lock, flags);
 
 	if (clock->count < clock->size)
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
index 4bba30e5a1a5..18647f78f164 100644
--- a/drivers/media/usb/uvc/uvcvideo.h
+++ b/drivers/media/usb/uvc/uvcvideo.h
@@ -599,6 +599,7 @@  extern unsigned int uvc_clock_param;
 extern unsigned int uvc_no_drop_param;
 extern unsigned int uvc_trace_param;
 extern unsigned int uvc_timeout_param;
+extern unsigned int uvc_hw_timestamps_param;
 
 #define uvc_trace(flag, msg...) \
 	do { \