设为首页 加入收藏

TOP

uvc摄像头代码解析7(五)
2015-11-21 01:42:23 来源: 作者: 【 】 浏览:26
Tags:uvc 摄像头 代码 解析
ep->desc.wMaxPacketSize) & 0x07ff; ?
? ? size = stream->ctrl.dwMaxPayloadTransferSize; ?
? ? stream->bulk.max_payload_size = size; ?
? ? npackets = uvc_alloc_urb_buffers(stream, size, psize, gfp_flags); ? //分配urb缓冲区 ?
? ? if (npackets == 0) ?
? ? ? ? return -ENOMEM; ?
? ? size = npackets * psize; ?
? ? if (usb_endpoint_dir_in(&ep->desc)) ?
? ? ? ? pipe = usb_rcvbulkpipe(stream->dev->udev,ep->desc.bEndpointAddress); ?
? ? else ?
? ? ? ? pipe = usb_sndbulkpipe(stream->dev->udev,ep->desc.bEndpointAddress); ?
??
? ? if (stream->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) ?
? ? ? ? size = 0; ?
? ? for (i = 0; i < UVC_URBS; ++i) { ?
? ? ? ? urb = usb_alloc_urb(0, gfp_flags); ?//分配urb ?
? ? ? ? if (urb == NULL) { ?
? ? ? ? ? ? uvc_uninit_video(stream, 1); ?
? ? ? ? ? ? return -ENOMEM; ?
? ? ? ? } ?
? ? ? ? usb_fill_bulk_urb(urb, stream->dev->udev, pipe,stream->urb_buffer[i], size, uvc_video_complete,stream); ? ?//设置urb ?
? ? ? ? urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; ?
? ? ? ? urb->transfer_dma = stream->urb_dma[i]; ?
? ? ? ? stream->urb[i] = urb; ?
? ? } ?
? ? return 0; ?
}
a.1.3.1 同步方式和a.1.3.2 Bluk方式 两种方式初始化uvc视频主要是分配设置urb,然后在uvc_init_video函数中又通过usb_submit_urb提交了urb,
两种方法的urb回调函数都是uvc_video_complete
a.2 urb回调函数uvc_video_complete
static void uvc_video_complete(struct urb *urb) ?
 
{ ?
? ? struct uvc_streaming *stream = urb->context; ?
? ? struct uvc_video_queue *queue = &stream->queue; ?
? ? struct uvc_buffer *buf = NULL; ?
? ? unsigned long flags; ?
? ? int ret; ?
? ? switch (urb->status) { ?
? ? case 0: ?
? ? ? ? break; ?
? ? default: ?
? ? ? ? uvc_printk(KERN_WARNING, "Non-zero status (%d) in video completion handler.\n", urb->status); ?
? ? case -ENOENT: ? ? ? /* usb_kill_urb() called. */ ?
? ? ? ? if (stream->frozen) ?
? ? ? ? ? ? return; ?
? ? case -ECONNRESET: ? /* usb_unlink_urb() called. */ ?
? ? case -ESHUTDOWN: ? ?/* The endpoint is being disabled. */ ?
? ? ? ? uvc_queue_cancel(queue, urb->status == -ESHUTDOWN); ?
? ? ? ? return; ?
? ? } ?
? ? spin_lock_irqsave(&queue->irqlock, flags); ?
? ? if (!list_empty(&queue->irqqueue)) ?
? ? ? ? buf = list_first_entry(&queue->irqqueue, struct uvc_buffer,queue); ?
? ? spin_unlock_irqrestore(&queue->irqlock, flags); ?
? ? stream->decode(urb, stream, buf); ? ?//调用uvc视频流的decode方法 ?
? ? if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { ? //再次提交urb ?
? ? ? ? uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n",ret); ?
? ? } ?
}对于同步和bilk方式的decode方法分别是 ?
 ?
 
 ? ?stream->decode = uvc_video_decode_isoc ?
 
stream->decode = uvc_video_encode_bulk; ?
这个在前面uvc_video_init函数中设置了 ?
 ?
 
ok后面就开始解码了 ?
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
 ?
 
?
?
?
?
?
首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uvc摄像头代码解析6 下一篇poj1698 Alice's Chance

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: