Eu gosto de configurar três câmeras web em um computador Windows 10, para permitir a captura simultânea de vídeo de todos os três. Todas as três câmeras USB2.0 são conectadas a um hub USB3.0, que é conectado ao PC. As câmeras serão usadas em um modo de baixa resolução e baixo FPS, então a largura de banda do USB3.0 (e até mesmo do USB2.0) será suficiente para todos esses três fluxos de baixa resolução e baixo FPS. .
O problema é, no entanto, que as câmeras estão relatando o requisito de largura de banda de seu fluxo máximo de resolução máxima para o controlador, de modo que o driver UVC não permitirá usar três câmeras ao mesmo tempo (nem mesmo duas ou) se conectado ao mesmo controlador host USB.Consegui configurar três câmeras usando três controladores USB separados (um embutido no meu laptop e dois na docking station, um deles é um USB2.0 e outro em uma porta USB3.0 ), então o problema é claramente causado por conectá-los ao mesmo controlador usando um hub.
Infelizmente, o requisito é criar um produto final contendo as três câmeras e ter uma única porta USB do lado de fora, portanto, precisamos usar um hub.
Nós tentamos a versão Linux dessa configuração e conseguimos fazer isso funcionar usando um dos modos 'quirks' do driver uvcvideo
do Linux, chamado UVC_QUIRK_FIX_BANDWIDTH
:
Try to estimate the bandwidth required for uncompressed streams instead on relying on the value reported by the camera. See FAQ 7 for more information.
As the uvcvideo driver has no way to know how much bandwidth a device will require, devices are responsible for reporting the amount of needed bandwidth to the driver as accurately as possible. Each alternate setting of the video streaming interface corresponds to one possible bandwidth value for the associated endpoint, and the driver then selects the alternate setting with the lowest bandwidth higher than or equal to the bandwidth requested by the device.
While most devices implement several alternate settings and only request the amount of bandwidth they really need, some just always request the maximum bandwidth available to a single endpoint, equal to 198.608 Mb/s excluding protocol overhead. Twice that bandwidth would exceed the high speed USB limit, resulting in -27 (-ENOSPC) errors.
If the device implements several alternate settings the driver could ignore the requested bandwidth and select a lower bandwidth alternate setting. This behaviour is currently implemented through the FIX_BANDWIDTH quirk when using an uncompressed format. Compressed formats are more difficult to work around as the driver has no way to estimate how much bandwidth the device could really require.
The FIX_BANDWIDTH quirk can be safely enabled without risking any adverse effect on the system stability, as it only affects UVC devices. In rare cases it could theoretically underestimate the required USB bandwidth, resulting in loss of USB packets and corrupt images. No such case has been reported in practice as of today.
You can find how how much bandwidth the device requests and which alternate setting the driver selects by setting the uvcvideo module trace parameter to 0x400. The driver will print bandwidth-related information to the kernel log.
Mais informações sobre isso aqui: link
Então, eu gostaria de fazer algo semelhante no Windows, fazendo com que o driver UVC ignore a largura de banda informada pelas câmeras, já que a largura de banda real será muito menor do que a relatada.
Existe alguma maneira de fazer isso? Como usar alguns drivers alternativos, ou modificar os atuais para permitir essa 'peculiaridade'?