覚え書きブログ

Raspberry Piの覚え書き(V4L編)

昔書いた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モジュールでは対応していないため、上記のようなエラーが出たのではないかと思う。この問題を解決するためには、以下のような方法などがあると思う。

  1. v4l1のモジュールをインストールして、v4l2の代わりにv4l1モジュールをカーネルにロードさせる:v4l2の新しい機能が利用できない。。。
  2. プログラムをv4l2に対応させる:おそらく大規模な修正が必要。。。