-
-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1 parent
087e09b
commit 06c4ecd
Showing
10 changed files
with
1,128 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
artefacts/obs* | ||
builder/obs-options.sh |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,214 @@ | ||
<h1 align="center"> | ||
<img src="https://avatars1.githubusercontent.com/u/7725691?v=3&s=256" alt="OBS Studio"> | ||
<br /> | ||
OBS Studio <i>Portable</i> for Ubuntu | ||
</h1> | ||
|
||
<p align="center"><b>Portable builds of OBS Studio for Ubuntu that come pre-loaded with extra features and plugins for live streaming and screen recording</b> | ||
<br /> | ||
Made with 💝 for <img src=".github/ubuntu.png" align="top" width="18" /></p> | ||
|
||
# OBS Studio Portable for Ubuntu | ||
|
||
Running OBS Studio in Portable Mode means that all settings (Profiles and Scene | ||
Collections) are saved within the same directory tree as the OBS Studio | ||
executables, plugins and. You can copy the whole folder to a another computer | ||
and just use it. | ||
|
||
- Nearly 40 of the best 3rd Party plugins for OBS Studio are bundled | ||
- Chromium Embedded Frameworks (CEF) to enable Browser Sources | ||
- NVENC (NVIDIA) and VA-API (AMD & Intel) accelerated video encoding | ||
- Fraunhofer FDK AAC Codec | ||
- VLC and GStreamer Media sources | ||
- AJA NTV2 SDK | ||
|
||
## Supported Software | ||
|
||
Each tarball of OBS Studio Portable includes a `manifest.txt` that describes | ||
exactly which versions are of plugins and add-ons are included. | ||
|
||
| Distro | OBS Studio 27 | OBS Studio 28 | | ||
| ------------ | ------------- | ------------- | | ||
| Ubuntu 20.04 | 27.2.4 (Qt 5) | 28.0.2 (Qt 5) | | ||
| Ubuntu 22.04 | 27.2.4 (Qt 5) | 28.0.2 (Qt 6) | | ||
| Ubuntu 22.10 | | 28.0.2 (Qt 6) | | ||
|
||
### Caveats | ||
|
||
- PipeWire support is not available in builds for Ubuntu 20.04 | ||
- Teleport is not available in builds for Ubuntu 20.04 | ||
- SRT & RIST Protocol support is only available in builds for Ubuntu 22.10 and newer | ||
|
||
# Install | ||
|
||
The install process is simple: | ||
|
||
- Download the tarball (and sha256 hash) of OBS Studio for the version of Ubuntu you're running. | ||
- **Builds are specific to an Ubuntu release!** | ||
- Extract the tarball somewhere. | ||
- Run `obs-dependencies`, include in the tarball, to make sure the runtime requirements for OBS Studio are satisfied. | ||
- Run `obs-portable` to launch OBS Studio. | ||
- **It is essential you use `obs-portable` to launch OBS Studio** to ensure it finds all the associated libraries and add-ons. | ||
|
||
```bash | ||
wget "https://github.com/wimpysworld/obs-portable/releases/download/r22271/obs-portable-28.0.2-r22271-ubuntu-22.04.tar.bz2" | ||
sha256sum -c obs-portable-28.0.2-r22271-ubuntu-22.04.tar.bz2.sha256 | ||
tar xvf obs-portable-28.0.2-r22271-ubuntu-22.04.tar.bz2 | ||
cd obs-portable-28.0.2-r22271-ubuntu-22.04 | ||
sudo ./obs-dependencies | ||
./obs-portable | ||
``` | ||
|
||
You can safely install these OBS Studio Portable builds alongside `.deb`, | ||
FlatPak or Snap installs of OBS Studio. | ||
|
||
## Upgrades | ||
|
||
The upgrade process is the same as an install and you can simply copy the | ||
`config` folder from your old OBS Studio Portable directory to the new one. If | ||
anything doesn't correctly when you start the new OBS Studio, just keep using | ||
the previous OBS Studio Portable instance. | ||
|
||
# Why does this project exist? | ||
|
||
If any of the following is true for you, you might find these builds of OBS | ||
Studio useful. | ||
|
||
- **I want a version of OBS Studio for Ubuntu that has all the features enabled, *by default*** | ||
- I use lots of 3rd party OBS Studio plugins in my stream configuration. | ||
- **I stream from two different locations using multiple computers** | ||
- [Syncthing](https://syncthing.net/) keeps most of my streaming configuration synced between sites, but I'd like to include OBS Studio itself. | ||
- **I sometimes make changes to my OBS Studio configuration from various computers** | ||
- Keeping these changes in sync manually can be cumbersome. But now I can automate that with [Syncthing](https://syncthing.net/). | ||
- **I stream to multiple channels** | ||
- Having discrete OBS Studio instances is easier to work with than switching between dozens of Profile and Scene Collection combinations. | ||
- **I don't want to deal with flag day releases of new software** | ||
- New software is wonderful, but I'd like more control over when and how I upgrade each of my streaming configuration instances. | ||
- **My stream integrations are not (currently) compatible with confined packages of OBS Studio** | ||
- I have some funky stream integrations, and will likely create more. | ||
- **I sometimes stream how to do stuff with OBS Studio** | ||
- Being able to run demo instances of OBS Studio with isolated configurations is great for this. | ||
- **I want a stable streaming setup and an WIP streaming setup** | ||
- When developing new features for my stream, I want to freely experiment with new versions of OBS Studio and plugins without fear of breaking my stable setup. | ||
- **I sometimes need old and new version of OBS Studio available** | ||
- I have some streaming projects that are archived and do not need upgrading, but I do want to reference from time to time. | ||
|
||
# Batteries included | ||
|
||
I am extremely thankful to the OBS Studio developers and developers of the | ||
growing list of excellent plugins. The Portable build of OBS Studio for Ubuntu | ||
celebrate the best of what is available. Thank you! 🙇 | ||
|
||
Here are the 3rd party plugins that come bundled with OBS Studio Portable for | ||
Ubuntu: | ||
|
||
## Audio | ||
|
||
* **[Audio Pan](https://github.com/norihiro/obs-audio-pan-filter)** plugin; control stereo pan of audio source. | ||
* **[Mute Filter](https://github.com/norihiro/obs-mute-filter)**plugin; to mute audio of a source. | ||
* **[PipeWire Audio Capture](https://github.com/dimtpap/obs-pipewire-audio-capture)** plugin; capture application audio from PipeWire. | ||
* **[Scale to Sound](https://github.com/Qufyy/obs-scale-to-sound)** plugin; adds a filter which makes a source scale based on the audio levels of any audio source you choose | ||
* **[Soundboard](https://github.com/cg2121/obs-soundboard)** plugin; adds a soundboard dock. | ||
* **[Waveform](https://github.com/phandasm/waveform)** plugin; audio spectral analysis. | ||
|
||
## Automation | ||
|
||
* **[Advanced Scene Switcher](https://github.com/WarmUpTill/SceneSwitcher)** plugin; an automated scene switcher. | ||
* **[Directory Watch Media](https://github.com/exeldro/obs-dir-watch-media)** plugin; filter you can add to media source to load the oldest or newest file in a directory. | ||
* **[Dummy Source](https://github.com/norihiro/obs-command-source)** plugin; provides a dummy source to execute arbitrary commands when scene is switched. | ||
* **[Source Switcher](https://github.com/exeldro/obs-source-switcher)** plugin; to switch between a list of sources. | ||
* **[Transition Table](https://github.com/exeldro/obs-transition-table)** plugin; customize scene transitions. | ||
* **[Websockets](https://github.com/Palakis/obs-websocket)** plugin; remote-control OBS Studio through WebSockets. | ||
* **Also includes the *4.91 compatibility* version** | ||
|
||
## Effects | ||
|
||
* **[DVD Screensaver](https://github.com/univrsal/dvds3)** plugin; a DVD screen saver source type. | ||
* **[Downstream Keyer](https://github.com/exeldro/obs-downstream-keyer)** plugin; add a Downstream Keyer dock. | ||
* **[Dynamic Delay](https://github.com/exeldro/obs-dynamic-delay)** plugin; filter for dynamic delaying a video source. | ||
* **[Freeze Filter](https://github.com/exeldro/obs-freeze-filter)** plugin; freeze a source using a filter. | ||
* **[Gradient Source](https://github.com/exeldro/obs-gradient-source)** plugin; adding gradients as a Source. | ||
* **[Move Transition](https://github.com/exeldro/obs-move-transition)** plugin; move source to a new position during scene transition. | ||
* **[Multi Source Effect](https://github.com/norihiro/obs-multisource-effect)** plugin; provides a custom effect to render multiple sources. | ||
* **[Recursion Effect](https://github.com/exeldro/obs-recursion-effect)** plugin; recursion effect filter. | ||
* **[Replay Source](https://github.com/exeldro/obs-replay-source)** plugin; slow motion replay async sources from memory. | ||
* **[RGB Levels](https://github.com/petrifiedpenguin/obs-rgb-levels-filter)** plugin; simple filter to adjust RGB levels. | ||
* **[Time Shift](https://github.com/exeldro/obs-time-shift)** plugin; time shift a source using a filter. | ||
* **[Time Warp Scan](https://github.com/exeldro/obs-time-warp-scan)** plugin; a time warp scan filter. | ||
|
||
## Encoding & Output | ||
|
||
* **[GStreamer](https://github.com/fzwoch/obs-gstreamer)** plugins; feed GStreamer launch pipelines into OBS Studio. | ||
* **[Source Record](https://github.com/exeldro/obs-source-record)** plugin; make sources available to record via a filter. | ||
* **[StreamFX](https://github.com/Xaymar/obs-StreamFX)** plugin; unlocks the fully potential of NVENC. | ||
* **[Teleport](https://github.com/fzwoch/obs-teleport)** plugin; open NDI-like replacement. (*not NDI compatible*) | ||
* **[VAAPI](https://github.com/exeldro/obs-transition-table)** plugin; GStreamer based VAAPI encoder implementation. | ||
* **[Virtual Cam Filter](https://github.com/exeldro/obs-virtual-cam-filter)** plugin; make sources available to the virtual camera via a filter | ||
|
||
## Tools | ||
|
||
* **[Scene Collection Manager](https://github.com/exeldro/obs-scene-collection-manager)** plugin; filter, backup and restore Scene Collections. | ||
* **[Scene Notes Dock](https://github.com/exeldro/obs-scene-notes-dock)** plugin; create a Dock for showing and editing notes for the current active scene. | ||
* **[Source Copy](https://github.com/exeldro/obs-source-copy)** plugin; adds copy and paste options to the tools menu. | ||
* **[Source Dock](https://github.com/exeldro/obs-source-dock)** plugin; create a Dock for a source, which lets you see audio levels, change volume and control media. | ||
|
||
## Text | ||
|
||
* **[Text Pango](https://github.com/kkartaltepe/obs-text-pango)** plugin; Provides a text source rendered using Pango with multi-language support, emoji support, vertical rendering and RTL support. | ||
* **[Text PThread](https://github.com/norihiro/obs-text-pthread)** plugin; Rich text source plugin with many advanced features. | ||
|
||
### Additional plugins | ||
|
||
If the builds of OBS Studio offered here don't include a plugin that you use, | ||
you can download a pre-compiled version and add it to the portable folder: | ||
|
||
- Put any `.so` files in `obs-plugins/64bit` | ||
- Put any data files associated with the plugin in `data/obs-plugins/<plugin name>/` | ||
|
||
## OBS Virtual Camera | ||
|
||
OBS Studio Virtual Camera support is integrated. The `Start Virtual Camera` | ||
button is located in the Controls pane, just below `Start Recording`. Here's how | ||
to install and configure `v4l2loopback` which OBS uses: | ||
|
||
```bash | ||
echo 'options v4l2loopback devices=1 video_nr=13 card_label="OBS Virtual Camera" exclusive_caps=1' | sudo tee /etc/modprobe.d/v4l2loopback.conf | ||
echo "v4l2loopback" | sudo tee /etc/modules-load.d/v4l2loopback.conf | ||
sudo modprobe -r v4l2loopback | ||
sudo modprobe v4l2loopback devices=1 video_nr=13 card_label="OBS Virtual Camera" exclusive_caps=1 | ||
``` | ||
|
||
**NOTE!** Using `video_nr` greater than 64 will not work. | ||
|
||
# Wayland | ||
|
||
Browser docks and streaming service integrations are currently disabled on | ||
Wayland due to Chromium Embedded Framework (CEF) issues. If you need browser | ||
docks or stream service integrations, click on the cog icon when logging into | ||
Ubuntu and select "ubuntu on xorg". | ||
|
||
Alternatively you can coerce OBS Studio to run via Xwayland without changing the | ||
desktop session: | ||
|
||
```bash | ||
env QT_QPA_PLATFORM=xcb ./obs-portable | ||
``` | ||
|
||
# Build process | ||
|
||
Each build is compiled in a freshly provisioned systemd container. The, somewhat | ||
hastily thrown together, *"build scripts"* are included in this repository. | ||
|
||
The `build-*.sh` scripts are wrappers to help automate things, with | ||
[`build-auto.sh`](./build-auto.sh) being the main entry point. | ||
|
||
The actual build script, [`obs-portable.sh`](builder/obs-portable.sh), gets | ||
injected into the new container and is responsible for actually building OBS | ||
Studio. Perhaps it might also serve as a reference for users of other Linux | ||
distributions who want to create their own portable builds of OBS Studio. | ||
|
||
# References | ||
|
||
- https://obsproject.com/wiki/Build-Instructions-For-Linux | ||
- https://github.com/snapcrafters/obs-studio | ||
- https://launchpad.net/~obsproject |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
#!/usr/bin/env bash | ||
|
||
if [ -z "${SUDO_USER}" ]; then | ||
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")" | ||
exit 1 | ||
else | ||
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6) | ||
fi | ||
|
||
if [ -z "${1}" ]; then | ||
echo "Usage: $(basename "${0}") <codename>" | ||
exit 1 | ||
fi | ||
DISTRO="${1}" | ||
|
||
case "${DISTRO}" in | ||
focal|jammy|kinetic) true;; | ||
*) echo "ERROR! Unknown Ubuntu release: ${DISTRO}" | ||
exit 1;; | ||
esac | ||
|
||
for OBS_VER in 27 28; do | ||
if [ "${DISTRO}" == "kinetic" ] && [ "${OBS_VER}" == "27" ]; then | ||
continue | ||
fi | ||
./build-trash.sh "${DISTRO}" | ||
./build-bootstrap.sh "${DISTRO}" | ||
./build-enter.sh "${DISTRO}" "/root/obs-portable.sh ${OBS_VER}" | ||
./build-get-artefacts.sh "${DISTRO}" "${OBS_VER}" | ||
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
#!/usr/bin/env bash | ||
|
||
if [ -z "${SUDO_USER}" ]; then | ||
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")" | ||
exit 1 | ||
else | ||
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6) | ||
fi | ||
|
||
if [ -z "${1}" ]; then | ||
echo "Usage: $(basename "${0}") <codename>" | ||
exit 1 | ||
fi | ||
|
||
DISTRO="${1}" | ||
case "${DISTRO}" in | ||
focal|jammy|kinetic) true;; | ||
*) echo "ERROR! Unknown version: ${DISTRO}" | ||
exit 1 | ||
;; | ||
esac | ||
R="${SUDO_HOME}/Builds/obs-builder-${DISTRO}" | ||
|
||
if [ ! -d "${R}" ]; then | ||
apt-get -y install debootstrap systemd-container debian-archive-keyring ubuntu-keyring | ||
|
||
if pidof apt-cacher-ng; then | ||
REPO="http://localhost:3142/gb.archive.ubuntu.com/ubuntu/" | ||
else | ||
REPO="http://gb.archive.ubuntu.com/ubuntu/" | ||
fi | ||
|
||
debootstrap \ | ||
--components=main,restricted,universe,multiverse \ | ||
--exclude=ubuntu-minimal,ubuntu-advantage-tools \ | ||
--include=nano,systemd-container \ | ||
"${DISTRO}" "${R}" "${REPO}" | ||
|
||
# Make sure the container has a machine-id | ||
systemd-machine-id-setup --root "${R}" --print | ||
echo "127.0.0.1 localhost ${DISTRO}" > "${R}/etc/hosts" | ||
|
||
# Set locale to C.UTF-8 by default. | ||
# https://git.launchpad.net/livecd-rootfs/tree/live-build/auto/build#n159 | ||
echo "LANG=C.UTF-8" > "${R}/etc/default/locale" | ||
|
||
echo " | ||
deb http://gb.archive.ubuntu.com/ubuntu/ ${DISTRO} main restricted universe multiverse | ||
deb http://gb.archive.ubuntu.com/ubuntu/ ${DISTRO}-updates main restricted universe multiverse | ||
deb http://gb.archive.ubuntu.com/ubuntu/ ${DISTRO}-backports main restricted universe multiverse | ||
deb http://security.ubuntu.com/ubuntu ${DISTRO}-security main restricted universe multiverse" > "${R}/etc/apt/sources.list" | ||
else | ||
echo "WARNING! ${R} already exists!" | ||
echo " Updating OBS build scripts only." | ||
fi | ||
|
||
cp builder/*.sh "${R}/root/" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#!/usr/bin/env bash | ||
|
||
cd artefacts | ||
for SHA_FILE in *.sha256; do | ||
sha256sum -c "${SHA_FILE}" | ||
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
#!/usr/bin/env bash | ||
|
||
if [ -z "${SUDO_USER}" ]; then | ||
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")" | ||
exit 1 | ||
else | ||
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6) | ||
fi | ||
|
||
if [ -z "${1}" ]; then | ||
echo "Usage: $(basename "${0}") <codename>" | ||
exit 1 | ||
fi | ||
DISTRO="${1}" | ||
|
||
if [ -n "${2}" ]; then | ||
CMD="${2}" | ||
else | ||
CMD="/bin/bash" | ||
fi | ||
|
||
case "${DISTRO}" in | ||
focal|jammy|kinetic) true;; | ||
*) echo "ERROR! Unknown version: ${DISTRO}" | ||
exit 1 | ||
;; | ||
esac | ||
|
||
R="${SUDO_HOME}/Builds/obs-builder-${DISTRO}" | ||
APT_CACHE_IP=$(ip route get 1.1.1.1 | head -n 1 | cut -d' ' -f 7) | ||
|
||
if pidof -q apt-cacher-ng && [ -d "${R}/etc/apt/apt.conf.d" ]; then | ||
echo "Acquire::http { Proxy \"http://${APT_CACHE_IP}:3142\"; }" > "${R}/etc/apt/apt.conf.d/90cache" | ||
fi | ||
|
||
echo "nameserver 1.1.1.1" > "/tmp/resolv-${DISTRO}.conf" | ||
systemd-nspawn \ | ||
--bind-ro="/tmp/resolv-${DISTRO}.conf":/etc/resolv.conf \ | ||
--chdir=/root \ | ||
--directory "${R}" \ | ||
--hostname="${DISTRO}" \ | ||
--machine="${DISTRO}" \ | ||
--resolv-conf=off \ | ||
${CMD} | ||
|
||
if [ -e "${R}/etc/apt/apt.conf.d/90cache" ]; then | ||
rm -f "${R}/etc/apt/apt.conf.d/90cache" | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
#!/usr/bin/env bash | ||
|
||
if [ -z "${SUDO_USER}" ]; then | ||
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")" | ||
exit 1 | ||
else | ||
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6) | ||
fi | ||
|
||
if [ -z "${1}" ] || [ -z "${2}" ]; then | ||
echo "Usage: $(basename "${0}") <codename> <obs_ver>" | ||
exit 1 | ||
fi | ||
|
||
DISTRO="${1}" | ||
OBS_VER="${2}" | ||
|
||
case "${DISTRO}" in | ||
focal) DISTRO_VER="20.04";; | ||
jammy) DISTRO_VER="22.04";; | ||
kinetic) DISTRO_VER="22.10";; | ||
*) echo "ERROR! Unknown Ubuntu release: ${DISTRO}" | ||
exit 1;; | ||
esac | ||
|
||
case "${OBS_VER}" in | ||
27|28) true;; | ||
*) echo "ERROR! Unsupported OBS Studio version: ${OBS_VER}" | ||
exit 1;; | ||
esac | ||
|
||
if [ -d "${SUDO_HOME}/Builds/obs-builder-${DISTRO}/root/obs-${OBS_VER}" ]; then | ||
cp -v "${SUDO_HOME}/Builds/obs-builder-${DISTRO}/root/obs-${OBS_VER}"/obs-portable-${OBS_VER}*-ubuntu-${DISTRO_VER}.* artefacts/ | ||
chown "${SUDO_USER}":"${SUDO_USER}" artefacts/obs-portable-${OBS_VER}*-ubuntu-${DISTRO_VER}.* | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#!/usr/bin/env bash | ||
|
||
if [ -z "${SUDO_USER}" ]; then | ||
echo "ERROR! You must use sudo to run this script: sudo ./$(basename "${0}")" | ||
exit 1 | ||
else | ||
SUDO_HOME=$(getent passwd "${SUDO_USER}" | cut -d: -f6) | ||
fi | ||
|
||
if [ -z "${1}" ]; then | ||
echo "Usage: $(basename "${0}") <codename>" | ||
exit 1 | ||
fi | ||
|
||
DISTRO="${1}" | ||
case "${DISTRO}" in | ||
focal|jammy|kinetic) true;; | ||
*) echo "ERROR! Unknown version: ${DISTRO}" | ||
exit 1 | ||
;; | ||
esac | ||
|
||
R="${SUDO_HOME}/Builds/obs-builder-${DISTRO}" | ||
if [ -d "${R}" ]; then | ||
rm -rf "${R}" | ||
fi |
Large diffs are not rendered by default.
Oops, something went wrong.