diff -u trunk/uvc_queue.c ../uvc-dfu07/trunk/uvc_queue.c --- trunk/uvc_queue.c 2008-05-06 00:48:16.000000000 -0500 +++ ../uvc-dfu07/trunk/uvc_queue.c 2008-05-24 01:01:34.000000000 -0500 @@ -287,10 +287,13 @@ * available. */ int uvc_dequeue_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *v4l2_buf, int nonblocking) + struct v4l2_buffer *v4l2_buf, int nonblocking, + struct uvc_frame *frame) { struct uvc_buffer *buf; int ret = 0; + int i; + char swap[frame->wWidth << 1]; if (v4l2_buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || v4l2_buf->memory != V4L2_MEMORY_MMAP) { @@ -333,6 +336,20 @@ goto done; } + // Flip webcam image. + for (i = 0; i < (frame->wHeight >> 1); i++) { + memcpy(&swap, (char *) queue->mem + buf->buf.m.offset + + i * (frame->wWidth << 1), (frame->wWidth << 1)); + memcpy((char *) queue->mem + buf->buf.m.offset + + i * (frame->wWidth << 1), + (char *) queue->mem + buf->buf.m.offset + + (frame->wHeight - 1 - i) * + (frame->wWidth << 1), (frame->wWidth << 1)); + memcpy((char *) queue->mem + buf->buf.m.offset + + (frame->wHeight - 1 - i) * + (frame->wWidth << 1) , &swap, (frame->wWidth << 1)); + } + list_del(&buf->stream); __uvc_query_buffer(buf, v4l2_buf); diff -u trunk/uvc_v4l2.c ../uvc-dfu07/trunk/uvc_v4l2.c --- trunk/uvc_v4l2.c 2008-05-06 00:48:16.000000000 -0500 +++ ../uvc-dfu07/trunk/uvc_v4l2.c 2008-05-24 00:36:24.000000000 -0500 @@ -877,7 +877,8 @@ return -EBUSY; return uvc_dequeue_buffer(&video->queue, arg, - file->f_flags & O_NONBLOCK); + file->f_flags & O_NONBLOCK, + video->streaming->cur_frame); case VIDIOC_STREAMON: { diff -u trunk/uvcvideo.h ../uvc-dfu07/trunk/uvcvideo.h --- trunk/uvcvideo.h 2008-05-06 00:48:16.000000000 -0500 +++ ../uvc-dfu07/trunk/uvcvideo.h 2008-05-24 00:36:24.000000000 -0500 @@ -711,7 +711,8 @@ extern int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf); extern int uvc_dequeue_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *v4l2_buf, int nonblocking); + struct v4l2_buffer *v4l2_buf, int nonblocking, + struct uvc_frame *frame); extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable); extern void uvc_queue_cancel(struct uvc_video_queue *queue); extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,