guest@amper.me /blog $ | |
линуксопроблемы (две вебкамеры)В линуксах уже давно есть такая проблема - невозможность использования одновременно двух вебкамер под v4l. При попытке заюзать еще одну камеру вылезает ошибка "Error 28 - No space left on device".Связано это с тем, что драйвером выделяется один буфер на ВСЕ камеры, расположенные на одной шине, в результате весь буфер заполнен только для одной камеры, даже если она занимает только часть буфера. Выхода тут два: 1) подключить камеру к другой шине USB (если есть). Тогда для камер будут разные буферы. У меня шина всего одна (NM10 все 8 портов на одной шине держит), следовательно, этот вариант не подходит. 2) сделать так, чтобы обе камеры помещались в выделенный буфер а это можно сделать, только если пропатчить драйвер камеры так как у меня UVC камера, то и будем патчить драйвер uvcvideo долгий гуглинг привел к такому патчу: Код diff: 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 %in", + 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 Код bash: # rmmod uvcvideo && modprobe uvcvideo quirks=128 дальнейшее гугление дало еще кое-что: в файле uvc_video.c найти следующее: Код c: if ((!(format->flags & UVC_FMT_FLAG_COMPRESSED) && stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH && stream->intf->num_altsetting > 1) { Код c: 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) { зы: все это прокатило на кернел 2.6.38, хотя патч писался под 2.6.32, видимо с тех пор драйвер не претерпел изменений, и работать будет почти на любом 2.6.x или 3.х ядре |
|
Время генерации страницы: 0.0023с. SQL запросов: 2 |