Example #1
0
/* The w9968cf docs say that a 0 sized packet means EOF (and also SOF
   for the next frame). This seems to simply not be true when operating
   in JPEG mode, in this case there may be empty packets within the
   frame. So in JPEG mode use the JPEG SOI marker to detect SOF.

   Note to make things even more interesting the w9968cf sends *PLANAR* jpeg,
   to be precise it sends: SOI, SOF, DRI, SOS, Y-data, SOS, U-data, SOS,
   V-data, EOI. */
static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev,
			u8 *data,			/* isoc packet */
			int len)			/* iso packet length */
{
	struct sd *sd = (struct sd *) gspca_dev;

	if (w9968cf_vga_mode[gspca_dev->curr_mode].pixelformat ==
	    V4L2_PIX_FMT_JPEG) {
		if (len >= 2 &&
		    data[0] == 0xff &&
		    data[1] == 0xd8) {
			gspca_frame_add(gspca_dev, LAST_PACKET,
					NULL, 0);
			gspca_frame_add(gspca_dev, FIRST_PACKET,
					sd->jpeg_hdr, JPEG_HDR_SZ);
			/* Strip the ff d8, our own header (which adds
			   huffman and quantization tables) already has this */
			len -= 2;
			data += 2;
		}
	} else {
		/* In UYVY mode an empty packet signals EOF */
		if (gspca_dev->empty_packet) {
			gspca_frame_add(gspca_dev, LAST_PACKET,
						NULL, 0);
			gspca_frame_add(gspca_dev, FIRST_PACKET,
					NULL, 0);
			gspca_dev->empty_packet = 0;
		}
	}
	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
}
static void m5602_urb_complete(struct gspca_dev *gspca_dev,
				u8 *data, int len)
{
	struct sd *sd = (struct sd *) gspca_dev;

	if (len < 6) {
		PDEBUG(D_PACK, "Packet is less than 6 bytes");
		return;
	}

	/* Frame delimiter: ff xx xx xx ff ff */
	if (data[0] == 0xff && data[4] == 0xff && data[5] == 0xff &&
	    data[2] != sd->frame_id) {
		PDEBUG(D_FRAM, "Frame delimiter detected");
		sd->frame_id = data[2];

		/* Remove the extra fluff appended on each header */
		data += 6;
		len -= 6;

		/* Complete the last frame (if any) */
		gspca_frame_add(gspca_dev, LAST_PACKET,
				NULL, 0);
		sd->frame_count++;

		/* Create a new frame */
		gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);

		PDEBUG(D_FRAM, "Starting new frame %d",
		       sd->frame_count);

	} else {
		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 */
		data += 4;
		len -= 4;

		if (cur_frame_len + len <= frame->v4l2_buf.length) {
			PDEBUG(D_FRAM, "Continuing frame %d copying %d bytes",
			       sd->frame_count, len);

			gspca_frame_add(gspca_dev, INTER_PACKET,
					data, len);
		} else if (frame->v4l2_buf.length - cur_frame_len > 0) {
			/* Add the remaining data up to frame size */
			gspca_frame_add(gspca_dev, INTER_PACKET, data,
				    frame->v4l2_buf.length - cur_frame_len);
		}
	}
}
static void m5602_urb_complete(struct gspca_dev *gspca_dev,
                               u8 *data, int len)
{
    struct sd *sd = (struct sd *) gspca_dev;

    if (len < 6) {
        PDEBUG(D_PACK, "Packet is less than 6 bytes");
        return;
    }


    if (data[0] == 0xff && data[4] == 0xff && data[5] == 0xff &&
            data[2] != sd->frame_id) {
        PDEBUG(D_FRAM, "Frame delimiter detected");
        sd->frame_id = data[2];


        data += 6;
        len -= 6;


        gspca_frame_add(gspca_dev, LAST_PACKET,
                        NULL, 0);
        sd->frame_count++;


        gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);

        PDEBUG(D_FRAM, "Starting new frame %d",
               sd->frame_count);

    } else {
        int cur_frame_len;

        cur_frame_len = gspca_dev->image_len;

        data += 4;
        len -= 4;

        if (cur_frame_len + len <= gspca_dev->frsz) {
            PDEBUG(D_FRAM, "Continuing frame %d copying %d bytes",
                   sd->frame_count, len);

            gspca_frame_add(gspca_dev, INTER_PACKET,
                            data, len);
        } else {

            gspca_frame_add(gspca_dev, INTER_PACKET, data,
                            gspca_dev->frsz - cur_frame_len);
        }
    }
}
Example #4
0
static void m5602_urb_complete(struct gspca_dev *gspca_dev,
			struct gspca_frame *frame,
			__u8 *data, int len)
{
	struct sd *sd = (struct sd *) gspca_dev;

	if (len < 6) {
		PDEBUG(D_PACK, "Packet is less than 6 bytes");
		return;
	}

	
	if (data[0] == 0xff && data[4] == 0xff && data[5] == 0xff &&
	    data[2] != sd->frame_id) {
		PDEBUG(D_FRAM, "Frame delimiter detected");
		sd->frame_id = data[2];

		
		data += 6;
		len -= 6;

		
		frame = gspca_frame_add(gspca_dev, LAST_PACKET,
					frame, data, 0);
		sd->frame_count++;

		
		gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len);

		PDEBUG(D_FRAM, "Starting new frame %d",
		       sd->frame_count);

	} else {
		int cur_frame_len = frame->data_end - frame->data;

		
		data += 4;
		len -= 4;

		if (cur_frame_len + len <= frame->v4l2_buf.length) {
			PDEBUG(D_FRAM, "Continuing frame %d copying %d bytes",
			       sd->frame_count, len);

			gspca_frame_add(gspca_dev, INTER_PACKET, frame,
					data, len);
		} else if (frame->v4l2_buf.length - cur_frame_len > 0) {
			
			gspca_frame_add(gspca_dev, INTER_PACKET, frame, data,
					frame->v4l2_buf.length - cur_frame_len);
		}
	}
}
Example #5
0
static void m5602_urb_complete(struct gspca_dev *gspca_dev,
				u8 *data, int len)
{
	struct sd *sd = (struct sd *) gspca_dev;

	if (len < 6) {
		gspca_dbg(gspca_dev, D_PACK, "Packet is less than 6 bytes\n");
		return;
	}

	/* Frame delimiter: ff xx xx xx ff ff */
	if (data[0] == 0xff && data[4] == 0xff && data[5] == 0xff &&
	    data[2] != sd->frame_id) {
		gspca_dbg(gspca_dev, D_FRAM, "Frame delimiter detected\n");
		sd->frame_id = data[2];

		/* Remove the extra fluff appended on each header */
		data += 6;
		len -= 6;

		/* Complete the last frame (if any) */
		gspca_frame_add(gspca_dev, LAST_PACKET,
				NULL, 0);
		sd->frame_count++;

		/* Create a new frame */
		gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);

		gspca_dbg(gspca_dev, D_FRAM, "Starting new frame %d\n",
			  sd->frame_count);

	} else {
		int cur_frame_len;

		cur_frame_len = gspca_dev->image_len;
		/* Remove urb header */
		data += 4;
		len -= 4;

		if (cur_frame_len + len <= gspca_dev->pixfmt.sizeimage) {
			gspca_dbg(gspca_dev, D_FRAM, "Continuing frame %d copying %d bytes\n",
				  sd->frame_count, len);

			gspca_frame_add(gspca_dev, INTER_PACKET,
					data, len);
		} else {
			/* Add the remaining data up to frame size */
			gspca_frame_add(gspca_dev, INTER_PACKET, data,
				gspca_dev->pixfmt.sizeimage - cur_frame_len);
		}
	}
}
Example #6
0
/* intercept camera image data */
static void dtcs033_pkt_scan(struct gspca_dev *gspca_dev,
			u8 *data,  /* packet data */
			int len)   /* packet data length */
{
	/* drop incomplete frames */
	if (len != DT_COLS*512) {
		gspca_dev->last_packet_type = DISCARD_PACKET;
		/* gspca.c: discard invalidates the whole frame. */
		return;
	}

	/* forward complete frames */
	gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
	gspca_frame_add(gspca_dev, INTER_PACKET,
		data + 16*DT_COLS,
		len  - 32*DT_COLS); /* skip first & last 16 lines */
	gspca_frame_add(gspca_dev, LAST_PACKET,  NULL, 0);

	return;
}
/* This function is called when an image is being received */
static void sd_pkt_scan(struct gspca_dev *gspca_dev,
			u8 *data, int len)
{
	struct sd *sd = (struct sd *) gspca_dev;
	static s32 nSkipped;

	s32 mode = (s32) gspca_dev->curr_mode;
	s32 nToSkip =
		sd->swapRB * (gspca_dev->cam.cam_mode[mode].bytesperline + 1);

	/* Test only against 0202h, so endianess does not matter */
	switch (*(s16 *) data) {
	case 0x0202:		/* End of frame, start a new one */
		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
		nSkipped = 0;
		if (sd->nbIm >= 0 && sd->nbIm < 10)
			sd->nbIm++;
		gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
		break;

	default:
		data += 2;
		len  -= 2;
		if (nSkipped + len <= nToSkip)
			nSkipped += len;
		else {
			if (nSkipped < nToSkip && nSkipped + len > nToSkip) {
				data += nToSkip - nSkipped;
				len  -= nToSkip - nSkipped;
				nSkipped = nToSkip + 1;
			}
			gspca_frame_add(gspca_dev,
				INTER_PACKET, data, len);
		}
		break;
	}
}
Example #8
0
static void sd_pkt_scan(struct gspca_dev *gspca_dev,
			struct gspca_frame *frame, u8 *data, s32 len)
{
	struct sd *sd = (struct sd *) gspca_dev;
	static s32 nSkipped;

	s32 mode = (s32) gspca_dev->curr_mode;
	s32 nToSkip =
		sd->swapRB * (gspca_dev->cam.cam_mode[mode].bytesperline + 1);

	
	switch (*(s16 *) data) {
	case 0x0202:		
		frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0);
		nSkipped = 0;
		if (sd->nbIm >= 0 && sd->nbIm < 10)
			sd->nbIm++;
		gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0);
		break;

	default:
		data += 2;
		len  -= 2;
		if (nSkipped + len <= nToSkip)
			nSkipped += len;
		else {
			if (nSkipped < nToSkip && nSkipped + len > nToSkip) {
				data += nToSkip - nSkipped;
				len  -= nToSkip - nSkipped;
				nSkipped = nToSkip + 1;
			}
			gspca_frame_add(gspca_dev,
				INTER_PACKET, frame, data, len);
		}
		break;
	}
}