Skip to content

Drop video logos: a logo is a picture, never a clip - #16

Merged
ZombieHDGaming merged 2 commits into
masterfrom
claude/obs-ffmpeg-compatibility-cmrv7g
Aug 23, 2026
Merged

Drop video logos: a logo is a picture, never a clip#16
ZombieHDGaming merged 2 commits into
masterfrom
claude/obs-ffmpeg-compatibility-cmrv7g

Conversation

@ZombieHDGaming

@ZombieHDGaming ZombieHDGaming commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Why

Video logos were the only reason this plugin linked FFmpeg, and linking FFmpeg is what stops it loading in a newer OBS. readelf -d on a module built from master today:

NEEDED  libavcodec.so.60
NEEDED  libavformat.so.60
NEEDED  libavutil.so.58
NEEDED  libswscale.so.7

Those are hard dependencies on the exact FFmpeg majors the build machine had. OBS ships its own FFmpeg and moves it between releases; the release after a move, those names are files the loader cannot find and the whole module fails to load — every credit roll in every scene collection, gone, over artwork nobody has to use. Keeping the feature safely would have meant a hand-written runtime loader plus a version gate that turns the feature off anyway.

So the video path goes, all of it.

What's gone

  • The ENABLE_VIDEO_LOGOS option and the entire FFmpeg block in CMakeLists.txt — no find_package, no linking, nothing to find at configure time.
  • The libav decode path in AnimatedLogo.cpp: VideoDecodeContext, decodeWithFfmpeg, sws_scale scaling, frame-duration handling, the CLOSING_TIME_HAVE_FFMPEG define.
  • animatedLogosSupportVideo() and videoLogoPatterns(), and the "Video" filter in the logo file dialog.
  • The recogniser and everything it fed: isVideoLogoPath(), the container-extension list, the designer's documentUsesVideoLogos() scan, the file-dialog warning, and the Designer.VideoLogoUnsupported string.

Nothing in the plugin knows what a video file is any more. A video dropped into a logo slot is an unreadable picture like any other — LogoCache logs that it could not decode the file, and the slot draws its placeholder box.

419 lines removed, 42 added.

What's unchanged

GIF, APNG and animated WebP animate exactly as before, through Qt — which is where nearly every credit-roll logo comes from. The frame caps, playback settings (loop, start-on-entry, speed), per-frame shadows, the animation cache and the whole strip path are untouched. The logo path is now Qt's image decoders and nothing else.

Testing

  • Full plugin module and test harness both build clean.
  • The built module now links libobs, obs-frontend-api, Qt (Core/Gui/Widgets/Svg) and the C/C++ runtime — nothing more. No libav*, no libswscale, against master's four.
  • 49 suites, 3002 checks, 0 failures.
  • clang-format (19) and gersemi clean.

Docs

README's logo and build sections, and ARCHITECTURE's Animated logos section, file map and known-limits list now say a logo is a picture and why — so the next person who reaches for libav finds the reason not to before they write it.

Video logos were the only reason this plugin linked FFmpeg, and linking
FFmpeg is what stops it loading. A module that links libavcodec is
stamped with the exact major it was built against -- readelf on the
current module shows NEEDED libavcodec.so.60, libavformat.so.60,
libavutil.so.58, libswscale.so.7 -- and OBS ships its own FFmpeg and
moves it between releases. The release after a move, those stamps name
files the loader cannot find and the whole module fails to load: every
credit roll in every scene collection, gone, over artwork nobody has to
use. Keeping the feature safe would have meant a hand-written runtime
loader and a version gate that switches the feature off anyway.

So the video path goes. GIF, APNG and animated WebP still animate exactly
as before, through Qt, which is where nearly every credit-roll logo comes
from; the caps, the playback settings, the per-frame shadows and the
whole strip path are untouched. The plugin's dependencies are now only
the ones OBS guarantees a plugin: libobs and Qt.

Gone with it: the ENABLE_VIDEO_LOGOS option and the whole FFmpeg block in
CMake, the libav decode path in AnimatedLogo, animatedLogosSupportVideo()
and videoLogoPatterns(), and the video filter in the logo file dialog.

What stays is the recognition, not the decoding: isVideoLogoPath() still
knows a video by its name so that choosing one is answered with a
sentence -- in the file dialog and under the designer's preview -- rather
than with an unexplained placeholder box, which matters for documents
written when the video path existed. Nothing reads the file.

The module now carries no libav dependency at all; 50 suites and 3014
checks pass, including a new one holding the file dialog, the playback
settings and the animation cache to the same answer about video.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AiVkw4TJiJVRFMXRb944BA
@ZombieHDGaming
ZombieHDGaming force-pushed the claude/obs-ffmpeg-compatibility-cmrv7g branch from e8bb856 to b2d2ef8 Compare August 23, 2026 23:23
@ZombieHDGaming ZombieHDGaming changed the title Borrow OBS's FFmpeg at run time instead of linking it Drop video logos: a logo is a picture, never a clip Aug 23, 2026
The last of the video path was `isVideoLogoPath`, which decoded nothing
and existed only to explain itself: a file dialog warning, a line under
the designer's preview, and the extension list behind both. It was never
load-bearing, and a plugin that has to keep a list of container
extensions in order to say "not that" is still carrying the feature.

So it goes as well, and with it the extension list, the designer's
`documentUsesVideoLogos` scan, the file-dialog warning and the
Designer.VideoLogoUnsupported string. A video dropped into a logo slot is
now an unreadable picture like any other: LogoCache logs that it could
not decode the file, and the slot draws its placeholder box.

The plugin's whole logo path is now Qt's image decoders and nothing else.
49 suites and 3002 checks pass, and the built module links libobs,
obs-frontend-api and Qt -- nothing more.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AiVkw4TJiJVRFMXRb944BA
@ZombieHDGaming
ZombieHDGaming merged commit 62ee979 into master Aug 23, 2026
6 checks passed
@ZombieHDGaming
ZombieHDGaming deleted the claude/obs-ffmpeg-compatibility-cmrv7g branch August 23, 2026 23:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant