Como limitar a largura de banda USB que um dispositivo pode alocar no Linux

4

Como você coloca um limite na quantidade de largura de banda que um dispositivo USB pode alocar no Linux?

Eu tenho um par de webcams USB baratas que estou tentando rodar de forma simultânea. A execução de v4l2-ctl --list-formats-ext --device=/dev/videoN mostra que ambos suportam várias resoluções não compactadas em 30 e 15 FPS.

No entanto, mesmo se eu configurar um para capturar a 15 FPS na resolução de 160x120, ele ainda aloca 480 Mbps de largura de banda, geralmente me impedindo de usar qualquer outro dispositivo USB, muito menos a segunda webcam. A tentativa de capturar a partir da segunda webcam com a mesma resolução de FPS resulta no erro:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

Pesquisando esse erro geralmente resulta em respostas como: "você é SOL, talvez compre uma câmera que suporte MJPG?".

Mas isso não faz absolutamente nenhum sentido.

Capturar 160x120 RGB não compactado é igual a 160 * 120 * 3 = 57600 bytes por quadro. Aos 15 FPS, isso requer pelo menos 864000 bytes por segundo de largura de banda (ou seja, 0.864 Mbps ou 6.912 Mbits )! Eu tenho hub USB2, que suporta 480 Mbit / s . Eu deveria ter largura de banda suficiente para rodar dezenas dessas webcams de uma só vez, mas rodar uma única consome quase todos os 480 Mbits do meu hub USB!

Como a câmera não precisa de 480 Mbps para transmitir 160x120, mas está dizendo ao driver para alocar tanto, existe alguma maneira, no nível do sistema operacional, forçar o driver a alocar uma certa quantia?

    
por Cerin 17.04.2015 / 16:42

1 resposta

2

Esse cara oferece uma solução que parece funcionar para alguns pessoas. No meu caso, eu tentei e não mudou nada, mas depende muito do hardware.

The uvcvideo kernel module can be set to ignore the requested bandwidth, and to calculate the right bandwidth. Try:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

This will be reset every reboot. If this works, create the following file:

sudo vi /etc/modprobe.d/uvcvideo.conf 

containing the line:

options uvcvideo quirks=128

De fato, em esta página eles dizem que isso nem sempre funciona e eles até dão a opção de altere o código na função uvc_init_video () do driver:

/* Isochronous endpoint, select the alternate setting. */
bandwidth = stream->ctrl.dwMaxPayloadTransferSize;
    
por 20.10.2016 / 14:37