提交 76dd272b 编写于 作者: J Jean-Francois Moine 提交者: Mauro Carvalho Chehab

V4L/DVB (13453): gspca - all subdrivers: Remove the unused frame ptr from pkt_scan().

Signed-off-by: NJean-Francois Moine <moinejf@free.fr>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 d131c3c9
...@@ -888,8 +888,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -888,8 +888,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -897,16 +896,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -897,16 +896,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
if (data[0] == 0xff && data[1] == 0xd8) { if (data[0] == 0xff && data[1] == 0xd8) {
/* start of frame */ /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
data += 2; data += 2;
len -= 2; len -= 2;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static void setbrightness(struct gspca_dev*gspca_dev) static void setbrightness(struct gspca_dev*gspca_dev)
......
...@@ -752,8 +752,7 @@ static void do_autogain(struct gspca_dev *gspca_dev) ...@@ -752,8 +752,7 @@ static void do_autogain(struct gspca_dev *gspca_dev)
#undef LIMIT #undef LIMIT
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
int seqframe; int seqframe;
...@@ -767,14 +766,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -767,14 +766,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
data[2], data[3], data[4], data[5]); data[2], data[3], data[4], data[5]);
data += 30; data += 30;
/* don't change datalength as the chips provided it */ /* don't change datalength as the chips provided it */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len);
return; return;
} }
if (len) { if (len) {
data += 8; data += 8;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} else { /* Drop Packet */ } else { /* Drop Packet */
gspca_dev->last_packet_type = DISCARD_PACKET; gspca_dev->last_packet_type = DISCARD_PACKET;
} }
......
...@@ -82,7 +82,6 @@ static void dostream(struct work_struct *work) ...@@ -82,7 +82,6 @@ static void dostream(struct work_struct *work)
struct gspca_dev *gspca_dev = &dev->gspca_dev; struct gspca_dev *gspca_dev = &dev->gspca_dev;
struct urb *urb = gspca_dev->urb[0]; struct urb *urb = gspca_dev->urb[0];
u8 *data = urb->transfer_buffer; u8 *data = urb->transfer_buffer;
struct gspca_frame *frame;
int ret = 0; int ret = 0;
int len; int len;
...@@ -118,10 +117,6 @@ static void dostream(struct work_struct *work) ...@@ -118,10 +117,6 @@ static void dostream(struct work_struct *work)
} }
if (!gspca_dev->present || !gspca_dev->streaming) if (!gspca_dev->present || !gspca_dev->streaming)
goto out; goto out;
frame = gspca_get_i_frame(&dev->gspca_dev);
if (frame == NULL)
gspca_dev->last_packet_type = DISCARD_PACKET;
if (len < FPIX_MAX_TRANSFER || if (len < FPIX_MAX_TRANSFER ||
(data[len - 2] == 0xff && (data[len - 2] == 0xff &&
data[len - 1] == 0xd9)) { data[len - 1] == 0xd9)) {
...@@ -132,21 +127,17 @@ static void dostream(struct work_struct *work) ...@@ -132,21 +127,17 @@ static void dostream(struct work_struct *work)
* but there's nothing we can do. We also end * but there's nothing we can do. We also end
* here if the the jpeg ends right at the end * here if the the jpeg ends right at the end
* of the frame. */ * of the frame. */
if (frame) gspca_frame_add(gspca_dev, LAST_PACKET,
frame = gspca_frame_add(gspca_dev, data, len);
LAST_PACKET,
frame,
data, len);
break; break;
} }
/* got a partial image */ /* got a partial image */
if (frame) gspca_frame_add(gspca_dev,
gspca_frame_add(gspca_dev, gspca_dev->last_packet_type
gspca_dev->last_packet_type == LAST_PACKET
== LAST_PACKET ? FIRST_PACKET : INTER_PACKET,
? FIRST_PACKET : INTER_PACKET, data, len);
frame, data, len);
} }
/* We must wait before trying reading the next /* We must wait before trying reading the next
......
...@@ -36,7 +36,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev); ...@@ -36,7 +36,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev);
static int sd_start(struct gspca_dev *gspca_dev); static int sd_start(struct gspca_dev *gspca_dev);
static void sd_stop0(struct gspca_dev *gspca_dev); static void sd_stop0(struct gspca_dev *gspca_dev);
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data, s32 len); u8 *data, int len);
static void sd_callback(struct gspca_dev *gspca_dev); static void sd_callback(struct gspca_dev *gspca_dev);
static int gl860_guess_sensor(struct gspca_dev *gspca_dev, static int gl860_guess_sensor(struct gspca_dev *gspca_dev,
...@@ -433,7 +433,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -433,7 +433,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
/* This function is called when an image is being received */ /* This function is called when an image is being received */
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data, s32 len) u8 *data, int len)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
static s32 nSkipped; static s32 nSkipped;
...@@ -445,11 +445,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -445,11 +445,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
/* Test only against 0202h, so endianess does not matter */ /* Test only against 0202h, so endianess does not matter */
switch (*(s16 *) data) { switch (*(s16 *) data) {
case 0x0202: /* End of frame, start a new one */ case 0x0202: /* End of frame, start a new one */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
nSkipped = 0; nSkipped = 0;
if (sd->nbIm >= 0 && sd->nbIm < 10) if (sd->nbIm >= 0 && sd->nbIm < 10)
sd->nbIm++; sd->nbIm++;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
break; break;
default: default:
...@@ -464,7 +464,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -464,7 +464,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
nSkipped = nToSkip + 1; nSkipped = nToSkip + 1;
} }
gspca_frame_add(gspca_dev, gspca_frame_add(gspca_dev,
INTER_PACKET, frame, data, len); INTER_PACKET, data, len);
} }
break; break;
} }
......
...@@ -165,7 +165,7 @@ static void fill_frame(struct gspca_dev *gspca_dev, ...@@ -165,7 +165,7 @@ static void fill_frame(struct gspca_dev *gspca_dev,
i, urb->iso_frame_desc[i].offset, len); i, urb->iso_frame_desc[i].offset, len);
data = (u8 *) urb->transfer_buffer data = (u8 *) urb->transfer_buffer
+ urb->iso_frame_desc[i].offset; + urb->iso_frame_desc[i].offset;
pkt_scan(gspca_dev, gspca_dev->cur_frame, data, len); pkt_scan(gspca_dev, data, len);
} }
resubmit: resubmit:
...@@ -218,7 +218,6 @@ static void bulk_irq(struct urb *urb) ...@@ -218,7 +218,6 @@ static void bulk_irq(struct urb *urb)
PDEBUG(D_PACK, "packet l:%d", urb->actual_length); PDEBUG(D_PACK, "packet l:%d", urb->actual_length);
gspca_dev->sd_desc->pkt_scan(gspca_dev, gspca_dev->sd_desc->pkt_scan(gspca_dev,
gspca_dev->frame,
urb->transfer_buffer, urb->transfer_buffer,
urb->actual_length); urb->actual_length);
...@@ -243,11 +242,10 @@ static void bulk_irq(struct urb *urb) ...@@ -243,11 +242,10 @@ static void bulk_irq(struct urb *urb)
* DISCARD_PACKET invalidates the whole frame. * DISCARD_PACKET invalidates the whole frame.
* On LAST_PACKET, a new frame is returned. * On LAST_PACKET, a new frame is returned.
*/ */
struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, void gspca_frame_add(struct gspca_dev *gspca_dev,
enum gspca_packet_type packet_type, enum gspca_packet_type packet_type,
struct gspca_frame *dummy, const u8 *data,
const __u8 *data, int len)
int len)
{ {
struct gspca_frame *frame; struct gspca_frame *frame;
int i, j; int i, j;
...@@ -259,7 +257,7 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, ...@@ -259,7 +257,7 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev,
if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS) if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS)
!= V4L2_BUF_FLAG_QUEUED) { != V4L2_BUF_FLAG_QUEUED) {
gspca_dev->last_packet_type = DISCARD_PACKET; gspca_dev->last_packet_type = DISCARD_PACKET;
return frame; return;
} }
/* when start of a new frame, if the current frame buffer /* when start of a new frame, if the current frame buffer
...@@ -272,7 +270,7 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, ...@@ -272,7 +270,7 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev,
} else if (gspca_dev->last_packet_type == DISCARD_PACKET) { } else if (gspca_dev->last_packet_type == DISCARD_PACKET) {
if (packet_type == LAST_PACKET) if (packet_type == LAST_PACKET)
gspca_dev->last_packet_type = packet_type; gspca_dev->last_packet_type = packet_type;
return frame; return;
} }
/* append the packet to the frame buffer */ /* append the packet to the frame buffer */
...@@ -304,9 +302,9 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, ...@@ -304,9 +302,9 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev,
i, i,
gspca_dev->fr_o); gspca_dev->fr_o);
j = gspca_dev->fr_queue[i]; j = gspca_dev->fr_queue[i];
gspca_dev->cur_frame = frame = &gspca_dev->frame[j]; gspca_dev->cur_frame = &gspca_dev->frame[j];
} }
return frame; return;
} }
EXPORT_SYMBOL(gspca_frame_add); EXPORT_SYMBOL(gspca_frame_add);
......
...@@ -79,8 +79,7 @@ typedef int (*cam_streamparm_op) (struct gspca_dev *, ...@@ -79,8 +79,7 @@ typedef int (*cam_streamparm_op) (struct gspca_dev *,
typedef int (*cam_qmnu_op) (struct gspca_dev *, typedef int (*cam_qmnu_op) (struct gspca_dev *,
struct v4l2_querymenu *); struct v4l2_querymenu *);
typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev, typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data,
__u8 *data,
int len); int len);
struct ctrl { struct ctrl {
...@@ -192,11 +191,10 @@ int gspca_dev_probe(struct usb_interface *intf, ...@@ -192,11 +191,10 @@ int gspca_dev_probe(struct usb_interface *intf,
int dev_size, int dev_size,
struct module *module); struct module *module);
void gspca_disconnect(struct usb_interface *intf); void gspca_disconnect(struct usb_interface *intf);
struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, void gspca_frame_add(struct gspca_dev *gspca_dev,
enum gspca_packet_type packet_type, enum gspca_packet_type packet_type,
struct gspca_frame *frame, const u8 *data,
const __u8 *data, int len);
int len);
struct gspca_frame *gspca_get_i_frame(struct gspca_dev *gspca_dev); struct gspca_frame *gspca_get_i_frame(struct gspca_dev *gspca_dev);
#ifdef CONFIG_PM #ifdef CONFIG_PM
int gspca_suspend(struct usb_interface *intf, pm_message_t message); int gspca_suspend(struct usb_interface *intf, pm_message_t message);
......
...@@ -181,7 +181,6 @@ static void jlj_dostream(struct work_struct *work) ...@@ -181,7 +181,6 @@ static void jlj_dostream(struct work_struct *work)
{ {
struct sd *dev = container_of(work, struct sd, work_struct); struct sd *dev = container_of(work, struct sd, work_struct);
struct gspca_dev *gspca_dev = &dev->gspca_dev; struct gspca_dev *gspca_dev = &dev->gspca_dev;
struct gspca_frame *frame;
int blocks_left; /* 0x200-sized blocks remaining in current frame. */ int blocks_left; /* 0x200-sized blocks remaining in current frame. */
int size_in_blocks; int size_in_blocks;
int act_len; int act_len;
...@@ -214,15 +213,13 @@ static void jlj_dostream(struct work_struct *work) ...@@ -214,15 +213,13 @@ static void jlj_dostream(struct work_struct *work)
PDEBUG(D_STREAM, "blocks_left = 0x%x", blocks_left); PDEBUG(D_STREAM, "blocks_left = 0x%x", blocks_left);
/* Start a new frame, and add the JPEG header, first thing */ /* Start a new frame, and add the JPEG header, first thing */
frame = gspca_get_i_frame(gspca_dev); gspca_frame_add(gspca_dev, FIRST_PACKET,
if (frame) { dev->jpeg_hdr, JPEG_HDR_SZ);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, /* Toss line 0 of data block 0, keep the rest. */
dev->jpeg_hdr, JPEG_HDR_SZ); gspca_frame_add(gspca_dev, INTER_PACKET,
/* Toss line 0 of data block 0, keep the rest. */ buffer + FRAME_HEADER_LEN,
gspca_frame_add(gspca_dev, INTER_PACKET,
frame, buffer + FRAME_HEADER_LEN,
JEILINJ_MAX_TRANSFER - FRAME_HEADER_LEN); JEILINJ_MAX_TRANSFER - FRAME_HEADER_LEN);
}
while (blocks_left > 0) { while (blocks_left > 0) {
if (!gspca_dev->present) if (!gspca_dev->present)
goto quit_stream; goto quit_stream;
...@@ -239,10 +236,8 @@ static void jlj_dostream(struct work_struct *work) ...@@ -239,10 +236,8 @@ static void jlj_dostream(struct work_struct *work)
packet_type = LAST_PACKET; packet_type = LAST_PACKET;
else else
packet_type = INTER_PACKET; packet_type = INTER_PACKET;
if (frame) gspca_frame_add(gspca_dev, packet_type,
gspca_frame_add(gspca_dev, packet_type, buffer, JEILINJ_MAX_TRANSFER);
frame, buffer,
JEILINJ_MAX_TRANSFER);
} }
} }
quit_stream: quit_stream:
......
...@@ -274,8 +274,7 @@ static int m5602_start_transfer(struct gspca_dev *gspca_dev) ...@@ -274,8 +274,7 @@ static int m5602_start_transfer(struct gspca_dev *gspca_dev)
} }
static void m5602_urb_complete(struct gspca_dev *gspca_dev, static void m5602_urb_complete(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data, int len)
__u8 *data, int len)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -295,19 +294,27 @@ static void m5602_urb_complete(struct gspca_dev *gspca_dev, ...@@ -295,19 +294,27 @@ static void m5602_urb_complete(struct gspca_dev *gspca_dev,
len -= 6; len -= 6;
/* Complete the last frame (if any) */ /* Complete the last frame (if any) */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, gspca_frame_add(gspca_dev, LAST_PACKET,
frame, data, 0); NULL, 0);
sd->frame_count++; sd->frame_count++;
/* Create a new frame */ /* Create a new frame */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
PDEBUG(D_FRAM, "Starting new frame %d", PDEBUG(D_FRAM, "Starting new frame %d",
sd->frame_count); sd->frame_count);
} else { } else {
int cur_frame_len = frame->data_end - frame->data; struct gspca_frame *frame;
int cur_frame_len;
frame = gspca_get_i_frame(gspca_dev);
if (frame == NULL) {
gspca_dev->last_packet_type = DISCARD_PACKET;
return;
}
cur_frame_len = frame->data_end - frame->data;
/* Remove urb header */ /* Remove urb header */
data += 4; data += 4;
len -= 4; len -= 4;
...@@ -316,12 +323,12 @@ static void m5602_urb_complete(struct gspca_dev *gspca_dev, ...@@ -316,12 +323,12 @@ static void m5602_urb_complete(struct gspca_dev *gspca_dev,
PDEBUG(D_FRAM, "Continuing frame %d copying %d bytes", PDEBUG(D_FRAM, "Continuing frame %d copying %d bytes",
sd->frame_count, len); sd->frame_count, len);
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, len); data, len);
} else if (frame->v4l2_buf.length - cur_frame_len > 0) { } else if (frame->v4l2_buf.length - cur_frame_len > 0) {
/* Add the remaining data up to frame size */ /* Add the remaining data up to frame size */
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, gspca_frame_add(gspca_dev, INTER_PACKET, data,
frame->v4l2_buf.length - cur_frame_len); frame->v4l2_buf.length - cur_frame_len);
} }
} }
} }
......
...@@ -325,8 +325,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -325,8 +325,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -348,11 +347,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -348,11 +347,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|| data[5 + p] == 0x67) { || data[5 + p] == 0x67) {
PDEBUG(D_PACK, "sof offset: %d len: %d", PDEBUG(D_PACK, "sof offset: %d len: %d",
p, len); p, len);
frame = gspca_frame_add(gspca_dev, LAST_PACKET, gspca_frame_add(gspca_dev, LAST_PACKET,
frame, data, p); data, p);
/* put the JPEG header */ /* put the JPEG header */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
data += p + 16; data += p + 16;
len -= p + 16; len -= p + 16;
...@@ -360,7 +359,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -360,7 +359,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
} }
} }
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -1030,9 +1030,8 @@ static int sd_getmin_clockdiv(struct gspca_dev *gspca_dev, __s32 *val) ...@@ -1030,9 +1030,8 @@ static int sd_getmin_clockdiv(struct gspca_dev *gspca_dev, __s32 *val)
#include "pac_common.h" #include "pac_common.h"
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */ int len) /* iso packet length */
int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
unsigned char *sof; unsigned char *sof;
...@@ -1047,15 +1046,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1047,15 +1046,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
n -= sizeof pac_sof_marker; n -= sizeof pac_sof_marker;
else else
n = 0; n = 0;
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
data, n); data, n);
/* Start next frame. */ /* Start next frame. */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
pac_sof_marker, sizeof pac_sof_marker); pac_sof_marker, sizeof pac_sof_marker);
len -= sof - data; len -= sof - data;
data = sof; data = sof;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
/* sub-driver description */ /* sub-driver description */
......
...@@ -3920,9 +3920,8 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -3920,9 +3920,8 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void ov511_pkt_scan(struct gspca_dev *gspca_dev, static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *in, /* isoc packet */
__u8 *in, /* isoc packet */ int len) /* iso packet length */
int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -3953,11 +3952,11 @@ static void ov511_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -3953,11 +3952,11 @@ static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
return; return;
} }
/* Add 11 byte footer to frame, might be usefull */ /* Add 11 byte footer to frame, might be usefull */
gspca_frame_add(gspca_dev, LAST_PACKET, frame, in, 11); gspca_frame_add(gspca_dev, LAST_PACKET, in, 11);
return; return;
} else { } else {
/* Frame start */ /* Frame start */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, in, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, in, 0);
sd->packet_nr = 0; sd->packet_nr = 0;
} }
} }
...@@ -3966,12 +3965,11 @@ static void ov511_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -3966,12 +3965,11 @@ static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
len--; len--;
/* intermediate packet */ /* intermediate packet */
gspca_frame_add(gspca_dev, INTER_PACKET, frame, in, len); gspca_frame_add(gspca_dev, INTER_PACKET, in, len);
} }
static void ov518_pkt_scan(struct gspca_dev *gspca_dev, static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -3979,8 +3977,8 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -3979,8 +3977,8 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
/* A false positive here is likely, until OVT gives me /* A false positive here is likely, until OVT gives me
* the definitive SOF/EOF format */ * the definitive SOF/EOF format */
if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) { if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) {
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
sd->packet_nr = 0; sd->packet_nr = 0;
} }
...@@ -4004,12 +4002,11 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -4004,12 +4002,11 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
} }
/* intermediate packet */ /* intermediate packet */
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static void ov519_pkt_scan(struct gspca_dev *gspca_dev, static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
/* Header of ov519 is 16 bytes: /* Header of ov519 is 16 bytes:
...@@ -4032,7 +4029,7 @@ static void ov519_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -4032,7 +4029,7 @@ static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
len -= HDRSZ; len -= HDRSZ;
#undef HDRSZ #undef HDRSZ
if (data[0] == 0xff || data[1] == 0xd8) if (data[0] == 0xff || data[1] == 0xd8)
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
data, len); data, len);
else else
gspca_dev->last_packet_type = DISCARD_PACKET; gspca_dev->last_packet_type = DISCARD_PACKET;
...@@ -4040,34 +4037,31 @@ static void ov519_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -4040,34 +4037,31 @@ static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
case 0x51: /* end of frame */ case 0x51: /* end of frame */
if (data[9] != 0) if (data[9] != 0)
gspca_dev->last_packet_type = DISCARD_PACKET; gspca_dev->last_packet_type = DISCARD_PACKET;
gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
data, 0); NULL, 0);
return; return;
} }
} }
/* intermediate packet */ /* intermediate packet */
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
data, len);
} }
static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev, static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
/* A short read signals EOF */ /* A short read signals EOF */
if (len < OVFX2_BULK_SIZE) { if (len < OVFX2_BULK_SIZE) {
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, len); gspca_frame_add(gspca_dev, LAST_PACKET, data, len);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, NULL, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
return; return;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -4075,20 +4069,20 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -4075,20 +4069,20 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
switch (sd->bridge) { switch (sd->bridge) {
case BRIDGE_OV511: case BRIDGE_OV511:
case BRIDGE_OV511PLUS: case BRIDGE_OV511PLUS:
ov511_pkt_scan(gspca_dev, frame, data, len); ov511_pkt_scan(gspca_dev, data, len);
break; break;
case BRIDGE_OV518: case BRIDGE_OV518:
case BRIDGE_OV518PLUS: case BRIDGE_OV518PLUS:
ov518_pkt_scan(gspca_dev, frame, data, len); ov518_pkt_scan(gspca_dev, data, len);
break; break;
case BRIDGE_OV519: case BRIDGE_OV519:
ov519_pkt_scan(gspca_dev, frame, data, len); ov519_pkt_scan(gspca_dev, data, len);
break; break;
case BRIDGE_OVFX2: case BRIDGE_OVFX2:
ovfx2_pkt_scan(gspca_dev, frame, data, len); ovfx2_pkt_scan(gspca_dev, data, len);
break; break;
case BRIDGE_W9968CF: case BRIDGE_W9968CF:
w9968cf_pkt_scan(gspca_dev, frame, data, len); w9968cf_pkt_scan(gspca_dev, data, len);
break; break;
} }
} }
......
...@@ -1403,8 +1403,8 @@ static void sd_stopN_ov965x(struct gspca_dev *gspca_dev) ...@@ -1403,8 +1403,8 @@ static void sd_stopN_ov965x(struct gspca_dev *gspca_dev)
#define UVC_STREAM_EOF (1 << 1) #define UVC_STREAM_EOF (1 << 1)
#define UVC_STREAM_FID (1 << 0) #define UVC_STREAM_FID (1 << 0)
static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
__u8 *data, int len) u8 *data, int len)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
__u32 this_pts; __u32 this_pts;
...@@ -1445,23 +1445,22 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame, ...@@ -1445,23 +1445,22 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,
/* If PTS or FID has changed, start a new frame. */ /* If PTS or FID has changed, start a new frame. */
if (this_pts != sd->last_pts || this_fid != sd->last_fid) { if (this_pts != sd->last_pts || this_fid != sd->last_fid) {
if (gspca_dev->last_packet_type == INTER_PACKET) if (gspca_dev->last_packet_type == INTER_PACKET)
frame = gspca_frame_add(gspca_dev, gspca_frame_add(gspca_dev, LAST_PACKET,
LAST_PACKET, frame, NULL, 0);
NULL, 0);
sd->last_pts = this_pts; sd->last_pts = this_pts;
sd->last_fid = this_fid; sd->last_fid = this_fid;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
data + 12, len - 12); data + 12, len - 12);
/* If this packet is marked as EOF, end the frame */ /* If this packet is marked as EOF, end the frame */
} else if (data[1] & UVC_STREAM_EOF) { } else if (data[1] & UVC_STREAM_EOF) {
sd->last_pts = 0; sd->last_pts = 0;
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
data + 12, len - 12); data + 12, len - 12);
} else { } else {
/* Add the data from this payload */ /* Add the data from this payload */
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data + 12, len - 12); data + 12, len - 12);
} }
/* Done this payload */ /* Done this payload */
...@@ -1469,7 +1468,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame, ...@@ -1469,7 +1468,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,
discard: discard:
/* Discard data until a new frame starts. */ /* Discard data until a new frame starts. */
gspca_frame_add(gspca_dev, DISCARD_PACKET, frame, NULL, 0); gspca_dev->last_packet_type = DISCARD_PACKET;
scan_next: scan_next:
remaining_len -= len; remaining_len -= len;
......
...@@ -337,8 +337,7 @@ static void pac207_do_auto_gain(struct gspca_dev *gspca_dev) ...@@ -337,8 +337,7 @@ static void pac207_do_auto_gain(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data,
__u8 *data,
int len) int len)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -354,10 +353,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -354,10 +353,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
n -= sizeof pac_sof_marker; n -= sizeof pac_sof_marker;
else else
n = 0; n = 0;
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
data, n); data, n);
sd->header_read = 0; sd->header_read = 0;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, NULL, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
len -= sof - data; len -= sof - data;
data = sof; data = sof;
} }
...@@ -381,7 +380,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -381,7 +380,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
sd->header_read = 11; sd->header_read = 11;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static void setbrightness(struct gspca_dev *gspca_dev) static void setbrightness(struct gspca_dev *gspca_dev)
......
...@@ -855,7 +855,7 @@ static void pac_start_frame(struct gspca_dev *gspca_dev, ...@@ -855,7 +855,7 @@ static void pac_start_frame(struct gspca_dev *gspca_dev,
{ {
unsigned char tmpbuf[4]; unsigned char tmpbuf[4];
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
pac_jpeg_header1, sizeof(pac_jpeg_header1)); pac_jpeg_header1, sizeof(pac_jpeg_header1));
tmpbuf[0] = lines >> 8; tmpbuf[0] = lines >> 8;
...@@ -863,25 +863,31 @@ static void pac_start_frame(struct gspca_dev *gspca_dev, ...@@ -863,25 +863,31 @@ static void pac_start_frame(struct gspca_dev *gspca_dev,
tmpbuf[2] = samples_per_line >> 8; tmpbuf[2] = samples_per_line >> 8;
tmpbuf[3] = samples_per_line & 0xff; tmpbuf[3] = samples_per_line & 0xff;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
tmpbuf, sizeof(tmpbuf)); tmpbuf, sizeof(tmpbuf));
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
pac_jpeg_header2, sizeof(pac_jpeg_header2)); pac_jpeg_header2, sizeof(pac_jpeg_header2));
} }
/* this function is run at interrupt level */ /* this function is run at interrupt level */
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
struct gspca_frame *frame;
unsigned char *sof; unsigned char *sof;
sof = pac_find_sof(&sd->sof_read, data, len); sof = pac_find_sof(&sd->sof_read, data, len);
if (sof) { if (sof) {
int n, lum_offset, footer_length; int n, lum_offset, footer_length;
frame = gspca_get_i_frame(gspca_dev);
if (frame == NULL) {
gspca_dev->last_packet_type = DISCARD_PACKET;
return;
}
/* 6 bytes after the FF D9 EOF marker a number of lumination /* 6 bytes after the FF D9 EOF marker a number of lumination
bytes are send corresponding to different parts of the bytes are send corresponding to different parts of the
image, the 14th and 15th byte after the EOF seem to image, the 14th and 15th byte after the EOF seem to
...@@ -895,12 +901,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -895,12 +901,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
frame->data_end += n; frame->data_end += n;
n = 0; n = 0;
} }
frame = gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, n); data, n);
if (gspca_dev->last_packet_type != DISCARD_PACKET && if (gspca_dev->last_packet_type != DISCARD_PACKET &&
frame->data_end[-2] == 0xff && frame->data_end[-2] == 0xff &&
frame->data_end[-1] == 0xd9) frame->data_end[-1] == 0xd9)
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
NULL, 0); NULL, 0);
n = sof - data; n = sof - data;
...@@ -920,7 +926,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -920,7 +926,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
pac_start_frame(gspca_dev, frame, pac_start_frame(gspca_dev, frame,
gspca_dev->width, gspca_dev->height); gspca_dev->width, gspca_dev->height);
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -653,7 +653,7 @@ static void pac_start_frame(struct gspca_dev *gspca_dev, ...@@ -653,7 +653,7 @@ static void pac_start_frame(struct gspca_dev *gspca_dev,
{ {
unsigned char tmpbuf[4]; unsigned char tmpbuf[4];
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
pac_jpeg_header1, sizeof(pac_jpeg_header1)); pac_jpeg_header1, sizeof(pac_jpeg_header1));
tmpbuf[0] = lines >> 8; tmpbuf[0] = lines >> 8;
...@@ -661,25 +661,31 @@ static void pac_start_frame(struct gspca_dev *gspca_dev, ...@@ -661,25 +661,31 @@ static void pac_start_frame(struct gspca_dev *gspca_dev,
tmpbuf[2] = samples_per_line >> 8; tmpbuf[2] = samples_per_line >> 8;
tmpbuf[3] = samples_per_line & 0xff; tmpbuf[3] = samples_per_line & 0xff;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
tmpbuf, sizeof(tmpbuf)); tmpbuf, sizeof(tmpbuf));
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
pac_jpeg_header2, sizeof(pac_jpeg_header2)); pac_jpeg_header2, sizeof(pac_jpeg_header2));
} }
/* this function is run at interrupt level */ /* this function is run at interrupt level */
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
unsigned char *sof; unsigned char *sof;
struct gspca_frame *frame;
sof = pac_find_sof(&sd->sof_read, data, len); sof = pac_find_sof(&sd->sof_read, data, len);
if (sof) { if (sof) {
int n, lum_offset, footer_length; int n, lum_offset, footer_length;
frame = gspca_get_i_frame(gspca_dev);
if (frame == NULL) {
gspca_dev->last_packet_type = DISCARD_PACKET;
return;
}
/* 6 bytes after the FF D9 EOF marker a number of lumination /* 6 bytes after the FF D9 EOF marker a number of lumination
bytes are send corresponding to different parts of the bytes are send corresponding to different parts of the
image, the 14th and 15th byte after the EOF seem to image, the 14th and 15th byte after the EOF seem to
...@@ -693,12 +699,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -693,12 +699,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
frame->data_end += n; frame->data_end += n;
n = 0; n = 0;
} }
frame = gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, n); data, n);
if (gspca_dev->last_packet_type != DISCARD_PACKET && if (gspca_dev->last_packet_type != DISCARD_PACKET &&
frame->data_end[-2] == 0xff && frame->data_end[-2] == 0xff &&
frame->data_end[-1] == 0xd9) frame->data_end[-1] == 0xd9)
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
NULL, 0); NULL, 0);
n = sof - data; n = sof - data;
...@@ -717,7 +723,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -717,7 +723,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
pac_start_frame(gspca_dev, frame, pac_start_frame(gspca_dev, frame,
gspca_dev->height, gspca_dev->width); gspca_dev->height, gspca_dev->width);
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val) static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -2342,7 +2342,6 @@ static void sd_dqcallback(struct gspca_dev *gspca_dev) ...@@ -2342,7 +2342,6 @@ static void sd_dqcallback(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
...@@ -2378,22 +2377,22 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -2378,22 +2377,22 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
avg_lum >>= 9; avg_lum >>= 9;
atomic_set(&sd->avg_lum, avg_lum); atomic_set(&sd->avg_lum, avg_lum);
gspca_frame_add(gspca_dev, LAST_PACKET, gspca_frame_add(gspca_dev, LAST_PACKET,
frame, data, len); data, len);
return; return;
} }
if (gspca_dev->last_packet_type == LAST_PACKET) { if (gspca_dev->last_packet_type == LAST_PACKET) {
if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv
& MODE_JPEG) { & MODE_JPEG) {
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, len); data, len);
} else { } else {
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
data, len); data, len);
} }
} else { } else {
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
} }
......
...@@ -995,8 +995,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -995,8 +995,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
unsigned char *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
int i; int i;
...@@ -1054,12 +1053,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1054,12 +1053,12 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
pkt_type = DISCARD_PACKET; pkt_type = DISCARD_PACKET;
} }
frame = gspca_frame_add(gspca_dev, pkt_type, gspca_frame_add(gspca_dev, pkt_type,
frame, data, 0); NULL, 0);
data += i + fr_h_sz; data += i + fr_h_sz;
len -= i + fr_h_sz; len -= i + fr_h_sz;
gspca_frame_add(gspca_dev, FIRST_PACKET, gspca_frame_add(gspca_dev, FIRST_PACKET,
frame, data, len); data, len);
return; return;
} }
} }
...@@ -1068,15 +1067,21 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1068,15 +1067,21 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) { if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) {
/* In raw mode we sometimes get some garbage after the frame /* In raw mode we sometimes get some garbage after the frame
ignore this */ ignore this */
int used = frame->data_end - frame->data; struct gspca_frame *frame;
int used;
int size = cam->cam_mode[gspca_dev->curr_mode].sizeimage; int size = cam->cam_mode[gspca_dev->curr_mode].sizeimage;
frame = gspca_get_i_frame(gspca_dev);
if (frame == NULL) {
gspca_dev->last_packet_type = DISCARD_PACKET;
return;
}
used = frame->data_end - frame->data;
if (used + len > size) if (used + len > size)
len = size - used; len = size - used;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
frame, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -1993,7 +1993,6 @@ static void do_autogain(struct gspca_dev *gspca_dev) ...@@ -1993,7 +1993,6 @@ static void do_autogain(struct gspca_dev *gspca_dev)
/* scan the URB packets */ /* scan the URB packets */
/* This function is run at interrupt level. */ /* This function is run at interrupt level. */
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
...@@ -2005,7 +2004,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -2005,7 +2004,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
/* end of frame */ /* end of frame */
gspca_frame_add(gspca_dev, LAST_PACKET, gspca_frame_add(gspca_dev, LAST_PACKET,
frame, data, sof + 2); data, sof + 2);
if (sd->ag_cnt < 0) if (sd->ag_cnt < 0)
return; return;
/* w1 w2 w3 */ /* w1 w2 w3 */
...@@ -2028,10 +2027,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -2028,10 +2027,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
if (gspca_dev->last_packet_type == LAST_PACKET) { if (gspca_dev->last_packet_type == LAST_PACKET) {
/* put the JPEG 422 header */ /* put the JPEG 422 header */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -899,8 +899,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -899,8 +899,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -913,11 +912,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -913,11 +912,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
/* gspca_dev->last_packet_type = DISCARD_PACKET; */ /* gspca_dev->last_packet_type = DISCARD_PACKET; */
return; return;
} }
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
ffd9, 2); ffd9, 2);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
data += SPCA500_OFFSET_DATA; data += SPCA500_OFFSET_DATA;
...@@ -931,7 +930,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -931,7 +930,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
i = 0; i = 0;
do { do {
if (data[i] == 0xff) { if (data[i] == 0xff) {
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, i + 1); data, i + 1);
len -= i; len -= i;
data += i; data += i;
...@@ -940,7 +939,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -940,7 +939,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
} }
i++; i++;
} while (i < len); } while (i < len);
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static void setbrightness(struct gspca_dev *gspca_dev) static void setbrightness(struct gspca_dev *gspca_dev)
......
...@@ -2032,20 +2032,15 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -2032,20 +2032,15 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
switch (data[0]) { switch (data[0]) {
case 0: /* start of frame */ case 0: /* start of frame */
frame = gspca_frame_add(gspca_dev, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
LAST_PACKET,
frame,
data, 0);
data += SPCA501_OFFSET_DATA; data += SPCA501_OFFSET_DATA;
len -= SPCA501_OFFSET_DATA; len -= SPCA501_OFFSET_DATA;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
data, len);
return; return;
case 0xff: /* drop */ case 0xff: /* drop */
/* gspca_dev->last_packet_type = DISCARD_PACKET; */ /* gspca_dev->last_packet_type = DISCARD_PACKET; */
...@@ -2053,8 +2048,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -2053,8 +2048,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
} }
data++; data++;
len--; len--;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -739,26 +739,22 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -739,26 +739,22 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
switch (data[0]) { switch (data[0]) {
case 0: /* start of frame */ case 0: /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0);
data += SPCA50X_OFFSET_DATA; data += SPCA50X_OFFSET_DATA;
len -= SPCA50X_OFFSET_DATA; len -= SPCA50X_OFFSET_DATA;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
data, len);
break; break;
case 0xff: /* drop */ case 0xff: /* drop */
break; break;
default: default:
data += 1; data += 1;
len -= 1; len -= 1;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
data, len);
break; break;
} }
} }
......
...@@ -543,18 +543,15 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -543,18 +543,15 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
switch (data[0]) { switch (data[0]) {
case 0: /* start of frame */ case 0: /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0);
data += SPCA50X_OFFSET_DATA; data += SPCA50X_OFFSET_DATA;
len -= SPCA50X_OFFSET_DATA; len -= SPCA50X_OFFSET_DATA;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
data, len);
break; break;
case 0xff: /* drop */ case 0xff: /* drop */
/* gspca_dev->last_packet_type = DISCARD_PACKET; */ /* gspca_dev->last_packet_type = DISCARD_PACKET; */
...@@ -562,8 +559,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -562,8 +559,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
default: default:
data += 1; data += 1;
len -= 1; len -= 1;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
data, len);
break; break;
} }
} }
......
...@@ -1447,26 +1447,22 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -1447,26 +1447,22 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
switch (data[0]) { switch (data[0]) {
case 0: /* start of frame */ case 0: /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0);
data += SPCA508_OFFSET_DATA; data += SPCA508_OFFSET_DATA;
len -= SPCA508_OFFSET_DATA; len -= SPCA508_OFFSET_DATA;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
data, len);
break; break;
case 0xff: /* drop */ case 0xff: /* drop */
break; break;
default: default:
data += 1; data += 1;
len -= 1; len -= 1;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
data, len);
break; break;
} }
} }
......
...@@ -779,8 +779,7 @@ static void do_autogain(struct gspca_dev *gspca_dev) ...@@ -779,8 +779,7 @@ static void do_autogain(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -788,12 +787,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -788,12 +787,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
len--; len--;
switch (*data++) { /* sequence number */ switch (*data++) { /* sequence number */
case 0: /* start of frame */ case 0: /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0);
if (data[1] & 0x10) { if (data[1] & 0x10) {
/* compressed bayer */ /* compressed bayer */
gspca_frame_add(gspca_dev, FIRST_PACKET, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
frame, data, len);
} else { } else {
/* raw bayer (with a header, which we skip) */ /* raw bayer (with a header, which we skip) */
if (sd->chip_revision == Rev012A) { if (sd->chip_revision == Rev012A) {
...@@ -803,14 +800,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -803,14 +800,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
data += 16; data += 16;
len -= 16; len -= 16;
} }
gspca_frame_add(gspca_dev, FIRST_PACKET, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
frame, data, len);
} }
return; return;
case 0xff: /* drop (empty mpackets) */ case 0xff: /* drop (empty mpackets) */
return; return;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
/* rev 72a only */ /* rev 72a only */
......
...@@ -214,7 +214,6 @@ static void sq905_dostream(struct work_struct *work) ...@@ -214,7 +214,6 @@ static void sq905_dostream(struct work_struct *work)
{ {
struct sd *dev = container_of(work, struct sd, work_struct); struct sd *dev = container_of(work, struct sd, work_struct);
struct gspca_dev *gspca_dev = &dev->gspca_dev; struct gspca_dev *gspca_dev = &dev->gspca_dev;
struct gspca_frame *frame;
int bytes_left; /* bytes remaining in current frame. */ int bytes_left; /* bytes remaining in current frame. */
int data_len; /* size to use for the next read. */ int data_len; /* size to use for the next read. */
int header_read; /* true if we have already read the frame header. */ int header_read; /* true if we have already read the frame header. */
...@@ -266,18 +265,14 @@ static void sq905_dostream(struct work_struct *work) ...@@ -266,18 +265,14 @@ static void sq905_dostream(struct work_struct *work)
} else { } else {
packet_type = INTER_PACKET; packet_type = INTER_PACKET;
} }
frame = gspca_get_i_frame(gspca_dev); gspca_frame_add(gspca_dev, packet_type,
if (frame) { data, data_len);
frame = gspca_frame_add(gspca_dev, packet_type, /* If entire frame fits in one packet we still
frame, data, data_len); need to add a LAST_PACKET */
/* If entire frame fits in one packet we still if (packet_type == FIRST_PACKET &&
need to add a LAST_PACKET */ bytes_left == 0)
if (packet_type == FIRST_PACKET && gspca_frame_add(gspca_dev, LAST_PACKET,
bytes_left == 0) NULL, 0);
frame = gspca_frame_add(gspca_dev,
LAST_PACKET,
frame, data, 0);
}
} }
if (gspca_dev->present) { if (gspca_dev->present) {
/* acknowledge the frame */ /* acknowledge the frame */
......
...@@ -115,7 +115,6 @@ static void sq905c_dostream(struct work_struct *work) ...@@ -115,7 +115,6 @@ static void sq905c_dostream(struct work_struct *work)
{ {
struct sd *dev = container_of(work, struct sd, work_struct); struct sd *dev = container_of(work, struct sd, work_struct);
struct gspca_dev *gspca_dev = &dev->gspca_dev; struct gspca_dev *gspca_dev = &dev->gspca_dev;
struct gspca_frame *frame;
int bytes_left; /* bytes remaining in current frame. */ int bytes_left; /* bytes remaining in current frame. */
int data_len; /* size to use for the next read. */ int data_len; /* size to use for the next read. */
int act_len; int act_len;
...@@ -146,10 +145,8 @@ static void sq905c_dostream(struct work_struct *work) ...@@ -146,10 +145,8 @@ static void sq905c_dostream(struct work_struct *work)
PDEBUG(D_STREAM, "bytes_left = 0x%x", bytes_left); PDEBUG(D_STREAM, "bytes_left = 0x%x", bytes_left);
/* We keep the header. It has other information, too. */ /* We keep the header. It has other information, too. */
packet_type = FIRST_PACKET; packet_type = FIRST_PACKET;
frame = gspca_get_i_frame(gspca_dev); gspca_frame_add(gspca_dev, packet_type,
if (frame) buffer, FRAME_HEADER_LEN);
gspca_frame_add(gspca_dev, packet_type,
frame, buffer, FRAME_HEADER_LEN);
while (bytes_left > 0 && gspca_dev->present) { while (bytes_left > 0 && gspca_dev->present) {
data_len = bytes_left > SQ905C_MAX_TRANSFER ? data_len = bytes_left > SQ905C_MAX_TRANSFER ?
SQ905C_MAX_TRANSFER : bytes_left; SQ905C_MAX_TRANSFER : bytes_left;
...@@ -167,9 +164,8 @@ static void sq905c_dostream(struct work_struct *work) ...@@ -167,9 +164,8 @@ static void sq905c_dostream(struct work_struct *work)
packet_type = LAST_PACKET; packet_type = LAST_PACKET;
else else
packet_type = INTER_PACKET; packet_type = INTER_PACKET;
if (frame) gspca_frame_add(gspca_dev, packet_type,
gspca_frame_add(gspca_dev, packet_type, buffer, data_len);
frame, buffer, data_len);
} }
} }
quit_stream: quit_stream:
......
...@@ -418,8 +418,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -418,8 +418,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -435,11 +434,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -435,11 +434,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
* (without ending - ff d9) * (without ending - ff d9)
*/ */
if (data[0] == 0xff && data[1] == 0xfe) { if (data[0] == 0xff && data[1] == 0xfe) {
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
ffd9, 2); ffd9, 2);
/* put the JPEG 411 header */ /* put the JPEG 411 header */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
/* beginning of the frame */ /* beginning of the frame */
...@@ -447,7 +446,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -447,7 +446,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
data += STKHDRSZ; data += STKHDRSZ;
len -= STKHDRSZ; len -= STKHDRSZ;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -281,8 +281,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -281,8 +281,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data,
__u8 *data,
int len) int len)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -299,10 +298,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -299,10 +298,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
/* Finish the previous frame, we do this upon reception of the next /* Finish the previous frame, we do this upon reception of the next
packet, even though it is already complete so that the strange 16 packet, even though it is already complete so that the strange 16
byte packets send after a corrupt frame can discard it. */ byte packets send after a corrupt frame can discard it. */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, NULL, 0); gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
/* Store the just received frame */ /* Store the just received frame */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
} }
/* sub-driver description */ /* sub-driver description */
......
...@@ -312,8 +312,7 @@ static void stv06xx_stopN(struct gspca_dev *gspca_dev) ...@@ -312,8 +312,7 @@ static void stv06xx_stopN(struct gspca_dev *gspca_dev)
* The 0005 and 0100 chunks seem to appear only in compressed stream. * The 0005 and 0100 chunks seem to appear only in compressed stream.
*/ */
static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev, static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -366,7 +365,7 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -366,7 +365,7 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev,
sd->to_skip -= skip; sd->to_skip -= skip;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, chunk_len); data, chunk_len);
break; break;
...@@ -378,7 +377,7 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -378,7 +377,7 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev,
/* Create a new frame, chunk length should be zero */ /* Create a new frame, chunk length should be zero */
gspca_frame_add(gspca_dev, FIRST_PACKET, gspca_frame_add(gspca_dev, FIRST_PACKET,
frame, data, 0); NULL, 0);
if (sd->bridge == BRIDGE_ST6422) if (sd->bridge == BRIDGE_ST6422)
sd->to_skip = gspca_dev->width * 4; sd->to_skip = gspca_dev->width * 4;
...@@ -394,8 +393,8 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -394,8 +393,8 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev,
PDEBUG(D_PACK, "End of frame detected"); PDEBUG(D_PACK, "End of frame detected");
/* Complete the last frame (if any) */ /* Complete the last frame (if any) */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, gspca_frame_add(gspca_dev, LAST_PACKET,
frame, data, 0); NULL, 0);
if (chunk_len) if (chunk_len)
PDEBUG(D_ERR, "Chunk length is " PDEBUG(D_ERR, "Chunk length is "
......
...@@ -1116,7 +1116,6 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -1116,7 +1116,6 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
...@@ -1186,11 +1185,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1186,11 +1185,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
break; break;
} }
if (sof) { /* start of frame */ if (sof) { /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
ffd9, 2); ffd9, 2);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
} }
...@@ -1198,7 +1197,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1198,7 +1197,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
i = 0; i = 0;
do { do {
if (data[i] == 0xff) { if (data[i] == 0xff) {
gspca_frame_add(gspca_dev, INTER_PACKET, frame, gspca_frame_add(gspca_dev, INTER_PACKET,
data, i + 1); data, i + 1);
len -= i; len -= i;
data += i; data += i;
...@@ -1207,7 +1206,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1207,7 +1206,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
} }
i++; i++;
} while (i < len); } while (i < len);
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -938,7 +938,6 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -938,7 +938,6 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
...@@ -956,9 +955,9 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -956,9 +955,9 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
/* extra bytes....., could be processed too but would be /* extra bytes....., could be processed too but would be
* a waste of time, right now leave the application and * a waste of time, right now leave the application and
* libjpeg do it for ourserlves.. */ * libjpeg do it for ourserlves.. */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
ffd9, 2); ffd9, 2);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len); gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
return; return;
} }
...@@ -967,7 +966,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -967,7 +966,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
* other's do not include it... */ * other's do not include it... */
len -= 2; len -= 2;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -398,8 +398,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -398,8 +398,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -424,9 +423,9 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -424,9 +423,9 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
* - 4 bytes * - 4 bytes
*/ */
gspca_frame_add(gspca_dev, packet_type0, gspca_frame_add(gspca_dev, packet_type0,
frame, data + 2, gspca_dev->width); data + 2, gspca_dev->width);
gspca_frame_add(gspca_dev, packet_type1, gspca_frame_add(gspca_dev, packet_type1,
frame, data + gspca_dev->width + 5, gspca_dev->width); data + gspca_dev->width + 5, gspca_dev->width);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -2987,7 +2987,6 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -2987,7 +2987,6 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */
u8 *data, /* isoc packet */ u8 *data, /* isoc packet */
int len) /* iso pkt length */ int len) /* iso pkt length */
{ {
...@@ -2996,21 +2995,25 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -2996,21 +2995,25 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
if (data[0] == 0xff && data[1] == 0xd8) { if (data[0] == 0xff && data[1] == 0xd8) {
PDEBUG(D_PACK, PDEBUG(D_PACK,
"vc032x header packet found len %d", len); "vc032x header packet found len %d", len);
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
data, 0);
data += sd->image_offset; data += sd->image_offset;
len -= sd->image_offset; len -= sd->image_offset;
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
data, len);
return; return;
} }
/* The vc0321 sends some additional data after sending the complete /* The vc0321 sends some additional data after sending the complete
* frame, we ignore this. */ * frame, we ignore this. */
if (sd->bridge == BRIDGE_VC0321 if (sd->bridge == BRIDGE_VC0321) {
&& len > frame->v4l2_buf.length - (frame->data_end - frame->data)) struct gspca_frame *frame;
len = frame->v4l2_buf.length - (frame->data_end - frame->data); int l;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
frame = gspca_get_i_frame(gspca_dev);
l = frame->data_end - frame->data;
if (len > frame->v4l2_buf.length - l)
len = frame->v4l2_buf.length - l;
}
gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val) static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
......
...@@ -576,8 +576,7 @@ static void w9968cf_stop0(struct sd *sd) ...@@ -576,8 +576,7 @@ static void w9968cf_stop0(struct sd *sd)
to be precise it sends: SOI, SOF, DRI, SOS, Y-data, SOS, U-data, SOS, to be precise it sends: SOI, SOF, DRI, SOS, Y-data, SOS, U-data, SOS,
V-data, EOI. */ V-data, EOI. */
static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev, static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ u8 *data, /* isoc packet */
__u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -587,9 +586,9 @@ static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -587,9 +586,9 @@ static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev,
if (len >= 2 && if (len >= 2 &&
data[0] == 0xff && data[0] == 0xff &&
data[1] == 0xd8) { data[1] == 0xd8) {
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
NULL, 0); NULL, 0);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
/* Strip the ff d8, our own header (which adds /* Strip the ff d8, our own header (which adds
huffman and quantization tables) already has this */ huffman and quantization tables) already has this */
...@@ -599,12 +598,12 @@ static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -599,12 +598,12 @@ static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev,
} else { } else {
/* In UYVY mode an empty packet signals EOF */ /* In UYVY mode an empty packet signals EOF */
if (gspca_dev->empty_packet) { if (gspca_dev->empty_packet) {
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
NULL, 0); NULL, 0);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
NULL, 0); NULL, 0);
gspca_dev->empty_packet = 0; gspca_dev->empty_packet = 0;
} }
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
...@@ -6974,17 +6974,16 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -6974,17 +6974,16 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
} }
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, u8 *data,
__u8 *data,
int len) int len)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
if (data[0] == 0xff && data[1] == 0xd8) { /* start of frame */ if (data[0] == 0xff && data[1] == 0xd8) { /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, gspca_frame_add(gspca_dev, LAST_PACKET,
data, 0); NULL, 0);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET,
sd->jpeg_hdr, JPEG_HDR_SZ); sd->jpeg_hdr, JPEG_HDR_SZ);
/* remove the webcam's header: /* remove the webcam's header:
...@@ -6996,7 +6995,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -6996,7 +6995,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
data += 18; data += 18;
len -= 18; len -= 18;
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册