AcerのノートについているUVCなWEBCAMを試してみました。
こちらのSAITOU Toshihideさんのコードを使わせてもらいます。
uvc_device_listに以下を追加します。
/* XPA9S1JG8 1.3M WebCam */
{ 0x0402, 0x9665, 0, 1, 1, 0, 0x81, 1, 0x0400, 0x0100 },
コンパイルして実行してみます。640x480(1)では動かなくて、320x240(2)では動きました。
% sudo ./ex41 2 test
1: 640x480
2: 320x240
XferType: 1
dwMaxPayloadTransferSize: 00000400
153600
1
153600
2
153600
3
153600
4
153600
5
153600
6
153600
7
153600
8
153600
9
153600
10
153600
11
^Ctime lapse: 989651
fps: 11
% sudo cat test | ffmpeg -f rawvideo -pix_fmt yuyv422 -s 320x240 -i - tmp.avi
このWEBCAMにはbFrameIndexは1から4まであるのですが2だけが使えるようです。
Windowsにtmp.aviをコピーして再生します。
640x480が処理できないのはdwMaxPayloadTransferSizeが関係しているようです。SAITOUさんのコードはMINの0x400(1Kbyte)で処理しているのですが、これだと320x240しか送れないみたいです。大きくすると640x480のEOFが拾えるようになるのですが、データがかけてしまいます。他のパラメータの調整も必要なのだと思われます。
640x480といってもyuyv422が1ピクセル16bitで5Mbit/frameくらいで、秒間30フレームだと150Mbit/secになり結構な量です。
dwMaxPayloadTransferSize(22-25)とFrame interval(4-7)をMINの二倍にしたら640x480でもキャプチャできました。Frame intervalは三倍にすると効かなくなるようなので、設定できる値に制限があるようです。
libuvcも試してみたのですが、まったくコールバックが呼ばれず、調べてみたら転送のsubmitのところでエラーになっていて動いていませんでした。デフォルトではエラーログも出さないし、クリーニングしてSUCCESSで返すし、DEBUGでビルドするとcore dumpするし、あまり品質のよくないプロジェクトみたいです。
ただ、どうもUVCなカメラはいろいろなようで、共通コードを作るのは結構大変で、いろいろ取り揃えて時間かけてやらないとダメそうな感じです。