Skip to content

History

Revisions

  • 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.

    @NuclearMeltdown NuclearMeltdown committed Aug 26, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 26, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 26, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 26, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 26, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 26, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    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.

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    7982198
  • State the AVIF exception before contradicting it

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    38ddc8c
  • Document that hidden settings are also inactive

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    e48c7cf
  • Document the settings that follow the source, and the first run

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    4f6db90
  • Document reinitialise card and the standard that travelled

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    203a42c
  • The crop dimming no longer covers its own buttons

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    24fa7fe
  • Bring the wiki up to 1.9

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    d961898
  • Stop saying the two windows share a device

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    14202a6
  • The settings window has a device of its own now

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    98dbd76
  • The native pixel grid, scanlines and the mask

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    1395bc8
  • What the grey ring actually was, and the field that went missing

    @NuclearMeltdown NuclearMeltdown committed Aug 25, 2026
    2246913
  • The sharpening offset, and what it was measured against

    @NuclearMeltdown NuclearMeltdown committed Aug 24, 2026
    277c88a
  • How the signal detector tells snow from a scene cut

    @NuclearMeltdown NuclearMeltdown committed Aug 24, 2026
    aa51446
  • The long version: one page per feature, and what the code does

    @NuclearMeltdown NuclearMeltdown committed Aug 24, 2026
    a630c77
  • Initial Home page

    @NuclearMeltdown NuclearMeltdown committed Aug 24, 2026
    0e54904