Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
- name: Run Android unit tests and lint, then build APK
working-directory: android
env:
OPENSTREAM_VERSION_NAME: 1.0.0
OPENSTREAM_VERSION_NAME: 1.0.1
OPENSTREAM_VERSION_CODE: ${{ steps.version.outputs.code }}
run: |
chmod +x ./gradlew
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/obs-plugin-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
- name: Build plugin installer
shell: powershell
env:
OPENSTREAM_VERSION: ci
OPENSTREAM_VERSION: 1.0.1
run: |
$iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
& $iscc "tools\installer\openstream-obs-plugin.iss" `
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
workflow_dispatch:
inputs:
tag:
description: Release tag, for example v1.0.0
description: Release tag, for example v1.0.1
required: true
type: string

Expand Down
5 changes: 2 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# OpenStream Repository Rules

These rules apply to every OpenStream V4 change.
These rules apply to every OpenStream change.

1. Never replace source timestamps with arrival time.
2. Never re-encode ISO video.
Expand All @@ -14,14 +14,13 @@ These rules apply to every OpenStream V4 change.
10. Never create a second phone video encoder in standard mode.
11. Never mix all microphones automatically.
12. Never promise genlock or guaranteed frame-perfect sync.
13. Never combine multiple major phases into one PR.
13. Keep unrelated changes in separate PRs.
14. Every performance change must include before-and-after measurements.
15. Every media change must include behavioural tests.
16. Every queue must declare its capacity and overflow policy.
17. Every recording gap must be surfaced and logged.
18. Hardware acceleration must have an explicit fallback and warning.
19. Preserve legacy compatibility through adapters, not core contamination.
20. Virtual microphone work is outside the initial V4 release.

## Completion workflow

Expand Down
56 changes: 9 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/badge/OpenStream-Turn_Your_Phone_Into_a_Wireless_OBS_Camera-00D4AA?style=for-the-badge&labelColor=0A0A0F">
<img alt="OpenStream V1.0.0 Banner" src="https://img.shields.io/badge/OpenStream-Turn_Your_Phone_Into_a_Wireless_OBS_Camera-00D4AA?style=for-the-badge&labelColor=0A0A0F">
<img alt="OpenStream V1.0.1 Banner" src="https://img.shields.io/badge/OpenStream-Turn_Your_Phone_Into_a_Wireless_OBS_Camera-00D4AA?style=for-the-badge&labelColor=0A0A0F">
</picture>

### Turn any Android phone into a wireless camera source for OBS Studio

[![Version](https://img.shields.io/badge/version-1.0.0-00D4AA?style=flat-square&labelColor=1a1a2e)](https://github.com/YashasVM/OpenStream/releases/tag/v1.0.0)
[![Version](https://img.shields.io/badge/version-1.0.1-00D4AA?style=flat-square&labelColor=1a1a2e)](https://github.com/YashasVM/OpenStream/releases/tag/v1.0.1)
[![Platform](https://img.shields.io/badge/platform-Android%20%2B%20Windows-green?style=flat-square&labelColor=1a1a2e)](https://github.com/YashasVM/OpenStream)
[![OBS](https://img.shields.io/badge/OBS-Studio%20Plugin-purple?style=flat-square&labelColor=1a1a2e)](https://obsproject.com)
[![Website](https://img.shields.io/badge/website-openstream.pages.dev-00D4AA?style=flat-square&labelColor=1a1a2e)](https://openstream.pages.dev)
Expand All @@ -19,7 +19,7 @@
</div>

> [!IMPORTANT]
> OpenStream V1.0.0 is the first public release for local Wi-Fi camera workflows. Device-specific camera behavior and network quality can still vary; please report bugs in [GitHub Issues](https://github.com/YashasVM/OpenStream/issues).
> OpenStream V1.0.1 is a fixed patch release for local Wi-Fi camera workflows. Device-specific camera behavior and network quality can still vary; please report bugs in [GitHub Issues](https://github.com/YashasVM/OpenStream/issues).

## Quick Downloads

Expand All @@ -35,41 +35,20 @@ Need the non-technical walkthrough with screenshots? Start with [`docs/set-up.md

## What is OpenStream?

