diff options
author | Marcus Glocker <mglocker@cvs.openbsd.org> | 2008-06-08 20:11:31 +0000 |
---|---|---|
committer | Marcus Glocker <mglocker@cvs.openbsd.org> | 2008-06-08 20:11:31 +0000 |
commit | 5fa04617da2eefbf68755abcee411f88f654dfc0 (patch) | |
tree | 819e68dc15f192890728226b3b173111cd4059d0 | |
parent | 4cae2a9aaccefd813f3d221cdc60abc88d3b6df9 (diff) |
If we have reached the end of the mmap frame buffer, start over again
(ring buffer). Add some more DPRINTFs to follow the queueing.
OK robert@
-rw-r--r-- | sys/dev/usb/uvideo.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/usb/uvideo.c b/sys/dev/usb/uvideo.c index 128c8f471f8..c6526b90611 100644 --- a/sys/dev/usb/uvideo.c +++ b/sys/dev/usb/uvideo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvideo.c,v 1.26 2008/06/08 00:18:33 robert Exp $ */ +/* $OpenBSD: uvideo.c,v 1.27 2008/06/08 20:11:30 mglocker Exp $ */ /* * Copyright (c) 2008 Robert Nagy <robert@openbsd.org> @@ -1243,15 +1243,21 @@ uvideo_mmap_queue(struct uvideo_softc *sc, uint8_t *buf, int len) if (sc->sc_mmap_cur == sc->sc_mmap_count) panic("uvideo_mmap_queue: mmap queue is full!"); - /* copy frame to mmap buffer */ + /* copy frame to mmap buffer and report length */ bcopy(buf, sc->sc_mmap[sc->sc_mmap_cur].buf, len); + sc->sc_mmap[sc->sc_mmap_cur].v4l2_buf.bytesused = len; /* queue it */ SIMPLEQ_INSERT_TAIL(&sc->sc_mmap_q, &sc->sc_mmap[sc->sc_mmap_cur], q_frames); + DPRINTF(1, "%s: %s: frame queued on index %d\n", + DEVNAME(sc), __func__, sc->sc_mmap_cur); /* point to next mmap buffer */ sc->sc_mmap_cur++; + if (sc->sc_mmap_cur == sc->sc_mmap_count) + /* we reached the end of the mmap buffer, start over */ + sc->sc_mmap_cur = 0; wakeup(sc); @@ -1863,6 +1869,9 @@ uvideo_qbuf(void *v, struct v4l2_buffer *qb) sc->sc_mmap[qb->index].v4l2_buf.flags |= V4L2_BUF_FLAG_MAPPED; sc->sc_mmap[qb->index].v4l2_buf.flags |= V4L2_BUF_FLAG_QUEUED; + DPRINTF(1, "%s: %s: buffer on index %d ready for queueing\n", + DEVNAME(sc), __func__, qb->index); + return (0); } @@ -1888,8 +1897,9 @@ uvideo_dqbuf(void *v, struct v4l2_buffer *dqb) mmap->v4l2_buf.flags |= V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_DONE; + DPRINTF(1, "%s: %s: frame dequeued from index %d\n", + DEVNAME(sc), __func__, mmap->v4l2_buf.index); SIMPLEQ_REMOVE_HEAD(&sc->sc_mmap_q, q_frames); - sc->sc_mmap_cur--; return (0); } |