Video capture device freezing on resolution change

shadikuizayoi

New Member
Hi,

I'm using OBS to capture an arcade machine which initially boots into a 1920x1080 desktop, then into a 1280x720 game after a few minutes.

I've been testing with Elgato Cam Link & HD60 S cards so far, which both appear to lack hardware scalers.

My capture source is currently configured like this:

obs64_UeBw0azL8s.png

This works as expected if OBS is started while the game is running, but if it happens before, the capture will fail to start:
Code:
16:27:03.433: Video Capture Device: Video format match failed
16:27:03.433: Video Capture Device: Video configuration failed

Checking with FFmpeg at this time, we can see that the input PC is still on the desktop:
Code:
[dshow @ 000001a0b513b100] DirectShow video device options (from video devices)
[dshow @ 000001a0b513b100]  Pin "Capture" (alternative pin name "0")
[dshow @ 000001a0b513b100]   pixel_format=yuyv422  min s=1920x1080 fps=59.9402 max s=1920x1080 fps=59.9402
[dshow @ 000001a0b513b100]   pixel_format=yuyv422  min s=1920x1080 fps=59.9402 max s=1920x1080 fps=59.9402 (tv, bt709/bt709/unknown, topleft)

Since these cards have no hardware scaling, only the current 1920x1080 resolution is exposed, so this makes sense.

A short time later, the game boots and the desired resolution is now available.
Code:
[dshow @ 00000202c2e4b100]   pixel_format=yuyv422  min s=1280x720 fps=59.9999 max s=1280x720 fps=59.9999
[dshow @ 00000202c2e4b100]   pixel_format=yuyv422  min s=1280x720 fps=59.9999 max s=1280x720 fps=59.9999 (tv, bt709/bt709/unknown, topleft)

But OBS doesn't try to re-open the capture device after the initial attempt fails. Manually deactivating and activating the source again works, but I need it to be able to recover automatically for my current use case.

Using device default for resolution doesn't work either, as this will just capture the desktop and then freeze up when the resolution changes:
Code:
17:26:33.244: ==== Startup complete ===============================================
17:26:33.269: All scene data cleared
17:26:33.269: ------------------------------------------------
17:26:33.275: Switched to scene 'Scene'
17:26:33.275: ------------------------------------------------
17:26:33.275: Loaded scenes:
17:26:33.275: - scene 'Scene':
17:26:33.275: - source: 'Video Capture Device' (dshow_input)
17:26:33.275: ------------------------------------------------
17:26:33.333: ---------------------------------
17:26:33.333: [DShow Device: 'Video Capture Device'] settings updated:
17:26:33.333: video device: Cam Link
17:26:33.333: video path: \\?\usb#vid_0fd9&pid_0061&mi_00#9&356347f8&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
17:26:33.333: resolution: 1920x1080
17:26:33.333: flip: 0
17:26:33.333: fps: 60.00 (interval: 166666)
17:26:33.333: format: YUY2
17:26:33.333: buffering: disabled
17:26:33.361: using video device audio: no
17:26:33.361: separate audio filter
17:26:33.361: sample rate: 44100
17:26:33.361: channels: 2
17:26:33.361:     audio type: Capture
At this point, the game has booted but the capture is frozen on the last frame before the resolution change occurred.

There is nothing further in the log and the source has to be reactivated manually.
Code:
17:26:47.950: ---------------------------------
17:26:47.950: [DShow Device: 'Video Capture Device'] settings updated:
17:26:47.950: video device: Cam Link
17:26:47.950: video path: \\?\usb#vid_0fd9&pid_0061&mi_00#9&356347f8&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
17:26:47.950: resolution: 1280x720
17:26:47.950: flip: 0
17:26:47.950: fps: 60.00 (interval: 166666)
17:26:47.950: format: YUY2
17:26:47.950: buffering: disabled
17:26:47.969: using video device audio: no
17:26:47.969: separate audio filter
17:26:47.969: sample rate: 44100
17:26:47.969: channels: 2
17:26:47.969: audio type: Capture
17:26:54.996: ---------------------------------

Just wondering if anyone has any ideas on how to potentially work around this.

Apologies in advance if a similar issue has been posted previously.
 
After glancing at the source code I guess it's not possible. Working around it for now by checking for the format before starting OBS.
Code:
:wait

ffmpeg -f dshow -list_options true -i video="Game Capture HD60 S" 2>&1 | find "pixel_format=yuyv422  min s=1280x720 fps=inf max s=1280x720 fps=60.0002" && goto boot
ping localhost -n 5 >NUL
goto wait

:boot

cd /D "C:\Program Files\obs-studio\bin\64bit"
start obs64.exe --startreplaybuffer --disable-updater
Still need to think of something to survive resolution changes, but this will do for now.
 
Back
Top