OpenStream V1.0.0 sends your Android phone camera directly into OBS Studio over local Wi-Fi. It uses Camera2, MediaCodec video/audio encoding, MPEG-TS muxing, SRT transport, two-way LAN discovery, source-slot pairing, and a native OBS source plugin.
OpenStream V1.0.1 sends your Android phone camera directly into OBS Studio over local Wi-Fi. It uses Camera2, MediaCodec video/audio encoding, MPEG-TS muxing, SRT transport, two-way LAN discovery, source-slot pairing, and a native OBS source plugin.

```text
Phone camera -> HEVC/H.264 + AAC -> SRT over Wi-Fi -> OpenStream camera slot in OBS
```

### V1.0.0 Release
### V1.0.1 Release

| Area | V1.0.0 release detail |
| Area | V1.0.1 release detail |
|---|---|
| **OBS setup** | The OpenStream Camera Control dock provides the legacy connection and camera controls. |
| **Scene compatibility** | Existing `OpenStream V7` scene sources keep loading while new sources appear as `OpenStream V8`. |
| **Pairing clarity** | OBS and Android both describe slots as production camera positions instead of raw listener ports. |
| **Release polish** | Version defaults, release notes, and setup docs are aligned around V1.0.0. |

### OpenStream vs DroidCam

DroidCam is a mature phone-as-webcam product with Wi-Fi, USB, desktop webcam clients, and an OBS plugin. OpenStream is an open-source alternative focused on local OBS camera slots, SRT transport, high-bitrate video, and a repo-controlled release path.

| Feature | OpenStream | DroidCam / DroidCam OBS |
|---|---|---|
| **Project model** | Open-source repo with Android app, native OBS plugin, CI builds, and public release assets. | Commercial app/client/plugin from Dev47Apps with free SD usage and paid HD/pro features. |
| **Primary workflow** | Turn Android phones into dedicated OBS camera sources over local Wi-Fi. | Use a phone as a webcam for video calls or as an OBS camera source. |
| **OBS integration** | Native `OpenStream V8` source with camera slots, discovery, pairing URLs, and live controls. | Direct DroidCam OBS plugin; no separate desktop client needed for OBS use. |
| **Transport** | SRT over LAN with MPEG-TS carrying HEVC/H.264 video and AAC audio. | Wi-Fi and USB transfer options; DroidCam OBS advertises hardware-accelerated video. |
| **Video target** | `1080p60` default with high local bitrate and HEVC preference. | Standard-definition free mode; HD/Full-HD/4K options depend on DroidCam mode and pro upgrade. |
| **Audio path** | AAC microphone audio into a separate OBS mixer channel, tuned for `48 kHz` live production. | Sound capture is supported, including webcam-style audio paths. |
| **Multi-camera setup** | Source slots such as `CAM A` and `CAM B` reserve phones and recover reconnects into the same OBS source. | DroidCam OBS supports adding multiple devices as OBS sources. |
| **Remote camera controls** | The OBS Cameras dock controls zoom, torch, lens switching, and the phone identification overlay. | Pro features include manual camera controls and PC remote controls. |
| **Release assets** | GitHub Releases provide the Android APK, checksum, Windows installer, and plugin ZIP. | Updates are delivered through DroidCam's app/client/plugin distribution channels. |
| **Best fit** | Builders and streamers who want an inspectable, hackable OBS-first camera pipeline. | Users who want a polished cross-app webcam product with mature USB and desktop-client options. |

