• Авторизация


uvcvideo 07-06-2011 13:07 к комментариям - к полной версии - понравилось!


и сразу же запись о том, как я победил линукс

 

уже давно есть такая проблема - невозможность использования одновременно двух вебкамер под v4l. при попытке заюзать вылезает ошибка "ERROR 28 - No space left on device"

связано это с тем, что драйвером выделается один буфер на ВСЕ камеры, в результате весь буфер заполнен только одной камерой, даже если используется не весь.

варианта тут два:

1 - подключить камеру к другой шине USB (если есть).

у меня шина всего одна (NM10 все 8 портов на одной шине держит), поэтому пойдем по второму пути.

2 - патчинг драйверов

так как у меня UVC камера, то и будем патчить драйвер uvcvideo

долгий гуглинг привел к такому патчу:

diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
index a1e9dfb..53e0847 100644
--- a/drivers/media/video/uvc/uvc_driver.c
+++ b/drivers/media/video/uvc/uvc_driver.c
@@ -348,7 +348,7 @@ static int uvc_parse_format(struct uvc_device *dev,
 		strlcpy(format->name, "MJPEG", sizeof format->name);
 		format->fcc = V4L2_PIX_FMT_MJPEG;
 		format->flags = UVC_FMT_FLAG_COMPRESSED;
-		format->bpp = 0;
+		format->bpp = 4;
 		ftype = UVC_VS_FRAME_MJPEG;
 		break;
 
@@ -461,10 +461,16 @@ static int uvc_parse_format(struct uvc_device *dev,
 		 * uncompressed formats this can be fixed by computing the
 		 * value from the frame size.
 		 */
-		if (!(format->flags & UVC_FMT_FLAG_COMPRESSED))
+		if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) ||
+				(format->type == UVC_VS_FORMAT_MJPEG))
 			frame->dwMaxVideoFrameBufferSize = format->bpp
 				* frame->wWidth * frame->wHeight / 8;
 
+		printk("---> framesize %ix%i, buffsize %i, bpp %i\n",
+			frame->wWidth, frame->wHeight,
+			frame->dwMaxVideoFrameBufferSize,
+			format->bpp);
+
 		/* Some bogus devices report dwMinFrameInterval equal to
 		 * dwMaxFrameInterval and have dwFrameIntervalStep set to
 		 * zero. Setting all null intervals to 1 fixes the problem an

 

однако, это все равно не спасло

дальнейшее гугление дало еще кое-что:

в файле uvc_video.c найти следующее:

if ((!(format->flags & UVC_FMT_FLAG_COMPRESSED)  &&
        stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH &&
        stream->intf->num_altsetting > 1) {

 

и изменить так:

if ((!(format->flags & UVC_FMT_FLAG_COMPRESSED) ||
        (format->type == UVC_VS_FORMAT_MJPEG)) &&
        stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH &&
        stream->intf->num_altsetting > 1) {

 

после чего выгрузить драйвер и загрузить с параметром:

rmmod uvcvideo && modprobe uvcvideo quirks=128

после такой процедуры обе камеры спокойно показывают 1280х800

 

зы: все это прокатило на кернел 2.6.38, хотя патч писался под 2.6.32, видимо с тех пор драйвер не претерпел изменений, и работать будет почти на любом ядре

вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник uvcvideo | Amper91 - /dev/null | Лента друзей Amper91 / Полная версия Добавить в друзья Страницы: раньше»