*video_buf = uvc_queue_next_buffer(&stream->queue, *video_buf);
 }
 
-static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream,
+static void uvc_video_decode_isoc(struct uvc_urb *uvc_urb,
                        struct uvc_buffer *buf, struct uvc_buffer *meta_buf)
 {
+       struct urb *urb = uvc_urb->urb;
+       struct uvc_streaming *stream = uvc_urb->stream;
        u8 *mem;
        int ret, i;
 
        }
 }
 
-static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream,
+static void uvc_video_decode_bulk(struct uvc_urb *uvc_urb,
                        struct uvc_buffer *buf, struct uvc_buffer *meta_buf)
 {
+       struct urb *urb = uvc_urb->urb;
+       struct uvc_streaming *stream = uvc_urb->stream;
        u8 *mem;
        int len, ret;
 
        }
 }
 
-static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream,
+static void uvc_video_encode_bulk(struct uvc_urb *uvc_urb,
        struct uvc_buffer *buf, struct uvc_buffer *meta_buf)
 {
+       struct urb *urb = uvc_urb->urb;
+       struct uvc_streaming *stream = uvc_urb->stream;
+
        u8 *mem = urb->transfer_buffer;
        int len = stream->urb_size, ret;
 
 
 static void uvc_video_complete(struct urb *urb)
 {
-       struct uvc_streaming *stream = urb->context;
+       struct uvc_urb *uvc_urb = urb->context;
+       struct uvc_streaming *stream = uvc_urb->stream;
        struct uvc_video_queue *queue = &stream->queue;
        struct uvc_video_queue *qmeta = &stream->meta.queue;
        struct vb2_queue *vb2_qmeta = stream->meta.vdev.queue;
                spin_unlock_irqrestore(&qmeta->irqlock, flags);
        }
 
-       stream->decode(urb, stream, buf, buf_meta);
+       stream->decode(uvc_urb, buf, buf_meta);
 
        if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
                uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n",
                                uvc_free_urb_buffers(stream);
                                break;
                        }
+
+                       uvc_urb->stream = stream;
                }
 
                if (i == UVC_URBS) {
                }
 
                urb->dev = stream->dev->udev;
-               urb->context = stream;
+               urb->context = uvc_urb;
                urb->pipe = usb_rcvisocpipe(stream->dev->udev,
                                ep->desc.bEndpointAddress);
 #ifndef CONFIG_DMA_NONCOHERENT
                        return -ENOMEM;
                }
 
-               usb_fill_bulk_urb(urb, stream->dev->udev, pipe, uvc_urb->buffer,
-                                 size, uvc_video_complete, stream);
+               usb_fill_bulk_urb(urb, stream->dev->udev, pipe, uvc_urb->buffer,
+                                 size, uvc_video_complete, uvc_urb);
 #ifndef CONFIG_DMA_NONCOHERENT
                urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
                urb->transfer_dma = uvc_urb->dma;
 
  * struct uvc_urb - URB context management structure
  *
  * @urb: the URB described by this context structure
+ * @stream: UVC streaming context
  * @buffer: memory storage for the URB
  * @dma: DMA coherent addressing for the urb_buffer
  */
 struct uvc_urb {
        struct urb *urb;
+       struct uvc_streaming *stream;
 
        char *buffer;
        dma_addr_t dma;
        /* Buffers queue. */
        unsigned int frozen : 1;
        struct uvc_video_queue queue;
-       void (*decode) (struct urb *urb, struct uvc_streaming *video,
-                       struct uvc_buffer *buf, struct uvc_buffer *meta_buf);
+       void (*decode)(struct uvc_urb *uvc_urb, struct uvc_buffer *buf,
+                      struct uvc_buffer *meta_buf);
 
        struct {
                struct video_device vdev;
                                            u8 epaddr);
 
 /* Quirks support */
-void uvc_video_decode_isight(struct urb *urb, struct uvc_streaming *stream,
+void uvc_video_decode_isight(struct uvc_urb *uvc_urb,
                             struct uvc_buffer *buf,
                             struct uvc_buffer *meta_buf);