tcpdump -i usbmon1 -w uvc_capture.pcap -c 1000
usb.src == "1.2.0" || usb.dst == "1.2.0"

- init bh->head.
static void init_giveback_urb_bh(struct giveback_urb_bh *bh)
{
spin_lock_init(&bh->lock);
INIT_LIST_HEAD(&bh->head);
tasklet_init(&bh->bh, usb_giveback_urb_bh, (unsigned long)bh);
}
- add urb_list 2 bh->head.
void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)
list_add_tail(&urb->urb_list, &bh->head);
- replace_ bh->head with local_list.
static void usb_giveback_urb_bh(unsigned long param)
list_replace_init(&bh->head, &local_list);
(gdb) bt
#0 mon_complete (ubus=0xffffffc0e7e7c800, urb=0xffffffc0e7150c00, status=0) at drivers/usb/mon/mon_main.c:151
#1 0xffffff8008857d20 in usbmon_urb_complete (status=<optimized out>, urb=<optimized out>, bus=<optimized out>) at ./include/linux/usb/hcd.h:736
#2 __usb_hcd_giveback_urb (urb=0xffffffc0e7150c00) at drivers/usb/core/hcd.c:1764
#3 0xffffff8008858a14 in usb_giveback_urb_bh (param=18446743802722372112) at drivers/usb/core/hcd.c:1818
#4 0xffffff80080b60e8 in tasklet_action_common (tl_head=0xffffffc0efeea7c0, softirq_nr=6, a=<optimized out>) at kernel/softirq.c:522
#5 0xffffff80080b61a4 in tasklet_action (a=<optimized out>) at kernel/softirq.c:540
#6 0xffffff8008081448 in __do_softirq () at kernel/softirq.c:292
/////////
int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
rh_urb_enqueue(hcd, urb);
static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
usb_hcd_link_urb_to_ep(hcd, urb);
int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)
list_add_tail(&urb->urb_list, &urb->ep->urb_list);
///////// decode

static void __usb_hcd_giveback_urb(struct urb *urb)
urb->complete(urb);
uvc_video_complete
uvc_video_decode_isoc

0x8C
10001100
0x8D
10001101
bit0翻转表示新的一帧开始