Sources: [DroidCam official site](https://droidcam.app/), [DroidCam OBS plugin](https://droidcam.app/obs/), and [DroidCam OBS usage notes](https://droidcam.app/obs/usage/).

---
| **Release polish** | Version defaults, release notes, and setup docs are aligned around V1.0.1. |

## Quick Start

Expand Down Expand Up @@ -108,7 +87,7 @@ Use OBS as usual. Open **Docks → OpenStream Camera Control** for the camera co
| **Phone OS** | Android 10+ with Camera2 and hardware MediaCodec support. |
| **OBS host** | Windows x64 with OBS Studio 32.2.1 and its bundled FFmpeg SRT support. |
| **Network** | Same LAN/subnet; guest Wi-Fi, VPNs, and client isolation can block discovery. |
| **Release maturity** | V1.0.0. Expect device-specific camera quirks and Wi-Fi-dependent latency. |
| **Release maturity** | V1.0.1. Expect device-specific camera quirks and Wi-Fi-dependent latency. |

---

Expand Down Expand Up @@ -276,28 +255,11 @@ This is a developer/debug tool only. Normal users should install the OBS plugin.

---

## Roadmap

- [x] Camera2 hardware-accelerated capture
- [x] HEVC/H.265 and H.264 encoding with MediaCodec
- [x] SRT transport with MPEG-TS muxing
- [x] Native OBS source plugin with FFmpeg decode
- [x] LAN auto-discovery
- [x] Audio streaming into the OBS mixer
- [x] Remote camera controls from OBS
- [x] Windows plugin installer
- [ ] Adaptive bitrate based on network conditions
- [ ] QR pairing for restricted networks
- [ ] GPU zero-copy receive path
- [ ] macOS/Linux OBS plugin packages

---

## Links

| Link | URL |
|---|---|
| Website | [OpenStream V1.0.0](https://openstream.pages.dev) |
| Website | [OpenStream V1.0.1](https://openstream.pages.dev) |
| Releases | [github.com/YashasVM/OpenStream/releases](https://github.com/YashasVM/OpenStream/releases) |
| Issues | [github.com/YashasVM/OpenStream/issues](https://github.com/YashasVM/OpenStream/issues) |

Expand Down
4 changes: 2 additions & 2 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ val hasReleaseSigning = listOf(
).all { !it.isNullOrBlank() }
val openStreamVersionName = providers.gradleProperty("openstream.versionName")
.orElse(providers.environmentVariable("OPENSTREAM_VERSION_NAME"))
.orElse("1.0.0")
.orElse("1.0.1")
.map { it.removePrefix("v") }
val openStreamVersionCode = providers.gradleProperty("openstream.versionCode")
.orElse(providers.environmentVariable("OPENSTREAM_VERSION_CODE"))
.orElse("1")
.orElse("2")
.map { it.toInt() }

android {
Expand Down
2 changes: 1 addition & 1 deletion build_plugin.bat
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ set "OBS_BIN="
set "PACKAGE_DIR="
set "CMAKE_EXE=cmake"
set "QT_ROOT=%OPENSTREAM_QT_ROOT%"
if not defined OPENSTREAM_VERSION set "OPENSTREAM_VERSION=1.0.0"
if not defined OPENSTREAM_VERSION set "OPENSTREAM_VERSION=1.0.1"

if defined OPENSTREAM_OBS_INSTALL set "OBS_INSTALL=%OPENSTREAM_OBS_INSTALL%"
if defined OPENSTREAM_PLUGIN_BUILD_DIR set "BUILD_DIR=%OPENSTREAM_PLUGIN_BUILD_DIR%"
Expand Down
12 changes: 0 additions & 12 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,15 +111,3 @@ The Android app publishes:

Telemetry is intentionally separate from the media path so OBS property
panels can evolve independently.

## Research Track

The following are explicitly not required for the first prototype:

- Raw `YUV_420_888` over network
- zstd lossless frame transport
- PTP-grade synchronization
- GPU zero-copy receive path
- ML Kit auto-framing
- Multi-network bonding
- Predictive auto-switching
2 changes: 1 addition & 1 deletion docs/protocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Overview

OpenStream V1.0.0 currently uses version 1 of its LAN wire protocol. Product
OpenStream V1.0.1 currently uses version 1 of its LAN wire protocol. Product
version numbers and protocol versions are independent: `OPENSTREAM/1` and
`OPENSTREAM_PHONE/1` below identify the protocol, not the app release.

Expand Down
6 changes: 3 additions & 3 deletions docs/release-notes-template.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# OpenStream V1.0.0
# OpenStream V1.0.1

OpenStream V1.0.0 provides a direct Android-to-OBS camera workflow with V8 source naming, V7 scene compatibility, Android camera streaming, and install downloads for both surfaces.
OpenStream V1.0.1 is a fixed Android-to-OBS camera release with V8 source naming, V7 scene compatibility, universal Android packaging, and install downloads for both surfaces.

## What's New

Expand Down Expand Up @@ -37,7 +37,7 @@ For the screenshot walkthrough, read [`docs/set-up.md`](https://github.com/Yasha
## Notes

- Windows OBS plugin only.
- Existing source names may still say `OpenStream V7`; rename them in OBS if you want the scene label to match V1.0.0.
- Existing source names may still say `OpenStream V7`; rename them in OBS if you want the scene label to match V1.0.1.
- Use 5 GHz or Wi-Fi 6 for best results.
- Keep both devices on the same subnet.
- Please report issues on GitHub.
17 changes: 12 additions & 5 deletions docs/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,25 @@ second copy of OBS/FFmpeg DLLs.

| Asset | Audience | Purpose |
|---|---|---|
| `openstream-android.apk` | Android users | Signed install package for the OpenStream V1.0.0 camera app. |
| `openstream-android.apk` | Android users | Signed install package for the OpenStream V1.0.1 camera app. |
| `openstream-android.apk.sha256` | Android users and automation | SHA-256 checksum for the exact APK in the release. |
| `openstream-obs-plugin-installer-windows-x64.exe` | Windows OBS users | Recommended one-click OBS plugin installer. |
| `openstream-obs-windows-x64.zip` | Technical users | Manual plugin package with DLL and install scripts. |

### Android compatibility note

The V1.0.1 APK is a universal signed APK with `minSdk 29` and native libraries
for `arm64-v8a`, `armeabi-v7a`, `x86`, and `x86_64`. It is therefore suitable for
modern ARM64 phones such as the Samsung Galaxy S24 Ultra. Camera lens availability
and device-specific Camera2 behavior should still be verified on the target phone.

## Automated Release

Create and push the V1.0.0 release tag:
Create and push the V1.0.1 release tag:

```powershell
git tag v1.0.0
git push origin v1.0.0
git tag v1.0.1
git push origin v1.0.1
```

The `Release` workflow builds:
Expand All @@ -38,7 +45,7 @@ artifacts, normalizes the APK name, writes its SHA-256 sidecar, and runs
`gh release create`.

You can also run the `Release` workflow manually from GitHub Actions with the
tag `v1.0.0`.
tag `v1.0.1`.

The Android job passes the release tag into Gradle as the APK `versionName` and
uses the release commit timestamp as `versionCode`.
Expand Down
12 changes: 6 additions & 6 deletions docs/set-up.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# OpenStream Set-Up Guide

This guide is the slower, screenshot-led path for installing OpenStream V1.0.0 on an Android phone and a Windows OBS Studio PC.
This guide is the slower, screenshot-led path for installing OpenStream V1.0.1 on an Android phone and a Windows OBS Studio PC.

For the fast technical version, use the [README quick start](../README.md#quick-start).

Expand All @@ -13,7 +13,7 @@ For the fast technical version, use the [README quick start](../README.md#quick-
| Android phone | Android 10 or newer is recommended. The phone must support Camera2. |
| Windows PC | OBS Studio installed on Windows x64. |
| Same network | Phone and PC must be on the same Wi-Fi or LAN subnet. |
| Release files | V1.0.0 APK for the phone, installer EXE for the OBS plugin. |
| Release files | V1.0.1 APK for the phone, installer EXE for the OBS plugin. |

> [!TIP]
> If discovery does not work, temporarily disable VPNs, guest Wi-Fi, and router client isolation.
Expand All @@ -22,7 +22,7 @@ For the fast technical version, use the [README quick start](../README.md#quick-

## 1. Download the Release Files

Open the latest OpenStream V1.0.0 release and download:
Open the latest OpenStream V1.0.1 release and download:

| File | Install on | Use |
|---|---|---|
Expand Down Expand Up @@ -71,9 +71,9 @@ C:\Program Files\obs-studio\obs-plugins\64bit\

### Upgrading from an Older OpenStream Plugin

OpenStream V1.0.0 appears in OBS as `OpenStream V8`. Existing scene sources created with `OpenStream V7` are still supported, but the saved source names may remain `OpenStream V7` until you rename them in OBS.
OpenStream V1.0.1 appears in OBS as `OpenStream V8`. Existing scene sources created with `OpenStream V7` are still supported, but the saved source names may remain `OpenStream V7` until you rename them in OBS.

If OBS still shows an older OpenStream source after installing V1.0.0, check these plugin locations and remove or replace stale copies:
If OBS still shows an older OpenStream source after installing V1.0.1, check these plugin locations and remove or replace stale copies:

```text
C:\Program Files\obs-studio\obs-plugins\64bit\openstream-obs.dll
Expand Down Expand Up @@ -157,7 +157,7 @@ In OBS:
| Installer cannot find OBS | Re-run it and choose the folder that contains `bin\64bit\obs64.exe`. |
| Windows blocks the EXE | Use `More info` then `Run anyway`, or use the manual zip install. |
| OpenStream V8 is missing in OBS | Confirm `openstream-obs.dll` is in one of the plugin folders above, remove stale older copies, then restart OBS. |
| Old OpenStream source is still visible | OBS may be loading an older all-users DLL from `C:\ProgramData\obs-studio\plugins\openstream-obs\bin\64bit\`. Replace it with the V1.0.0 DLL or remove it. |
| Old OpenStream source is still visible | OBS may be loading an older all-users DLL from `C:\ProgramData\obs-studio\plugins\openstream-obs\bin\64bit\`. Replace it with the V1.0.1 DLL or remove it. |
| Phone cannot see OBS | Put both devices on the same Wi-Fi, disable VPNs, and check guest/client isolation. |
| Camera stays blank | Start with port `9000`, latency `120 ms`, and one phone only. |
| Audio is missing | Grant microphone permission on Android and check the OBS mixer channel. |
Expand Down
2 changes: 1 addition & 1 deletion docs/setup.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# OpenStream V1.0.0 Setup
# OpenStream V1.0.1 Setup

The current user-facing setup guide lives in [`docs/set-up.md`](set-up.md).

Expand Down
2 changes: 1 addition & 1 deletion obs-plugin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.24)
project(openstream_obs_plugin VERSION 1.0.0 LANGUAGES CXX)
project(openstream_obs_plugin VERSION 1.0.1 LANGUAGES CXX)
set(OPENSTREAM_VERSION "${PROJECT_VERSION}" CACHE STRING "Version embedded in the OBS plugin")

# Releases are built against OBS Studio 32.2.1 x64. Its bundled FFmpeg ABI is
Expand Down
10 changes: 5 additions & 5 deletions tests/test_repo_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def test_architecture_documents_practical_v1_transport() -> None:
assert "SRT caller" in architecture
assert "UDP discovery" in architecture
assert "PTP" in architecture
assert "not required for the first prototype" in architecture
assert "## Research Track" not in architecture


def test_android_project_declares_camera_media_codec_srt_discovery_boundaries() -> None:
Expand Down Expand Up @@ -301,7 +301,7 @@ def test_release_build_fails_without_signing_and_keystores_are_ignored() -> None
assert "Release builds require OPENSTREAM_RELEASE_KEYSTORE" in app_gradle
assert "openstream.versionName" in app_gradle
assert "openstream.versionCode" in app_gradle
assert '"1.0.0"' in app_gradle
assert '"1.0.1"' in app_gradle
version_code = re.search(
r"openStreamVersionCode.*?\.orElse\(\"(\d+)\"\)",
app_gradle,
Expand All @@ -318,6 +318,6 @@ def test_legacy_android_and_restored_obs_metadata_are_explicit() -> None:
cmake = read("obs-plugin/CMakeLists.txt")
installer = read("tools/installer/openstream-obs-plugin.iss")

assert '"1.0.0"' in app_gradle
assert "project(openstream_obs_plugin VERSION 1.0.0" in cmake
assert '#define OpenStreamVersion "1.0.0"' in installer
assert '"1.0.1"' in app_gradle
assert "project(openstream_obs_plugin VERSION 1.0.1" in cmake
assert '#define OpenStreamVersion "1.0.1"' in installer
2 changes: 1 addition & 1 deletion tools/installer/openstream-obs-plugin.iss
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#endif

#ifndef OpenStreamVersion
#define OpenStreamVersion "1.0.0"
#define OpenStreamVersion "1.0.1"
#endif

[Setup]
Expand Down
Loading
Loading