There are cases where alpha is multiplied unnecessarily. This change
attempts to use premultiplied alpha blending for composition.
To keep this change simple, The filter chain will continue to use
straight alpha. Otherwise, every source would need to modified to output
premultiplied, and every filter modified for premultiplied input.
"DrawAlphaDivide" shader techniques have been added to convert from
premultiplied alpha to straight alpha for final output. "DrawMatrix"
techniques ignore alpha, so they do not appear to need changing.
One remaining issue is that scale effects are set up here to use the
same shader logic for both scale filters (straight alpha - incorrectly),
and output composition (premultiplied alpha - correctly). A fix could be
made to add additional shaders for straight alpha, but the "real" fix
may be to eliminate the straight alpha path at some point.
For graphics, SrcBlendAlpha and DestBlendAlpha were both ONE, and could
combine together to form alpha values greater than one. This is not as
noticeable of a problem for UNORM targets because the channels are
clamped, but it will likely become a problem in more situations if FLOAT
targets are used.
This change switches DestBlendAlpha to INVSRCALPHA. The blending
behavior of stacked transparents is preserved without overflowing the
alpha channel.
obs-transitions: Use premultiplied alpha blend, and simplify shaders
because both inputs and outputs use premultiplied alpha now.
Fixes https://obsproject.com/mantis/view.php?id=1108
The initial DTS for non-fractional framerates was being incorrectly
calculated. It assumed that the time base was in frames when it was
not.
Closesobsproject/obs-studio#1857
The workarounds were made because of conflicts with running multiple UI
threads at once on macOS, which macOS can't do very well, and would be
susceptible to crashes. This would cause crashes not only on startup
but seemingly at random when using the browser source on macOS. The
original "fix" was a hack to try to minimize UI code and browser UI code
from executing at the same time. The macOS initial scene loading was
deferred until all Qt-related and main window initialization was
completed. Although this worked to some extent to prevent conflicts, it
made it so that there was an initial period on startup where the entire
UI seemed "blank" for users, and it was still possible for the main UI
thread and the browser UI thread to clash, causing crashes seemingly at
random for users.
The external message pump method of CEF is the solution to the problem,
which is the method which allows the main UI thread to share events with
CEF. To do this, all CEF operations need to be performed in the UI
thread (Qt's main thread), and CefDoMessageLoopWork() needs to be called
when CefApp::OnScheduleMessagePumpWork callback is triggered. A number
of other issues had to be solved as well, such as CefBrowser references
getting "stuck" in the Qt event queue.
With this, macOS no longer needs to do the "deferred load" hack, and
browsers are now much more stable and no longer as susceptible to
seemingly random crashes, improving overall program stability when
browsers are used.
Instead of having ffmpeg-mux stored in a data directory, install it to
the primary binary directory. On windows, this fixes ffmpeg-mux
potentially accessing the wrong FFmpeg libraries (some programs install
them to system32, foolishly), and instead ensures that it uses the ones
that come with the program. On Linux, ensures that a binary is in its
appropriate directory (/usr/bin or /usr/local/bin rather than a subset
of /usr/share or /usr/local/share).
libobs: Add support for limited to full color range conversions when
using RGB or Y800 formats, and move RGB converison for Y800 formats to
the GPU.
decklink: Stop hiding color space/range properties for RGB formats, and
remove "YUV" from "YUV Color Space" and "YUV Color Range".
win-dshow: Remove "YUV" from "YUV Color Space" and "YUV Color Range".
UI: Remove "YUV" from "YUV Color Space" and "YUV Color Range".
Allows the ability to override and use partial range RGB with the
DirectShow and Decklink device sources when partial range RGB is
implemented. Fixes certain cases where devices could capture RGB in
limited range via HDMI (per the HDMI specs).
This reverts commit d91bd327d7a8bb4597562fc26da4edb7b56874ff, which
broke alpha with sources, scenes, and filter, causing them all to become
opaque unintentionally.
This commit fixes a bug where the user would have to restart OBS when
certain types of devices are unplugged and plugged back in again
(particularly USB devices). A wait interval is required
(RECONNECT_INTERVAL) because Windows does not send any events to
IAudioCaptureClient on device invalidation.
Currently SrcBlendAlpha and DestBlendAlpha are both ONE, and can
combine together to form two. This is not a noticeable problem for
UNORM targets because the channels are clamped, but it will likely
become a problem if FLOAT targets are more widely used.
This change switches DestBlendAlpha to INVSRCALPHA, and starts
backgrounds as opaque black instead of transparent black. The blending
behavior of stacked transparents is preserved without overflowing the
alpha channel.
The quadro P5000 would incorrectly be considered blacklisted because it
used a string search for the P500, which is an earlier quadro variant
that does not have NVENC support.
To fix this, instead of just doing a string search, additionally check
to make sure that there preceding or trailing numbers on the adapter
name.