diff --git a/.github/scripts/.package.zsh b/.github/scripts/.package.zsh index 821dc9f385241d..ec4b4c9a2037bb 100755 --- a/.github/scripts/.package.zsh +++ b/.github/scripts/.package.zsh @@ -110,7 +110,16 @@ package() { local commit_hash if [[ -d ${project_root}/.git ]] { - local git_description="$(git describe --tags --long)" + # `|| true` keeps ERR_RETURN/TRAPZERR from firing (and leaking the + # callstack into the variable) when the fork has no tags reachable. + local git_description="$(git describe --tags --long 2>/dev/null || true)" + if [[ -z ${git_description} ]] { + # obs-studio-plus fork fallback: synthesize --g + # from the commit count and short HEAD hash so packaging proceeds. + local _short_hash="$(git rev-parse --short=9 HEAD)" + local _commit_count="$(git rev-list --count HEAD)" + git_description="0.0.1-${_commit_count}-g${_short_hash}" + } commit_version="${${git_description%-*}%-*}" commit_hash="${git_description##*-g}" commit_distance="${${git_description%-*}##*-}" diff --git a/.github/scripts/Package-Windows.ps1 b/.github/scripts/Package-Windows.ps1 index e2f276a0d1cdf3..890d72a8fd4c27 100644 --- a/.github/scripts/Package-Windows.ps1 +++ b/.github/scripts/Package-Windows.ps1 @@ -44,7 +44,15 @@ function Package { Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile" - $GitDescription = Invoke-External git describe --tags --long + # obs-studio-plus fork: tolerate missing tags (git describe --tags fails + # when no tag is reachable). Fall back to --g. + $GitDescription = $null + try { $GitDescription = Invoke-External git describe --tags --long } catch { } + if ( -not $GitDescription ) { + $ShortHash = (Invoke-External git rev-parse --short=9 HEAD).Trim() + $CommitCount = (Invoke-External git rev-list --count HEAD).Trim() + $GitDescription = "0.0.1-${CommitCount}-g${ShortHash}" + } $Tokens = ($GitDescription -split '-') $CommitVersion = $Tokens[0..$($Tokens.Count - 3)] -join '-' $CommitHash = $($Tokens[-1]).SubString(1) diff --git a/.github/workflows/no-core-changes.yaml b/.github/workflows/no-core-changes.yaml new file mode 100644 index 00000000000000..781e9427eb9869 --- /dev/null +++ b/.github/workflows/no-core-changes.yaml @@ -0,0 +1,99 @@ +name: No Core Changes +# Enforces the Mosaic fork rule: libobs/, plugins/, deps/, and the C++/Qt +# parts of frontend/ track upstream OBS Studio untouched. Only files under +# engine/, CI infrastructure, and explicitly-allowlisted fork-specific +# build fixes may diverge. +# +# See CONTRIBUTING.md for the full policy. + +on: + push: + branches: + - dev + - 'engine/**' + pull_request: + branches: + - dev + - master + +permissions: + contents: read + +jobs: + diff-against-upstream: + name: Diff Against Upstream OBS + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + with: + fetch-depth: 0 + + - name: Add upstream remote + run: | + git remote add upstream https://github.com/obsproject/obs-studio.git + git fetch --depth=200 upstream master + + - name: Check off-limits paths + run: | + set -euo pipefail + + # Off-limits paths (see CONTRIBUTING.md). + OFF_LIMITS=( + 'libobs/' + 'libobs-d3d11/' + 'libobs-opengl/' + 'libobs-winrt/' + 'plugins/' + 'deps/' + ) + + # Frontend is special: only the C++/Qt code is off-limits. The + # frontend/cmake/os-linux.cmake flatpak fix is allowlisted below. + # We restrict to actual source files, not cmake. + OFF_LIMITS+=( + 'frontend/*.cpp' + 'frontend/*.hpp' + 'frontend/*.h' + 'frontend/*.mm' + 'frontend/*.swift' + 'frontend/data/' + 'frontend/dialogs/' + 'frontend/docks/' + 'frontend/forms/' + 'frontend/idian/' + 'frontend/menu/' + 'frontend/models/' + 'frontend/oauth/' + 'frontend/plugins/' + 'frontend/settings/' + 'frontend/utility/' + 'frontend/widgets/' + 'frontend/window-basic-main.*' + ) + + MERGE_BASE=$(git merge-base upstream/master HEAD) + echo "Merge base with upstream/master: ${MERGE_BASE}" + + # Find any diff in off-limits paths. + CHANGED=$(git diff --name-only "${MERGE_BASE}" HEAD -- "${OFF_LIMITS[@]}" || true) + + if [[ -z "${CHANGED}" ]]; then + echo '✅ No core changes detected. Fork rule respected.' + exit 0 + fi + + echo '❌ The following files were modified in off-limits paths:' + echo '---' + echo "${CHANGED}" + echo '---' + echo '' + echo 'See CONTRIBUTING.md ("Mosaic — Fork Contribution Rules").' + echo 'OBS core (libobs, plugins, frontend C++) tracks upstream untouched.' + echo '' + echo 'Options:' + echo ' 1. Move the change into engine/ (preferred)' + echo ' 2. File the change upstream first (obsproject/obs-studio)' + echo ' 3. If the change is genuinely fork-specific build/CI infrastructure' + echo ' and would be accepted upstream as a robustness fix, update' + echo ' CONTRIBUTING.md to allowlist it explicitly.' + exit 1 diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index f61753abca6873..1a8ae1172d8356 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -1,20 +1,27 @@ name: Push +# Mosaic fork: triggers on dev and engine/** branches run-name: ${{ github.ref_name }} push run 🚀 on: push: paths-ignore: - '**.md' + - '**.rst' + - 'AUTHORS' + - 'COPYING' branches: - master - 'release/**' + - dev + - 'feature/**' tags: - '*' + workflow_dispatch: permissions: contents: write jobs: check-format: name: Format 🔍 - if: github.ref_name == 'master' + if: github.ref_name == 'master' || github.ref_name == 'dev' || startsWith(github.ref_name, 'feature/') uses: ./.github/workflows/check-format.yaml permissions: contents: read diff --git a/.gitignore b/.gitignore index e7c7cd4e4a20e9..1cbef1a12ad7cb 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,9 @@ !COPYING !INSTALL !README.rst +!ROADMAP.md +!MOSAIC_PLAN.md +!/engine # Exclude lock files *.lock.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3ade81b445778d..35b5410ffc203b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,128 @@ +Mosaic — Fork Contribution Rules +================================ + +> The section below is **specific to this fork** (`OgBops/mosaic`). +> Upstream OBS Studio's full contribution guide follows further down and +> applies to any code that is intended to be submitted upstream. + +This repository hosts `mosaic-host`, the engine for the Mosaic desktop +app. Mosaic is a separate user-facing product (separate repository, +future). This fork exists for one reason: produce a headless +`mosaic-host` binary that runs the upstream broadcasting engine in a +sidecar process and exposes its functionality over IPC. + +## The hard rule: upstream broadcasting code is read-only + +We do **not** modify the upstream broadcasting engine, its plugins, or +any code that ships as part of upstream OBS Studio. The fork's value is +in keeping the upstream code unmodified so upstream changes merge cleanly +forever. + +### Off-limits paths + +| Path | What it is | +|------|-----------| +| `libobs/` | The upstream broadcasting engine | +| `libobs-d3d11/`, `libobs-opengl/`, `libobs-winrt/` | Engine GPU backends | +| `plugins/` | Every upstream encoder, capture source, filter, output | +| `frontend/` (C++/Qt code) | Upstream Qt UI. We don't link it; we also don't modify it. | +| `deps/` | Third-party dependencies as upstream ships them | + +### Allowed playgrounds + +| Path | Purpose | +|------|---------| +| `engine/` | All Mosaic engine code (IPC server, host wrapper). New code lives here. | +| `.github/workflows/`, `.github/scripts/`, `.github/actions/` | CI infrastructure | +| `cmake/common/versionconfig.cmake` | Already-shipped fork-specific build robustness fix | +| `frontend/cmake/os-linux.cmake` | Already-shipped flatpak metadata fix | +| `*.md`, `*.rst`, `AUTHORS`, `COPYING` | Documentation and licensing | +| `build-aux/` | Project tooling | + +### Smell test + +Before any commit outside `engine/`: + +> "Would this change still be correct if we deleted the entire fork tomorrow +> and submitted it upstream as a PR?" + +If yes, fine. If no, you're modifying upstream code. Stop. + +## What if the upstream engine is genuinely missing what we need? + +We file the change **upstream first**. + +1. Search [obsproject/obs-studio issues](https://github.com/obsproject/obs-studio/issues) + for prior discussion. +2. Open an upstream PR or issue with the API change request. +3. Wait for upstream review. +4. Once accepted upstream, sync via `master`. + +We do not carry local core patches. The discipline is the point. + +## Where Mosaic engine code goes + +``` +engine/ +├─ host/ # mosaic-host binary: links the upstream engine, runs IPC server +│ ├─ ipc/ # newline-JSON IPC protocol implementation +│ ├─ methods/ # IPC method handlers (capture, output, scenes...) +│ └─ main.cpp # entry point +├─ protocol/ # IPC protocol schema (shared definitions) +└─ spike/ # Phase 0 throwaway code (deleted at end of phase 0) +``` + +## CI enforcement + +The workflow `.github/workflows/no-core-changes.yaml` runs on every push to +`dev` and `engine/**`. It diffs against `upstream/master` and fails the +build if any off-limits path has changed beyond explicitly-allowlisted +commits. + +To intentionally update the allowlist (rare — only for upstream-able +fork-specific build/CI fixes), edit the allowlist in the workflow itself +and reference the upstream issue or PR. + +## Branding separation (trademark) + +"OBS" and "OBS Studio" are trademarks of the OBS Project. Mosaic is an +independent project and does not redistribute upstream-branded binaries. +Specifically: + +- The Mosaic desktop app, when it exists, has its own name, icon, and + bundle identifier — it never ships as "OBS.app" or + `com.obsproject.obs-studio`. +- This repository's `master` branch carries upstream code with its + original branding, but `master` is never tagged or released from this + repository. +- The CI artifacts produced from `dev` are for our own development + verification only and are not redistributed publicly. +- Any release artifact from this repository must be built from + `engine/`-only code, or from a `dev` HEAD where the build has been + explicitly re-branded. + +## Branching + +| Branch | Purpose | +|--------|---------| +| `master` | Tracks upstream OBS Studio. Untouched. | +| `dev` | Integration branch. Mosaic docs, CI, the engine entry points land here. | +| `engine/` | Active engine work. Branch off `dev`. | +| `engine/spike` | Phase 0 spike. Temporary; deleted after the spike retro. | + +Open work-in-progress PRs against `dev`, never `master`. + +## License + +Files in `engine/` are licensed under the GPL v2 or later, same as the +upstream broadcasting source, because they link the upstream engine. + +The Mosaic app (separate repository) does **not** link the upstream +engine — it communicates with `mosaic-host` over IPC — and is therefore +not subject to GPL. That separation is load-bearing. Keep it that way. + +--- + OBS Studio Contribution Guidelines ============ diff --git a/MOSAIC_PLAN.md b/MOSAIC_PLAN.md new file mode 100644 index 00000000000000..bdef6f70b915d1 --- /dev/null +++ b/MOSAIC_PLAN.md @@ -0,0 +1,155 @@ +# Mosaic — Project Plan + +This document is the north star for the Mosaic project. When in doubt about +scope, refer back here. When this document is wrong, update it before +writing code that contradicts it. + +## What we're building + +**Mosaic** — a cross-platform desktop streaming app, owned end-to-end, +that covers three streaming modes: general streaming (OBS-like), vertical- +first (TikTok/Shorts/Reels), and podcast/interview-style. + +## Architecture + +Mosaic is two binaries: + +``` +┌─ Mosaic.app ───────────────────────────────────┐ +│ Rust + Tauri (separate repo, not yet created) │ +│ - UI shell (TypeScript/React in webview) │ +│ - Mode logic (general / vertical / podcast) │ +│ - Multi-destination fanout policy │ +│ - Talks to mosaic-host over IPC │ +│ │ +│ Closed-source-capable (no GPL linkage) │ +└──────────────────┬──────────────────────────────┘ + │ named pipe (Win) / Unix socket (mac/linux) + │ + shared GPU texture handle (later phase) +┌──────────────────▼──────────────────────────────┐ +│ mosaic-host (THIS REPO, derived from OBS) │ +│ - Upstream broadcasting engine + plugins │ +│ - IPC server (engine/host/ipc) │ +│ - IPC method handlers (engine/host/methods) │ +│ - No Qt frontend │ +│ │ +│ GPL v2 (same as the upstream source) │ +└──────────────────────────────────────────────────┘ +``` + +The architecture mirrors how Streamlabs Desktop works (their +`obs-studio-node` is the analog of our `mosaic-host`). The legal point of +running the broadcasting engine in a sidecar process is that the GPL +boundary stops at the IPC pipe. The Mosaic app does not link the +broadcasting engine and is not a derived work. + +## Hard constraints + +- **Upstream broadcasting code is read-only** — see `CONTRIBUTING.md`. + Enforced in CI by `.github/workflows/no-core-changes.yaml`. +- **Mosaic must remain closed-source-capable.** No statically-linked GPL + code in the Mosaic app. No `#include` paths into the broadcasting + engine from the Mosaic side. IPC only. +- **Upstream merges stay clean.** `master` tracks upstream untouched. + Quarterly merge into `dev`. +- **Trademark separation.** Mosaic uses its own name, icon, bundle ID, + and branding. We do not redistribute upstream-branded binaries from + this repository. + +## Phases + +| # | Phase | Weeks | What lands | +|---|-----------------------------------|-------|------------| +| 0 | Spike & validate | 2 | 200-LOC Rust + 400-LOC C++ end-to-end pipeline. Two binaries, one pipe, one RTMP stream. Both platforms. Throwaway. | +| 1 | Strip Qt, real IPC server | 6 | `mosaic-host` builds without `frontend/`. JSON-RPC IPC server. `ping`/`version`/`shutdown`. | +| 2 | IPC protocol v0.1 | 8 | Scene/source/output CRUD over IPC. Streaming start/stop. Stats. Settings persistence. CLI test client. | +| 3 | Shared GPU texture preview | 6 | D3D11 shared handles (Win), IOSurface (mac), DMA-BUF (Linux). Zero-copy 60fps preview. Hardest piece. | +| 4 | Mosaic shell — General mode | 8 | Tauri app. Source list, scene editor, "Go Live". Functional parity with general streaming for single-destination. | +| 5 | Multi-destination (local fanout) | 4 | N parallel output instances. Per-destination bitrate. UI for adding destinations. | +| 6 | Vertical mode | 4 | 9:16 canvas, source layout templates, vertical default scenes. | +| 7 | Podcast mode P0 | 12 | WebRTC mesh ≤4 participants. Guests join via web client (no install). Live composite. No per-participant local recording yet. | +| 8 | Podcast mode P1 | 10 | Per-participant local recording in browser via MediaRecorder. Background upload. Post-session merge. | +| 9 | Polish & ship | 8 | Code signing on both platforms. Auto-updater. Installers. Telemetry (opt-in). Marketing site. Public beta. | + +**Total realistic timeline: ~80 weeks (1.5 years).** Slack accounted for. + +### Decision points where the plan should bend + +- **End of phase 3:** if shared GPU texture doesn't work cleanly on + Windows, fall back to CPU-side preview. Don't let perfection kill phase 3. +- **End of phase 6:** if vertical-first turns out to be the killer mode, + ship vertical alone as the public beta. Phases 7–8 can wait. +- **End of phase 8:** podcast mode is the riskiest. If it's not working + at week 60, cut it. Mosaic ships as a 2-mode product. Podcast is v2. + +## Phase 0 — feasibility spike + +See `engine/spike/PLAN.md` (created at the start of phase 0). + +**Goal:** prove the architecture isn't fiction. The smallest possible +end-to-end pipeline. + +**Done = green checkmark on every line:** +1. ✅ `mosaic-host-spike` builds and runs on macOS arm64 and Windows x64 +2. ✅ `mosaic-spike-client` (Rust) connects to it on both platforms +3. ✅ End-to-end stream works on both (verified by ffplay) +4. ✅ Both processes exit cleanly under normal shutdown +5. ✅ Total new C++ code in `mosaic-host-spike` < 600 LOC +6. ✅ Total Rust code < 300 LOC +7. ✅ `git diff upstream/master..HEAD -- libobs/ plugins/ frontend/cpp deps/` is empty + +If 1–4 fail, re-plan (one re-plan budget). If 5–6 are massively over, +that signals the Qt-strip is bigger than expected; phase 1 estimate +doubles. + +## Repo layout, target + +``` +mosaic/ +├─ master/ ← tracks upstream broadcasting source, untouched +├─ dev/ ← integration: Mosaic docs, CI, engine entry points +├─ engine/spike/ ← phase 0, throwaway +├─ engine/host/ ← mosaic-host (phases 1+) +│ ├─ ipc/ ← JSON-RPC server +│ ├─ methods/ ← IPC method handlers +│ └─ main.cpp +├─ engine/protocol/ ← IPC schema (shared definitions) +├─ libobs/ ← UPSTREAM, READ-ONLY +├─ plugins/ ← UPSTREAM, READ-ONLY +├─ frontend/ ← UPSTREAM, READ-ONLY (we don't link, don't modify) +└─ ... ← upstream as-is +``` + +The Mosaic desktop app itself lives in a separate repository (created at +the start of phase 4). + +## Risk register (top of mind) + +| Risk | Likelihood | Impact | Mitigation | +|------|-----------|--------|-----------| +| Shared GPU texture path differs subtly per platform/GPU | High | High | Phase 0 spike on real hardware. CPU-fallback path planned. | +| Stripping Qt cascades through more code than expected | Medium | High | Don't delete `frontend/` immediately — make it not link, then prune. Preserves upstream merge compat. | +| GPL boundary gets challenged | Low | Existential | Follow Streamlabs' pattern exactly: separate process, IPC only, no shared address space. Document the design decision. | +| Trademark dispute with upstream re-emerges | Low (now) | High | Renamed 2026-05-22. Ongoing: strict branding separation in any user-facing artifact. | +| Upstream API changes break mosaic-host | Medium/quarter | Medium | Track `master` against upstream, merge quarterly, fix breakage. | +| Podcast WebRTC stack is its own 6-month project | High | Medium | Use existing libraries (`webrtc-rs`, `mediasoup`). Don't roll our own SFU. | +| Code signing gets stuck on dev enrollment | Medium | Low (delay) | Apply for Apple Developer Program + Windows EV cert before phase 9. | +| First 100 beta users find a thousand bugs | Certain | Medium | Phase 9 includes telemetry + crash reporting from day 1. | + +## Project history + +- **2026-05-17:** Cloned upstream OBS, started exploring as "OBS Studio Plus" + fork. +- **2026-05-22 (early):** CI green on all 6 platforms after no-tag survival + patches. +- **2026-05-22 (mid):** Pivot from "OBS with Qt features" to engine-for-Mosaic + architecture. +- **2026-05-22 (late):** Renamed from "OBS Studio Plus" to **Mosaic** after + trademark notice from the OBS Project. All public OBS-branded artifacts + deleted from CI. Repository renamed to `OgBops/mosaic`. + +## Updating this document + +When phase boundaries change, when a phase actually ships, when the architecture +gets revised, **update this file in the same commit as the change**. A plan +doc that's out of sync with reality is worse than no plan doc at all. diff --git a/README.rst b/README.rst index 67a4673ff48767..5566e2380b02f4 100644 --- a/README.rst +++ b/README.rst @@ -1,79 +1,125 @@ -OBS Studio -=================================== +Mosaic +====== -.. image:: https://github.com/obsproject/obs-studio/actions/workflows/push.yaml/badge.svg?branch=master - :alt: OBS Studio Build Status - GitHub Actions - :target: https://github.com/obsproject/obs-studio/actions/workflows/push.yaml?query=branch%3Amaster +|build-status| + +Mosaic is a cross-platform desktop streaming application targeting three +modes: general streaming, vertical-first content (TikTok / Shorts / Reels), +and podcast/interview workflows. + +This repository hosts ``mosaic-host``, the engine. It is a fork of +`OBS Studio `_ stripped to a headless binary that +runs the upstream broadcasting engine in a sidecar process and exposes its +functionality over local IPC. The Mosaic desktop app (separate repository, +written in Rust + Tauri) talks to ``mosaic-host`` over a named pipe. + +Running the broadcasting engine out of process keeps the GPL boundary at +the IPC layer so the Mosaic app itself can be developed under any license, +while ``mosaic-host`` remains GPL v2 like the upstream code it links. + +This is **not** a re-distribution of OBS Studio. Mosaic is a separate +product. See the `OBS Studio project `_ for the +original software. + +Status +------ + +**Pre-alpha.** The repository is in the middle of a foundational rebuild. +Phase 0 (a 2-week feasibility spike) is the current work. There is no +shippable product yet, and no public binary releases. + +Today, a build from ``dev`` is just the upstream broadcasting source — +that is intentional. The engine wrapper and the Mosaic app land in later +phases. See `MOSAIC_PLAN.md `_ for the full plan. + +Repository layout +----------------- + +================================ =============================================== +Branch / path What it is +================================ =============================================== +``master`` Tracks upstream OBS Studio, untouched. +``dev`` Integration branch. Mosaic-specific docs, CI + fixes, engine entry points land here. +``engine/spike`` Phase 0 spike. Created at the start of phase 0, + deleted after the retro. +``engine/host`` ``mosaic-host`` proper (created in phase 1). +``libobs/``, ``plugins/``, Read-only mirror of the upstream broadcasting +``frontend/`` C++/Qt source. Modifying these files fails CI. +================================ =============================================== + +The hard rule: see `CONTRIBUTING.md `_. Upstream broadcasting +core code is read-only in this fork. The CI workflow ``no-core-changes.yaml`` +enforces the rule by diffing against ``upstream/master``. + +Downloads +--------- + +There are no public binary releases at this time. CI builds the upstream +broadcasting source on every push to ``dev`` and ``engine/**`` for our own +verification, but those builds are not redistributed. Public Mosaic +releases will begin once the Mosaic desktop app exists in its own +repository under its own application name. + +Building from source +-------------------- + +Build instructions for ``mosaic-host`` follow upstream OBS Studio's build +process. The upstream wiki covers platform setup: +https://github.com/obsproject/obs-studio/wiki/Install-Instructions + +Quick start (macOS, requires full Xcode.app):: + + cmake --preset macos + cmake --build --preset macos + +Quick start (Linux):: + + cmake --preset ubuntu-x86_64 + cmake --build --preset ubuntu-x86_64 + +License +------- + +The engine code in this repository (everything that links the upstream +broadcasting engine, including any code we add under ``engine/``) is +distributed under the GNU General Public License v2 (or any later +version), the same license as the upstream source. See ``COPYING`` for +details. + +The Mosaic desktop app — which lives in a separate repository — does not +link the upstream engine. It communicates with ``mosaic-host`` over IPC. +That separation is load-bearing for keeping the Mosaic app +closed-source-capable. Don't break it. + +Trademark notice +---------------- + +"OBS" and "OBS Studio" are trademarks of the OBS Project. Mosaic is an +independent project and is not affiliated with, endorsed by, or sponsored +by the OBS Project. References to OBS Studio in this repository refer +solely to the upstream open-source project from which the engine code is +derived. -.. image:: https://badges.crowdin.net/obs-studio/localized.svg - :alt: OBS Studio Translation Project Progress - :target: https://crowdin.com/project/obs-studio - -.. image:: https://img.shields.io/discord/348973006581923840.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2 - :alt: OBS Studio Discord Server - :target: https://obsproject.com/discord - -What is OBS Studio? -------------------- - -OBS Studio is software designed for capturing, compositing, encoding, -recording, and streaming video content, efficiently. - -It's distributed under the GNU General Public License v2 (or any later -version) - see the accompanying COPYING file for more details. - -Quick Links +Quick links ----------- -- Website: https://obsproject.com - -- Help/Documentation/Guides: https://github.com/obsproject/obs-studio/wiki - -- Forums: https://obsproject.com/forum/ - -- Build Instructions: https://github.com/obsproject/obs-studio/wiki/Install-Instructions - -- Developer/API Documentation: https://obsproject.com/docs - -- Donating/backing/sponsoring: https://obsproject.com/contribute - -- Bug Tracker: https://github.com/obsproject/obs-studio/issues - -Contributing ------------- - -- If you would like to help fund or sponsor the project, you can do so - via `Patreon `_, `OpenCollective - `_, or `PayPal - `_. See our `contribute page - `_ for more information. - -- If you wish to contribute code to the project, please make sure to - read the coding and commit guidelines: - https://github.com/obsproject/obs-studio/blob/master/CONTRIBUTING.md - -- Code for the project follows the code style guidelines, located - here: https://github.com/obsproject/obs-studio/blob/master/CODESTYLE.md - -- Developer/API documentation can be found here: - https://obsproject.com/docs - -- If you wish to contribute translations, do not submit pull requests. - Instead, please use Crowdin. For more information read this page: - https://obsproject.com/wiki/How-To-Contribute-Translations-For-OBS - -- Contributors to OBS Studio and related repositories are expected to - follow our Code of Conduct, which can be read here: - https://github.com/obsproject/obs-studio/blob/master/COC.rst +- This repository: https://github.com/OgBops/mosaic +- Plan: `MOSAIC_PLAN.md `_ +- Fork rules: `CONTRIBUTING.md `_ +- Upstream OBS Studio: https://github.com/obsproject/obs-studio -- Other ways to contribute are by helping people out with support on - our forums or in our community chat. Please limit support to topics - you fully understand -- bad advice is worse than no advice. When it - comes to something that you don't fully know or understand, please - defer to the official help or official channels. +Acknowledgements +---------------- +Mosaic is built on top of the work of the OBS Studio team and its +hundreds of contributors. See the ``AUTHORS`` file for the full list. +This project would not exist without their work. -SAST Tools ----------- +If you would like to support upstream OBS Studio (which is recommended, +since this fork depends on their continued work), see +https://obsproject.com/contribute. -`PVS-Studio `_ - static analyzer for C, C++, C#, and Java code. +.. |build-status| image:: https://github.com/OgBops/mosaic/actions/workflows/push.yaml/badge.svg?branch=dev + :target: https://github.com/OgBops/mosaic/actions/workflows/push.yaml + :alt: dev branch build status diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 00000000000000..a825b8f773684e --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,20 @@ +# Roadmap + +The high-level roadmap and planning document is `MOSAIC_PLAN.md`. This file +is preserved as a pointer so links from the README and elsewhere don't +break. + +→ See **[MOSAIC_PLAN.md](MOSAIC_PLAN.md)** for: + +- The Plus app architecture +- Hard constraints (OBS core is read-only) +- All 9 phases with timelines +- Phase 0 (the current work) details +- Risk register + +→ See **[CONTRIBUTING.md](CONTRIBUTING.md)** for: + +- Off-limits paths +- The "smell test" for any change outside `engine/` +- How to escalate when libobs is genuinely missing what we need +- Branching policy diff --git a/cmake/common/versionconfig.cmake b/cmake/common/versionconfig.cmake index 7a1e753125eeec..615d44109f3cbc 100644 --- a/cmake/common/versionconfig.cmake +++ b/cmake/common/versionconfig.cmake @@ -21,7 +21,19 @@ if(NOT DEFINED OBS_VERSION_OVERRIDE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git endif() if(_obs_version_result EQUAL 0) - string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" _obs_version_canonical ${_obs_version}) + if(_obs_version MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+).*") + string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" _obs_version_canonical ${_obs_version}) + else() + # obs-studio-plus fork: no upstream tags reachable from this commit, so + # `git describe` returned a bare SHA. Fall back to _obs_default_version + # for the canonical M.m.p triple and the raw OBS_VERSION string. + message( + STATUS + "OBS version: no tag reachable, using default ${_obs_default_version} (git describe: ${_obs_version})" + ) + set(_obs_version ${_obs_default_version}) + set(_obs_version_canonical ${_obs_default_version}) + endif() endif() elseif(DEFINED OBS_VERSION_OVERRIDE) if(OBS_VERSION_OVERRIDE MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+).*") diff --git a/frontend/cmake/os-linux.cmake b/frontend/cmake/os-linux.cmake index d146e7297e1e49..fd9f3eccec2c6c 100644 --- a/frontend/cmake/os-linux.cmake +++ b/frontend/cmake/os-linux.cmake @@ -33,6 +33,17 @@ if(NOT DEFINED APPDATA_RELEASE_DATE) WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_STRIP_TRAILING_WHITESPACE ) + # obs-studio-plus fork: no tags reachable, so the tag-scoped log returns + # empty and the appstream metainfo loses its release date. Fall back to + # the most recent commit's date. + if(APPDATA_RELEASE_DATE STREQUAL "") + execute_process( + COMMAND git log -1 --pretty=%cd --date=short + OUTPUT_VARIABLE APPDATA_RELEASE_DATE + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + endif() elseif(EXISTS "${CMAKE_SOURCE_DIR}/cmake/.CMakeBuildNumber") file(TIMESTAMP "${CMAKE_SOURCE_DIR}/cmake/.CMakeBuildNumber" APPDATA_RELEASE_DATE "%Y-%m-%d") else()