* [PATCH] gspca_ov534: Print only frame_rate actually used.
@ 2008-11-25 22:52 Antonio Ospite
2008-11-27 9:23 ` Jean-Francois Moine
0 siblings, 1 reply; 10+ messages in thread
From: Antonio Ospite @ 2008-11-25 22:52 UTC (permalink / raw)
To: video4linux-list
Print only frame_rate actually used.
It is better to avoid altogether misleading prints of to be discarded values.
Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
diff -r 8d178f462ba7 linux/drivers/media/video/gspca/ov534.c
--- a/linux/drivers/media/video/gspca/ov534.c Mon Nov 24 10:38:21 2008 +0100
+++ b/linux/drivers/media/video/gspca/ov534.c Tue Nov 25 23:41:10 2008 +0100
@@ -364,10 +364,9 @@
if (frame_rate > 0)
sd->frame_rate = frame_rate;
- PDEBUG(D_PROBE, "frame_rate = %d", sd->frame_rate);
-
switch (sd->frame_rate) {
case 50:
+ PDEBUG(D_PROBE, "frame_rate = 50");
sccb_reg_write(gspca_dev->dev, 0x11, 0x01);
sccb_check_status(gspca_dev->dev);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41);
@@ -375,6 +374,7 @@
ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x02);
break;
case 40:
+ PDEBUG(D_PROBE, "frame_rate = 40");
sccb_reg_write(gspca_dev->dev, 0x11, 0x02);
sccb_check_status(gspca_dev->dev);
sccb_reg_write(gspca_dev->dev, 0x0d, 0xc1);
@@ -383,6 +383,7 @@
break;
case 30:
default:
+ PDEBUG(D_PROBE, "frame_rate = 30");
sccb_reg_write(gspca_dev->dev, 0x11, 0x04);
sccb_check_status(gspca_dev->dev);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x81);
@@ -390,6 +391,7 @@
ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x02);
break;
case 15:
+ PDEBUG(D_PROBE, "frame_rate = 15");
sccb_reg_write(gspca_dev->dev, 0x11, 0x03);
sccb_check_status(gspca_dev->dev);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41);
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-11-25 22:52 [PATCH] gspca_ov534: Print only frame_rate actually used Antonio Ospite @ 2008-11-27 9:23 ` Jean-Francois Moine 2008-11-27 11:05 ` Antonio Ospite 0 siblings, 1 reply; 10+ messages in thread From: Jean-Francois Moine @ 2008-11-27 9:23 UTC (permalink / raw) To: Antonio Ospite; +Cc: video4linux-list [-- Attachment #1: Type: text/plain, Size: 722 bytes --] On Tue, 2008-11-25 at 23:52 +0100, Antonio Ospite wrote: > Print only frame_rate actually used. Hello Antonio, This may be simplified as in the attached patch (the frame_rate in the sd structure was not used). The patch also includes removing the bulk_size setting at streamon time: the value is already used at this time, and also, there is only one resolution. I found a real problem: for USB read and write, you have a 16-bits variable in/from which you read/write only one byte. This will fail with big-endian machines. Anyway, it is safer to use the usb_buf from the gspca structure. Cheers. -- Ken ar c'hentañ | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ [-- Attachment #2: ov534.patch --] [-- Type: text/x-patch, Size: 2153 bytes --] diff -r 3e0ba0a8e47f linux/drivers/media/video/gspca/ov534.c --- a/linux/drivers/media/video/gspca/ov534.c Wed Nov 26 20:17:13 2008 +0100 +++ b/linux/drivers/media/video/gspca/ov534.c Thu Nov 27 10:15:08 2008 +0100 @@ -48,7 +48,6 @@ /* specific webcam descriptor */ struct sd { struct gspca_dev gspca_dev; /* !! must be the first item */ - __u8 frame_rate; }; /* V4L2 controls supported by the driver */ @@ -59,7 +58,7 @@ {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, .bytesperline = 640 * 2, .sizeimage = 640 * 480 * 2, - .colorspace = V4L2_COLORSPACE_JPEG, + .colorspace = V4L2_COLORSPACE_SRGB, .priv = 0}, }; @@ -359,14 +358,13 @@ static int sd_init(struct gspca_dev *gspca_dev) { struct sd *sd = (struct sd *)gspca_dev; + int fr; + ov534_setup(gspca_dev->dev); - if (frame_rate > 0) - sd->frame_rate = frame_rate; + fr = frame_rate; - PDEBUG(D_PROBE, "frame_rate = %d", sd->frame_rate); - - switch (sd->frame_rate) { + switch (fr) { case 50: sccb_reg_write(gspca_dev->dev, 0x11, 0x01); sccb_check_status(gspca_dev->dev); @@ -381,8 +379,9 @@ sccb_check_status(gspca_dev->dev); ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x04); break; - case 30: +/* case 30: */ default: + fr = 30; sccb_reg_write(gspca_dev->dev, 0x11, 0x04); sccb_check_status(gspca_dev->dev); sccb_reg_write(gspca_dev->dev, 0x0d, 0x81); @@ -396,18 +395,15 @@ sccb_check_status(gspca_dev->dev); ov534_reg_verify_write(gspca_dev->dev, 0xe5, 0x04); break; - }; + } + + PDEBUG(D_PROBE, "frame_rate: %d", fr); return 0; } static int sd_start(struct gspca_dev *gspca_dev) { - PDEBUG(D_PROBE, "width = %d, height = %d", - gspca_dev->width, gspca_dev->height); - - gspca_dev->cam.bulk_size = gspca_dev->width * gspca_dev->height * 2; - /* start streaming data */ ov534_set_led(gspca_dev->dev, 1); ov534_reg_write(gspca_dev->dev, 0xe0, 0x00); @@ -433,7 +429,6 @@ int framesize = gspca_dev->cam.bulk_size; if (len == framesize - 4) { - frame = gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, last_pixel, [-- Attachment #3: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-11-27 9:23 ` Jean-Francois Moine @ 2008-11-27 11:05 ` Antonio Ospite 2008-11-27 12:22 ` Jean-Francois Moine 0 siblings, 1 reply; 10+ messages in thread From: Antonio Ospite @ 2008-11-27 11:05 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 2688 bytes --] On Thu, 27 Nov 2008 10:23:04 +0100 Jean-Francois Moine <moinejf@free.fr> wrote: > On Tue, 2008-11-25 at 23:52 +0100, Antonio Ospite wrote: > > Print only frame_rate actually used. > > Hello Antonio, > > This may be simplified as in the attached patch (the frame_rate in the > sd structure was not used). > Some questions inlined. I am still learning. > The patch also includes removing the bulk_size setting at streamon time: > the value is already used at this time, and also, there is only one > resolution. > We will add this again when we add other resolutions, OK. > I found a real problem: for USB read and write, you have a 16-bits > variable in/from which you read/write only one byte. This will fail with > big-endian machines. Anyway, it is safer to use the usb_buf from the > gspca structure. > Ah, you mean in control messages, yes, those always use size=1 so a u8 can be used there. I'll give a look and will do some tests on a real PS3. Thanks. Regards, Antonio Ospite. > Cheers. > > -- > Ken ar c'hentañ | ** Breizh ha Linux atav! ** > Jef | http://moinejf.free.fr/ > > > > [ov534.patch text/x-patch (2,1KB)] > diff -r 3e0ba0a8e47f linux/drivers/media/video/gspca/ov534.c > --- a/linux/drivers/media/video/gspca/ov534.c Wed Nov 26 20:17:13 2008 +0100 > +++ b/linux/drivers/media/video/gspca/ov534.c Thu Nov 27 10:15:08 2008 +0100 > @@ -48,7 +48,6 @@ > /* specific webcam descriptor */ > struct sd { > struct gspca_dev gspca_dev; /* !! must be the first item */ > - __u8 frame_rate; > }; > > /* V4L2 controls supported by the driver */ > @@ -59,7 +58,7 @@ > {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, > .bytesperline = 640 * 2, > .sizeimage = 640 * 480 * 2, > - .colorspace = V4L2_COLORSPACE_JPEG, > + .colorspace = V4L2_COLORSPACE_SRGB, > .priv = 0}, > }; > Can you explain this one, please? [snip] > @@ -433,7 +429,6 @@ > int framesize = gspca_dev->cam.bulk_size; > > if (len == framesize - 4) { > - frame = > gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); This change is just to follow the convention used by other drivers, right? You could also adjust indentation on following line, then. > frame = > gspca_frame_add(gspca_dev, LAST_PACKET, frame, last_pixel, > -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-11-27 11:05 ` Antonio Ospite @ 2008-11-27 12:22 ` Jean-Francois Moine 2008-11-27 13:52 ` Antonio Ospite 0 siblings, 1 reply; 10+ messages in thread From: Jean-Francois Moine @ 2008-11-27 12:22 UTC (permalink / raw) To: Antonio Ospite; +Cc: video4linux-list On Thu, 2008-11-27 at 12:05 +0100, Antonio Ospite wrote: > > The patch also includes removing the bulk_size setting at streamon time: > > the value is already used at this time, and also, there is only one > > resolution. > We will add this again when we add other resolutions, OK. The bulk_size must be set at the max resolution because it is used for buffer allocation before stream on. [snip] > > /* V4L2 controls supported by the driver */ > > @@ -59,7 +58,7 @@ > > {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, > > .bytesperline = 640 * 2, > > .sizeimage = 640 * 480 * 2, > > - .colorspace = V4L2_COLORSPACE_JPEG, > > + .colorspace = V4L2_COLORSPACE_SRGB, > > .priv = 0}, > > }; > > > > Can you explain this one, please? I think the JPEG images embed colorspace information, and here, it is simple RGB. > [snip] > > @@ -433,7 +429,6 @@ > > int framesize = gspca_dev->cam.bulk_size; > > > > if (len == framesize - 4) { > > - frame = > > gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); > > This change is just to follow the convention used by other drivers, > right? You could also adjust indentation on following line, then. If you look carefully, the frame returned by gspca_frame_add() is changed only when the packet type is LAST_PACKET. OK for the indentation. Cheers. -- Ken ar c'hentañ | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-11-27 12:22 ` Jean-Francois Moine @ 2008-11-27 13:52 ` Antonio Ospite 2008-12-03 16:45 ` Antonio Ospite 0 siblings, 1 reply; 10+ messages in thread From: Antonio Ospite @ 2008-11-27 13:52 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 2606 bytes --] On Thu, 27 Nov 2008 13:22:33 +0100 Jean-Francois Moine <moinejf@free.fr> wrote: > On Thu, 2008-11-27 at 12:05 +0100, Antonio Ospite wrote: > > > The patch also includes removing the bulk_size setting at streamon time: > > > the value is already used at this time, and also, there is only one > > > resolution. > > We will add this again when we add other resolutions, OK. > > The bulk_size must be set at the max resolution because it is used for > buffer allocation before stream on. > Well, isn't it only used in create_urbs()? AFAICS the latter uses it to set urb->tranfer_buffer_length and is called at streamon time, so it could still be worth to set bulk_size to exact value for the current resolution to have more efficient transfers, what do you think? > [snip] > > > /* V4L2 controls supported by the driver */ > > > @@ -59,7 +58,7 @@ > > > {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, > > > .bytesperline = 640 * 2, > > > .sizeimage = 640 * 480 * 2, > > > - .colorspace = V4L2_COLORSPACE_JPEG, > > > + .colorspace = V4L2_COLORSPACE_SRGB, > > > .priv = 0}, > > > }; > > > > > > > Can you explain this one, please? > > I think the JPEG images embed colorspace information, and here, it is > simple RGB. > Also other drivers are setting this colorspace for raw YCbCr data, see mt9m111.c: COL_FMT("YCrYCb 16 bit", 16, V4L2_PIX_FMT_YUYV, V4L2_COLORSPACE_JPEG), and tcm825x.c: switch (pix->pixelformat) { case V4L2_PIX_FMT_UYVY: default: pix->colorspace = V4L2_COLORSPACE_JPEG; break; and also the comment relative to V4L2_COLORSPACE_JPEG mentions YCbCr, but honestly, I don't know how this colorspace info is used that's why I am asking. > > [snip] > > > @@ -433,7 +429,6 @@ > > > int framesize = gspca_dev->cam.bulk_size; > > > > > > if (len == framesize - 4) { > > > - frame = > > > gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); > > > > This change is just to follow the convention used by other drivers, > > right? You could also adjust indentation on following line, then. > > If you look carefully, the frame returned by gspca_frame_add() is > changed only when the packet type is LAST_PACKET. OK for the > indentation. > OK, thanks. Regards, Antonio Ospite -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-11-27 13:52 ` Antonio Ospite @ 2008-12-03 16:45 ` Antonio Ospite 2008-12-03 18:01 ` Jim Paris 0 siblings, 1 reply; 10+ messages in thread From: Antonio Ospite @ 2008-12-03 16:45 UTC (permalink / raw) To: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 3906 bytes --] On Thu, 27 Nov 2008 14:52:33 +0100 Antonio Ospite <ospite@studenti.unina.it> wrote: > On Thu, 27 Nov 2008 13:22:33 +0100 > Jean-Francois Moine <moinejf@free.fr> wrote: > > > On Thu, 2008-11-27 at 12:05 +0100, Antonio Ospite wrote: > > > > The patch also includes removing the bulk_size setting at streamon time: > > > > the value is already used at this time, and also, there is only one > > > > resolution. > > > We will add this again when we add other resolutions, OK. > > > > The bulk_size must be set at the max resolution because it is used for > > buffer allocation before stream on. > > > > Well, isn't it only used in create_urbs()? AFAICS the latter uses it to > set urb->tranfer_buffer_length and is called at streamon time, so it > could still be worth to set bulk_size to exact value for the current > resolution to have more efficient transfers, what do you think? > Hi Jean-Francois, it turned out that on PS3 the big current bulk_size doesn't work, because here the hardware needs contiguous memory for transfers (if the description is somewhat imprecise please correct me) and it is not always possible to allocate such a big contiguous chunk, so we have to use a smaller fixed size for bulk transfers and fill the frame in several passes in pkt_scan. I am preparing some patches, but I come across a problem. Now I use this code in pkt_scan (I add a zero length FIRST_PACKET in sd_start): if ((frame->data_end - frame->data + len) == (framesize - 4)) { PDEBUG(D_PACK, " end of frame?"); gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, last, 4); gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0); } else gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); When everything works ok I get this log messages: ov534: ** packet len = 16384, framesize = 614400 ov534: ** frame->data_end - frame->data + len = 16384 ov534: ... ov534: ** packet len = 8188, framesize = 614400 ov534: ** frame->data_end - frame->data + len = 614396 ov534: end of frame! ov534: ov534: ** packet len = 16384, framesize = 614400 ov534: ** frame->data_end - frame->data + len = 16384 ov534: ... But sometime, at higher frame rates, it doesn't work, frames are discarded because I get: ov534: ** packet len = 16384, framesize = 614400 ov534: ** frame->data_end - frame->data + len = 16384 ov534: ... ov534: ** packet len = 8188, framesize = 614400 ov534: ** frame->data_end - frame->data + len = 614396 ov534: end of frame! ov534: ov534: ** packet len = 16384, framesize = 614400 ov534: ** frame->data_end - frame->data + len = 630784 ov534: ^^^^^^ ... ^^^^^^ It looks like something is failing in gspca_frame_add(), it doesn't get to the statement frame->data_end = frame->data; when adding the FIRST_PACKET. That could be because the packet has been queued but not added yet, AFAIU. How to deal with such case? As a side note, if I use this check to detect the end of the frame: if (len < gspca_dev->cam.bulk_size) { ... } else ... I can recover from the previous error even if I get some frame discarded from time to time. Is this check acceptable to you If I take care that framesize is not a multiple of bulk_size? The current quilt patchset is here: http://shell.studenti.unina.it/~ospite/tmp/gspca_ov534_patches-2008-12-03.tar.gz Regards, Antonio Ospite -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-12-03 16:45 ` Antonio Ospite @ 2008-12-03 18:01 ` Jim Paris 2008-12-03 18:44 ` Antonio Ospite 0 siblings, 1 reply; 10+ messages in thread From: Jim Paris @ 2008-12-03 18:01 UTC (permalink / raw) To: Antonio Ospite; +Cc: video4linux-list Hi Antonio, Antonio Ospite wrote: > it turned out that on PS3 the big current bulk_size doesn't work, > because here the hardware needs contiguous memory for transfers (if > the description is somewhat imprecise please correct me) and it is not > always possible to allocate such a big contiguous chunk, so we have to > use a smaller fixed size for bulk transfers and fill the frame in > several passes in pkt_scan. Such a large bulk_size is probably not a good idea on any system. The PS3 in particular is already memory constrained so it's definitely a good idea to break that up. > I am preparing some patches, but I come across a problem. > > Now I use this code in pkt_scan (I add a zero length FIRST_PACKET in > sd_start): > > if ((frame->data_end - frame->data + len) == (framesize - 4)) { > PDEBUG(D_PACK, " end of frame?"); > gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); > frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, last, 4); > gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0); > } else > gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); ... > It looks like something is failing in gspca_frame_add(), it doesn't get > to the statement frame->data_end = frame->data; when adding the > FIRST_PACKET. That could be because the packet has been queued but not > added yet, AFAIU. How to deal with such case? If gspca decides to discard a frame with DISCARD_PACKET, I believe it won't start working again until you send another FIRST_PACKET. In your code, if DISCARD_PACKET ever happens, the frame->data pointers won't get updated so you'll never get to FIRST_PACKET? > As a side note, if I use this check to detect the end of the frame: > > if (len < gspca_dev->cam.bulk_size) { > ... > } else ... > > I can recover from the previous error even if I get some frame > discarded from time to time. Is this check acceptable to you If I take > care that framesize is not a multiple of bulk_size? Hold off a bit on this work. There's a problem with breaking up the transfers, because we're not currently getting any header data from the bridge chip that lets us know when we really hit the end of a frame, and it's easy to get out of sync. Using (len < bulk_size) is a good trick if they're not a multiple, as you say, since the last payload will be shorter, but I have a better solution -- I found how to get the camera to add a UVC-format header on each payload. I'm finishing up the patch and will post it a bit later today once I iron out a few bugs. -jim -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-12-03 18:01 ` Jim Paris @ 2008-12-03 18:44 ` Antonio Ospite 2008-12-03 19:17 ` Jean-Francois Moine 0 siblings, 1 reply; 10+ messages in thread From: Antonio Ospite @ 2008-12-03 18:44 UTC (permalink / raw) To: Jim Paris; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 2291 bytes --] On Wed, 3 Dec 2008 13:01:28 -0500 Jim Paris <jim@jtan.com> wrote: > Hi Antonio, > > Antonio Ospite wrote: > > If gspca decides to discard a frame with DISCARD_PACKET, I believe it > won't start working again until you send another FIRST_PACKET. In > your code, if DISCARD_PACKET ever happens, the frame->data pointers > won't get updated so you'll never get to FIRST_PACKET? > Yes, the code takes this path in gspca.c, gspca_frame_add(), line 277: if (packet_type == FIRST_PACKET) { if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS) != V4L2_BUF_FLAG_QUEUED) { gspca_dev->last_packet_type = DISCARD_PACKET; return frame; } and then it keeps on adding only INTER_PACKETs because of the current end of frame check. It is a timing issue, it happens only with high frame_rates, maybe there is some code in gspca that needs to be protected by locking? Or would it be normal to loose some frames at high frame rates using smaller bulk_size? > > As a side note, if I use this check to detect the end of the frame: > > > > if (len < gspca_dev->cam.bulk_size) { > > ... > > } else ... > > > > I can recover from the previous error even if I get some frame > > discarded from time to time. Is this check acceptable to you If I take > > care that framesize is not a multiple of bulk_size? > > Hold off a bit on this work. > > There's a problem with breaking up the transfers, because we're not > currently getting any header data from the bridge chip that lets us > know when we really hit the end of a frame, and it's easy to get out > of sync. Using (len < bulk_size) is a good trick if they're not a > multiple, as you say, since the last payload will be shorter, but I > have a better solution -- I found how to get the camera to add a > UVC-format header on each payload. I'm finishing up the patch and > will post it a bit later today once I iron out a few bugs. > > -jim Ok, many thanks. Regards, Antonio -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-12-03 18:44 ` Antonio Ospite @ 2008-12-03 19:17 ` Jean-Francois Moine 2008-12-04 11:55 ` Antonio Ospite 0 siblings, 1 reply; 10+ messages in thread From: Jean-Francois Moine @ 2008-12-03 19:17 UTC (permalink / raw) To: Antonio Ospite; +Cc: video4linux-list [-- Attachment #1: Type: text/plain, Size: 2536 bytes --] On Wed, 2008-12-03 at 19:44 +0100, Antonio Ospite wrote: > Yes, the code takes this path in gspca.c, gspca_frame_add(), line 277: > > if (packet_type == FIRST_PACKET) { > if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS) > != V4L2_BUF_FLAG_QUEUED) { > gspca_dev->last_packet_type = DISCARD_PACKET; > return frame; > } > > and then it keeps on adding only INTER_PACKETs because of the current > end of frame check. It is a timing issue, it happens only with high > frame_rates, maybe there is some code in gspca that needs to be > protected by locking? > Or would it be normal to loose some frames at high frame rates using > smaller bulk_size? > > > > As a side note, if I use this check to detect the end of the frame: > > > > > > if (len < gspca_dev->cam.bulk_size) { > > > ... > > > } else ... > > > > > > I can recover from the previous error even if I get some frame > > > discarded from time to time. Is this check acceptable to you If I take > > > care that framesize is not a multiple of bulk_size? > > > > Hold off a bit on this work. > > > > There's a problem with breaking up the transfers, because we're not > > currently getting any header data from the bridge chip that lets us > > know when we really hit the end of a frame, and it's easy to get out > > of sync. Using (len < bulk_size) is a good trick if they're not a > > multiple, as you say, since the last payload will be shorter, but I > > have a better solution -- I found how to get the camera to add a > > UVC-format header on each payload. I'm finishing up the patch and > > will post it a bit later today once I iron out a few bugs. > > > > -jim Hi Antonio, The problem comes from the availability of the application buffer. In the bulk_irq, there is: frame = gspca_get_i_frame(gspca_dev); if (!frame) { gspca_dev->last_packet_type = DISCARD_PACKET; } else { .. pkt_scan(..); } Then, you are not called and you cannot know how many bytes have been really received. As the buffer check exists in frame_add, I may call you each time with a valid frame pointer (see patch). In this case, you cannot count the image bytes with the data_end. You should have a counter in the sd structure. An other solution is to start and stop the transfer for each image as it was in the original driver, but it asks for a kernel thread. Anyway, if Jim may add a mark between the images, if will be the best... Cheers. -- Ken ar c'hentañ | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ [-- Attachment #2: gspca.patch --] [-- Type: text/x-patch, Size: 1061 bytes --] diff -r d23374509b5b linux/drivers/media/video/gspca/gspca.c --- a/linux/drivers/media/video/gspca/gspca.c Wed Dec 03 18:10:01 2008 +0100 +++ b/linux/drivers/media/video/gspca/gspca.c Wed Dec 03 20:11:23 2008 +0100 @@ -211,6 +211,7 @@ { struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context; struct gspca_frame *frame; + int i; int st; PDEBUG(D_PACK, "bulk irq"); @@ -231,16 +232,14 @@ } /* check the availability of the frame buffer */ - frame = gspca_get_i_frame(gspca_dev); - if (!frame) { - gspca_dev->last_packet_type = DISCARD_PACKET; - } else { - PDEBUG(D_PACK, "packet l:%d", urb->actual_length); - gspca_dev->sd_desc->pkt_scan(gspca_dev, - frame, - urb->transfer_buffer, - urb->actual_length); - } + i = gspca_dev->fr_i; + i = gspca_dev->fr_queue[i]; + frame = &gspca_dev->frame[i]; + PDEBUG(D_PACK, "packet l:%d", urb->actual_length); + gspca_dev->sd_desc->pkt_scan(gspca_dev, + frame, + urb->transfer_buffer, + urb->actual_length); /* resubmit the URB */ if (gspca_dev->cam.bulk_nurbs != 0) { [-- Attachment #3: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] gspca_ov534: Print only frame_rate actually used. 2008-12-03 19:17 ` Jean-Francois Moine @ 2008-12-04 11:55 ` Antonio Ospite 0 siblings, 0 replies; 10+ messages in thread From: Antonio Ospite @ 2008-12-04 11:55 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: video4linux-list [-- Attachment #1.1: Type: text/plain, Size: 2167 bytes --] On Wed, 03 Dec 2008 20:17:20 +0100 Jean-Francois Moine <moinejf@free.fr> wrote: > On Wed, 2008-12-03 at 19:44 +0100, Antonio Ospite wrote: > > Yes, the code takes this path in gspca.c, gspca_frame_add(), line 277: > > > > if (packet_type == FIRST_PACKET) { > > if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS) > > != V4L2_BUF_FLAG_QUEUED) { > > gspca_dev->last_packet_type = DISCARD_PACKET; > > return frame; > > } > > > > and then it keeps on adding only INTER_PACKETs because of the current > > end of frame check. It is a timing issue, it happens only with high > > frame_rates, maybe there is some code in gspca that needs to be > > protected by locking? > > Or would it be normal to loose some frames at high frame rates using > > smaller bulk_size? > > > > Hi Antonio, > > The problem comes from the availability of the application buffer. In > the bulk_irq, there is: > > frame = gspca_get_i_frame(gspca_dev); > if (!frame) { > gspca_dev->last_packet_type = DISCARD_PACKET; > } else { > .. pkt_scan(..); > } > > Then, you are not called and you cannot know how many bytes have been > really received. > And this happens because we couldn't have two separate events for LAST_PACKET and FIRST_PACKET, right? > As the buffer check exists in frame_add, I may call you each time with a > valid frame pointer (see patch). In this case, you cannot count the > image bytes with the data_end. You should have a counter in the sd > structure. > > An other solution is to start and stop the transfer for each image as it > was in the original driver, but it asks for a kernel thread. > > Anyway, if Jim may add a mark between the images, if will be the best... > Ok, we'll go with Jim changes. Thanks anyway for the patch, but I don't think it is needed anymore. Regards, Antonio -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? Web site: http://www.studenti.unina.it/~ospite Public key: http://www.studenti.unina.it/~ospite/aopubkey.asc [-- Attachment #1.2: Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 164 bytes --] -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-12-04 11:55 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-11-25 22:52 [PATCH] gspca_ov534: Print only frame_rate actually used Antonio Ospite 2008-11-27 9:23 ` Jean-Francois Moine 2008-11-27 11:05 ` Antonio Ospite 2008-11-27 12:22 ` Jean-Francois Moine 2008-11-27 13:52 ` Antonio Ospite 2008-12-03 16:45 ` Antonio Ospite 2008-12-03 18:01 ` Jim Paris 2008-12-03 18:44 ` Antonio Ospite 2008-12-03 19:17 ` Jean-Francois Moine 2008-12-04 11:55 ` Antonio Ospite
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox