Module Name:    src
Committed By:   jmcneill
Date:           Fri May 22 11:25:06 UTC 2020

Modified Files:
        src/sys/dev/usb: uvideo.c

Log Message:
Support get_framerate and provide a stub for set_framerate


To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/sys/dev/usb/uvideo.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/uvideo.c
diff -u src/sys/dev/usb/uvideo.c:1.56 src/sys/dev/usb/uvideo.c:1.57
--- src/sys/dev/usb/uvideo.c:1.56	Sat Mar 14 02:35:34 2020
+++ src/sys/dev/usb/uvideo.c	Fri May 22 11:25:06 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvideo.c,v 1.56 2020/03/14 02:35:34 christos Exp $	*/
+/*	$NetBSD: uvideo.c,v 1.57 2020/05/22 11:25:06 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 2008 Patrick Mahoney
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvideo.c,v 1.56 2020/03/14 02:35:34 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvideo.c,v 1.57 2020/05/22 11:25:06 jmcneill Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -275,6 +275,8 @@ static int	uvideo_enum_format(void *, ui
 static int	uvideo_get_format(void *, struct video_format *);
 static int	uvideo_set_format(void *, struct video_format *);
 static int	uvideo_try_format(void *, struct video_format *);
+static int	uvideo_get_framerate(void *, struct video_fract *);
+static int	uvideo_set_framerate(void *, struct video_fract *);
 static int	uvideo_start_transfer(void *);
 static int	uvideo_stop_transfer(void *);
 
@@ -380,6 +382,8 @@ static const struct video_hw_if uvideo_h
 	.get_format = uvideo_get_format,
 	.set_format = uvideo_set_format,
 	.try_format = uvideo_try_format,
+	.get_framerate = uvideo_get_framerate,
+	.set_framerate = uvideo_set_framerate,
 	.start_transfer = uvideo_start_transfer,
 	.stop_transfer = uvideo_stop_transfer,
 	.control_iter_init = NULL,
@@ -1877,6 +1881,8 @@ uvideo_close(void *addr)
 
 	sc = addr;
 
+	uvideo_stop_transfer(addr);
+
 	if (sc->sc_state != UVIDEO_STATE_CLOSED) {
 		sc->sc_state = UVIDEO_STATE_CLOSED;
 	}
@@ -2072,6 +2078,49 @@ uvideo_try_format(void *addr, struct vid
 }
 
 static int
+uvideo_get_framerate(void *addr, struct video_fract *fract)
+{
+	struct uvideo_softc *sc = addr;
+	struct uvideo_stream *vs = sc->sc_stream_in;
+
+	switch (vs->vs_frame_interval) {
+	case 41666:	/* 240 */
+	case 83333:	/* 120 */
+	case 166666:	/* 60 */
+	case 200000:	/* 50 */
+	case 333333:	/* 30 */
+	case 400000:	/* 25 */
+	case 500000:	/* 20 */
+	case 666666:	/* 15 */
+	case 1000000:	/* 10 */
+		fract->numerator = 1;
+		fract->denominator = 10000000 / vs->vs_frame_interval;
+		break;
+	case 166833:	/* 59.94 */
+		fract->numerator = 60;
+		fract->denominator = 1001;
+		break;
+	case 333667:	/* 29.97 */
+		fract->numerator = 30;
+		fract->denominator = 1001;
+		break;
+	default:
+		fract->numerator = vs->vs_frame_interval;
+		fract->denominator = 10000000;
+		break;
+	}
+
+	return 0;
+}
+
+static int
+uvideo_set_framerate(void *addr, struct video_fract *fract)
+{
+	/* XXX setting framerate is not supported yet, return actual rate */
+	return uvideo_get_framerate(addr, fract);
+}
+
+static int
 uvideo_start_transfer(void *addr)
 {
 	struct uvideo_softc *sc = addr;

Reply via email to