aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/pac7311.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/gspca/pac7311.c')
-rw-r--r--drivers/media/video/gspca/pac7311.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c
index 44fed9686729..1cb7e99e92bd 100644
--- a/drivers/media/video/gspca/pac7311.c
+++ b/drivers/media/video/gspca/pac7311.c
@@ -270,7 +270,7 @@ static void reg_w_buf(struct gspca_dev *gspca_dev,
270 memcpy(gspca_dev->usb_buf, buffer, len); 270 memcpy(gspca_dev->usb_buf, buffer, len);
271 ret = usb_control_msg(gspca_dev->dev, 271 ret = usb_control_msg(gspca_dev->dev,
272 usb_sndctrlpipe(gspca_dev->dev, 0), 272 usb_sndctrlpipe(gspca_dev->dev, 0),
273 1, /* request */ 273 0, /* request */
274 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 274 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
275 0, /* value */ 275 0, /* value */
276 index, gspca_dev->usb_buf, len, 276 index, gspca_dev->usb_buf, len,
@@ -599,7 +599,6 @@ static const unsigned char pac_jpeg_header2[] = {
599}; 599};
600 600
601static void pac_start_frame(struct gspca_dev *gspca_dev, 601static void pac_start_frame(struct gspca_dev *gspca_dev,
602 struct gspca_frame *frame,
603 __u16 lines, __u16 samples_per_line) 602 __u16 lines, __u16 samples_per_line)
604{ 603{
605 unsigned char tmpbuf[4]; 604 unsigned char tmpbuf[4];
@@ -624,19 +623,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
624 int len) /* iso packet length */ 623 int len) /* iso packet length */
625{ 624{
626 struct sd *sd = (struct sd *) gspca_dev; 625 struct sd *sd = (struct sd *) gspca_dev;
626 u8 *image;
627 unsigned char *sof; 627 unsigned char *sof;
628 struct gspca_frame *frame;
629 628
630 sof = pac_find_sof(&sd->sof_read, data, len); 629 sof = pac_find_sof(&sd->sof_read, data, len);
631 if (sof) { 630 if (sof) {
632 int n, lum_offset, footer_length; 631 int n, lum_offset, footer_length;
633 632
634 frame = gspca_get_i_frame(gspca_dev);
635 if (frame == NULL) {
636 gspca_dev->last_packet_type = DISCARD_PACKET;
637 return;
638 }
639
640 /* 6 bytes after the FF D9 EOF marker a number of lumination 633 /* 6 bytes after the FF D9 EOF marker a number of lumination
641 bytes are send corresponding to different parts of the 634 bytes are send corresponding to different parts of the
642 image, the 14th and 15th byte after the EOF seem to 635 image, the 14th and 15th byte after the EOF seem to
@@ -647,16 +640,16 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
647 /* Finish decoding current frame */ 640 /* Finish decoding current frame */
648 n = (sof - data) - (footer_length + sizeof pac_sof_marker); 641 n = (sof - data) - (footer_length + sizeof pac_sof_marker);
649 if (n < 0) { 642 if (n < 0) {
650 frame->data_end += n; 643 gspca_dev->image_len += n;
651 n = 0; 644 n = 0;
645 } else {
646 gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
652 } 647 }
653 gspca_frame_add(gspca_dev, INTER_PACKET, 648 image = gspca_dev->image;
654 data, n); 649 if (image != NULL
655 if (gspca_dev->last_packet_type != DISCARD_PACKET && 650 && image[gspca_dev->image_len - 2] == 0xff
656 frame->data_end[-2] == 0xff && 651 && image[gspca_dev->image_len - 1] == 0xd9)
657 frame->data_end[-1] == 0xd9) 652 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
658 gspca_frame_add(gspca_dev, LAST_PACKET,
659 NULL, 0);
660 653
661 n = sof - data; 654 n = sof - data;
662 len -= n; 655 len -= n;
@@ -671,7 +664,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
671 atomic_set(&sd->avg_lum, -1); 664 atomic_set(&sd->avg_lum, -1);
672 665
673 /* Start the new frame with the jpeg header */ 666 /* Start the new frame with the jpeg header */
674 pac_start_frame(gspca_dev, frame, 667 pac_start_frame(gspca_dev,
675 gspca_dev->height, gspca_dev->width); 668 gspca_dev->height, gspca_dev->width);
676 } 669 }
677 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 670 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);