昔書いたV4L1(Video for Linux ver. 1)を用いたWebカメラのキャプチャプログラムをRaspberry Piでコンパイルしたら動かそうとしたら、下記のように「linux/videodev.h」が無いと怒られたので、libv4l-devパッケージをインストールしてみた。
Hv4lCapture.h:12:28: fatal error: linux/videodev.h: No such file or directory #include <linux/videodev.h>
> sudo apt-get install libv4l-dev > dpkg -L libv4l-dev /. /usr /usr/include /usr/include/libv4l-plugin.h /usr/include/libv4l1.h /usr/include/libv4l2.h /usr/include/libv4l2rds.h /usr/include/libv4l1-videodev.h /usr/include/libv4lconvert.h /usr/lib /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabihf/libv4lconvert.a /usr/lib/arm-linux-gnueabihf/libv4l1.a /usr/lib/arm-linux-gnueabihf/pkgconfig /usr/lib/arm-linux-gnueabihf/pkgconfig/libv4l2rds.pc /usr/lib/arm-linux-gnueabihf/pkgconfig/libv4l2.pc /usr/lib/arm-linux-gnueabihf/pkgconfig/libv4lconvert.pc /usr/lib/arm-linux-gnueabihf/pkgconfig/libv4l1.pc /usr/lib/arm-linux-gnueabihf/libv4l2.a /usr/lib/arm-linux-gnueabihf/libv4l2rds.a /usr/share /usr/share/doc /usr/lib/arm-linux-gnueabihf/libv4l2.so /usr/lib/arm-linux-gnueabihf/libv4l1.so /usr/lib/arm-linux-gnueabihf/libv4lconvert.so /usr/lib/arm-linux-gnueabihf/libv4l2rds.so /usr/share/doc/libv4l-dev
しかしながら、上記のように、インストールしたlibv4l-devパッケージの一覧を見たところ、linux/videodev.hが無い。そこで、ヘッダーファイル「libv4l1-videodev.h」とライブラリ「/usr/lib/arm-linux-gnueabihf/libv4l1.so」を参照するようにプログラムおよびMakefileを書き換えたところ、コンパイルが通った。
しかしながら、コンパイルしたプログラムを実行したところ、下記のようなエラーが出た。
「VIDIOCGCAP: Inappropriate ioctl for device」
これは、下記のようにWebカメラの互換性(Capability)を確認するためのシステムコールを実行した際に出ているエラーである。
if(ioctl(fd, VIDIOCGCAP, vd) < 0)
いろいろ調べたところ、下記のようにUbuntu MATE16.04 for raspi 2 and 3は、v4l2関連のパッケージが既に入っていて、Webカメラ(Logitech QuickCam pro 4000)をUSBに刺した時に、v4l2のモジュールがロードされていたようだ。。。
> lsmod | grep v4l v4l2_common 3777 2 pwc,videobuf2_core videodev 121307 3 pwc,v4l2_common,videobuf2_core > uname -a Linux RasPi3 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l armv7l armv7l GNU/Linux > ls /lib/modules/4.1.19-v7+/kernel/drivers/media/ common dvb-frontends media.ko platform rc usb dvb-core i2c pci radio tuners v4l2-core > ls /usr/include/linux/videodev* /usr/include/linux/videodev2.h
おそらくVIDIOCGCAPのシステムコールは、v4l2モジュールでは対応していないため、上記のようなエラーが出たのではないかと思う。この問題を解決するためには、以下のような方法などがあると思う。
- v4l1のモジュールをインストールして、v4l2の代わりにv4l1モジュールをカーネルにロードさせる:v4l2の新しい機能が利用できない。。。
- プログラムをv4l2に対応させる:おそらく大規模な修正が必要。。。