diff options
Diffstat (limited to 'drivers/media/video/gspca/pac7311.c')
-rw-r--r-- | drivers/media/video/gspca/pac7311.c | 29 |
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 | ||
601 | static void pac_start_frame(struct gspca_dev *gspca_dev, | 601 | static 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); |