Thursday 11 February 2010

Upside down webcam

Suffering from upside down Webcam?

Well your not the only one. It appears that its a common problem!

Some manufacturers mount the webcam upside down...In Windows the software detects the problem and flips the image automatically. Linux handles the problem differently. Most (but not all) Linux software that makes use of the webcam via a a collection of userspace libraries called libv4l.




libv4l adds a thin abstraction layer on top of video4linux2 devices. The purpose of this layer is to make it easy for application writers to support a wide variety of devices without
having to write separate code for different devices in the same class.

If your webcam is running upside down, download the latest libv4l. Then run your webcam app with following proceeding it: LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so

For example, if you want to run Kopete instant messenger you would run:

LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so kopete

if your webcam is still upside down then you should run the following commands:

lsusb > lsusb.log
dmidecode > dmi.log

then email Hans de Goede (hdegoede@redhat.com) explaining you have a webcam with upside down image and attaching the two log files you have just created (lsusb.log & dmi.log).

Hans will update libv4l and send instructions back on how to install it.

For ASUS X5DC users, I have already asked Hans to update so this should work(thanks Hans!)

You can download the new version here: http://people.fedoraproject.org/~jwrdegoede/libv4l-0.6.5-test.tar.gz



1. Install
===========

Howto install and test libv4l depends on your system. There are
different instructions for if you have a 32 bit system or a 64 bit system.
which is using multilib. A 64 bit system without multilib is the same as
a 32 bit system.

To find out what you have do:

ls -d /usr/lib64

If this command gives a "No such file or directory" error, use the Non multilib instructions, if the second command is successful, you have multilib, to find out which version (dubbed Fedora and Ubuntu multilib, because those are the most well known examples, do):

ls -d /usr/lib32
If this command gives a "No such file or directory" error, use the Fedora multilib instructions. If this command succeeds use the Ubuntu multilib instructions. Note the ubuntu multilib instructions also apply to gentoo.

Non multilib instructions:
-------------------------------
tar xvfz libv4l-0.6.5-test.tar.gz
cd libv4l-0.6.5
make PREFIX=/usr
sudo make install PREFIX=/usr

Fedora Multilib instructions:
-----------------------------------
Basic 64 bit install:
tar xvfz libv4l-0.6.5-test.tar.gz
cd libv4l-0.6.5
make PREFIX=/usr LIBDIR=/usr/lib64
sudo make install PREFIX=/usr LIBDIR=/usr/lib64

If you also want to use 32 bit apps (such as skype), you
will need to have the 32 bit libc headers installed, on Fedora
this can be done like this:
Fedora 10-: "sudo yum install glibc-devel.i386"
Fedora 11: "sudo yum install glibc-devel.i586"
Fedora 12+: "sudo yum install glibc-devel.i686"
Then do:
make clean
make PREFIX=/usr CFLAGS=-m32 LDFLAGS=-m32
sudo make install PREFIX=/usr

Ubuntu Multilib instructions:
-----------------------------------
tar xvfz libv4l-0.6.5-test.tar.gz
cd libv4l-0.6.5
make PREFIX=/usr
sudo make install PREFIX=/usr

If you also want to use 32 bit apps (such as skype), you will need to have the 32 bit libc headers installed, on Ubuntu this can be done like this:

sudo apt-get install libc6-dev-i386

On gentoo this can be done like this:
sudo emerge -v app-emulation/emul-linux-x86-compat

Then do:
make clean
make PREFIX=/usr CFLAGS=-m32 LDFLAGS=-m32 LIBDIR=/usr/lib32
sudo make install PREFIX=/usr LIBDIR=/usr/lib32


2. Testing
========

You have a chance that your webcam app use libv4l or have an appropriate script starting it. In that case you don't have to do anything. Just run the application. This is the most common situation with Ubuntu and Fedora packages. If your problem remains unsolved, then your app might not use libv4l.

In that case start the application from a terminal like this:

Non multilib:
----------------
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so

Note on Ubuntu sometimes skype is using a wrapper script, so if skype
does not work try:
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so skype.real

Fedora multilib:
--------------------
For 64 bit applications (almost all apps):

LD_PRELOAD=/usr/lib64/libv4l/v4l1compat.so

For 32 bit applications (you only need it for proprietary softwares, which don't have a 64 bit version, like skype):

LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so skype

Ubuntu multilib:
--------------------

For 64 bit applications (almost all apps):

LD_PRELOAD=/usr/lib64/libv4l/v4l1compat.so skype

For 32 bit applications (you only need it for proprietary softwares, which
don't have a 64 bit version, like skype):

LD_PRELOAD=/usr/lib32/libv4l/v4l1compat.so skype

Note on Ubuntu sometimes skype is using a wrapper script, so if skype does not work try:
LD_PRELOAD=/usr/lib32/libv4l/v4l1compat.so skype.real

4 comments:

  1. Is there any way to set it up so that I don't have to run that command every time I want to launch Skype? Having done it once and had it work fine, it reverts to being upside-down when I launch Skype as normal, which is highly inconvenient. Help?

    ReplyDelete
  2. Thanks for the blog post, it worked like a charm.

    But I have the same question of Nim. Is there a way to configure the system to do this.

    In the meantime I just created script for each app that uses the webcam, but I'd really like to have it at system level.

    If I find a way to do it I'll come back to post it.

    ReplyDelete
  3. Doesn't work for my U35JC running Fedora 14, have emailed Hans for some help. Will update this if I get a reply from Hans.

    ReplyDelete
  4. Hans hooked me up with a new version of the v4lib: v4l-utils-0.8.2-test

    I compiled and installed it and everything works like a charm, Skype and all!

    Thanks Hans!

    ReplyDelete