Stop claiming the OBS Custom list follows in one direction
It was reported repopulating on the way up and never on the way down.
Tested again, it stayed on the lower sizes going up as well. So it is not
an asymmetry to document, it is a list that cannot be relied on inside one
session at all -- assume OBS has to be restarted, and better, do not use
Custom. What a fresh OBS lists for each source is written down, because
that part is reproducible.
ab61fc1
Say what OBS actually does on a format change
Disabling the device and enabling it again does reload the current Device
Default size, both directions -- that is the whole fix after a console
change. What it does not clear is the size list under Custom, and only
downward: it extends from 576p to 1080p, but never shrinks back until OBS
restarts. That only reaches anyone who picked a resolution by hand.
37b2e33
Record the area average, and that OBS caches its own list
1600x900 is out of the offered sizes. Nothing has it on a wish list, and from
a 1080p source it is a six-to-five shrink, the ratio at which a resampler is
most visible. It was the one size below 1080p that grained.
The ratio itself stays in the house -- 576 to 480 is the same six to five, and
that is PAL into 640x480, a size consumers do ask for -- so shrinking now
covers the whole footprint of each destination pixel instead of reading two
source pixels and skipping what lies between them. Written down with what it
costs, which is more than two taps rather than less, and with what it cannot
do: a 1.2 pixel wide footprint does not average away detail at the Nyquist
limit and is not meant to.
And the resolution list under OBS Custom is OBS's own cache, filled when the
box was last opened. Swapping down from 1080p to 576i leaves the 1080p-era
sizes listed until OBS is restarted, and disabling the device does not clear
it. Nothing is cached on this side, which is why a fresh OBS is right again.
The guidance that follows from all of it is now in three places: leave the
resolution on automatic, whatever program is reading the camera.
e231942
The camera advertises only what it has
The per-entry size range fed OBS's resolution dropdown with sizes the camera
did not have -- 32x32 at one end, 1920x1080 at the other -- and they survived
restarting OBS because they were never a description of the source. Each
capability now describes itself, and nothing above the source is offered at
all; QueryAccept stays broad so an explicit request still works.
Also the other half of the hash-named DLL: a program that was already running
when the camera was installed keeps the filter it loaded until it restarts.
That is stale code rather than a stale picture, which is why it can show
behaviour the build on disk no longer has.
e502154
Record the idle picture and the format-once rule
Two things came out of testing against real hardware. A program settles its
format when it opens the camera and holds it for as long as it holds the
camera -- so changing console changes what CapView publishes and changes
nothing for a program already reading. That has per-program consequences worth
writing down: OBS needs Device Default rather than Custom, Discord renegotiates
when the camera is turned off and on again, a browser when the page calls
getUserMedia again.
And the camera now draws a picture when it is idle rather than black, which
needed its own section: why GDI, why the mark is packed, what is dropped as
the asked-for size gets smaller.
78efa4d
Rewrite the virtual camera page for the DirectShow filter
The page described a Media Foundation frame server that no longer exists. It
now describes what 3.0 actually ships, and why the argument that led to Media
Foundation in 1.9 was wrong: a source filter runs inside the consumer, so the
Global namespace and the privilege that goes with it are simply not needed.
New sections cover the source being passed through 1:1, the continuous ranges
that let a consumer ask for something in between, what OBS, Discord and the
browsers each end up with, the generation-named frame section, the seqlock and
the retry that fixed it, one wake event per consumer, and the consumer table.
Two things are recorded that were measured rather than reasoned about:
- The 8K120 collapse. A single torn read used to end the attempt, which at
large sizes turned ordinary contention into a black picture that never came
back: 94 frames delivered, 0 of them fresh. With three attempts it is 239 of
269.
- The producer half, exercised for the first time. A temporary per-user
registration got past the "installed?" gate and let CapView's own
VirtualCamera feed a real consumer off the SA7160, at native, at 720p30 and
at 640x480@15.
That per-user registration is written up as its own section, because it works:
the camera enumerates through the ordinary system device enumerator with no
administrator anywhere. 3.0 does not ship it, since nothing has shown that OBS
and Discord accept a registration without a FilterData blob, and a camera that
silently fails to appear is a bad thing to learn after release. It is the first
candidate for 3.1.
Building, Home, Updates and Shortcuts follow the same rename from "media
source" to "filter". Shortcuts also loses a wrong claim: the overlay does not
show the camera counters, Settings then Recording does.
396bf30
Finish reading the remaining pages against the source
The rest of the sweep. Five more corrections, all found the same way -- opening
the file the page cites instead of trusting the page:
Updates named RemoveLeftovers() and RestartIntoNew(). The functions are
CleanUpPreviousBuild() and RestartIntoNewBuild().
Audio named tapOverflows(). It is tapOverruns(), on the ring rather than on the
engine.
Colour range had RGB reading offset 0 with a step of 1 over all channels.
LumaLayout() reads green -- offset 1, step 3 or 4 by subtype -- because green
carries most of the brightness at a third of the reads.
High dynamic range still claimed screenshots never need ffmpeg, four paragraphs
above AVIF, which does. Same sentence as the one on the Screenshots page, same
fix.
Building said 1.6 MB. The executable is just under 2 MB.
Recording, Encoder settings, Scaling and sharpening, Virtual camera and
Translations were read line by line and needed nothing.
14fc533
Correct four details that had drifted from the code
Read against the source rather than against memory:
Deinterlacing named AM_INTERLACE_FIELD_PATTERN_FIELD1FIRST. The flag the code
tests in the VIDEOINFOHEADER2 is AMINTERLACE_Field1First.
The settings window named AdjustWindowRectEx. The call is AdjustWindowRect.
Signal detection gave kSignalSnowDelta as 48 in three places. It is 65, and it
was raised for a reason worth writing down, so the reason is there now too.
Latency quoted an idle floor of a flat 200 ms. IdleFloorMs() has since become
two numbers: 16 ms while something on screen animates itself, 200 ms otherwise.
The measured 4.7 fps of a fully idle window is in the text.
7a4f649
Document the second grab point for screenshots
A screenshot used to be one thing: the picture, at source resolution, taken
between the first draw pass and the interface. The Recording tab now has a
switch that moves the grab to the far side of that line, and the page has to
say where the line is, what GrabBackBuffer does with the back buffer, and the
two things that change as a result -- window size instead of source size, and
SDR always, because the scRGB back buffer is refused rather than converted by
untested maths.
The JPEG XR paragraph no longer claims that screenshots never need ffmpeg. AVIF
sits three paragraphs below and needs it, which the same page had already said.
The two page descriptions on Home now match what those pages have grown into.
7982198
State the AVIF exception before contradicting it
38ddc8c
Document that hidden settings are also inactive
e48c7cf
Document the settings that follow the source, and the first run
4f6db90
Document reinitialise card and the standard that travelled
203a42c
The crop dimming no longer covers its own buttons
24fa7fe
Stop saying the two windows share a device
14202a6
The settings window has a device of its own now
98dbd76
The native pixel grid, scanlines and the mask
1395bc8
What the grey ring actually was, and the field that went missing
2246913
The sharpening offset, and what it was measured against
277c88a
How the signal detector tells snow from a scene cut
aa51446
The long version: one page per feature, and what the code does
a630c77