[SVN-Commit] r1131 - in trunk: Mk mail/thunderbird/files www/firefox-nightly/files www/firefox/files www/seamonkey/files

svn-freebsd-gecko at chruetertee.ch svn-freebsd-gecko at chruetertee.ch
Sat Jan 5 10:02:41 UTC 2013


Author: jbeich
Date: Sat Jan  5 10:02:26 2013
New Revision: 1131

Log:
support more cameras with WebRTC

Submitted by:	Henrik Gulbrandsen <henrik at gulbra.net> (earlier version)

Added:
   trunk/mail/thunderbird/files/patch-bug826985
   trunk/www/firefox-nightly/files/patch-bug826985
   trunk/www/firefox/files/patch-bug826985
   trunk/www/seamonkey/files/patch-bug826985
Modified:
   trunk/Mk/bsd.gecko.mk

Modified: trunk/Mk/bsd.gecko.mk
==============================================================================
--- trunk/Mk/bsd.gecko.mk	Wed Jan  2 19:58:18 2013	(r1130)
+++ trunk/Mk/bsd.gecko.mk	Sat Jan  5 10:02:26 2013	(r1131)
@@ -736,7 +736,8 @@
 .endif
 
 .if ${PORT_OPTIONS:MWEBRTC}
-BUILD_DEPENDS+=	${LOCALBASE}/include/linux/videodev2.h:${PORTSDIR}/multimedia/v4l_compat
+BUILD_DEPENDS+=	v4l_compat>0:${PORTSDIR}/multimedia/v4l_compat
+LIB_DEPENDS+=	v4l2:${PORTSDIR}/multimedia/libv4l
 . if ! ${PORT_OPTIONS:MALSA}
 IGNORE=		WEBRTC works only with ALSA audio backend
 . endif

