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;