The virtual camera was rebuilt on DirectShow, and it now hands on the source exactly as it arrives — its resolution, its frame rate, no ceiling anywhere.
Upgrading from 2.x: the camera has to be installed again.
The old camera and the new one are different COM classes, so installing 3.0 cannot convert the old registration. Open Settings → Recording and install the camera once. The 2.x registration is deleted for you at the same time; left alone it would keep appearing in device lists pointing at a DLL that is no longer there.
The source, 1:1
2.x offered three fixed sizes — 1920×1080, 1280×720, 640×480 — all at 30 fps, whatever the card was actually doing. A 50 Hz PAL console went out at 30. A 59.94 Hz source went out at 30.
3.0 offers what the card is giving, first in the list, in its own size at its own rate, and puts the familiar sizes behind it for consumers that cannot take it.
| Consumer | What it takes |
|---|---|
| OBS | the native entry — 1920×1080 @ 59.94 |
| Discord | 1280×720 @ 60, its own ceiling |
| Browsers | whichever list entry the page asks for |
Each entry describes exactly one size, and nothing above the source is ever offered — a camera that advertises what it has not got pins a consumer to a size the console cannot fill. A consumer that wants something in between can still ask for it outright: the offer is narrow, the acceptance is not. Measured against a live 1080p59.94 source:
| asked for | arrived | picture |
|---|---|---|
| native | 300 samples in 5.005 s — 59.94 fps | luma 17..234 |
| 1280×720 @ 30 | 150 samples in 5.000 s — 30 fps | luma 17..233 |
| 640×480 @ 15 | 61 samples in 4.067 s — 15 fps | luma 16..233, pillarboxed |
Three consumers at once, at three different sizes and rates, each got its own exactly.
Shrinking now averages the whole area a destination pixel covers instead of reading two source pixels and skipping what lies between them. At a six-to-five shrink the two-tap sampling phase repeats 0.1, 0.3, 0.5, 0.7, 0.9 — every fifth pixel nearly a copy, the next a half-and-half blend — and that regular alternation is what showed as grain. Enlarging still uses two taps, and a consumer taking the source untouched still goes through no scaler at all.
It says when it is idle
The camera is registered machine-wide, so it is in every device list from the
moment it is installed — running or not, the same as OBS's virtual camera. A
camera that is always listed and shows black when idle is indistinguishable from
a broken one, so it now shows the mark and CapView is not running instead,
at whatever size the program asked for.
Black is kept for the case it belongs to: a picture that is expected and a frame
or two late.
One thing worth knowing about changing console
A program settles its format when it opens the camera and keeps it for as long
as it holds it open. That is DirectShow's rule — the buffers are committed at
that size and cannot grow underneath a running graph.
So swapping a 1080p console for a 576i one changes what CapView publishes
straight away, and changes nothing for a program already reading: it goes on
asking for the size it negotiated and gets the new picture fitted into it. The
fix is to reopen the camera there.
Whatever program reads the camera, leave its resolution on automatic — hands
off any custom resolution. In OBS that is Resolution/FPS Type: Device
Default. Then a console change is a matter of disabling the device and
enabling it again, and OBS picks up the new size. Discord needs no more than
its camera off and back on.
No ceilings
There is no maximum resolution and no maximum frame rate in the code any more. An 8K120 source is offered as 7680 × 4320 at up to 120 fps, and delivers: 8K30 measured 98 fresh frames of 110, 4K120 measured 286 of 324.
No hardware here can do that. The limits were arbitrary, so they are gone.
Why DirectShow, having chosen Media Foundation in 1.9
The Media Foundation camera was a frame server: it ran in a process of Windows' choosing, which is why it needed objects in the Global namespace, which is why it needed SeCreateGlobalPrivilege, which is why it needed a service.
A DirectShow source filter runs inside the application that opened the camera. That single fact removes the whole chain. Local names are enough, CapView creates the shared objects itself, and the format negotiation is an ordinary interface call instead of a fixed list.
The trade is at the other end: Local names are invisible inside an app container, so packaged Store apps cannot see the camera. That is the deliberate price of not needing administrator rights to use it.
Fixed: large formats went black and stayed black
The consumer reads frames out of shared memory through a seqlock. If it caught a slot mid-write it gave up — and at 8K120 catching a slot mid-write is ordinary rather than rare, so the picture went black and never recovered: 94 frames delivered, 0 of them fresh.
The reader now retries up to three times. Same source, after: 239 fresh of 269. Nothing measurable changed at 1080p, where the collision almost never happened in the first place.
Also
- The filter lives inside
CapView.exeand is written out next to it when the camera is installed, so the two can never be from different builds. Its filename carries an FNV-1a hash of its own contents, because Windows identifies a loaded module by name and a file in use cannot be replaced. - The camera reports who is using it. Settings → Recording lists each consumer by process name with the format it negotiated and how many frames it has taken.
- HDR passes through as P010, offered ahead of NV12. A P010 consumer sees the full 64..940 10-bit video range; an NV12 consumer against the same HDR source gets a converted picture rather than nothing.
- Shift+F5 reinitialises the capture card without restarting CapView. It looks the video standard, resolution and frame rate up again — a different console may be in front of it now — but keeps the pixel format you chose. A card that could do RGB32 a moment ago can still do it, and picking it back out of the list every time was work for nothing.
- The frame rate list works like OBS's — highest available, rather than a fixed set.
Still one file, about 2 MB, nothing installed unless you ask for the camera.