Added: trunk/mail/thunderbird/files/patch-bug826985
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/mail/thunderbird/files/patch-bug826985	Sat Jan  5 10:02:26 2013	(r1131)
@@ -0,0 +1,370 @@
+commit d18000b
+Author: Henrik Gulbrandsen <henrik at gulbra.net>
+Date:   Fri Jan 4 13:49:22 2013 +0100
+
+    Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux.
+---
+ configure.in                                       | 13 ++++++
+ .../main/source/Linux/device_info_linux.cc         | 30 ++++++++------
+ .../main/source/Linux/video_capture_linux.cc       | 47 ++++++++++++----------
+ .../video_capture/main/source/video_capture.gypi   |  1 +
+ toolkit/library/Makefile.in                        |  3 ++
+ 5 files changed, 60 insertions(+), 34 deletions(-)
+
+diff --git configure.in configure.in
+index 6d05f9c..297615f 100644
+--- mozilla/configure.in
++++ mozilla/configure.in
+@@ -5270,6 +5270,17 @@ if test -n "$MOZ_WEBRTC"; then
+     MOZ_VP8=1
+     MOZ_VP8_ENCODER=1
+     MOZ_VP8_ERROR_CONCEALMENT=1
++    dnl use libv4l on Linux to support more cameras
++    case "$target" in
++    *-android*|*-linuxandroid*)
++        ;;
++    *-linux*|*-dragonfly*|*-freebsd*|*-netbsd*|*-openbsd*)
++        MOZ_WEBRTC_LIBV4L=1
++        PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2, ,
++            [echo "$MOZ_LIBV4L2_PKG_ERRORS"
++              AC_MSG_ERROR([WebRTC on Linux needs libv4l2 for video format conversion.])])
++        ;;
++    esac
+ dnl enable once Signaling lands
+     MOZ_WEBRTC_SIGNALING=1
+     AC_DEFINE(MOZ_WEBRTC_SIGNALING)
+@@ -5288,6 +5299,7 @@ fi
+ AC_SUBST(MOZ_WEBRTC)
+ AC_SUBST(MOZ_WEBRTC_SIGNALING)
+ AC_SUBST(MOZ_PEERCONNECTION)
++AC_SUBST(MOZ_WEBRTC_LIBV4L)
+ AC_SUBST(MOZ_WEBRTC_IN_LIBXUL)
+ AC_SUBST(MOZ_SCTP)
+ AC_SUBST(MOZ_SRTP)
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+index 653ee16..270f064 100644
+--- mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
++++ mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+@@ -26,6 +26,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include "ref_count.h"
+ #include "trace.h"
+@@ -68,9 +69,9 @@ WebRtc_UWord32 DeviceInfoLinux::NumberOfDevices()
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+-            close(fd);
++            v4l2_close(fd);
+             count++;
+         }
+     }
+@@ -97,14 +98,14 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             if (count == deviceNumber) {
+                 // Found the device
+                 found = true;
+                 break;
+             } else {
+-                close(fd);
++                v4l2_close(fd);
+                 count++;
+             }
+         }
+@@ -115,21 +116,26 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+ 
+     // query device capabilities
+     struct v4l2_capability cap;
+-    if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
++    if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in querying the device capability for device %s. errno = %d",
+                    device, errno);
+-        close(fd);
++        v4l2_close(fd);
+         return -1;
+     }
+ 
+-    close(fd);
++    v4l2_close(fd);
+ 
+     char cameraName[64];
+     memset(deviceNameUTF8, 0, deviceNameLength);
+     memcpy(cameraName, cap.card, sizeof(cap.card));
+ 
++    if (cameraName[0] == '\0')
++    {
++        sprintf(cameraName, "Camera at /dev/video%d", deviceNumber);
++    }
++
+     if (deviceNameLength >= strlen(cameraName))
+     {
+         memcpy(deviceNameUTF8, cameraName, strlen(cameraName));
+@@ -181,13 +187,13 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     for (int n = 0; n < 64; ++n)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        fd = open(device, O_RDONLY);
++        fd = v4l2_open(device, O_RDONLY);
+         if (fd == -1)
+           continue;
+ 
+         // query device capabilities
+         struct v4l2_capability cap;
+-        if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++        if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+         {
+             if (cap.bus_info[0] != 0)
+             {
+@@ -209,7 +215,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+                 }
+             }
+         }
+-        close(fd); // close since this is not the matching device
++        v4l2_close(fd); // close since this is not the matching device
+     }
+ 
+     if (!found)
+@@ -228,7 +234,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     }
+ 
+     int size = FillCapabilityMap(fd);
+-    close(fd);
++    v4l2_close(fd);
+ 
+     // Store the new used device name
+     _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
+@@ -282,7 +288,7 @@ WebRtc_Word32 DeviceInfoLinux::FillCapabilityMap(int fd)
+             video_fmt.fmt.pix.width = size[i][0];
+             video_fmt.fmt.pix.height = size[i][1];
+ 
+-            if (ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
++            if (v4l2_ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
+             {
+                 if ((video_fmt.fmt.pix.width == size[i][0])
+                     && (video_fmt.fmt.pix.height == size[i][1]))
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+index 12df1b3..4ddc9d4 100644
+--- mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
++++ mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+@@ -25,6 +25,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include <new>
+ 
+@@ -79,11 +82,11 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+     for (n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             // query device capabilities
+             struct v4l2_capability cap;
+-            if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++            if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+             {
+                 if (cap.bus_info[0] != 0)
+                 {
+@@ -91,13 +94,13 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+                                 (const char*) deviceUniqueIdUTF8,
+                                 strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
+                     {
+-                        close(fd);
++                        v4l2_close(fd);
+                         found = true;
+                         break; // fd matches with device unique id supplied
+                     }
+                 }
+             }
+-            close(fd); // close since this is not the matching device
++            v4l2_close(fd); // close since this is not the matching device
+         }
+     }
+     if (!found)
+@@ -117,7 +120,7 @@ VideoCaptureModuleV4L2::~VideoCaptureModuleV4L2()
+         delete _captureCritSect;
+     }
+     if (_deviceFd != -1)
+-      close(_deviceFd);
++      v4l2_close(_deviceFd);
+ }
+ 
+ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+@@ -142,7 +145,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     char device[20];
+     sprintf(device, "/dev/video%d", (int) _deviceId);
+ 
+-    if ((_deviceFd = open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
++    if ((_deviceFd = v4l2_open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in opening %s errono = %d", device, errno);
+@@ -175,7 +178,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     for (int i = 0; i < nFormats; i++)
+     {
+         video_fmt.fmt.pix.pixelformat = fmts[i];
+-        if (ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
+         {
+             continue;
+         }
+@@ -200,7 +203,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         _captureVideoType = kVideoMJPEG;
+ 
+     //set format and frame size now
+-    if (ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_S_FMT, errno = %d", errno);
+@@ -217,7 +220,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     struct v4l2_streamparm streamparms;
+     memset(&streamparms, 0, sizeof(streamparms));
+     streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
++    if (v4l2_ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_G_PARM errno = %d", errno);
+         driver_framerate_support = false;
+@@ -230,7 +233,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         streamparms.parm.capture.timeperframe.numerator = 1;
+         streamparms.parm.capture.timeperframe.denominator = capability.maxFPS;
+-        if (ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
++        if (v4l2_ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
+           WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Failed to set the framerate. errno=%d", errno);
+           driver_framerate_support = false;
+@@ -268,7 +271,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     // Needed to start UVC camera - from the uvcview application
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                      "Failed to turn on stream");
+@@ -303,7 +306,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StopCapture()
+         _captureThread = NULL;
+ 
+         DeAllocateVideoBuffers();
+-        close(_deviceFd);
++        v4l2_close(_deviceFd);
+         _deviceFd = -1;
+     }
+ 
+@@ -321,7 +324,7 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+     rbuffer.memory = V4L2_MEMORY_MMAP;
+     rbuffer.count = kNoOfV4L2Bufffers;
+ 
+-    if (ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Could not get buffers from device. errno = %d", errno);
+@@ -344,24 +347,24 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+         buffer.memory = V4L2_MEMORY_MMAP;
+         buffer.index = i;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
+         {
+             return false;
+         }
+ 
+-        _pool[i].start = mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
++        _pool[i].start = v4l2_mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
+                               _deviceFd, buffer.m.offset);
+ 
+         if (MAP_FAILED == _pool[i].start)
+         {
+             for (unsigned int j = 0; j < i; j++)
+-                munmap(_pool[j].start, _pool[j].length);
++                v4l2_munmap(_pool[j].start, _pool[j].length);
+             return false;
+         }
+ 
+         _pool[i].length = buffer.length;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
+         {
+             return false;
+         }
+@@ -373,14 +376,14 @@ bool VideoCaptureModuleV4L2::DeAllocateVideoBuffers()
+ {
+     // unmap buffers
+     for (int i = 0; i < _buffersAllocatedByDevice; i++)
+-        munmap(_pool[i].start, _pool[i].length);
++        v4l2_munmap(_pool[i].start, _pool[i].length);
+ 
+     delete[] _pool;
+ 
+     // turn off stream
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "VIDIOC_STREAMOFF error. errno: %d", errno);
+@@ -438,7 +441,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         buf.memory = V4L2_MEMORY_MMAP;
+         // dequeue a buffer - repeat until dequeued properly!
+-        while (ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
++        while (v4l2_ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
+         {
+             if (errno != EINTR)
+             {
+@@ -457,7 +460,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         IncomingFrame((unsigned char*) _pool[buf.index].start,
+                       buf.bytesused, frameInfo);
+         // enqueue the buffer again
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
+         {
+             WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id,
+                        "Failed to enqueue capture buffer");
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+index 8d38102..3e8f76b 100644
+--- mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
++++ mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+@@ -179,6 +179,7 @@
+               'libraries': [
+                 '-lXext',
+                 '-lX11',
++                '-lv4l2',
+               ],
+             }],
+             ['OS=="linux"', {
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 0440c26..8f6c735 100644
+--- mozilla/toolkit/library/Makefile.in
++++ mozilla/toolkit/library/Makefile.in
+@@ -411,6 +411,9 @@ EXTRA_DSO_LDOPTS += \
+   $(DEPTH)/media/webrtc/signaling/signaling_sipcc/$(LIB_PREFIX)sipcc.$(LIB_SUFFIX) \
+   $(NULL)
+ endif
++ifdef MOZ_WEBRTC_LIBV4L
++EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS)
++endif
+ ifdef MOZ_WEBRTC_IN_LIBXUL
+ include $(topsrcdir)/media/webrtc/shared_libs.mk
+ EXTRA_DSO_LDOPTS += $(WEBRTC_LIBS)

Added: trunk/www/firefox-nightly/files/patch-bug826985
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/firefox-nightly/files/patch-bug826985	Sat Jan  5 10:02:26 2013	(r1131)
@@ -0,0 +1,371 @@
+commit d18000b
+Author: Henrik Gulbrandsen <henrik at gulbra.net>
+Date:   Fri Jan 4 13:49:22 2013 +0100
+
+    Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux.
+---
+ configure.in                                       | 13 ++++++
+ .../main/source/Linux/device_info_linux.cc         | 30 ++++++++------
+ .../main/source/Linux/video_capture_linux.cc       | 47 ++++++++++++----------
+ .../video_capture/main/source/video_capture.gypi   |  1 +
+ toolkit/library/Makefile.in                        |  3 ++
+ 5 files changed, 60 insertions(+), 34 deletions(-)
+
+diff --git configure.in configure.in
+index 6d05f9c..297615f 100644
+--- configure.in
++++ configure.in
+@@ -5279,6 +5279,18 @@ if test -n "$MOZ_WEBRTC"; then
+     MOZ_VP8_ENCODER=1
+     MOZ_VP8_ERROR_CONCEALMENT=1
+ 
++    dnl use libv4l on Linux to support more cameras
++    case "$target" in
++    *-android*|*-linuxandroid*)
++        ;;
++    *-linux*|*-dragonfly*|*-freebsd*|*-netbsd*|*-openbsd*)
++        MOZ_WEBRTC_LIBV4L=1
++        PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2, ,
++            [echo "$MOZ_LIBV4L2_PKG_ERRORS"
++              AC_MSG_ERROR([WebRTC on Linux needs libv4l2 for video format conversion.])])
++        ;;
++    esac
++
+     dnl OpenSLES is only available in Android 2.3 and later; we'll change this
+     dnl hard dependency to a dynamic load with graceful runtime failure before
+     dnl we make --enable-webrtc on by default in Android (bug 815905)
+@@ -5311,6 +5323,7 @@ AC_SUBST(MOZ_WEBRTC)
+ AC_SUBST(MOZ_WEBRTC_LEAKING_TESTS)
+ AC_SUBST(MOZ_WEBRTC_SIGNALING)
+ AC_SUBST(MOZ_PEERCONNECTION)
++AC_SUBST(MOZ_WEBRTC_LIBV4L)
+ AC_SUBST(MOZ_WEBRTC_IN_LIBXUL)
+ AC_SUBST(MOZ_SCTP)
+ AC_SUBST(MOZ_SRTP)
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+index 653ee16..270f064 100644
+--- media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
++++ media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+@@ -26,6 +26,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include "ref_count.h"
+ #include "trace.h"
+@@ -68,9 +69,9 @@ WebRtc_UWord32 DeviceInfoLinux::NumberOfDevices()
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+-            close(fd);
++            v4l2_close(fd);
+             count++;
+         }
+     }
+@@ -97,14 +98,14 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             if (count == deviceNumber) {
+                 // Found the device
+                 found = true;
+                 break;
+             } else {
+-                close(fd);
++                v4l2_close(fd);
+                 count++;
+             }
+         }
+@@ -115,21 +116,26 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+ 
+     // query device capabilities
+     struct v4l2_capability cap;
+-    if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
++    if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in querying the device capability for device %s. errno = %d",
+                    device, errno);
+-        close(fd);
++        v4l2_close(fd);
+         return -1;
+     }
+ 
+-    close(fd);
++    v4l2_close(fd);
+ 
+     char cameraName[64];
+     memset(deviceNameUTF8, 0, deviceNameLength);
+     memcpy(cameraName, cap.card, sizeof(cap.card));
+ 
++    if (cameraName[0] == '\0')
++    {
++        sprintf(cameraName, "Camera at /dev/video%d", deviceNumber);
++    }
++
+     if (deviceNameLength >= strlen(cameraName))
+     {
+         memcpy(deviceNameUTF8, cameraName, strlen(cameraName));
+@@ -181,13 +187,13 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     for (int n = 0; n < 64; ++n)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        fd = open(device, O_RDONLY);
++        fd = v4l2_open(device, O_RDONLY);
+         if (fd == -1)
+           continue;
+ 
+         // query device capabilities
+         struct v4l2_capability cap;
+-        if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++        if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+         {
+             if (cap.bus_info[0] != 0)
+             {
+@@ -209,7 +215,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+                 }
+             }
+         }
+-        close(fd); // close since this is not the matching device
++        v4l2_close(fd); // close since this is not the matching device
+     }
+ 
+     if (!found)
+@@ -228,7 +234,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     }
+ 
+     int size = FillCapabilityMap(fd);
+-    close(fd);
++    v4l2_close(fd);
+ 
+     // Store the new used device name
+     _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
+@@ -282,7 +288,7 @@ WebRtc_Word32 DeviceInfoLinux::FillCapabilityMap(int fd)
+             video_fmt.fmt.pix.width = size[i][0];
+             video_fmt.fmt.pix.height = size[i][1];
+ 
+-            if (ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
++            if (v4l2_ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
+             {
+                 if ((video_fmt.fmt.pix.width == size[i][0])
+                     && (video_fmt.fmt.pix.height == size[i][1]))
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+index 12df1b3..4ddc9d4 100644
+--- media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
++++ media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+@@ -25,6 +25,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include <new>
+ 
+@@ -79,11 +82,11 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+     for (n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             // query device capabilities
+             struct v4l2_capability cap;
+-            if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++            if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+             {
+                 if (cap.bus_info[0] != 0)
+                 {
+@@ -91,13 +94,13 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+                                 (const char*) deviceUniqueIdUTF8,
+                                 strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
+                     {
+-                        close(fd);
++                        v4l2_close(fd);
+                         found = true;
+                         break; // fd matches with device unique id supplied
+                     }
+                 }
+             }
+-            close(fd); // close since this is not the matching device
++            v4l2_close(fd); // close since this is not the matching device
+         }
+     }
+     if (!found)
+@@ -117,7 +120,7 @@ VideoCaptureModuleV4L2::~VideoCaptureModuleV4L2()
+         delete _captureCritSect;
+     }
+     if (_deviceFd != -1)
+-      close(_deviceFd);
++      v4l2_close(_deviceFd);
+ }
+ 
+ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+@@ -142,7 +145,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     char device[20];
+     sprintf(device, "/dev/video%d", (int) _deviceId);
+ 
+-    if ((_deviceFd = open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
++    if ((_deviceFd = v4l2_open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in opening %s errono = %d", device, errno);
+@@ -175,7 +178,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     for (int i = 0; i < nFormats; i++)
+     {
+         video_fmt.fmt.pix.pixelformat = fmts[i];
+-        if (ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
+         {
+             continue;
+         }
+@@ -200,7 +203,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         _captureVideoType = kVideoMJPEG;
+ 
+     //set format and frame size now
+-    if (ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_S_FMT, errno = %d", errno);
+@@ -217,7 +220,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     struct v4l2_streamparm streamparms;
+     memset(&streamparms, 0, sizeof(streamparms));
+     streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
++    if (v4l2_ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_G_PARM errno = %d", errno);
+         driver_framerate_support = false;
+@@ -230,7 +233,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         streamparms.parm.capture.timeperframe.numerator = 1;
+         streamparms.parm.capture.timeperframe.denominator = capability.maxFPS;
+-        if (ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
++        if (v4l2_ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
+           WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Failed to set the framerate. errno=%d", errno);
+           driver_framerate_support = false;
+@@ -268,7 +271,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     // Needed to start UVC camera - from the uvcview application
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                      "Failed to turn on stream");
+@@ -303,7 +306,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StopCapture()
+         _captureThread = NULL;
+ 
+         DeAllocateVideoBuffers();
+-        close(_deviceFd);
++        v4l2_close(_deviceFd);
+         _deviceFd = -1;
+     }
+ 
+@@ -321,7 +324,7 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+     rbuffer.memory = V4L2_MEMORY_MMAP;
+     rbuffer.count = kNoOfV4L2Bufffers;
+ 
+-    if (ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Could not get buffers from device. errno = %d", errno);
+@@ -344,24 +347,24 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+         buffer.memory = V4L2_MEMORY_MMAP;
+         buffer.index = i;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
+         {
+             return false;
+         }
+ 
+-        _pool[i].start = mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
++        _pool[i].start = v4l2_mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
+                               _deviceFd, buffer.m.offset);
+ 
+         if (MAP_FAILED == _pool[i].start)
+         {
+             for (unsigned int j = 0; j < i; j++)
+-                munmap(_pool[j].start, _pool[j].length);
++                v4l2_munmap(_pool[j].start, _pool[j].length);
+             return false;
+         }
+ 
+         _pool[i].length = buffer.length;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
+         {
+             return false;
+         }
+@@ -373,14 +376,14 @@ bool VideoCaptureModuleV4L2::DeAllocateVideoBuffers()
+ {
+     // unmap buffers
+     for (int i = 0; i < _buffersAllocatedByDevice; i++)
+-        munmap(_pool[i].start, _pool[i].length);
++        v4l2_munmap(_pool[i].start, _pool[i].length);
+ 
+     delete[] _pool;
+ 
+     // turn off stream
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "VIDIOC_STREAMOFF error. errno: %d", errno);
+@@ -438,7 +441,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         buf.memory = V4L2_MEMORY_MMAP;
+         // dequeue a buffer - repeat until dequeued properly!
+-        while (ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
++        while (v4l2_ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
+         {
+             if (errno != EINTR)
+             {
+@@ -457,7 +460,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         IncomingFrame((unsigned char*) _pool[buf.index].start,
+                       buf.bytesused, frameInfo);
+         // enqueue the buffer again
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
+         {
+             WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id,
+                        "Failed to enqueue capture buffer");
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+index 8d38102..3e8f76b 100644
+--- media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
++++ media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+@@ -179,6 +179,7 @@
+               'libraries': [
+                 '-lXext',
+                 '-lX11',
++                '-lv4l2',
+               ],
+             }],
+             ['OS=="linux"', {
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 0440c26..8f6c735 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -411,6 +411,9 @@ EXTRA_DSO_LDOPTS += \
+   $(DEPTH)/media/webrtc/signaling/signaling_sipcc/$(LIB_PREFIX)sipcc.$(LIB_SUFFIX) \
+   $(NULL)
+ endif
++ifdef MOZ_WEBRTC_LIBV4L
++EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS)
++endif
+ ifdef MOZ_WEBRTC_IN_LIBXUL
+ include $(topsrcdir)/media/webrtc/shared_libs.mk
+ EXTRA_DSO_LDOPTS += $(WEBRTC_LIBS)

Added: trunk/www/firefox/files/patch-bug826985
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/firefox/files/patch-bug826985	Sat Jan  5 10:02:26 2013	(r1131)
@@ -0,0 +1,370 @@
+commit d18000b
+Author: Henrik Gulbrandsen <henrik at gulbra.net>
+Date:   Fri Jan 4 13:49:22 2013 +0100
+
+    Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux.
+---
+ configure.in                                       | 13 ++++++
+ .../main/source/Linux/device_info_linux.cc         | 30 ++++++++------
+ .../main/source/Linux/video_capture_linux.cc       | 47 ++++++++++++----------
+ .../video_capture/main/source/video_capture.gypi   |  1 +
+ toolkit/library/Makefile.in                        |  3 ++
+ 5 files changed, 60 insertions(+), 34 deletions(-)
+
+diff --git configure.in configure.in
+index 6d05f9c..297615f 100644
+--- configure.in
++++ configure.in
+@@ -5270,6 +5270,17 @@ if test -n "$MOZ_WEBRTC"; then
+     MOZ_VP8=1
+     MOZ_VP8_ENCODER=1
+     MOZ_VP8_ERROR_CONCEALMENT=1
++    dnl use libv4l on Linux to support more cameras
++    case "$target" in
++    *-android*|*-linuxandroid*)
++        ;;
++    *-linux*|*-dragonfly*|*-freebsd*|*-netbsd*|*-openbsd*)
++        MOZ_WEBRTC_LIBV4L=1
++        PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2, ,
++            [echo "$MOZ_LIBV4L2_PKG_ERRORS"
++              AC_MSG_ERROR([WebRTC on Linux needs libv4l2 for video format conversion.])])
++        ;;
++    esac
+ dnl enable once Signaling lands
+     MOZ_WEBRTC_SIGNALING=1
+     AC_DEFINE(MOZ_WEBRTC_SIGNALING)
+@@ -5288,6 +5299,7 @@ fi
+ AC_SUBST(MOZ_WEBRTC)
+ AC_SUBST(MOZ_WEBRTC_SIGNALING)
+ AC_SUBST(MOZ_PEERCONNECTION)
++AC_SUBST(MOZ_WEBRTC_LIBV4L)
+ AC_SUBST(MOZ_WEBRTC_IN_LIBXUL)
+ AC_SUBST(MOZ_SCTP)
+ AC_SUBST(MOZ_SRTP)
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+index 653ee16..270f064 100644
+--- media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
++++ media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+@@ -26,6 +26,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include "ref_count.h"
+ #include "trace.h"
+@@ -68,9 +69,9 @@ WebRtc_UWord32 DeviceInfoLinux::NumberOfDevices()
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+-            close(fd);
++            v4l2_close(fd);
+             count++;
+         }
+     }
+@@ -97,14 +98,14 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             if (count == deviceNumber) {
+                 // Found the device
+                 found = true;
+                 break;
+             } else {
+-                close(fd);
++                v4l2_close(fd);
+                 count++;
+             }
+         }
+@@ -115,21 +116,26 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+ 
+     // query device capabilities
+     struct v4l2_capability cap;
+-    if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
++    if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in querying the device capability for device %s. errno = %d",
+                    device, errno);
+-        close(fd);
++        v4l2_close(fd);
+         return -1;
+     }
+ 
+-    close(fd);
++    v4l2_close(fd);
+ 
+     char cameraName[64];
+     memset(deviceNameUTF8, 0, deviceNameLength);
+     memcpy(cameraName, cap.card, sizeof(cap.card));
+ 
++    if (cameraName[0] == '\0')
++    {
++        sprintf(cameraName, "Camera at /dev/video%d", deviceNumber);
++    }
++
+     if (deviceNameLength >= strlen(cameraName))
+     {
+         memcpy(deviceNameUTF8, cameraName, strlen(cameraName));
+@@ -181,13 +187,13 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     for (int n = 0; n < 64; ++n)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        fd = open(device, O_RDONLY);
++        fd = v4l2_open(device, O_RDONLY);
+         if (fd == -1)
+           continue;
+ 
+         // query device capabilities
+         struct v4l2_capability cap;
+-        if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++        if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+         {
+             if (cap.bus_info[0] != 0)
+             {
+@@ -209,7 +215,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+                 }
+             }
+         }
+-        close(fd); // close since this is not the matching device
++        v4l2_close(fd); // close since this is not the matching device
+     }
+ 
+     if (!found)
+@@ -228,7 +234,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     }
+ 
+     int size = FillCapabilityMap(fd);
+-    close(fd);
++    v4l2_close(fd);
+ 
+     // Store the new used device name
+     _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
+@@ -282,7 +288,7 @@ WebRtc_Word32 DeviceInfoLinux::FillCapabilityMap(int fd)
+             video_fmt.fmt.pix.width = size[i][0];
+             video_fmt.fmt.pix.height = size[i][1];
+ 
+-            if (ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
++            if (v4l2_ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
+             {
+                 if ((video_fmt.fmt.pix.width == size[i][0])
+                     && (video_fmt.fmt.pix.height == size[i][1]))
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+index 12df1b3..4ddc9d4 100644
+--- media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
++++ media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+@@ -25,6 +25,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include <new>
+ 
+@@ -79,11 +82,11 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+     for (n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             // query device capabilities
+             struct v4l2_capability cap;
+-            if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++            if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+             {
+                 if (cap.bus_info[0] != 0)
+                 {
+@@ -91,13 +94,13 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+                                 (const char*) deviceUniqueIdUTF8,
+                                 strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
+                     {
+-                        close(fd);
++                        v4l2_close(fd);
+                         found = true;
+                         break; // fd matches with device unique id supplied
+                     }
+                 }
+             }
+-            close(fd); // close since this is not the matching device
++            v4l2_close(fd); // close since this is not the matching device
+         }
+     }
+     if (!found)
+@@ -117,7 +120,7 @@ VideoCaptureModuleV4L2::~VideoCaptureModuleV4L2()
+         delete _captureCritSect;
+     }
+     if (_deviceFd != -1)
+-      close(_deviceFd);
++      v4l2_close(_deviceFd);
+ }
+ 
+ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+@@ -142,7 +145,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     char device[20];
+     sprintf(device, "/dev/video%d", (int) _deviceId);
+ 
+-    if ((_deviceFd = open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
++    if ((_deviceFd = v4l2_open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in opening %s errono = %d", device, errno);
+@@ -175,7 +178,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     for (int i = 0; i < nFormats; i++)
+     {
+         video_fmt.fmt.pix.pixelformat = fmts[i];
+-        if (ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
+         {
+             continue;
+         }
+@@ -200,7 +203,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         _captureVideoType = kVideoMJPEG;
+ 
+     //set format and frame size now
+-    if (ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_S_FMT, errno = %d", errno);
+@@ -217,7 +220,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     struct v4l2_streamparm streamparms;
+     memset(&streamparms, 0, sizeof(streamparms));
+     streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
++    if (v4l2_ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_G_PARM errno = %d", errno);
+         driver_framerate_support = false;
+@@ -230,7 +233,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         streamparms.parm.capture.timeperframe.numerator = 1;
+         streamparms.parm.capture.timeperframe.denominator = capability.maxFPS;
+-        if (ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
++        if (v4l2_ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
+           WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Failed to set the framerate. errno=%d", errno);
+           driver_framerate_support = false;
+@@ -268,7 +271,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     // Needed to start UVC camera - from the uvcview application
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                      "Failed to turn on stream");
+@@ -303,7 +306,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StopCapture()
+         _captureThread = NULL;
+ 
+         DeAllocateVideoBuffers();
+-        close(_deviceFd);
++        v4l2_close(_deviceFd);
+         _deviceFd = -1;
+     }
+ 
+@@ -321,7 +324,7 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+     rbuffer.memory = V4L2_MEMORY_MMAP;
+     rbuffer.count = kNoOfV4L2Bufffers;
+ 
+-    if (ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Could not get buffers from device. errno = %d", errno);
+@@ -344,24 +347,24 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+         buffer.memory = V4L2_MEMORY_MMAP;
+         buffer.index = i;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
+         {
+             return false;
+         }
+ 
+-        _pool[i].start = mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
++        _pool[i].start = v4l2_mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
+                               _deviceFd, buffer.m.offset);
+ 
+         if (MAP_FAILED == _pool[i].start)
+         {
+             for (unsigned int j = 0; j < i; j++)
+-                munmap(_pool[j].start, _pool[j].length);
++                v4l2_munmap(_pool[j].start, _pool[j].length);
+             return false;
+         }
+ 
+         _pool[i].length = buffer.length;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
+         {
+             return false;
+         }
+@@ -373,14 +376,14 @@ bool VideoCaptureModuleV4L2::DeAllocateVideoBuffers()
+ {
+     // unmap buffers
+     for (int i = 0; i < _buffersAllocatedByDevice; i++)
+-        munmap(_pool[i].start, _pool[i].length);
++        v4l2_munmap(_pool[i].start, _pool[i].length);
+ 
+     delete[] _pool;
+ 
+     // turn off stream
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "VIDIOC_STREAMOFF error. errno: %d", errno);
+@@ -438,7 +441,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         buf.memory = V4L2_MEMORY_MMAP;
+         // dequeue a buffer - repeat until dequeued properly!
+-        while (ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
++        while (v4l2_ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
+         {
+             if (errno != EINTR)
+             {
+@@ -457,7 +460,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         IncomingFrame((unsigned char*) _pool[buf.index].start,
+                       buf.bytesused, frameInfo);
+         // enqueue the buffer again
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
+         {
+             WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id,
+                        "Failed to enqueue capture buffer");
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+index 8d38102..3e8f76b 100644
+--- media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
++++ media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+@@ -179,6 +179,7 @@
+               'libraries': [
+                 '-lXext',
+                 '-lX11',
++                '-lv4l2',
+               ],
+             }],
+             ['OS=="linux"', {
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 0440c26..8f6c735 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -411,6 +411,9 @@ EXTRA_DSO_LDOPTS += \
+   $(DEPTH)/media/webrtc/signaling/signaling_sipcc/$(LIB_PREFIX)sipcc.$(LIB_SUFFIX) \
+   $(NULL)
+ endif
++ifdef MOZ_WEBRTC_LIBV4L
++EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS)
++endif
+ ifdef MOZ_WEBRTC_IN_LIBXUL
+ include $(topsrcdir)/media/webrtc/shared_libs.mk
+ EXTRA_DSO_LDOPTS += $(WEBRTC_LIBS)

Added: trunk/www/seamonkey/files/patch-bug826985
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/www/seamonkey/files/patch-bug826985	Sat Jan  5 10:02:26 2013	(r1131)
@@ -0,0 +1,370 @@
+commit d18000b
+Author: Henrik Gulbrandsen <henrik at gulbra.net>
+Date:   Fri Jan 4 13:49:22 2013 +0100
+
+    Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux.
+---
+ configure.in                                       | 13 ++++++
+ .../main/source/Linux/device_info_linux.cc         | 30 ++++++++------
+ .../main/source/Linux/video_capture_linux.cc       | 47 ++++++++++++----------
+ .../video_capture/main/source/video_capture.gypi   |  1 +
+ toolkit/library/Makefile.in                        |  3 ++
+ 5 files changed, 60 insertions(+), 34 deletions(-)
+
+diff --git configure.in configure.in
+index 6d05f9c..297615f 100644
+--- mozilla/configure.in
++++ mozilla/configure.in
+@@ -5270,6 +5270,17 @@ if test -n "$MOZ_WEBRTC"; then
+     MOZ_VP8=1
+     MOZ_VP8_ENCODER=1
+     MOZ_VP8_ERROR_CONCEALMENT=1
++    dnl use libv4l on Linux to support more cameras
++    case "$target" in
++    *-android*|*-linuxandroid*)
++        ;;
++    *-linux*|*-dragonfly*|*-freebsd*|*-netbsd*|*-openbsd*)
++        MOZ_WEBRTC_LIBV4L=1
++        PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2, ,
++            [echo "$MOZ_LIBV4L2_PKG_ERRORS"
++              AC_MSG_ERROR([WebRTC on Linux needs libv4l2 for video format conversion.])])
++        ;;
++    esac
+ dnl enable once Signaling lands
+     MOZ_WEBRTC_SIGNALING=1
+     AC_DEFINE(MOZ_WEBRTC_SIGNALING)
+@@ -5288,6 +5299,7 @@ fi
+ AC_SUBST(MOZ_WEBRTC)
+ AC_SUBST(MOZ_WEBRTC_SIGNALING)
+ AC_SUBST(MOZ_PEERCONNECTION)
++AC_SUBST(MOZ_WEBRTC_LIBV4L)
+ AC_SUBST(MOZ_WEBRTC_IN_LIBXUL)
+ AC_SUBST(MOZ_SCTP)
+ AC_SUBST(MOZ_SRTP)
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+index 653ee16..270f064 100644
+--- mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
++++ mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/device_info_linux.cc
+@@ -26,6 +26,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include "ref_count.h"
+ #include "trace.h"
+@@ -68,9 +69,9 @@ WebRtc_UWord32 DeviceInfoLinux::NumberOfDevices()
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+-            close(fd);
++            v4l2_close(fd);
+             count++;
+         }
+     }
+@@ -97,14 +98,14 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+     for (int n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             if (count == deviceNumber) {
+                 // Found the device
+                 found = true;
+                 break;
+             } else {
+-                close(fd);
++                v4l2_close(fd);
+                 count++;
+             }
+         }
+@@ -115,21 +116,26 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
+ 
+     // query device capabilities
+     struct v4l2_capability cap;
+-    if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
++    if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in querying the device capability for device %s. errno = %d",
+                    device, errno);
+-        close(fd);
++        v4l2_close(fd);
+         return -1;
+     }
+ 
+-    close(fd);
++    v4l2_close(fd);
+ 
+     char cameraName[64];
+     memset(deviceNameUTF8, 0, deviceNameLength);
+     memcpy(cameraName, cap.card, sizeof(cap.card));
+ 
++    if (cameraName[0] == '\0')
++    {
++        sprintf(cameraName, "Camera at /dev/video%d", deviceNumber);
++    }
++
+     if (deviceNameLength >= strlen(cameraName))
+     {
+         memcpy(deviceNameUTF8, cameraName, strlen(cameraName));
+@@ -181,13 +187,13 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     for (int n = 0; n < 64; ++n)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        fd = open(device, O_RDONLY);
++        fd = v4l2_open(device, O_RDONLY);
+         if (fd == -1)
+           continue;
+ 
+         // query device capabilities
+         struct v4l2_capability cap;
+-        if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++        if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+         {
+             if (cap.bus_info[0] != 0)
+             {
+@@ -209,7 +215,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+                 }
+             }
+         }
+-        close(fd); // close since this is not the matching device
++        v4l2_close(fd); // close since this is not the matching device
+     }
+ 
+     if (!found)
+@@ -228,7 +234,7 @@ WebRtc_Word32 DeviceInfoLinux::CreateCapabilityMap(
+     }
+ 
+     int size = FillCapabilityMap(fd);
+-    close(fd);
++    v4l2_close(fd);
+ 
+     // Store the new used device name
+     _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
+@@ -282,7 +288,7 @@ WebRtc_Word32 DeviceInfoLinux::FillCapabilityMap(int fd)
+             video_fmt.fmt.pix.width = size[i][0];
+             video_fmt.fmt.pix.height = size[i][1];
+ 
+-            if (ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
++            if (v4l2_ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
+             {
+                 if ((video_fmt.fmt.pix.width == size[i][0])
+                     && (video_fmt.fmt.pix.height == size[i][1]))
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+index 12df1b3..4ddc9d4 100644
+--- mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
++++ mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/Linux/video_capture_linux.cc
+@@ -25,6 +25,7 @@
+ #else
+ #include <linux/videodev2.h>
+ #endif
++#include <libv4l2.h>
+ 
+ #include <new>
+ 
+@@ -79,11 +82,11 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+     for (n = 0; n < 64; n++)
+     {
+         sprintf(device, "/dev/video%d", n);
+-        if ((fd = open(device, O_RDONLY)) != -1)
++        if ((fd = v4l2_open(device, O_RDONLY)) != -1)
+         {
+             // query device capabilities
+             struct v4l2_capability cap;
+-            if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
++            if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
+             {
+                 if (cap.bus_info[0] != 0)
+                 {
+@@ -91,13 +94,13 @@ WebRtc_Word32 VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
+                                 (const char*) deviceUniqueIdUTF8,
+                                 strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
+                     {
+-                        close(fd);
++                        v4l2_close(fd);
+                         found = true;
+                         break; // fd matches with device unique id supplied
+                     }
+                 }
+             }
+-            close(fd); // close since this is not the matching device
++            v4l2_close(fd); // close since this is not the matching device
+         }
+     }
+     if (!found)
+@@ -117,7 +120,7 @@ VideoCaptureModuleV4L2::~VideoCaptureModuleV4L2()
+         delete _captureCritSect;
+     }
+     if (_deviceFd != -1)
+-      close(_deviceFd);
++      v4l2_close(_deviceFd);
+ }
+ 
+ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+@@ -142,7 +145,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     char device[20];
+     sprintf(device, "/dev/video%d", (int) _deviceId);
+ 
+-    if ((_deviceFd = open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
++    if ((_deviceFd = v4l2_open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in opening %s errono = %d", device, errno);
+@@ -175,7 +178,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     for (int i = 0; i < nFormats; i++)
+     {
+         video_fmt.fmt.pix.pixelformat = fmts[i];
+-        if (ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_TRY_FMT, &video_fmt) < 0)
+         {
+             continue;
+         }
+@@ -200,7 +203,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         _captureVideoType = kVideoMJPEG;
+ 
+     //set format and frame size now
+-    if (ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_S_FMT, errno = %d", errno);
+@@ -217,7 +220,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     struct v4l2_streamparm streamparms;
+     memset(&streamparms, 0, sizeof(streamparms));
+     streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
++    if (v4l2_ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "error in VIDIOC_G_PARM errno = %d", errno);
+         driver_framerate_support = false;
+@@ -230,7 +233,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+         streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         streamparms.parm.capture.timeperframe.numerator = 1;
+         streamparms.parm.capture.timeperframe.denominator = capability.maxFPS;
+-        if (ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
++        if (v4l2_ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
+           WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Failed to set the framerate. errno=%d", errno);
+           driver_framerate_support = false;
+@@ -268,7 +271,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StartCapture(
+     // Needed to start UVC camera - from the uvcview application
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                      "Failed to turn on stream");
+@@ -303,7 +306,7 @@ WebRtc_Word32 VideoCaptureModuleV4L2::StopCapture()
+         _captureThread = NULL;
+ 
+         DeAllocateVideoBuffers();
+-        close(_deviceFd);
++        v4l2_close(_deviceFd);
+         _deviceFd = -1;
+     }
+ 
+@@ -321,7 +324,7 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+     rbuffer.memory = V4L2_MEMORY_MMAP;
+     rbuffer.count = kNoOfV4L2Bufffers;
+ 
+-    if (ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "Could not get buffers from device. errno = %d", errno);
+@@ -344,24 +347,24 @@ bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
+         buffer.memory = V4L2_MEMORY_MMAP;
+         buffer.index = i;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
+         {
+             return false;
+         }
+ 
+-        _pool[i].start = mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
++        _pool[i].start = v4l2_mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
+                               _deviceFd, buffer.m.offset);
+ 
+         if (MAP_FAILED == _pool[i].start)
+         {
+             for (unsigned int j = 0; j < i; j++)
+-                munmap(_pool[j].start, _pool[j].length);
++                v4l2_munmap(_pool[j].start, _pool[j].length);
+             return false;
+         }
+ 
+         _pool[i].length = buffer.length;
+ 
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
+         {
+             return false;
+         }
+@@ -373,14 +376,14 @@ bool VideoCaptureModuleV4L2::DeAllocateVideoBuffers()
+ {
+     // unmap buffers
+     for (int i = 0; i < _buffersAllocatedByDevice; i++)
+-        munmap(_pool[i].start, _pool[i].length);
++        v4l2_munmap(_pool[i].start, _pool[i].length);
+ 
+     delete[] _pool;
+ 
+     // turn off stream
+     enum v4l2_buf_type type;
+     type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+-    if (ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
++    if (v4l2_ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
+     {
+         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
+                    "VIDIOC_STREAMOFF error. errno: %d", errno);
+@@ -438,7 +441,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+         buf.memory = V4L2_MEMORY_MMAP;
+         // dequeue a buffer - repeat until dequeued properly!
+-        while (ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
++        while (v4l2_ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
+         {
+             if (errno != EINTR)
+             {
+@@ -457,7 +460,7 @@ bool VideoCaptureModuleV4L2::CaptureProcess()
+         IncomingFrame((unsigned char*) _pool[buf.index].start,
+                       buf.bytesused, frameInfo);
+         // enqueue the buffer again
+-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
++        if (v4l2_ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
+         {
+             WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id,
+                        "Failed to enqueue capture buffer");
+diff --git media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+index 8d38102..3e8f76b 100644
+--- mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
++++ mozilla/media/webrtc/trunk/src/modules/video_capture/main/source/video_capture.gypi
+@@ -179,6 +179,7 @@
+               'libraries': [
+                 '-lXext',
+                 '-lX11',
++                '-lv4l2',
+               ],
+             }],
+             ['OS=="linux"', {
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 0440c26..8f6c735 100644
+--- mozilla/toolkit/library/Makefile.in
++++ mozilla/toolkit/library/Makefile.in
+@@ -411,6 +411,9 @@ EXTRA_DSO_LDOPTS += \
+   $(DEPTH)/media/webrtc/signaling/signaling_sipcc/$(LIB_PREFIX)sipcc.$(LIB_SUFFIX) \
+   $(NULL)
+ endif
++ifdef MOZ_WEBRTC_LIBV4L
++EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS)
++endif
+ ifdef MOZ_WEBRTC_IN_LIBXUL
+ include $(topsrcdir)/media/webrtc/shared_libs.mk
+ EXTRA_DSO_LDOPTS += $(WEBRTC_LIBS)


More information about the freebsd-gecko mailing list