Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Nov 2012 22:26:52 +0900 (JST)
From:      SAITOU Toshihide <toshi@ruby.ocn.ne.jp>
To:        hselasky@c2i.net
Cc:        freebsd-usb@freebsd.org
Subject:   Re: isochronous transfer packet is out of sequence
Message-ID:  <20121113.222652.71084426.toshi@ruby.ocn.ne.jp>
In-Reply-To: <201211121342.47141.hselasky@c2i.net>
References:  <20121112.205208.208974549.toshi@ruby.ocn.ne.jp> <201211121342.47141.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <201211121342.47141.hselasky@c2i.net>
            Hans Petter Selasky <hselasky@c2i.net> writes:
> On Monday 12 November 2012 12:52:08 SAITOU Toshihide wrote:
>> I have tryed the USB isochronous transfer for UVC cam using libusb
>> interface and I find the packet fragment is out of sequence on the
>> FreeBSD(1). But I don't find it on the MacBook(2).
>> 
>> (1) FreeBSD 9.1-RC2, Intel Core i7 3770T
>> (2) Mac OS X 10.6.8, Intel Core 2 Duo, libusb 1.0.9 (single core)
>> 
>> Can I prevent this behaviour using libusb interface or is
>> this an expected behaviour?
>> 
>> The bellow I issued two libusb_submit_transfer at the beginning.
>> 
>> 
>> ----- log (1)
>> 049 4437e06b 0 c 818
>> 04a 4437e06b 0 c c00
>> 04b 4437e06b 0 c 818
>> UVC_STREAM_EOF
>> total a1400
>> 04c 4402516b 1 c b9c
>> 04d 4402516b 1 c 87c
>> 04e 4402516b 1 c 800
>> 04f 4402516b 1 c c00
>> 050 4402516b 1 c 800
>> 051 4437e06b 0 c c00
>> 052 4437e06b 0 c 744
>> 053 4437e06b 0 c c00
>> 
>> 
>> ----- callback function
>> static void cb(struct libusb_transfer *xfer)
>> {
>>         uint8_t *p;
>>         int plen;
>>         int i;
>> 
>>         p = xfer->buffer;
>> 
>>         for (i = 0; i < xfer->num_iso_packets; i++, p += PKT_LEN)
>>         {
>>                 if (xfer->iso_packet_desc[i].status ==
>> LIBUSB_TRANSFER_COMPLETED) {
>>                         plen = xfer->iso_packet_desc[i].actual_length;
>> 
>>                         if (plen < 2)
>> 				continue;
>> 
>>                         if (p[1] & UVC_STREAM_ERR) // bmHeaderInfo
>> 				continue;
>> 
>>                         fprintf(stderr, "%03x ", i);
>>                         fprintf(stderr, "%08x ", p[2] | p[3]<<8 | p[4]<<16
>> | p[5]<<24); // pts fprintf(stderr, "%01x ", p[1] & UVC_STREAM_FID); //
>> fid fprintf(stderr, "%01x ", p[0]); // header length fprintf(stderr,
>> "%x\n", plen); // actual length
>> 
>>                         total += plen - p[0];
>> 
>>                         if (p[1] & UVC_STREAM_EOF)
>>                         {
>> 				fprintf(stderr, "UVC_STREAM_EOF\n", total);
>> 				fprintf(stderr, "total %x\n", total);
>> 
>> 				if (total < FrameSize)
>> 				{
>> 					fprintf(stderr, "insufficient frame data.\n");
>> 					write(fd, padding, FrameSize - total); // zero padding
>> 				}
>>                                 total = 0;
>>                         }
>> 			write(fd, p + p[0], plen - p[0]); // write payload data
>>                 }
>>         }
>> 
>>         if (libusb_submit_transfer(xfer) != 0)
>>         {
>>                 fprintf(stderr, "submit transfer failed.\n");
>>         }
>> }
> 
> Hi,
> 
> You need to submit two transfers for continued operation.

I may have a misunderstanding but I submit two transfers at start and
it is resubmited in the callback function, then I see the packet group
in the wrong place. It seems that the callback function was excuted
exclusively so the iso packets in the data buffer were out of order,
just like the packet does not correctly assign to the two transfers.

I can get the video on the MacBook(2). I confirmed using mplayer.

---
SAITOU Toshihide



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121113.222652.71084426.toshi>