Skip to contentSkip to conversation

PATCH: gscpa stv06xx + ov518: dont discard every other frame

PATCH Hans de Goede 2 participants 2 messages Oct 4, 2009 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

Hi,

As noticed by James Blanford <[email protected]>, we were discarding every other frame in stv06xx and the ov518 (part of ov519.c) drivers.

When we call gspca_frame_add, it returns a pointer to the frame passed in, unless we call it with LAST_PACKET, when it will return a pointer to a new frame in which to store the frame data for the next frame. So whenever calling:
gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, len);
we should do this as:
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, len);

So that any further data got from of the pkt we are handling in pkt_scan, goes to the next frame.

We are not doing this in stv06xx.c pkt_scan method, which the cause of what James is seeing. So I started checking all drivers, and we are not doing this either in ov519.c when handling an ov518 bridge. So now the framerate of my 3 ov518 test cams has just doubled. Thanks James!

The attached patch fixes this.

Regards,

Hans

linux/drivers/media/video/gspca/ov519.c +1 -1
diff -r 5ad36b0c0e90 linux/drivers/media/video/gspca/ov519.c
@@ -2939,7 +2939,7 @@
 	/* A false positive here is likely, until OVT gives me
 	 * the definitive SOF/EOF format */
 	if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) {
-		gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0);
+		frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0);
 		gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0);
 		sd->packet_nr = 0;
 	}
linux/drivers/media/video/gspca/stv06xx/stv06xx.c +1 -1
diff -r 5ad36b0c0e90 linux/drivers/media/video/gspca/stv06xx/stv06xx.c
@@ -394,7 +394,7 @@
 			PDEBUG(D_PACK, "End of frame detected");
 
 			/* Complete the last frame (if any) */
-			gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0);
+			frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0);
 
 			if (chunk_len)
 				PDEBUG(D_ERR, "Chunk length is "
#1 lore raw

2009/10/4 Hans de Goede <[email protected]>:

Quoted 17 lines

Hi,

As noticed by James Blanford <[email protected]>, we were discarding every other frame in stv06xx and the ov518 (part of ov519.c) drivers.

When we call gspca_frame_add, it returns a pointer to the frame passed in, unless we call it with LAST_PACKET, when it will return a pointer to a new frame in which to store the frame data for the next frame. So whenever calling:
gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, len);
we should do this as:
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, len);

So that any further data got from of the pkt we are handling in pkt_scan, goes
to the next frame.

Quoted 6 lines

We are not doing this in stv06xx.c pkt_scan method, which the cause of what James is seeing. So I started checking all drivers, and we are not doing this
either in ov519.c when handling an ov518 bridge. So now the framerate of my 3 ov518 test cams has just doubled. Thanks James!

What a great discovery! \o/

Regards,
Erik

Quoted 6 lines

The attached patch fixes this.

Regards,

Hans