Copy disabled (too large)
Download .txt
Showing preview only (16,785K chars total). Download the full file to get everything.
Repository: obsproject/obs-studio
Branch: master
Commit: 5533a277e440
Files: 4796
Total size: 26.0 MB
Directory structure:
gitextract_bhk1839_/
├── .clang-format
├── .editorconfig
├── .gersemirc
├── .github/
│ ├── FUNDING.yml
│ ├── actions/
│ │ ├── build-obs/
│ │ │ └── action.yaml
│ │ ├── check-changes/
│ │ │ └── action.yaml
│ │ ├── compatibility-validator/
│ │ │ └── action.yaml
│ │ ├── flatpak-builder-lint/
│ │ │ ├── action.yaml
│ │ │ └── exceptions.json
│ │ ├── flatpak-manifest-validator/
│ │ │ └── action.yaml
│ │ ├── generate-docs/
│ │ │ └── action.yaml
│ │ ├── package-obs/
│ │ │ └── action.yaml
│ │ ├── qt-xml-validator/
│ │ │ └── action.yaml
│ │ ├── run-clang-format/
│ │ │ └── action.yaml
│ │ ├── run-gersemi/
│ │ │ └── action.yaml
│ │ ├── run-swift-format/
│ │ │ └── action.yaml
│ │ ├── services-validator/
│ │ │ └── action.yaml
│ │ ├── setup-macos-codesigning/
│ │ │ └── action.yaml
│ │ ├── sparkle-appcast/
│ │ │ ├── action.yaml
│ │ │ ├── appcast_adjust.xslt
│ │ │ └── appcast_legacy.xslt
│ │ ├── steam-upload/
│ │ │ └── action.yaml
│ │ ├── windows-analysis/
│ │ │ ├── Invoke-External.ps1
│ │ │ ├── Logger.ps1
│ │ │ ├── action.yaml
│ │ │ └── obs.pvsconfig
│ │ ├── windows-patches/
│ │ │ ├── Ensure-Location.ps1
│ │ │ ├── Invoke-External.ps1
│ │ │ ├── Logger.ps1
│ │ │ ├── action.yaml
│ │ │ └── config.toml
│ │ └── windows-signing/
│ │ ├── Ensure-Location.ps1
│ │ ├── Invoke-External.ps1
│ │ ├── Logger.ps1
│ │ ├── action.yaml
│ │ ├── cng-release-signing-key.pem
│ │ ├── config_arm64.toml
│ │ ├── config_x64.toml
│ │ ├── prod-gc.crt
│ │ ├── prod.crt
│ │ └── test.crt
│ ├── scripts/
│ │ ├── .Aptfile
│ │ ├── .Brewfile
│ │ ├── .Wingetfile
│ │ ├── .build.zsh
│ │ ├── .package.zsh
│ │ ├── Build-Windows.ps1
│ │ ├── Package-Windows.ps1
│ │ ├── utils.pwsh/
│ │ │ ├── Ensure-Location.ps1
│ │ │ ├── Install-BuildDependencies.ps1
│ │ │ ├── Invoke-External.ps1
│ │ │ └── Logger.ps1
│ │ ├── utils.py/
│ │ │ ├── check-jsonschema.py
│ │ │ └── check-services.py
│ │ └── utils.zsh/
│ │ ├── check_macos
│ │ ├── check_ubuntu
│ │ ├── create_diskimage
│ │ ├── log_debug
│ │ ├── log_error
│ │ ├── log_group
│ │ ├── log_info
│ │ ├── log_output
│ │ ├── log_status
│ │ ├── log_warning
│ │ ├── mkcd
│ │ ├── setup_ccache
│ │ └── setup_ubuntu
│ └── workflows/
│ ├── analyze-project.yaml
│ ├── build-project.yaml
│ ├── check-format.yaml
│ ├── dispatch.yaml
│ ├── pr-pull.yaml
│ ├── publish.yaml
│ ├── push.yaml
│ ├── scheduled.yaml
│ └── sign-windows.yaml
├── .gitignore
├── .gitmodules
├── .mailmap
├── .swift-format
├── AUTHORS
├── CMakeLists.txt
├── CMakePresets.json
├── COC.rst
├── COMMITMENT
├── CONTRIBUTING.rst
├── COPYING
├── INSTALL
├── README.rst
├── build-aux/
│ ├── .functions/
│ │ ├── log_debug
│ │ ├── log_error
│ │ ├── log_group
│ │ ├── log_info
│ │ ├── log_output
│ │ ├── log_status
│ │ ├── log_warning
│ │ └── set_loglevel
│ ├── .run-format.zsh
│ ├── README.md
│ ├── com.obsproject.Studio.json
│ ├── format-manifest.py
│ └── steam/
│ ├── obs_build.vdf
│ ├── obs_playtest_build.vdf
│ ├── scripts_macos/
│ │ └── launch.sh
│ └── scripts_windows/
│ ├── install.bat
│ ├── installscript.vdf
│ └── uninstall.bat
├── cmake/
│ ├── bundle/
│ │ └── windows/
│ │ ├── ALL_BUILD.vcxproj.user.in
│ │ └── obs-module.rc.in
│ ├── common/
│ │ ├── bootstrap.cmake
│ │ ├── buildnumber.cmake
│ │ ├── buildspec_common.cmake
│ │ ├── ccache.cmake
│ │ ├── compiler_common.cmake
│ │ ├── cpackconfig_common.cmake
│ │ ├── helpers_common.cmake
│ │ ├── osconfig.cmake
│ │ ├── policies.cmake
│ │ └── versionconfig.cmake
│ ├── finders/
│ │ ├── FindAMF.cmake
│ │ ├── FindAsio.cmake
│ │ ├── FindCEF.cmake
│ │ ├── FindDetours.cmake
│ │ ├── FindFFmpeg.cmake
│ │ ├── FindFFnvcodec.cmake
│ │ ├── FindGio.cmake
│ │ ├── FindJack.cmake
│ │ ├── FindLibAJANTV2.cmake
│ │ ├── FindLibUUID.cmake
│ │ ├── FindLibVLC.cmake
│ │ ├── FindLibdrm.cmake
│ │ ├── FindLibfdk.cmake
│ │ ├── FindLibpci.cmake
│ │ ├── FindLibrist.cmake
│ │ ├── FindLibrnnoise.cmake
│ │ ├── FindLibspeexdsp.cmake
│ │ ├── FindLibsrt.cmake
│ │ ├── FindLibudev.cmake
│ │ ├── FindLibv4l2.cmake
│ │ ├── FindLibva.cmake
│ │ ├── FindLibx264.cmake
│ │ ├── FindLuajit.cmake
│ │ ├── FindMbedTLS.cmake
│ │ ├── FindOSS.cmake
│ │ ├── FindPipeWire.cmake
│ │ ├── FindPulseAudio.cmake
│ │ ├── FindSIMDe.cmake
│ │ ├── FindSndio.cmake
│ │ ├── FindSysinfo.cmake
│ │ ├── FindUthash.cmake
│ │ ├── FindVPL.cmake
│ │ ├── FindWebsocketpp.cmake
│ │ ├── FindXkbcommon.cmake
│ │ ├── Findjansson.cmake
│ │ └── Findqrcodegencpp.cmake
│ ├── linux/
│ │ ├── compilerconfig.cmake
│ │ ├── cpackconfig.cmake
│ │ ├── defaults.cmake
│ │ ├── ecmconfig.cmake
│ │ ├── helpers.cmake
│ │ ├── toolchain-aarch64-clang.cmake
│ │ ├── toolchain-aarch64-gcc.cmake
│ │ └── toolchain-x86_64-gcc.cmake
│ ├── macos/
│ │ ├── buildspec.cmake
│ │ ├── compilerconfig.cmake
│ │ ├── defaults.cmake
│ │ ├── helpers.cmake
│ │ ├── resources/
│ │ │ ├── AppIcon.icns
│ │ │ ├── background.tiff
│ │ │ └── package.applescript
│ │ └── xcode.cmake
│ └── windows/
│ ├── FindPython.cmake
│ ├── architecture.cmake
│ ├── buildspec.cmake
│ ├── compilerconfig.cmake
│ ├── cpackconfig.cmake
│ ├── defaults.cmake
│ ├── helpers.cmake
│ └── idlfilehelper.cmake
├── deps/
│ ├── blake2/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE.blake2
│ │ └── src/
│ │ ├── blake2-impl.h
│ │ ├── blake2.h
│ │ └── blake2b-ref.c
│ ├── glad/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ ├── EGL/
│ │ │ │ └── eglplatform.h
│ │ │ ├── KHR/
│ │ │ │ └── khrplatform.h
│ │ │ └── glad/
│ │ │ ├── glad.h
│ │ │ ├── glad_egl.h
│ │ │ └── glad_wgl.h
│ │ └── src/
│ │ ├── glad.c
│ │ ├── glad_egl.c
│ │ └── glad_wgl.c
│ ├── json11/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE.txt
│ │ ├── json11.cpp
│ │ └── json11.hpp
│ ├── libcaption/
│ │ ├── .clang-format
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── Doxyfile.in
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── caption/
│ │ │ ├── caption.h
│ │ │ ├── cea708.h
│ │ │ ├── dvtcc.h
│ │ │ ├── eia608.h
│ │ │ ├── eia608_charmap.h
│ │ │ ├── mpeg.h
│ │ │ ├── scc.h
│ │ │ ├── srt.h
│ │ │ ├── utf8.h
│ │ │ ├── vtt.h
│ │ │ └── xds.h
│ │ ├── format.sh
│ │ └── src/
│ │ ├── caption.c
│ │ ├── cea708.c
│ │ ├── dvtcc.c
│ │ ├── eia608.c
│ │ ├── eia608_charmap.c
│ │ ├── eia608_from_utf8.c
│ │ ├── eia608_from_utf8.re2c
│ │ ├── mpeg.c
│ │ ├── scc.c
│ │ ├── srt.c
│ │ ├── utf8.c
│ │ ├── vtt.c
│ │ └── xds.c
│ ├── libdshowcapture/
│ │ └── CMakeLists.txt
│ └── w32-pthreads/
│ ├── .clang-format
│ ├── ANNOUNCE
│ ├── BUGS
│ ├── Bmakefile
│ ├── CMakeLists.txt
│ ├── CONTRIBUTORS
│ ├── COPYING
│ ├── COPYING.LIB
│ ├── ChangeLog
│ ├── FAQ
│ ├── GNUmakefile
│ ├── MAINTAINERS
│ ├── Makefile
│ ├── NEWS
│ ├── Nmakefile
│ ├── Nmakefile.tests
│ ├── PROGRESS
│ ├── README
│ ├── README.Borland
│ ├── README.CV
│ ├── README.NONPORTABLE
│ ├── README.Watcom
│ ├── README.WinCE
│ ├── TODO
│ ├── WinCE-PORT
│ ├── attr.c
│ ├── autostatic.c
│ ├── barrier.c
│ ├── builddmc.bat
│ ├── cancel.c
│ ├── cleanup.c
│ ├── cmake/
│ │ ├── w32-pthreadsConfig.cmake.in
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── condvar.c
│ ├── config.h
│ ├── context.h
│ ├── create.c
│ ├── dll.c
│ ├── errno.c
│ ├── exit.c
│ ├── fork.c
│ ├── global.c
│ ├── implement.h
│ ├── libpthreadGC2.a
│ ├── libpthreadGC2.stamp
│ ├── manual/
│ │ ├── ChangeLog
│ │ ├── PortabilityIssues.html
│ │ ├── index.html
│ │ ├── pthreadCancelableWait.html
│ │ ├── pthread_attr_init.html
│ │ ├── pthread_attr_setstackaddr.html
│ │ ├── pthread_attr_setstacksize.html
│ │ ├── pthread_barrier_init.html
│ │ ├── pthread_barrier_wait.html
│ │ ├── pthread_barrierattr_init.html
│ │ ├── pthread_barrierattr_setpshared.html
│ │ ├── pthread_cancel.html
│ │ ├── pthread_cleanup_push.html
│ │ ├── pthread_cond_init.html
│ │ ├── pthread_condattr_init.html
│ │ ├── pthread_condattr_setpshared.html
│ │ ├── pthread_create.html
│ │ ├── pthread_delay_np.html
│ │ ├── pthread_detach.html
│ │ ├── pthread_equal.html
│ │ ├── pthread_exit.html
│ │ ├── pthread_getunique_np.html
│ │ ├── pthread_getw32threadhandle_np.html
│ │ ├── pthread_join.html
│ │ ├── pthread_key_create.html
│ │ ├── pthread_kill.html
│ │ ├── pthread_mutex_init.html
│ │ ├── pthread_mutexattr_init.html
│ │ ├── pthread_mutexattr_setpshared.html
│ │ ├── pthread_num_processors_np.html
│ │ ├── pthread_once.html
│ │ ├── pthread_rwlock_init.html
│ │ ├── pthread_rwlock_rdlock.html
│ │ ├── pthread_rwlock_timedrdlock.html
│ │ ├── pthread_rwlock_timedwrlock.html
│ │ ├── pthread_rwlock_unlock.html
│ │ ├── pthread_rwlock_wrlock.html
│ │ ├── pthread_rwlockattr_init.html
│ │ ├── pthread_rwlockattr_setpshared.html
│ │ ├── pthread_self.html
│ │ ├── pthread_setcancelstate.html
│ │ ├── pthread_setcanceltype.html
│ │ ├── pthread_setconcurrency.html
│ │ ├── pthread_setschedparam.html
│ │ ├── pthread_spin_init.html
│ │ ├── pthread_spin_lock.html
│ │ ├── pthread_spin_unlock.html
│ │ ├── pthread_timechange_handler_np.html
│ │ ├── pthread_win32_attach_detach_np.html
│ │ ├── pthread_win32_test_features_np.html
│ │ ├── sched_get_priority_max.html
│ │ ├── sched_getscheduler.html
│ │ ├── sched_setscheduler.html
│ │ ├── sched_yield.html
│ │ └── sem_init.html
│ ├── misc.c
│ ├── mutex.c
│ ├── need_errno.h
│ ├── nonportable.c
│ ├── private.c
│ ├── pthread.c
│ ├── pthread.dsp
│ ├── pthread.dsw
│ ├── pthread.h
│ ├── pthread.lastbuildstate
│ ├── pthread.sln
│ ├── pthread.vcxproj
│ ├── pthread.vcxproj.filters
│ ├── pthread_attr_destroy.c
│ ├── pthread_attr_getdetachstate.c
│ ├── pthread_attr_getinheritsched.c
│ ├── pthread_attr_getschedparam.c
│ ├── pthread_attr_getschedpolicy.c
│ ├── pthread_attr_getscope.c
│ ├── pthread_attr_getstackaddr.c
│ ├── pthread_attr_getstacksize.c
│ ├── pthread_attr_init.c
│ ├── pthread_attr_setdetachstate.c
│ ├── pthread_attr_setinheritsched.c
│ ├── pthread_attr_setschedparam.c
│ ├── pthread_attr_setschedpolicy.c
│ ├── pthread_attr_setscope.c
│ ├── pthread_attr_setstackaddr.c
│ ├── pthread_attr_setstacksize.c
│ ├── pthread_barrier_destroy.c
│ ├── pthread_barrier_init.c
│ ├── pthread_barrier_wait.c
│ ├── pthread_barrierattr_destroy.c
│ ├── pthread_barrierattr_getpshared.c
│ ├── pthread_barrierattr_init.c
│ ├── pthread_barrierattr_setpshared.c
│ ├── pthread_cancel.c
│ ├── pthread_cond_destroy.c
│ ├── pthread_cond_init.c
│ ├── pthread_cond_signal.c
│ ├── pthread_cond_wait.c
│ ├── pthread_condattr_destroy.c
│ ├── pthread_condattr_getpshared.c
│ ├── pthread_condattr_init.c
│ ├── pthread_condattr_setpshared.c
│ ├── pthread_delay_np.c
│ ├── pthread_detach.c
│ ├── pthread_equal.c
│ ├── pthread_exit.c
│ ├── pthread_getconcurrency.c
│ ├── pthread_getschedparam.c
│ ├── pthread_getspecific.c
│ ├── pthread_getunique_np.c
│ ├── pthread_getw32threadhandle_np.c
│ ├── pthread_join.c
│ ├── pthread_key_create.c
│ ├── pthread_key_delete.c
│ ├── pthread_kill.c
│ ├── pthread_mutex_consistent.c
│ ├── pthread_mutex_destroy.c
│ ├── pthread_mutex_init.c
│ ├── pthread_mutex_lock.c
│ ├── pthread_mutex_timedlock.c
│ ├── pthread_mutex_trylock.c
│ ├── pthread_mutex_unlock.c
│ ├── pthread_mutexattr_destroy.c
│ ├── pthread_mutexattr_getkind_np.c
│ ├── pthread_mutexattr_getpshared.c
│ ├── pthread_mutexattr_getrobust.c
│ ├── pthread_mutexattr_gettype.c
│ ├── pthread_mutexattr_init.c
│ ├── pthread_mutexattr_setkind_np.c
│ ├── pthread_mutexattr_setpshared.c
│ ├── pthread_mutexattr_setrobust.c
│ ├── pthread_mutexattr_settype.c
│ ├── pthread_num_processors_np.c
│ ├── pthread_once.c
│ ├── pthread_rwlock_destroy.c
│ ├── pthread_rwlock_init.c
│ ├── pthread_rwlock_rdlock.c
│ ├── pthread_rwlock_timedrdlock.c
│ ├── pthread_rwlock_timedwrlock.c
│ ├── pthread_rwlock_tryrdlock.c
│ ├── pthread_rwlock_trywrlock.c
│ ├── pthread_rwlock_unlock.c
│ ├── pthread_rwlock_wrlock.c
│ ├── pthread_rwlockattr_destroy.c
│ ├── pthread_rwlockattr_getpshared.c
│ ├── pthread_rwlockattr_init.c
│ ├── pthread_rwlockattr_setpshared.c
│ ├── pthread_self.c
│ ├── pthread_setcancelstate.c
│ ├── pthread_setcanceltype.c
│ ├── pthread_setconcurrency.c
│ ├── pthread_setschedparam.c
│ ├── pthread_setspecific.c
│ ├── pthread_spin_destroy.c
│ ├── pthread_spin_init.c
│ ├── pthread_spin_lock.c
│ ├── pthread_spin_trylock.c
│ ├── pthread_spin_unlock.c
│ ├── pthread_testcancel.c
│ ├── pthread_timechange_handler_np.c
│ ├── pthread_win32_attach_detach_np.c
│ ├── ptw32_MCS_lock.c
│ ├── ptw32_OLL_lock.c
│ ├── ptw32_callUserDestroyRoutines.c
│ ├── ptw32_calloc.c
│ ├── ptw32_cond_check_need_init.c
│ ├── ptw32_getprocessors.c
│ ├── ptw32_is_attr.c
│ ├── ptw32_mutex_check_need_init.c
│ ├── ptw32_new.c
│ ├── ptw32_processInitialize.c
│ ├── ptw32_processTerminate.c
│ ├── ptw32_relmillisecs.c
│ ├── ptw32_reuse.c
│ ├── ptw32_rwlock_cancelwrwait.c
│ ├── ptw32_rwlock_check_need_init.c
│ ├── ptw32_semwait.c
│ ├── ptw32_spinlock_check_need_init.c
│ ├── ptw32_threadDestroy.c
│ ├── ptw32_threadStart.c
│ ├── ptw32_throw.c
│ ├── ptw32_timespec.c
│ ├── ptw32_tkAssocCreate.c
│ ├── ptw32_tkAssocDestroy.c
│ ├── rwlock.c
│ ├── sched.c
│ ├── sched.h
│ ├── sched_get_priority_max.c
│ ├── sched_get_priority_min.c
│ ├── sched_getscheduler.c
│ ├── sched_setscheduler.c
│ ├── sched_yield.c
│ ├── sem_close.c
│ ├── sem_destroy.c
│ ├── sem_getvalue.c
│ ├── sem_init.c
│ ├── sem_open.c
│ ├── sem_post.c
│ ├── sem_post_multiple.c
│ ├── sem_timedwait.c
│ ├── sem_trywait.c
│ ├── sem_unlink.c
│ ├── sem_wait.c
│ ├── semaphore.c
│ ├── semaphore.h
│ ├── signal.c
│ ├── spin.c
│ ├── sync.c
│ ├── tests/
│ │ ├── Bmakefile
│ │ ├── ChangeLog
│ │ ├── Debug.dsp
│ │ ├── Debug.dsw
│ │ ├── Debug.plg
│ │ ├── Debug.txt
│ │ ├── GNUmakefile
│ │ ├── Makefile
│ │ ├── README
│ │ ├── README.BENCHTESTS
│ │ ├── SIZES.GC
│ │ ├── SIZES.GCE
│ │ ├── SIZES.VC
│ │ ├── SIZES.VCE
│ │ ├── SIZES.VSE
│ │ ├── Wmakefile
│ │ ├── barrier1.c
│ │ ├── barrier2.c
│ │ ├── barrier3.c
│ │ ├── barrier4.c
│ │ ├── barrier5.c
│ │ ├── barrier6.c
│ │ ├── benchlib.c
│ │ ├── benchtest.h
│ │ ├── benchtest1.c
│ │ ├── benchtest2.c
│ │ ├── benchtest3.c
│ │ ├── benchtest4.c
│ │ ├── benchtest5.c
│ │ ├── cancel1.c
│ │ ├── cancel2.c
│ │ ├── cancel3.c
│ │ ├── cancel4.c
│ │ ├── cancel5.c
│ │ ├── cancel6a.c
│ │ ├── cancel6d.c
│ │ ├── cancel7.c
│ │ ├── cancel8.c
│ │ ├── cancel9.c
│ │ ├── cleanup0.c
│ │ ├── cleanup1.c
│ │ ├── cleanup2.c
│ │ ├── cleanup3.c
│ │ ├── condvar1.c
│ │ ├── condvar1_1.c
│ │ ├── condvar1_2.c
│ │ ├── condvar2.c
│ │ ├── condvar2_1.c
│ │ ├── condvar3.c
│ │ ├── condvar3_1.c
│ │ ├── condvar3_2.c
│ │ ├── condvar3_3.c
│ │ ├── condvar4.c
│ │ ├── condvar5.c
│ │ ├── condvar6.c
│ │ ├── condvar7.c
│ │ ├── condvar8.c
│ │ ├── condvar9.c
│ │ ├── context1.c
│ │ ├── count1.c
│ │ ├── create1.c
│ │ ├── create2.c
│ │ ├── create3.c
│ │ ├── delay1.c
│ │ ├── delay2.c
│ │ ├── detach1.c
│ │ ├── equal1.c
│ │ ├── errno1.c
│ │ ├── exception1.c
│ │ ├── exception2.c
│ │ ├── exception3.c
│ │ ├── exit1.c
│ │ ├── exit2.c
│ │ ├── exit3.c
│ │ ├── exit4.c
│ │ ├── exit5.c
│ │ ├── eyal1.c
│ │ ├── inherit1.c
│ │ ├── join0.c
│ │ ├── join1.c
│ │ ├── join2.c
│ │ ├── join3.c
│ │ ├── kill1.c
│ │ ├── loadfree.c
│ │ ├── mutex1.c
│ │ ├── mutex1e.c
│ │ ├── mutex1n.c
│ │ ├── mutex1r.c
│ │ ├── mutex2.c
│ │ ├── mutex2e.c
│ │ ├── mutex2r.c
│ │ ├── mutex3.c
│ │ ├── mutex3e.c
│ │ ├── mutex3r.c
│ │ ├── mutex4.c
│ │ ├── mutex5.c
│ │ ├── mutex6.c
│ │ ├── mutex6e.c
│ │ ├── mutex6es.c
│ │ ├── mutex6n.c
│ │ ├── mutex6r.c
│ │ ├── mutex6rs.c
│ │ ├── mutex6s.c
│ │ ├── mutex7.c
│ │ ├── mutex7e.c
│ │ ├── mutex7n.c
│ │ ├── mutex7r.c
│ │ ├── mutex8.c
│ │ ├── mutex8e.c
│ │ ├── mutex8n.c
│ │ ├── mutex8r.c
│ │ ├── once1.c
│ │ ├── once2.c
│ │ ├── once3.c
│ │ ├── once4.c
│ │ ├── openmp1.c
│ │ ├── priority1.c
│ │ ├── priority2.c
│ │ ├── reuse1.c
│ │ ├── reuse2.c
│ │ ├── robust1.c
│ │ ├── robust2.c
│ │ ├── robust3.c
│ │ ├── robust4.c
│ │ ├── robust5.c
│ │ ├── rwlock1.c
│ │ ├── rwlock2.c
│ │ ├── rwlock2_t.c
│ │ ├── rwlock3.c
│ │ ├── rwlock3_t.c
│ │ ├── rwlock4.c
│ │ ├── rwlock4_t.c
│ │ ├── rwlock5.c
│ │ ├── rwlock5_t.c
│ │ ├── rwlock6.c
│ │ ├── rwlock6_t.c
│ │ ├── rwlock6_t2.c
│ │ ├── rwlock7.c
│ │ ├── rwlock8.c
│ │ ├── self1.c
│ │ ├── self2.c
│ │ ├── semaphore1.c
│ │ ├── semaphore2.c
│ │ ├── semaphore3.c
│ │ ├── semaphore4.c
│ │ ├── semaphore4t.c
│ │ ├── semaphore5.c
│ │ ├── sequence1.c
│ │ ├── sizes.c
│ │ ├── spin1.c
│ │ ├── spin2.c
│ │ ├── spin3.c
│ │ ├── spin4.c
│ │ ├── stress1.c
│ │ ├── test.h
│ │ ├── tryentercs.c
│ │ ├── tryentercs2.c
│ │ ├── tsd1.c
│ │ ├── tsd2.c
│ │ ├── valid1.c
│ │ └── valid2.c
│ ├── tsd.c
│ ├── version.rc
│ ├── w32-pthreadsConfig.cmake.in
│ ├── w32-pthreadsConfigVersion.cmake.in
│ └── w32_CancelableWait.c
├── docs/
│ └── sphinx/
│ ├── Makefile
│ ├── _build/
│ │ └── .gitignore
│ ├── _static/
│ │ ├── .gitignore
│ │ └── css/
│ │ └── custom.css
│ ├── _templates/
│ │ └── .gitignore
│ ├── backend-design.rst
│ ├── conf.py
│ ├── frontends.rst
│ ├── graphics.rst
│ ├── index.rst
│ ├── make.bat
│ ├── plugins.rst
│ ├── reference-canvases.rst
│ ├── reference-core-objects.rst
│ ├── reference-core.rst
│ ├── reference-encoders.rst
│ ├── reference-frontend-api.rst
│ ├── reference-libobs-callback.rst
│ ├── reference-libobs-graphics-axisang.rst
│ ├── reference-libobs-graphics-effects.rst
│ ├── reference-libobs-graphics-graphics.rst
│ ├── reference-libobs-graphics-image-file.rst
│ ├── reference-libobs-graphics-math.rst
│ ├── reference-libobs-graphics-matrix4.rst
│ ├── reference-libobs-graphics-quat.rst
│ ├── reference-libobs-graphics-vec2.rst
│ ├── reference-libobs-graphics-vec3.rst
│ ├── reference-libobs-graphics-vec4.rst
│ ├── reference-libobs-graphics.rst
│ ├── reference-libobs-media-io.rst
│ ├── reference-libobs-util-base.rst
│ ├── reference-libobs-util-bmem.rst
│ ├── reference-libobs-util-config-file.rst
│ ├── reference-libobs-util-darray.rst
│ ├── reference-libobs-util-deque.rst
│ ├── reference-libobs-util-dstr.rst
│ ├── reference-libobs-util-platform.rst
│ ├── reference-libobs-util-profiler.rst
│ ├── reference-libobs-util-serializers.rst
│ ├── reference-libobs-util-source-profiler.rst
│ ├── reference-libobs-util-text-lookup.rst
│ ├── reference-libobs-util-threading.rst
│ ├── reference-libobs-util.rst
│ ├── reference-modules.rst
│ ├── reference-outputs.rst
│ ├── reference-properties.rst
│ ├── reference-scenes.rst
│ ├── reference-services.rst
│ ├── reference-settings.rst
│ ├── reference-sources.rst
│ ├── requirements.txt
│ └── scripting.rst
├── frontend/
│ ├── CMakeLists.txt
│ ├── OBSApp.cpp
│ ├── OBSApp.hpp
│ ├── OBSApp_Themes.cpp
│ ├── OBSStudioAPI.cpp
│ ├── OBSStudioAPI.hpp
│ ├── api/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── linux/
│ │ │ │ └── obs-frontend-api.pc.in
│ │ │ ├── obs-frontend-apiConfig.cmake.in
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── obs-frontend-api.cpp
│ │ ├── obs-frontend-api.h
│ │ └── obs-frontend-internal.hpp
│ ├── cmake/
│ │ ├── feature-browserpanels.cmake
│ │ ├── feature-idian-playground.cmake
│ │ ├── feature-importers.cmake
│ │ ├── feature-macos-update.cmake
│ │ ├── feature-plugin-manager.cmake
│ │ ├── feature-restream.cmake
│ │ ├── feature-sparkle.cmake
│ │ ├── feature-twitch.cmake
│ │ ├── feature-whatsnew.cmake
│ │ ├── feature-youtube.cmake
│ │ ├── linux/
│ │ │ ├── com.obsproject.Studio.desktop
│ │ │ └── com.obsproject.Studio.metainfo.xml.in
│ │ ├── macos/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist.in
│ │ │ ├── entitlements-extension.plist
│ │ │ ├── entitlements.plist
│ │ │ ├── exportOptions-extension.plist.in
│ │ │ ├── exportOptions.plist.in
│ │ │ └── qt.conf
│ │ ├── os-freebsd.cmake
│ │ ├── os-linux.cmake
│ │ ├── os-macos.cmake
│ │ ├── os-windows.cmake
│ │ ├── templates/
│ │ │ └── ui-config.h.in
│ │ ├── ui-components.cmake
│ │ ├── ui-dialogs.cmake
│ │ ├── ui-docks.cmake
│ │ ├── ui-models.cmake
│ │ ├── ui-oauth.cmake
│ │ ├── ui-qt.cmake
│ │ ├── ui-settings.cmake
│ │ ├── ui-utility.cmake
│ │ ├── ui-widgets.cmake
│ │ ├── ui-wizards.cmake
│ │ └── windows/
│ │ ├── obs.manifest
│ │ └── obs.rc.in
│ ├── components/
│ │ ├── AbsoluteSlider.cpp
│ │ ├── AbsoluteSlider.hpp
│ │ ├── AccessibleAlignmentCell.cpp
│ │ ├── AccessibleAlignmentCell.hpp
│ │ ├── AccessibleAlignmentSelector.cpp
│ │ ├── AccessibleAlignmentSelector.hpp
│ │ ├── AlignmentSelector.cpp
│ │ ├── AlignmentSelector.hpp
│ │ ├── ApplicationAudioCaptureToolbar.cpp
│ │ ├── ApplicationAudioCaptureToolbar.hpp
│ │ ├── AudioCaptureToolbar.cpp
│ │ ├── AudioCaptureToolbar.hpp
│ │ ├── BalanceSlider.hpp
│ │ ├── BrowserToolbar.cpp
│ │ ├── BrowserToolbar.hpp
│ │ ├── ClickableLabel.hpp
│ │ ├── ColorSourceToolbar.cpp
│ │ ├── ColorSourceToolbar.hpp
│ │ ├── ComboSelectToolbar.cpp
│ │ ├── ComboSelectToolbar.hpp
│ │ ├── DelButton.hpp
│ │ ├── DeviceCaptureToolbar.cpp
│ │ ├── DeviceCaptureToolbar.hpp
│ │ ├── DisplayCaptureToolbar.cpp
│ │ ├── DisplayCaptureToolbar.hpp
│ │ ├── EditWidget.hpp
│ │ ├── FocusList.cpp
│ │ ├── FocusList.hpp
│ │ ├── GameCaptureToolbar.cpp
│ │ ├── GameCaptureToolbar.hpp
│ │ ├── ImageSourceToolbar.cpp
│ │ ├── ImageSourceToolbar.hpp
│ │ ├── MediaControls.cpp
│ │ ├── MediaControls.hpp
│ │ ├── MenuButton.cpp
│ │ ├── MenuButton.hpp
│ │ ├── MenuCheckBox.cpp
│ │ ├── MenuCheckBox.hpp
│ │ ├── Multiview.cpp
│ │ ├── Multiview.hpp
│ │ ├── MuteCheckBox.hpp
│ │ ├── OBSAdvAudioCtrl.cpp
│ │ ├── OBSAdvAudioCtrl.hpp
│ │ ├── OBSPreviewScalingComboBox.cpp
│ │ ├── OBSPreviewScalingComboBox.hpp
│ │ ├── OBSPreviewScalingLabel.cpp
│ │ ├── OBSPreviewScalingLabel.hpp
│ │ ├── OBSSourceLabel.cpp
│ │ ├── OBSSourceLabel.hpp
│ │ ├── SceneTree.cpp
│ │ ├── SceneTree.hpp
│ │ ├── SilentUpdateCheckBox.hpp
│ │ ├── SilentUpdateSpinBox.hpp
│ │ ├── SourceToolbar.cpp
│ │ ├── SourceToolbar.hpp
│ │ ├── SourceTree.cpp
│ │ ├── SourceTree.hpp
│ │ ├── SourceTreeDelegate.cpp
│ │ ├── SourceTreeDelegate.hpp
│ │ ├── SourceTreeItem.cpp
│ │ ├── SourceTreeItem.hpp
│ │ ├── SourceTreeModel.cpp
│ │ ├── SourceTreeModel.hpp
│ │ ├── TextSourceToolbar.cpp
│ │ ├── TextSourceToolbar.hpp
│ │ ├── UIValidation.cpp
│ │ ├── UIValidation.hpp
│ │ ├── UrlPushButton.cpp
│ │ ├── UrlPushButton.hpp
│ │ ├── VisibilityItemDelegate.cpp
│ │ ├── VisibilityItemDelegate.hpp
│ │ ├── VisibilityItemWidget.cpp
│ │ ├── VisibilityItemWidget.hpp
│ │ ├── VolumeAccessibleInterface.cpp
│ │ ├── VolumeAccessibleInterface.hpp
│ │ ├── VolumeControl.cpp
│ │ ├── VolumeControl.hpp
│ │ ├── VolumeMeter.cpp
│ │ ├── VolumeMeter.hpp
│ │ ├── VolumeName.cpp
│ │ ├── VolumeName.hpp
│ │ ├── VolumeSlider.cpp
│ │ ├── VolumeSlider.hpp
│ │ ├── WindowCaptureToolbar.cpp
│ │ └── WindowCaptureToolbar.hpp
│ ├── data/
│ │ ├── OBSPublicRSAKey.pem
│ │ ├── license/
│ │ │ └── gplv2.txt
│ │ ├── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bem-ZM.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── eo-UY.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── lv-LV.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pa-IN.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── te-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── locale.ini
│ │ ├── striped_line.effect
│ │ └── themes/
│ │ ├── System.obt
│ │ ├── Yami.obt
│ │ ├── Yami_Acri.ovt
│ │ ├── Yami_Classic.ovt
│ │ ├── Yami_Default.ovt
│ │ ├── Yami_Grey.ovt
│ │ ├── Yami_Light.ovt
│ │ └── Yami_Rachni.ovt
│ ├── dialogs/
│ │ ├── LogUploadDialog.cpp
│ │ ├── LogUploadDialog.hpp
│ │ ├── NameDialog.cpp
│ │ ├── NameDialog.hpp
│ │ ├── OAuthLogin.cpp
│ │ ├── OAuthLogin.hpp
│ │ ├── OBSAbout.cpp
│ │ ├── OBSAbout.hpp
│ │ ├── OBSBasicAdvAudio.cpp
│ │ ├── OBSBasicAdvAudio.hpp
│ │ ├── OBSBasicFilters.cpp
│ │ ├── OBSBasicFilters.hpp
│ │ ├── OBSBasicInteraction.cpp
│ │ ├── OBSBasicInteraction.hpp
│ │ ├── OBSBasicProperties.cpp
│ │ ├── OBSBasicProperties.hpp
│ │ ├── OBSBasicSourceSelect.cpp
│ │ ├── OBSBasicSourceSelect.hpp
│ │ ├── OBSBasicTransform.cpp
│ │ ├── OBSBasicTransform.hpp
│ │ ├── OBSBasicVCamConfig.cpp
│ │ ├── OBSBasicVCamConfig.hpp
│ │ ├── OBSExtraBrowsers.cpp
│ │ ├── OBSExtraBrowsers.hpp
│ │ ├── OBSIdianPlayground.cpp
│ │ ├── OBSIdianPlayground.hpp
│ │ ├── OBSLogViewer.cpp
│ │ ├── OBSLogViewer.hpp
│ │ ├── OBSMissingFiles.cpp
│ │ ├── OBSMissingFiles.hpp
│ │ ├── OBSPermissions.cpp
│ │ ├── OBSPermissions.hpp
│ │ ├── OBSRemux.cpp
│ │ ├── OBSRemux.hpp
│ │ ├── OBSUpdate.cpp
│ │ ├── OBSUpdate.hpp
│ │ ├── OBSWhatsNew.cpp
│ │ ├── OBSWhatsNew.hpp
│ │ ├── OBSYoutubeActions.cpp
│ │ └── OBSYoutubeActions.hpp
│ ├── docks/
│ │ ├── BrowserDock.cpp
│ │ ├── BrowserDock.hpp
│ │ ├── OBSDock.cpp
│ │ ├── OBSDock.hpp
│ │ ├── YouTubeAppDock.cpp
│ │ ├── YouTubeAppDock.hpp
│ │ ├── YouTubeChatDock.cpp
│ │ └── YouTubeChatDock.hpp
│ ├── forms/
│ │ ├── AutoConfigFinishPage.ui
│ │ ├── AutoConfigStartPage.ui
│ │ ├── AutoConfigStreamPage.ui
│ │ ├── AutoConfigTestPage.ui
│ │ ├── AutoConfigVideoPage.ui
│ │ ├── ColorSelect.ui
│ │ ├── LogUploadDialog.ui
│ │ ├── OBSAbout.ui
│ │ ├── OBSAdvAudio.ui
│ │ ├── OBSBasic.ui
│ │ ├── OBSBasicControls.ui
│ │ ├── OBSBasicFilters.ui
│ │ ├── OBSBasicInteraction.ui
│ │ ├── OBSBasicProperties.ui
│ │ ├── OBSBasicSettings.ui
│ │ ├── OBSBasicSourceSelect.ui
│ │ ├── OBSBasicTransform.ui
│ │ ├── OBSBasicVCamConfig.ui
│ │ ├── OBSExtraBrowsers.ui
│ │ ├── OBSIdianPlayground.ui
│ │ ├── OBSImporter.ui
│ │ ├── OBSLogViewer.ui
│ │ ├── OBSMissingFiles.ui
│ │ ├── OBSPermissions.ui
│ │ ├── OBSRemux.ui
│ │ ├── OBSUpdate.ui
│ │ ├── OBSYoutubeActions.ui
│ │ ├── PluginManagerWindow.ui
│ │ ├── StatusBarWidget.ui
│ │ ├── XML-Schema-Qt5.15.xsd
│ │ ├── obs.qrc
│ │ └── source-toolbar/
│ │ ├── browser-source-toolbar.ui
│ │ ├── color-source-toolbar.ui
│ │ ├── device-select-toolbar.ui
│ │ ├── game-capture-toolbar.ui
│ │ ├── image-source-toolbar.ui
│ │ ├── media-controls.ui
│ │ └── text-source-toolbar.ui
│ ├── importer/
│ │ ├── ImporterEntryPathItemDelegate.cpp
│ │ ├── ImporterEntryPathItemDelegate.hpp
│ │ ├── ImporterModel.cpp
│ │ ├── ImporterModel.hpp
│ │ ├── OBSImporter.cpp
│ │ └── OBSImporter.hpp
│ ├── importers/
│ │ ├── classic.cpp
│ │ ├── importers.cpp
│ │ ├── importers.hpp
│ │ ├── sl.cpp
│ │ ├── studio.cpp
│ │ └── xsplit.cpp
│ ├── models/
│ │ ├── Rect.cpp
│ │ ├── Rect.hpp
│ │ ├── SceneCollection.cpp
│ │ └── SceneCollection.hpp
│ ├── oauth/
│ │ ├── Auth.cpp
│ │ ├── Auth.hpp
│ │ ├── AuthListener.cpp
│ │ ├── AuthListener.hpp
│ │ ├── OAuth.cpp
│ │ ├── OAuth.hpp
│ │ ├── RestreamAuth.cpp
│ │ ├── RestreamAuth.hpp
│ │ ├── TwitchAuth.cpp
│ │ ├── TwitchAuth.hpp
│ │ ├── YoutubeAuth.cpp
│ │ └── YoutubeAuth.hpp
│ ├── obs-main.cpp
│ ├── plugin-manager/
│ │ ├── PluginManager.cpp
│ │ ├── PluginManager.hpp
│ │ ├── PluginManagerWindow.cpp
│ │ └── PluginManagerWindow.hpp
│ ├── plugins/
│ │ ├── CMakeLists.txt
│ │ ├── aja-output-ui/
│ │ │ ├── AJAOutputUI.cpp
│ │ │ ├── AJAOutputUI.h
│ │ │ ├── CMakeLists.txt
│ │ │ ├── aja-ui-main.cpp
│ │ │ ├── aja-ui-main.h
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ ├── data/
│ │ │ │ └── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── lv-LV.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── ur-PK.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── forms/
│ │ │ └── output.ui
│ │ ├── decklink-captions/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ ├── data/
│ │ │ │ └── .keepme
│ │ │ ├── decklink-captions.cpp
│ │ │ ├── decklink-captions.h
│ │ │ └── forms/
│ │ │ └── captions.ui
│ │ ├── decklink-output-ui/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── DecklinkOutputUI.cpp
│ │ │ ├── DecklinkOutputUI.h
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ ├── data/
│ │ │ │ └── .keepme
│ │ │ ├── decklink-ui-main.cpp
│ │ │ ├── decklink-ui-main.h
│ │ │ └── forms/
│ │ │ └── output.ui
│ │ └── frontend-tools/
│ │ ├── CMakeLists.txt
│ │ ├── auto-scene-switcher-nix.cpp
│ │ ├── auto-scene-switcher-osx.mm
│ │ ├── auto-scene-switcher-win.cpp
│ │ ├── auto-scene-switcher.cpp
│ │ ├── auto-scene-switcher.hpp
│ │ ├── captions-handler.cpp
│ │ ├── captions-handler.hpp
│ │ ├── captions-mssapi-stream.cpp
│ │ ├── captions-mssapi-stream.hpp
│ │ ├── captions-mssapi.cpp
│ │ ├── captions-mssapi.hpp
│ │ ├── captions.cpp
│ │ ├── captions.hpp
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── an-ES.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── is-IS.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── lt-LT.ini
│ │ │ │ ├── lv-LV.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── oc-FR.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── scripts/
│ │ │ ├── clock-source.lua
│ │ │ ├── countdown.lua
│ │ │ ├── instant-replay.lua
│ │ │ ├── pause-scene.lua
│ │ │ └── url-text.py
│ │ ├── forms/
│ │ │ ├── auto-scene-switcher.ui
│ │ │ ├── captions.ui
│ │ │ ├── output-timer.ui
│ │ │ └── scripts.ui
│ │ ├── frontend-tools-config.h.in
│ │ ├── frontend-tools.c
│ │ ├── output-timer.cpp
│ │ ├── output-timer.hpp
│ │ ├── scripts.cpp
│ │ ├── scripts.hpp
│ │ └── tool-helpers.hpp
│ ├── settings/
│ │ ├── OBSBasicSettings.cpp
│ │ ├── OBSBasicSettings.hpp
│ │ ├── OBSBasicSettings_A11y.cpp
│ │ ├── OBSBasicSettings_Appearance.cpp
│ │ ├── OBSBasicSettings_Stream.cpp
│ │ ├── OBSHotkeyEdit.cpp
│ │ ├── OBSHotkeyEdit.hpp
│ │ ├── OBSHotkeyLabel.cpp
│ │ ├── OBSHotkeyLabel.hpp
│ │ ├── OBSHotkeyWidget.cpp
│ │ └── OBSHotkeyWidget.hpp
│ ├── updater/
│ │ ├── CMakeLists.txt
│ │ ├── hash.cpp
│ │ ├── helpers.cpp
│ │ ├── helpers.hpp
│ │ ├── http.cpp
│ │ ├── init-hook-files.c
│ │ ├── manifest.hpp
│ │ ├── patch.cpp
│ │ ├── resource.h
│ │ ├── updater.cpp
│ │ ├── updater.hpp
│ │ ├── updater.manifest
│ │ └── updater.rc
│ ├── utility/
│ │ ├── AdvancedOutput.cpp
│ │ ├── AdvancedOutput.hpp
│ │ ├── AutoUpdateThread.cpp
│ │ ├── AutoUpdateThread.hpp
│ │ ├── BaseLexer.hpp
│ │ ├── BasicOutputHandler.cpp
│ │ ├── BasicOutputHandler.hpp
│ │ ├── CrashHandler.cpp
│ │ ├── CrashHandler.hpp
│ │ ├── CrashHandler_FreeBSD.cpp
│ │ ├── CrashHandler_Linux.cpp
│ │ ├── CrashHandler_MacOS.mm
│ │ ├── CrashHandler_Windows.cpp
│ │ ├── ExtraBrowsersDelegate.cpp
│ │ ├── ExtraBrowsersDelegate.hpp
│ │ ├── ExtraBrowsersModel.cpp
│ │ ├── ExtraBrowsersModel.hpp
│ │ ├── FFmpegCodec.cpp
│ │ ├── FFmpegCodec.hpp
│ │ ├── FFmpegFormat.cpp
│ │ ├── FFmpegFormat.hpp
│ │ ├── FFmpegShared.hpp
│ │ ├── GoLiveAPI_CensoredJson.cpp
│ │ ├── GoLiveAPI_CensoredJson.hpp
│ │ ├── GoLiveAPI_Network.cpp
│ │ ├── GoLiveAPI_Network.hpp
│ │ ├── GoLiveAPI_PostData.cpp
│ │ ├── GoLiveAPI_PostData.hpp
│ │ ├── MacUpdateThread.cpp
│ │ ├── MacUpdateThread.hpp
│ │ ├── MissingFilesModel.cpp
│ │ ├── MissingFilesModel.hpp
│ │ ├── MissingFilesPathItemDelegate.cpp
│ │ ├── MissingFilesPathItemDelegate.hpp
│ │ ├── MultitrackVideoError.cpp
│ │ ├── MultitrackVideoError.hpp
│ │ ├── MultitrackVideoOutput.cpp
│ │ ├── MultitrackVideoOutput.hpp
│ │ ├── NativeEventFilter.cpp
│ │ ├── NativeEventFilter.hpp
│ │ ├── NativeEventFilter_Windows.cpp
│ │ ├── OBSCanvas.cpp
│ │ ├── OBSCanvas.hpp
│ │ ├── OBSEventFilter.hpp
│ │ ├── OBSProxyStyle.cpp
│ │ ├── OBSProxyStyle.hpp
│ │ ├── OBSSparkle.hpp
│ │ ├── OBSSparkle.mm
│ │ ├── OBSTheme.hpp
│ │ ├── OBSThemeVariable.hpp
│ │ ├── OBSTranslator.cpp
│ │ ├── OBSTranslator.hpp
│ │ ├── OBSUpdateDelegate.h
│ │ ├── OBSUpdateDelegate.mm
│ │ ├── PreviewProgramSizeObserver.cpp
│ │ ├── PreviewProgramSizeObserver.hpp
│ │ ├── QuickTransition.cpp
│ │ ├── QuickTransition.hpp
│ │ ├── RemoteTextThread.cpp
│ │ ├── RemoteTextThread.hpp
│ │ ├── RemuxEntryPathItemDelegate.cpp
│ │ ├── RemuxEntryPathItemDelegate.hpp
│ │ ├── RemuxQueueModel.cpp
│ │ ├── RemuxQueueModel.hpp
│ │ ├── RemuxWorker.cpp
│ │ ├── RemuxWorker.hpp
│ │ ├── SceneRenameDelegate.cpp
│ │ ├── SceneRenameDelegate.hpp
│ │ ├── ScreenshotObj.cpp
│ │ ├── ScreenshotObj.hpp
│ │ ├── SettingsEventFilter.hpp
│ │ ├── SimpleOutput.cpp
│ │ ├── SimpleOutput.hpp
│ │ ├── StartMultiTrackVideoStreamingGuard.hpp
│ │ ├── SurfaceEventFilter.hpp
│ │ ├── VCamConfig.hpp
│ │ ├── WHIPSimulcastEncoders.hpp
│ │ ├── WhatsNewBrowserInitThread.cpp
│ │ ├── WhatsNewBrowserInitThread.hpp
│ │ ├── WhatsNewInfoThread.cpp
│ │ ├── WhatsNewInfoThread.hpp
│ │ ├── YoutubeApiWrappers.cpp
│ │ ├── YoutubeApiWrappers.hpp
│ │ ├── audio-encoders.cpp
│ │ ├── audio-encoders.hpp
│ │ ├── crypto-helpers-mac.mm
│ │ ├── crypto-helpers-mbedtls.cpp
│ │ ├── crypto-helpers.hpp
│ │ ├── display-helpers.hpp
│ │ ├── item-widget-helpers.cpp
│ │ ├── item-widget-helpers.hpp
│ │ ├── models/
│ │ │ ├── branches.hpp
│ │ │ ├── multitrack-video.hpp
│ │ │ └── whatsnew.hpp
│ │ ├── obf.c
│ │ ├── obf.h
│ │ ├── platform-osx.mm
│ │ ├── platform-windows.cpp
│ │ ├── platform-x11.cpp
│ │ ├── platform.hpp
│ │ ├── system-info-macos.mm
│ │ ├── system-info-posix.cpp
│ │ ├── system-info-windows.cpp
│ │ ├── system-info.hpp
│ │ ├── undo_stack.cpp
│ │ ├── undo_stack.hpp
│ │ ├── update-helpers.cpp
│ │ ├── update-helpers.hpp
│ │ └── win-dll-blocklist.c
│ ├── widgets/
│ │ ├── AudioMixer.cpp
│ │ ├── AudioMixer.hpp
│ │ ├── ColorSelect.cpp
│ │ ├── ColorSelect.hpp
│ │ ├── OBSBasic.cpp
│ │ ├── OBSBasic.hpp
│ │ ├── OBSBasicControls.cpp
│ │ ├── OBSBasicControls.hpp
│ │ ├── OBSBasicPreview.cpp
│ │ ├── OBSBasicPreview.hpp
│ │ ├── OBSBasicStats.cpp
│ │ ├── OBSBasicStats.hpp
│ │ ├── OBSBasicStatusBar.cpp
│ │ ├── OBSBasicStatusBar.hpp
│ │ ├── OBSBasic_Browser.cpp
│ │ ├── OBSBasic_Canvases.cpp
│ │ ├── OBSBasic_Clipboard.cpp
│ │ ├── OBSBasic_ContextToolbar.cpp
│ │ ├── OBSBasic_Docks.cpp
│ │ ├── OBSBasic_Dropfiles.cpp
│ │ ├── OBSBasic_Hotkeys.cpp
│ │ ├── OBSBasic_Icons.cpp
│ │ ├── OBSBasic_MainControls.cpp
│ │ ├── OBSBasic_OutputHandler.cpp
│ │ ├── OBSBasic_Preview.cpp
│ │ ├── OBSBasic_Profiles.cpp
│ │ ├── OBSBasic_Projectors.cpp
│ │ ├── OBSBasic_Recording.cpp
│ │ ├── OBSBasic_ReplayBuffer.cpp
│ │ ├── OBSBasic_SceneCollections.cpp
│ │ ├── OBSBasic_SceneItems.cpp
│ │ ├── OBSBasic_Scenes.cpp
│ │ ├── OBSBasic_Screenshots.cpp
│ │ ├── OBSBasic_Service.cpp
│ │ ├── OBSBasic_StatusBar.cpp
│ │ ├── OBSBasic_Streaming.cpp
│ │ ├── OBSBasic_StudioMode.cpp
│ │ ├── OBSBasic_SysTray.cpp
│ │ ├── OBSBasic_Transitions.cpp
│ │ ├── OBSBasic_Updater.cpp
│ │ ├── OBSBasic_VirtualCam.cpp
│ │ ├── OBSBasic_YouTube.cpp
│ │ ├── OBSMainWindow.hpp
│ │ ├── OBSProjector.cpp
│ │ ├── OBSProjector.hpp
│ │ ├── OBSQTDisplay.cpp
│ │ ├── OBSQTDisplay.hpp
│ │ ├── StatusBarWidget.cpp
│ │ └── StatusBarWidget.hpp
│ └── wizards/
│ ├── AutoConfig.cpp
│ ├── AutoConfig.hpp
│ ├── AutoConfigStartPage.cpp
│ ├── AutoConfigStartPage.hpp
│ ├── AutoConfigStreamPage.cpp
│ ├── AutoConfigStreamPage.hpp
│ ├── AutoConfigTestPage.cpp
│ ├── AutoConfigTestPage.hpp
│ ├── AutoConfigVideoPage.cpp
│ ├── AutoConfigVideoPage.hpp
│ └── TestMode.hpp
├── libobs/
│ ├── CMakeLists.txt
│ ├── audio-monitoring/
│ │ ├── null/
│ │ │ └── null-audio-monitoring.c
│ │ ├── osx/
│ │ │ ├── coreaudio-enum-devices.c
│ │ │ ├── coreaudio-monitoring-available.c
│ │ │ ├── coreaudio-output.c
│ │ │ └── mac-helpers.h
│ │ ├── pulse/
│ │ │ ├── pulseaudio-enum-devices.c
│ │ │ ├── pulseaudio-monitoring-available.c
│ │ │ ├── pulseaudio-output.c
│ │ │ ├── pulseaudio-wrapper.c
│ │ │ └── pulseaudio-wrapper.h
│ │ └── win32/
│ │ ├── wasapi-enum-devices.c
│ │ ├── wasapi-monitoring-available.c
│ │ ├── wasapi-output.c
│ │ └── wasapi-output.h
│ ├── callback/
│ │ ├── calldata.c
│ │ ├── calldata.h
│ │ ├── decl.c
│ │ ├── decl.h
│ │ ├── proc.c
│ │ ├── proc.h
│ │ ├── signal.c
│ │ └── signal.h
│ ├── cmake/
│ │ ├── libobsConfig.cmake.in
│ │ ├── linux/
│ │ │ └── libobs.pc.in
│ │ ├── macos/
│ │ │ └── entitlements.plist
│ │ ├── obs-version.cmake
│ │ ├── os-freebsd.cmake
│ │ ├── os-linux.cmake
│ │ ├── os-macos.cmake
│ │ ├── os-windows.cmake
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── data/
│ │ ├── area.effect
│ │ ├── bicubic_scale.effect
│ │ ├── bilinear_lowres_scale.effect
│ │ ├── color.effect
│ │ ├── default.effect
│ │ ├── default_rect.effect
│ │ ├── deinterlace_base.effect
│ │ ├── deinterlace_blend.effect
│ │ ├── deinterlace_blend_2x.effect
│ │ ├── deinterlace_discard.effect
│ │ ├── deinterlace_discard_2x.effect
│ │ ├── deinterlace_linear.effect
│ │ ├── deinterlace_linear_2x.effect
│ │ ├── deinterlace_yadif.effect
│ │ ├── deinterlace_yadif_2x.effect
│ │ ├── format_conversion.effect
│ │ ├── lanczos_scale.effect
│ │ ├── opaque.effect
│ │ ├── premultiplied_alpha.effect
│ │ ├── repeat.effect
│ │ └── solid.effect
│ ├── graphics/
│ │ ├── axisang.c
│ │ ├── axisang.h
│ │ ├── basemath.hpp
│ │ ├── bounds.c
│ │ ├── bounds.h
│ │ ├── device-exports.h
│ │ ├── effect-parser.c
│ │ ├── effect-parser.h
│ │ ├── effect.c
│ │ ├── effect.h
│ │ ├── graphics-ffmpeg.c
│ │ ├── graphics-imports.c
│ │ ├── graphics-internal.h
│ │ ├── graphics.c
│ │ ├── graphics.h
│ │ ├── half.h
│ │ ├── image-file.c
│ │ ├── image-file.h
│ │ ├── input.h
│ │ ├── libnsgif/
│ │ │ ├── .clang-format
│ │ │ ├── LICENSE.libnsgif
│ │ │ ├── libnsgif.c
│ │ │ └── libnsgif.h
│ │ ├── math-defs.h
│ │ ├── math-extra.c
│ │ ├── math-extra.h
│ │ ├── matrix3.c
│ │ ├── matrix3.h
│ │ ├── matrix4.c
│ │ ├── matrix4.h
│ │ ├── plane.c
│ │ ├── plane.h
│ │ ├── quat.c
│ │ ├── quat.h
│ │ ├── shader-parser.c
│ │ ├── shader-parser.h
│ │ ├── srgb.h
│ │ ├── texture-render.c
│ │ ├── vec2.c
│ │ ├── vec2.h
│ │ ├── vec3.c
│ │ ├── vec3.h
│ │ ├── vec4.c
│ │ └── vec4.h
│ ├── media-io/
│ │ ├── audio-io.c
│ │ ├── audio-io.h
│ │ ├── audio-math.h
│ │ ├── audio-resampler-ffmpeg.c
│ │ ├── audio-resampler.h
│ │ ├── format-conversion.c
│ │ ├── format-conversion.h
│ │ ├── frame-rate.h
│ │ ├── media-io-defs.h
│ │ ├── media-remux.c
│ │ ├── media-remux.h
│ │ ├── video-fourcc.c
│ │ ├── video-frame.c
│ │ ├── video-frame.h
│ │ ├── video-io.c
│ │ ├── video-io.h
│ │ ├── video-matrices.c
│ │ ├── video-scaler-ffmpeg.c
│ │ └── video-scaler.h
│ ├── obs-audio-controls.c
│ ├── obs-audio-controls.h
│ ├── obs-audio.c
│ ├── obs-av1.c
│ ├── obs-av1.h
│ ├── obs-avc.c
│ ├── obs-avc.h
│ ├── obs-canvas.c
│ ├── obs-cocoa.m
│ ├── obs-config.h
│ ├── obs-data.c
│ ├── obs-data.h
│ ├── obs-defs.h
│ ├── obs-display.c
│ ├── obs-encoder.c
│ ├── obs-encoder.h
│ ├── obs-ffmpeg-compat.h
│ ├── obs-hevc.c
│ ├── obs-hevc.h
│ ├── obs-hotkey-name-map.c
│ ├── obs-hotkey.c
│ ├── obs-hotkey.h
│ ├── obs-hotkeys.h
│ ├── obs-interaction.h
│ ├── obs-internal.h
│ ├── obs-missing-files.c
│ ├── obs-missing-files.h
│ ├── obs-module.c
│ ├── obs-module.h
│ ├── obs-nal.c
│ ├── obs-nal.h
│ ├── obs-nix-platform.c
│ ├── obs-nix-platform.h
│ ├── obs-nix-wayland.c
│ ├── obs-nix-wayland.h
│ ├── obs-nix-x11.c
│ ├── obs-nix-x11.h
│ ├── obs-nix.c
│ ├── obs-nix.h
│ ├── obs-output-delay.c
│ ├── obs-output.c
│ ├── obs-output.h
│ ├── obs-properties.c
│ ├── obs-properties.h
│ ├── obs-scene.c
│ ├── obs-scene.h
│ ├── obs-service.c
│ ├── obs-service.h
│ ├── obs-source-deinterlace.c
│ ├── obs-source-transition.c
│ ├── obs-source.c
│ ├── obs-source.h
│ ├── obs-video-gpu-encode.c
│ ├── obs-video.c
│ ├── obs-view.c
│ ├── obs-win-crash-handler.c
│ ├── obs-windows.c
│ ├── obs.c
│ ├── obs.h
│ ├── obs.hpp
│ ├── obsconfig.h.in
│ ├── obsversion.c.in
│ ├── obsversion.h
│ ├── pkgconfig/
│ │ └── libobs.pc.in
│ └── util/
│ ├── apple/
│ │ └── cfstring-utils.h
│ ├── array-serializer.c
│ ├── array-serializer.h
│ ├── base.c
│ ├── base.h
│ ├── bitstream.c
│ ├── bitstream.h
│ ├── bmem.c
│ ├── bmem.h
│ ├── buffered-file-serializer.c
│ ├── buffered-file-serializer.h
│ ├── c99defs.h
│ ├── cf-lexer.c
│ ├── cf-lexer.h
│ ├── cf-parser.c
│ ├── cf-parser.h
│ ├── config-file.c
│ ├── config-file.h
│ ├── crc32.c
│ ├── crc32.h
│ ├── curl/
│ │ └── curl-helper.h
│ ├── darray.h
│ ├── deque.h
│ ├── dstr.c
│ ├── dstr.h
│ ├── dstr.hpp
│ ├── file-serializer.c
│ ├── file-serializer.h
│ ├── lexer.c
│ ├── lexer.h
│ ├── pipe-posix.c
│ ├── pipe-windows.c
│ ├── pipe.c
│ ├── pipe.h
│ ├── platform-cocoa.m
│ ├── platform-nix-dbus.c
│ ├── platform-nix-portal.c
│ ├── platform-nix.c
│ ├── platform-windows.c
│ ├── platform.c
│ ├── platform.h
│ ├── profiler.c
│ ├── profiler.h
│ ├── profiler.hpp
│ ├── serializer.h
│ ├── source-profiler.c
│ ├── source-profiler.h
│ ├── sse-intrin.h
│ ├── task.c
│ ├── task.h
│ ├── text-lookup.c
│ ├── text-lookup.h
│ ├── threading-posix.c
│ ├── threading-posix.h
│ ├── threading-windows.c
│ ├── threading-windows.h
│ ├── threading.h
│ ├── utf8.c
│ ├── utf8.h
│ ├── uthash.h
│ ├── util.hpp
│ ├── util_uint128.h
│ ├── util_uint64.h
│ └── windows/
│ ├── CoTaskMemPtr.hpp
│ ├── ComPtr.hpp
│ ├── HRError.hpp
│ ├── WinHandle.hpp
│ ├── device-enum.c
│ ├── device-enum.h
│ ├── obfuscate.c
│ ├── obfuscate.h
│ ├── win-registry.h
│ ├── win-version.h
│ ├── window-helpers.c
│ └── window-helpers.h
├── libobs-d3d11/
│ ├── CMakeLists.txt
│ ├── cmake/
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── d3d11-duplicator.cpp
│ ├── d3d11-indexbuffer.cpp
│ ├── d3d11-rebuild.cpp
│ ├── d3d11-samplerstate.cpp
│ ├── d3d11-shader.cpp
│ ├── d3d11-shaderprocessor.cpp
│ ├── d3d11-shaderprocessor.hpp
│ ├── d3d11-stagesurf.cpp
│ ├── d3d11-subsystem.cpp
│ ├── d3d11-subsystem.hpp
│ ├── d3d11-texture2d.cpp
│ ├── d3d11-texture3d.cpp
│ ├── d3d11-vertexbuffer.cpp
│ └── d3d11-zstencilbuffer.cpp
├── libobs-metal/
│ ├── CMakeLists.txt
│ ├── CVPixelFormat+Extensions.swift
│ ├── MTLCullMode+Extensions.swift
│ ├── MTLOrigin+Extensions.swift
│ ├── MTLPixelFormat+Extensions.swift
│ ├── MTLRegion+Extensions.swift
│ ├── MTLSize+Extensions.swift
│ ├── MTLTexture+Extensions.swift
│ ├── MTLTextureDescriptor+Extensions.swift
│ ├── MTLTextureType+Extensions.swift
│ ├── MTLViewport+Extensions.swift
│ ├── MetalBuffer.swift
│ ├── MetalDevice.swift
│ ├── MetalError.swift
│ ├── MetalRenderState.swift
│ ├── MetalShader+Extensions.swift
│ ├── MetalShader.swift
│ ├── MetalStageBuffer.swift
│ ├── MetalTexture.swift
│ ├── OBSShader.swift
│ ├── OBSSwapChain.swift
│ ├── README.md
│ ├── Sequence+Hashable.swift
│ ├── libobs+Extensions.swift
│ ├── libobs+SignalHandlers.swift
│ ├── libobs-metal-Bridging-Header.h
│ ├── metal-indexbuffer.swift
│ ├── metal-samplerstate.swift
│ ├── metal-shader.swift
│ ├── metal-stagesurf.swift
│ ├── metal-subsystem.swift
│ ├── metal-swapchain.swift
│ ├── metal-texture2d.swift
│ ├── metal-texture3d.swift
│ ├── metal-unimplemented.swift
│ ├── metal-vertexbuffer.swift
│ └── metal-zstencilbuffer.swift
├── libobs-opengl/
│ ├── CMakeLists.txt
│ ├── cmake/
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── gl-cocoa.m
│ ├── gl-egl-common.c
│ ├── gl-egl-common.h
│ ├── gl-helpers.c
│ ├── gl-helpers.h
│ ├── gl-indexbuffer.c
│ ├── gl-nix.c
│ ├── gl-nix.h
│ ├── gl-shader.c
│ ├── gl-shaderparser.c
│ ├── gl-shaderparser.h
│ ├── gl-stagesurf.c
│ ├── gl-subsystem.c
│ ├── gl-subsystem.h
│ ├── gl-texture2d.c
│ ├── gl-texture3d.c
│ ├── gl-texturecube.c
│ ├── gl-vertexbuffer.c
│ ├── gl-wayland-egl.c
│ ├── gl-wayland-egl.h
│ ├── gl-windows.c
│ ├── gl-x11-egl.c
│ ├── gl-x11-egl.h
│ └── gl-zstencil.c
├── libobs-winrt/
│ ├── CMakeLists.txt
│ ├── winrt-capture.cpp
│ ├── winrt-capture.h
│ ├── winrt-dispatch.cpp
│ └── winrt-dispatch.h
├── plugins/
│ ├── CMakeLists.txt
│ ├── aja/
│ │ ├── CMakeLists.txt
│ │ ├── README.md
│ │ ├── aja-card-manager.cpp
│ │ ├── aja-card-manager.hpp
│ │ ├── aja-common.cpp
│ │ ├── aja-common.hpp
│ │ ├── aja-enums.hpp
│ │ ├── aja-output.cpp
│ │ ├── aja-output.hpp
│ │ ├── aja-presets.cpp
│ │ ├── aja-presets.hpp
│ │ ├── aja-props.cpp
│ │ ├── aja-props.hpp
│ │ ├── aja-routing.cpp
│ │ ├── aja-routing.hpp
│ │ ├── aja-source.cpp
│ │ ├── aja-source.hpp
│ │ ├── aja-ui-props.hpp
│ │ ├── aja-vpid-data.cpp
│ │ ├── aja-vpid-data.hpp
│ │ ├── aja-widget-io.cpp
│ │ ├── aja-widget-io.hpp
│ │ ├── audio-repack.c
│ │ ├── audio-repack.h
│ │ ├── audio-repack.hpp
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── main.cpp
│ ├── coreaudio-encoder/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── eo-UY.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── encoder.cpp
│ │ └── windows-imports.h
│ ├── decklink/
│ │ ├── CMakeLists.txt
│ │ ├── DecklinkBase.cpp
│ │ ├── DecklinkBase.h
│ │ ├── DecklinkInput.cpp
│ │ ├── DecklinkInput.hpp
│ │ ├── DecklinkOutput.cpp
│ │ ├── DecklinkOutput.hpp
│ │ ├── LICENSE.decklink-sdk
│ │ ├── OBSVideoFrame.cpp
│ │ ├── OBSVideoFrame.h
│ │ ├── audio-repack.c
│ │ ├── audio-repack.h
│ │ ├── audio-repack.hpp
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── const.h
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── eo-UY.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── decklink-device-discovery.cpp
│ │ ├── decklink-device-discovery.hpp
│ │ ├── decklink-device-instance.cpp
│ │ ├── decklink-device-instance.hpp
│ │ ├── decklink-device-mode.cpp
│ │ ├── decklink-device-mode.hpp
│ │ ├── decklink-device.cpp
│ │ ├── decklink-device.hpp
│ │ ├── decklink-devices.cpp
│ │ ├── decklink-devices.hpp
│ │ ├── decklink-output.cpp
│ │ ├── decklink-source.cpp
│ │ ├── linux/
│ │ │ ├── decklink-sdk/
│ │ │ │ ├── .clang-format
│ │ │ │ ├── DeckLinkAPI.h
│ │ │ │ ├── DeckLinkAPIConfiguration.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_11.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_2.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_4.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_5.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_9.h
│ │ │ │ ├── DeckLinkAPIDeckControl.h
│ │ │ │ ├── DeckLinkAPIDiscovery.h
│ │ │ │ ├── DeckLinkAPIDispatch.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_11.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_8.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v7_6.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v8_0.cpp
│ │ │ │ ├── DeckLinkAPIModes.h
│ │ │ │ ├── DeckLinkAPITypes.h
│ │ │ │ ├── DeckLinkAPIVersion.h
│ │ │ │ ├── DeckLinkAPIVideoEncoderInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_4.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_5_1.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v11_4.h
│ │ │ │ ├── DeckLinkAPI_v10_11.h
│ │ │ │ ├── DeckLinkAPI_v10_2.h
│ │ │ │ ├── DeckLinkAPI_v10_4.h
│ │ │ │ ├── DeckLinkAPI_v10_5.h
│ │ │ │ ├── DeckLinkAPI_v10_6.h
│ │ │ │ ├── DeckLinkAPI_v10_9.h
│ │ │ │ ├── DeckLinkAPI_v11_5.h
│ │ │ │ ├── DeckLinkAPI_v11_5_1.h
│ │ │ │ ├── DeckLinkAPI_v7_1.h
│ │ │ │ ├── DeckLinkAPI_v7_3.h
│ │ │ │ ├── DeckLinkAPI_v7_6.h
│ │ │ │ ├── DeckLinkAPI_v7_9.h
│ │ │ │ ├── DeckLinkAPI_v8_0.h
│ │ │ │ ├── DeckLinkAPI_v8_1.h
│ │ │ │ ├── DeckLinkAPI_v9_2.h
│ │ │ │ ├── DeckLinkAPI_v9_9.h
│ │ │ │ └── LinuxCOM.h
│ │ │ └── platform.cpp
│ │ ├── mac/
│ │ │ ├── decklink-sdk/
│ │ │ │ ├── .clang-format
│ │ │ │ ├── DeckLinkAPI.h
│ │ │ │ ├── DeckLinkAPIConfiguration.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_11.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_2.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_4.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_5.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_9.h
│ │ │ │ ├── DeckLinkAPIDeckControl.h
│ │ │ │ ├── DeckLinkAPIDiscovery.h
│ │ │ │ ├── DeckLinkAPIDispatch.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_11.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_8.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v7_6.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v8_0.cpp
│ │ │ │ ├── DeckLinkAPIModes.h
│ │ │ │ ├── DeckLinkAPIStreaming.h
│ │ │ │ ├── DeckLinkAPIStreaming_v10_11.h
│ │ │ │ ├── DeckLinkAPITypes.h
│ │ │ │ ├── DeckLinkAPIVersion.h
│ │ │ │ ├── DeckLinkAPIVideoEncoderInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_4.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_5_1.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v11_4.h
│ │ │ │ ├── DeckLinkAPI_v10_11.h
│ │ │ │ ├── DeckLinkAPI_v10_2.h
│ │ │ │ ├── DeckLinkAPI_v10_4.h
│ │ │ │ ├── DeckLinkAPI_v10_5.h
│ │ │ │ ├── DeckLinkAPI_v10_6.h
│ │ │ │ ├── DeckLinkAPI_v10_9.h
│ │ │ │ ├── DeckLinkAPI_v11_5.h
│ │ │ │ ├── DeckLinkAPI_v11_5_1.h
│ │ │ │ ├── DeckLinkAPI_v7_1.h
│ │ │ │ ├── DeckLinkAPI_v7_3.h
│ │ │ │ ├── DeckLinkAPI_v7_6.h
│ │ │ │ ├── DeckLinkAPI_v7_9.h
│ │ │ │ ├── DeckLinkAPI_v8_0.h
│ │ │ │ ├── DeckLinkAPI_v8_1.h
│ │ │ │ ├── DeckLinkAPI_v9_2.h
│ │ │ │ └── DeckLinkAPI_v9_9.h
│ │ │ └── platform.cpp
│ │ ├── platform.hpp
│ │ ├── plugin-main.cpp
│ │ ├── util.cpp
│ │ ├── util.hpp
│ │ └── win/
│ │ ├── decklink-sdk/
│ │ │ ├── DeckLinkAPI.idl
│ │ │ ├── DeckLinkAPIConfiguration.idl
│ │ │ ├── DeckLinkAPIDeckControl.idl
│ │ │ ├── DeckLinkAPIDiscovery.idl
│ │ │ ├── DeckLinkAPIModes.idl
│ │ │ ├── DeckLinkAPIStreaming.idl
│ │ │ ├── DeckLinkAPIStreaming_v10_8.idl
│ │ │ ├── DeckLinkAPITypes.idl
│ │ │ ├── DeckLinkAPIVersion.h
│ │ │ ├── DeckLinkAPI_v10_11.idl
│ │ │ ├── DeckLinkAPI_v10_2.idl
│ │ │ ├── DeckLinkAPI_v10_4.idl
│ │ │ ├── DeckLinkAPI_v10_5.idl
│ │ │ ├── DeckLinkAPI_v10_6.idl
│ │ │ ├── DeckLinkAPI_v10_8.idl
│ │ │ ├── DeckLinkAPI_v10_9.idl
│ │ │ ├── DeckLinkAPI_v11_4.idl
│ │ │ ├── DeckLinkAPI_v11_5.idl
│ │ │ ├── DeckLinkAPI_v11_5_1.idl
│ │ │ ├── DeckLinkAPI_v7_1.idl
│ │ │ ├── DeckLinkAPI_v7_3.idl
│ │ │ ├── DeckLinkAPI_v7_6.idl
│ │ │ ├── DeckLinkAPI_v7_9.idl
│ │ │ ├── DeckLinkAPI_v8_0.idl
│ │ │ ├── DeckLinkAPI_v8_1.idl
│ │ │ ├── DeckLinkAPI_v9_2.idl
│ │ │ └── DeckLinkAPI_v9_9.idl
│ │ └── platform.cpp
│ ├── image-source/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── color-source.c
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pa-IN.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── image-source.c
│ │ ├── obs-slideshow-mk2.c
│ │ └── obs-slideshow.c
│ ├── linux-alsa/
│ │ ├── CMakeLists.txt
│ │ ├── alsa-input.c
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── linux-alsa.c
│ ├── linux-capture/
│ │ ├── CMakeLists.txt
│ │ ├── README
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lv-LV.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── te-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── linux-capture.c
│ │ ├── xcomposite-input.c
│ │ ├── xcomposite-input.h
│ │ ├── xcursor-xcb.c
│ │ ├── xcursor-xcb.h
│ │ ├── xhelpers.c
│ │ ├── xhelpers.h
│ │ └── xshm-input.c
│ ├── linux-jack/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── jack-input.c
│ │ ├── jack-wrapper.c
│ │ ├── jack-wrapper.h
│ │ └── linux-jack.c
│ ├── linux-pipewire/
│ │ ├── CMakeLists.txt
│ │ ├── camera-portal.c
│ │ ├── camera-portal.h
│ │ ├── data/
│ │ │ ├── .gitkeep
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── formats.c
│ │ ├── formats.h
│ │ ├── linux-pipewire.c
│ │ ├── pipewire.c
│ │ ├── pipewire.h
│ │ ├── portal.c
│ │ ├── portal.h
│ │ ├── screencast-portal.c
│ │ └── screencast-portal.h
│ ├── linux-pulseaudio/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── linux-pulseaudio.c
│ │ ├── pulse-input.c
│ │ ├── pulse-wrapper.c
│ │ └── pulse-wrapper.h
│ ├── linux-v4l2/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── linux-v4l2.c
│ │ ├── v4l2-controls.c
│ │ ├── v4l2-controls.h
│ │ ├── v4l2-decoder.c
│ │ ├── v4l2-decoder.h
│ │ ├── v4l2-helpers.c
│ │ ├── v4l2-helpers.h
│ │ ├── v4l2-input.c
│ │ ├── v4l2-output.c
│ │ ├── v4l2-udev.c
│ │ └── v4l2-udev.h
│ ├── mac-avcapture/
│ │ ├── AVCaptureDeviceFormat+OBSListable.h
│ │ ├── AVCaptureDeviceFormat+OBSListable.m
│ │ ├── CMakeLists.txt
│ │ ├── OBSAVCapture.h
│ │ ├── OBSAVCapture.m
│ │ ├── OBSAVCapturePresetInfo.h
│ │ ├── OBSAVCapturePresetInfo.m
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── legacy/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── av-capture.mm
│ │ │ ├── left-right.hpp
│ │ │ └── scope-guard.hpp
│ │ ├── plugin-main.h
│ │ ├── plugin-main.m
│ │ ├── plugin-properties.h
│ │ └── plugin-properties.m
│ ├── mac-capture/
│ │ ├── CMakeLists.txt
│ │ ├── audio-device-enum.c
│ │ ├── audio-device-enum.h
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── mac-audio.c
│ │ ├── mac-display-capture.m
│ │ ├── mac-sck-audio-capture.m
│ │ ├── mac-sck-common.h
│ │ ├── mac-sck-common.m
│ │ ├── mac-sck-video-capture.m
│ │ ├── mac-window-capture.m
│ │ ├── plugin-main.c
│ │ ├── window-utils.h
│ │ └── window-utils.m
│ ├── mac-syphon/
│ │ ├── CMakeLists.txt
│ │ ├── SyphonOBSClient.h
│ │ ├── SyphonOBSClient.m
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── oc-FR.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── syphon_license.txt
│ │ ├── plugin-main.c
│ │ └── syphon.m
│ ├── mac-videotoolbox/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── encoder.c
│ ├── mac-virtualcam/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ └── en-US.ini
│ │ └── src/
│ │ ├── camera-extension/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── OBSCameraDeviceSource.swift
│ │ │ ├── OBSCameraProviderSource.swift
│ │ │ ├── OBSCameraStreamSink.swift
│ │ │ ├── OBSCameraStreamSource.swift
│ │ │ ├── cmake/
│ │ │ │ └── macos/
│ │ │ │ ├── Info.plist.in
│ │ │ │ └── entitlements.plist
│ │ │ └── main.swift
│ │ ├── common/
│ │ │ └── MachProtocol.h
│ │ ├── dal-plugin/
│ │ │ ├── CMSampleBufferUtils.h
│ │ │ ├── CMSampleBufferUtils.mm
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Defines.h
│ │ │ ├── Logging.h
│ │ │ ├── OBSDALDevice.h
│ │ │ ├── OBSDALDevice.mm
│ │ │ ├── OBSDALMachClient.h
│ │ │ ├── OBSDALMachClient.mm
│ │ │ ├── OBSDALObjectStore.h
│ │ │ ├── OBSDALObjectStore.mm
│ │ │ ├── OBSDALPlugIn.h
│ │ │ ├── OBSDALPlugIn.mm
│ │ │ ├── OBSDALPlugInInterface.h
│ │ │ ├── OBSDALPlugInInterface.mm
│ │ │ ├── OBSDALPlugInMain.mm
│ │ │ ├── OBSDALStream.h
│ │ │ ├── OBSDALStream.mm
│ │ │ └── cmake/
│ │ │ └── macos/
│ │ │ └── Info.plist.in
│ │ └── obs-plugin/
│ │ ├── CMakeLists.txt
│ │ ├── Defines.h
│ │ ├── OBSDALMachServer.h
│ │ ├── OBSDALMachServer.mm
│ │ ├── cmake/
│ │ │ └── macos/
│ │ │ └── Info.plist.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── plugin-main.mm
│ ├── nv-filters/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── color.effect
│ │ │ ├── locale/
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── rtx_blur.effect
│ │ │ └── rtx_greenscreen.effect
│ │ ├── nv-filters.c
│ │ ├── nv_sdk_versions.h
│ │ ├── nvafx-load.h
│ │ ├── nvidia-audiofx-filter.c
│ │ ├── nvidia-videofx-filter.c
│ │ └── nvvfx-load.h
│ ├── obs-ffmpeg/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── dependencies.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── ffmpeg-mux/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── ffmpeg-mux.c
│ │ │ └── ffmpeg-mux.h
│ │ ├── obs-amf-test/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obs-amf-test.cpp
│ │ ├── obs-ffmpeg-audio-encoders.c
│ │ ├── obs-ffmpeg-av1.c
│ │ ├── obs-ffmpeg-compat.h
│ │ ├── obs-ffmpeg-config.h.in
│ │ ├── obs-ffmpeg-formats.h
│ │ ├── obs-ffmpeg-hls-mux.c
│ │ ├── obs-ffmpeg-logging.c
│ │ ├── obs-ffmpeg-mpegts.c
│ │ ├── obs-ffmpeg-mux.c
│ │ ├── obs-ffmpeg-mux.h
│ │ ├── obs-ffmpeg-nvenc.c
│ │ ├── obs-ffmpeg-openh264.c
│ │ ├── obs-ffmpeg-output.c
│ │ ├── obs-ffmpeg-output.h
│ │ ├── obs-ffmpeg-rist.h
│ │ ├── obs-ffmpeg-source.c
│ │ ├── obs-ffmpeg-srt.h
│ │ ├── obs-ffmpeg-url.h
│ │ ├── obs-ffmpeg-vaapi.c
│ │ ├── obs-ffmpeg-video-encoders.c
│ │ ├── obs-ffmpeg-video-encoders.h
│ │ ├── obs-ffmpeg.c
│ │ ├── texture-amf-opts.hpp
│ │ ├── texture-amf.cpp
│ │ ├── vaapi-utils.c
│ │ └── vaapi-utils.h
│ ├── obs-filters/
│ │ ├── CMakeLists.txt
│ │ ├── async-delay-filter.c
│ │ ├── chroma-key-filter.c
│ │ ├── cmake/
│ │ │ ├── rnnoise.cmake
│ │ │ ├── speexdsp.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── color-correction-filter.c
│ │ ├── color-grade-filter.c
│ │ ├── color-key-filter.c
│ │ ├── compressor-filter.c
│ │ ├── crop-filter.c
│ │ ├── data/
│ │ │ ├── LUTs/
│ │ │ │ ├── grayscale.cube
│ │ │ │ └── original.cube
│ │ │ ├── blend_add_filter.effect
│ │ │ ├── blend_mul_filter.effect
│ │ │ ├── blend_sub_filter.effect
│ │ │ ├── chroma_key_filter.effect
│ │ │ ├── chroma_key_filter_v2.effect
│ │ │ ├── color.effect
│ │ │ ├── color_correction_filter.effect
│ │ │ ├── color_grade_filter.effect
│ │ │ ├── color_key_filter.effect
│ │ │ ├── color_key_filter_v2.effect
│ │ │ ├── crop_filter.effect
│ │ │ ├── hdr_tonemap_filter.effect
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── luma_key_filter.effect
│ │ │ ├── luma_key_filter_v2.effect
│ │ │ ├── mask_alpha_filter.effect
│ │ │ ├── mask_color_filter.effect
│ │ │ └── sharpness.effect
│ │ ├── eq-filter.c
│ │ ├── expander-filter.c
│ │ ├── gain-filter.c
│ │ ├── gpu-delay.c
│ │ ├── hdr-tonemap-filter.c
│ │ ├── invert-audio-polarity.c
│ │ ├── limiter-filter.c
│ │ ├── luma-key-filter.c
│ │ ├── mask-filter.c
│ │ ├── noise-gate-filter.c
│ │ ├── noise-suppress-filter.c
│ │ ├── obs-filters-config.h.in
│ │ ├── obs-filters.c
│ │ ├── rnnoise/
│ │ │ ├── .clang-format
│ │ │ ├── AUTHORS
│ │ │ ├── COPYING
│ │ │ ├── README
│ │ │ ├── include/
│ │ │ │ └── rnnoise.h
│ │ │ └── src/
│ │ │ ├── _kiss_fft_guts.h
│ │ │ ├── arch.h
│ │ │ ├── celt_lpc.c
│ │ │ ├── celt_lpc.h
│ │ │ ├── common.h
│ │ │ ├── compile.sh
│ │ │ ├── denoise.c
│ │ │ ├── kiss_fft.c
│ │ │ ├── kiss_fft.h
│ │ │ ├── opus_types.h
│ │ │ ├── pitch.c
│ │ │ ├── pitch.h
│ │ │ ├── rnn.c
│ │ │ ├── rnn.h
│ │ │ ├── rnn_data.c
│ │ │ ├── rnn_data.h
│ │ │ ├── rnn_reader.c
│ │ │ ├── rnn_train.py
│ │ │ └── tansig_table.h
│ │ ├── scale-filter.c
│ │ ├── scroll-filter.c
│ │ └── sharpness-filter.c
│ ├── obs-libfdk/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── obs-libfdk.c
│ ├── obs-nvenc/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── cuda-helpers.c
│ │ ├── cuda-helpers.h
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── nvenc-compat.c
│ │ ├── nvenc-cuda.c
│ │ ├── nvenc-d3d11.c
│ │ ├── nvenc-helpers.c
│ │ ├── nvenc-helpers.h
│ │ ├── nvenc-internal.h
│ │ ├── nvenc-opengl.c
│ │ ├── nvenc-opts-parser.c
│ │ ├── nvenc-properties.c
│ │ ├── nvenc.c
│ │ ├── obs-nvenc-test/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obs-nvenc-test.cpp
│ │ ├── obs-nvenc.c
│ │ └── obs-nvenc.h
│ ├── obs-outputs/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── flv-mux.c
│ │ ├── flv-mux.h
│ │ ├── flv-output.c
│ │ ├── librtmp/
│ │ │ ├── .clang-format
│ │ │ ├── COPYING
│ │ │ ├── amf.c
│ │ │ ├── amf.h
│ │ │ ├── bytes.h
│ │ │ ├── cencode.c
│ │ │ ├── cencode.h
│ │ │ ├── handshake.h
│ │ │ ├── hashswf.c
│ │ │ ├── http.h
│ │ │ ├── log.c
│ │ │ ├── log.h
│ │ │ ├── md5.c
│ │ │ ├── md5.h
│ │ │ ├── parseurl.c
│ │ │ ├── rtmp.c
│ │ │ ├── rtmp.h
│ │ │ └── rtmp_sys.h
│ │ ├── mp4-mux-internal.h
│ │ ├── mp4-mux.c
│ │ ├── mp4-mux.h
│ │ ├── mp4-output.c
│ │ ├── net-if.c
│ │ ├── net-if.h
│ │ ├── null-output.c
│ │ ├── obs-output-ver.h
│ │ ├── obs-outputs.c
│ │ ├── rtmp-av1.c
│ │ ├── rtmp-av1.h
│ │ ├── rtmp-helpers.h
│ │ ├── rtmp-hevc.c
│ │ ├── rtmp-hevc.h
│ │ ├── rtmp-stream.c
│ │ ├── rtmp-stream.h
│ │ ├── rtmp-windows.c
│ │ └── utils.h
│ ├── obs-qsv11/
│ │ ├── CMakeLists.txt
│ │ ├── QSV11-License-Clarification-Email.txt
│ │ ├── QSV_Encoder.cpp
│ │ ├── QSV_Encoder.h
│ │ ├── QSV_Encoder_Internal.cpp
│ │ ├── QSV_Encoder_Internal.h
│ │ ├── bits/
│ │ │ ├── .clang-format
│ │ │ ├── linux_defs.h
│ │ │ └── windows_defs.h
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── common_directx11.cpp
│ │ ├── common_directx11.h
│ │ ├── common_utils.cpp
│ │ ├── common_utils.h
│ │ ├── common_utils_linux.cpp
│ │ ├── common_utils_windows.cpp
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── obs-qsv-test/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obs-qsv-test.cpp
│ │ ├── obs-qsv11-LICENSE.txt
│ │ ├── obs-qsv11-plugin-main.c
│ │ └── obs-qsv11.c
│ ├── obs-text/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── gdiplus/
│ │ └── obs-text.cpp
│ ├── obs-transitions/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── fade_to_color_transition.effect
│ │ │ ├── fade_transition.effect
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── luma_wipe_transition.effect
│ │ │ ├── luma_wipes/
│ │ │ │ └── wipes.json
│ │ │ ├── slide_transition.effect
│ │ │ ├── stinger_matte_transition.effect
│ │ │ └── swipe_transition.effect
│ │ ├── easings.h
│ │ ├── obs-transitions.c
│ │ ├── transition-cut.c
│ │ ├── transition-fade-to-color.c
│ │ ├── transition-fade.c
│ │ ├── transition-luma-wipe.c
│ │ ├── transition-slide.c
│ │ ├── transition-stinger.c
│ │ └── transition-swipe.c
│ ├── obs-vst/
│ │ ├── CMakeLists.txt
│ │ ├── EditorWidget.cpp
│ │ ├── VSTPlugin.cpp
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── headers/
│ │ │ ├── EditorWidget.h
│ │ │ ├── VSTPlugin.h
│ │ │ └── vst-plugin-callbacks.hpp
│ │ ├── linux/
│ │ │ ├── EditorWidget-linux.cpp
│ │ │ └── VSTPlugin-linux.cpp
│ │ ├── mac/
│ │ │ ├── EditorWidget-osx.mm
│ │ │ └── VSTPlugin-osx.mm
│ │ ├── obs-vst.cpp
│ │ ├── vst_header/
│ │ │ ├── .clang-format
│ │ │ └── aeffectx.h
│ │ └── win/
│ │ ├── EditorWidget-win.cpp
│ │ └── VSTPlugin-win.cpp
│ ├── obs-webrtc/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── obs-webrtc.cpp
│ │ ├── whip-output.cpp
│ │ ├── whip-output.h
│ │ ├── whip-service.cpp
│ │ ├── whip-service.h
│ │ └── whip-utils.h
│ ├── obs-x264/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ └── x264-test.cmake
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lv-LV.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── obs-x264-plugin-main.c
│ │ ├── obs-x264-test.c
│ │ └── obs-x264.c
│ ├── oss-audio/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── oss-audio.c
│ │ ├── oss-input.c
│ │ └── oss-platform.h.in
│ ├── rtmp-services/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── ur-PK.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── package.json
│ │ │ ├── schema/
│ │ │ │ ├── package-schema.json
│ │ │ │ └── service-schema-v5.json
│ │ │ └── services.json
│ │ ├── lookup-config.h.in
│ │ ├── rtmp-common.c
│ │ ├── rtmp-custom.c
│ │ ├── rtmp-format-ver.h
│ │ ├── rtmp-services-main.c
│ │ └── service-specific/
│ │ ├── amazon-ivs.c
│ │ ├── amazon-ivs.h
│ │ ├── dacast.c
│ │ ├── dacast.h
│ │ ├── nimotv.c
│ │ ├── nimotv.h
│ │ ├── service-ingest.c
│ │ ├── service-ingest.h
│ │ ├── showroom.c
│ │ ├── showroom.h
│ │ ├── twitch.c
│ │ └── twitch.h
│ ├── sndio/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── sndio-input.c
│ │ ├── sndio-input.h
│ │ └── sndio.c
│ ├── text-freetype2/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── text_default.effect
│ │ ├── find-font-cocoa.m
│ │ ├── find-font-iconv.c
│ │ ├── find-font-unix.c
│ │ ├── find-font-windows.c
│ │ ├── find-font.c
│ │ ├── find-font.h
│ │ ├── obs-convenience.c
│ │ ├── obs-convenience.h
│ │ ├── text-freetype2.c
│ │ ├── text-freetype2.h
│ │ └── text-functionality.c
│ ├── vlc-video/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── vlc-video-plugin.c
│ │ ├── vlc-video-plugin.h
│ │ └── vlc-video-source.c
│ ├── win-capture/
│ │ ├── CMakeLists.txt
│ │ ├── app-helpers.c
│ │ ├── app-helpers.h
│ │ ├── audio-helpers.c
│ │ ├── audio-helpers.h
│ │ ├── compat-config.h.in
│ │ ├── compat-format-ver.h
│ │ ├── compat-helpers.c
│ │ ├── compat-helpers.h
│ │ ├── cursor-capture.c
│ │ ├── cursor-capture.h
│ │ ├── data/
│ │ │ ├── compatibility.json
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── is-IS.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── lt-LT.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── package.json
│ │ │ └── schema/
│ │ │ ├── compatibility-schema-v1.json
│ │ │ └── package-schema.json
│ │ ├── dc-capture.c
│ │ ├── dc-capture.h
│ │ ├── duplicator-monitor-capture.c
│ │ ├── game-capture-file-init.c
│ │ ├── game-capture.c
│ │ ├── get-graphics-offsets/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── d3d8-offsets.cpp
│ │ │ ├── d3d9-offsets.cpp
│ │ │ ├── ddraw-offsets.cpp
│ │ │ ├── dxgi-offsets.cpp
│ │ │ ├── get-graphics-offsets.c
│ │ │ └── get-graphics-offsets.h
│ │ ├── graphics-hook/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── d3d10-capture.cpp
│ │ │ ├── d3d11-capture.cpp
│ │ │ ├── d3d12-capture.cpp
│ │ │ ├── d3d8-capture.cpp
│ │ │ ├── d3d9-capture.cpp
│ │ │ ├── d3d9-patches.hpp
│ │ │ ├── dxgi-capture.cpp
│ │ │ ├── dxgi-helpers.hpp
│ │ │ ├── gl-capture.c
│ │ │ ├── gl-decs.h
│ │ │ ├── graphics-hook-config.h.in
│ │ │ ├── graphics-hook.c
│ │ │ ├── graphics-hook.h
│ │ │ ├── graphics-hook.rc
│ │ │ ├── obs-vulkan32.json
│ │ │ ├── obs-vulkan64.json
│ │ │ ├── vulkan-capture.c
│ │ │ └── vulkan-capture.h
│ │ ├── inject-helper/
│ │ │ ├── CMakeLists.txt
│ │ │ └── inject-helper.c
│ │ ├── load-graphics-offsets.c
│ │ ├── monitor-capture.c
│ │ ├── nt-stuff.c
│ │ ├── nt-stuff.h
│ │ ├── plugin-main.c
│ │ └── window-capture.c
│ ├── win-dshow/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── libdshowcapture.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── dshow-plugin.cpp
│ │ ├── encode-dstr.hpp
│ │ ├── ffmpeg-decode.c
│ │ ├── ffmpeg-decode.h
│ │ ├── shared-memory-queue.c
│ │ ├── shared-memory-queue.h
│ │ ├── tiny-nv12-scale.c
│ │ ├── tiny-nv12-scale.h
│ │ ├── virtualcam-module/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ ├── obs-module.rc.in
│ │ │ │ ├── virtualcam-module-arm64.def
│ │ │ │ ├── virtualcam-module32.def
│ │ │ │ └── virtualcam-module64.def
│ │ │ ├── placeholder.cpp
│ │ │ ├── sleepto.c
│ │ │ ├── sleepto.h
│ │ │ ├── virtualcam-filter.cpp
│ │ │ ├── virtualcam-filter.hpp
│ │ │ ├── virtualcam-guid.h.in
│ │ │ ├── virtualcam-install.bat.in
│ │ │ ├── virtualcam-module.cpp
│ │ │ ├── virtualcam-module.def.in
│ │ │ └── virtualcam-uninstall.bat.in
│ │ ├── virtualcam.c
│ │ ├── win-dshow-encoder.cpp
│ │ └── win-dshow.cpp
│ └── win-wasapi/
│ ├── CMakeLists.txt
│ ├── cmake/
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── data/
│ │ └── locale/
│ │ ├── af-ZA.ini
│ │ ├── an-ES.ini
│ │ ├── ar-SA.ini
│ │ ├── az-AZ.ini
│ │ ├── ba-RU.ini
│ │ ├── be-BY.ini
│ │ ├── bg-BG.ini
│ │ ├── bn-BD.ini
│ │ ├── ca-ES.ini
│ │ ├── cs-CZ.ini
│ │ ├── da-DK.ini
│ │ ├── de-DE.ini
│ │ ├── el-GR.ini
│ │ ├── en-GB.ini
│ │ ├── en-US.ini
│ │ ├── es-ES.ini
│ │ ├── et-EE.ini
│ │ ├── eu-ES.ini
│ │ ├── fa-IR.ini
│ │ ├── fi-FI.ini
│ │ ├── fil-PH.ini
│ │ ├── fr-FR.ini
│ │ ├── gd-GB.ini
│ │ ├── gl-ES.ini
│ │ ├── he-IL.ini
│ │ ├── hi-IN.ini
│ │ ├── hr-HR.ini
│ │ ├── hu-HU.ini
│ │ ├── hy-AM.ini
│ │ ├── id-ID.ini
│ │ ├── is-IS.ini
│ │ ├── it-IT.ini
│ │ ├── ja-JP.ini
│ │ ├── ka-GE.ini
│ │ ├── kaa.ini
│ │ ├── kab-KAB.ini
│ │ ├── kmr-TR.ini
│ │ ├── ko-KR.ini
│ │ ├── lo-LA.ini
│ │ ├── lt-LT.ini
│ │ ├── mn-MN.ini
│ │ ├── ms-MY.ini
│ │ ├── nb-NO.ini
│ │ ├── nl-NL.ini
│ │ ├── nn-NO.ini
│ │ ├── pl-PL.ini
│ │ ├── pt-BR.ini
│ │ ├── pt-PT.ini
│ │ ├── ro-RO.ini
│ │ ├── ru-RU.ini
│ │ ├── si-LK.ini
│ │ ├── sk-SK.ini
│ │ ├── sl-SI.ini
│ │ ├── sq-AL.ini
│ │ ├── sr-CS.ini
│ │ ├── sr-SP.ini
│ │ ├── sv-SE.ini
│ │ ├── szl-PL.ini
│ │ ├── ta-IN.ini
│ │ ├── th-TH.ini
│ │ ├── tl-PH.ini
│ │ ├── tr-TR.ini
│ │ ├── tt-RU.ini
│ │ ├── ug-CN.ini
│ │ ├── uk-UA.ini
│ │ ├── ur-PK.ini
│ │ ├── vi-VN.ini
│ │ ├── zh-CN.ini
│ │ └── zh-TW.ini
│ ├── enum-wasapi.cpp
│ ├── enum-wasapi.hpp
│ ├── plugin-main.cpp
│ ├── wasapi-notify.cpp
│ ├── wasapi-notify.hpp
│ └── win-wasapi.cpp
├── shared/
│ ├── bpm/
│ │ ├── CMakeLists.txt
│ │ ├── bpm-internal.h
│ │ ├── bpm.c
│ │ └── bpm.h
│ ├── file-updater/
│ │ ├── CMakeLists.txt
│ │ └── file-updater/
│ │ ├── file-updater.c
│ │ └── file-updater.h
│ ├── happy-eyeballs/
│ │ ├── CMakeLists.txt
│ │ ├── happy-eyeballs.c
│ │ └── happy-eyeballs.h
│ ├── ipc-util/
│ │ ├── CMakeLists.txt
│ │ └── ipc-util/
│ │ ├── pipe-posix.c
│ │ ├── pipe-posix.h
│ │ ├── pipe-windows.c
│ │ ├── pipe-windows.h
│ │ └── pipe.h
│ ├── media-playback/
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE.media-playback
│ │ └── media-playback/
│ │ ├── cache.c
│ │ ├── cache.h
│ │ ├── closest-format.h
│ │ ├── decode.c
│ │ ├── decode.h
│ │ ├── media-playback.c
│ │ ├── media-playback.h
│ │ ├── media.c
│ │ └── media.h
│ ├── obs-d3d8-api/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── d3d8.h
│ │ ├── d3d8caps.h
│ │ └── d3d8types.h
│ ├── obs-hook-config/
│ │ ├── CMakeLists.txt
│ │ ├── graphics-hook-info.h
│ │ ├── graphics-hook-ver.h
│ │ └── hook-helpers.h
│ ├── obs-inject-library/
│ │ ├── CMakeLists.txt
│ │ ├── inject-library.c
│ │ └── inject-library.h
│ ├── obs-scripting/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── cstrcache.cmake
│ │ │ ├── lua.cmake
│ │ │ ├── python.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── cstrcache.cpp
│ │ ├── cstrcache.h
│ │ ├── obs-scripting-callback.h
│ │ ├── obs-scripting-config.h.in
│ │ ├── obs-scripting-internal.h
│ │ ├── obs-scripting-logging.c
│ │ ├── obs-scripting-lua-frontend.c
│ │ ├── obs-scripting-lua-source.c
│ │ ├── obs-scripting-lua.c
│ │ ├── obs-scripting-lua.h
│ │ ├── obs-scripting-python-frontend.c
│ │ ├── obs-scripting-python-import.c
│ │ ├── obs-scripting-python-import.h
│ │ ├── obs-scripting-python.c
│ │ ├── obs-scripting-python.h
│ │ ├── obs-scripting.c
│ │ ├── obs-scripting.h
│ │ ├── obslua/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obslua.i
│ │ └── obspython/
│ │ ├── CMakeLists.txt
│ │ └── obspython.i
│ ├── obs-shared-memory-queue/
│ │ ├── CMakeLists.txt
│ │ ├── shared-memory-queue.c
│ │ └── shared-memory-queue.h
│ ├── obs-tiny-nv12-scale/
│ │ ├── CMakeLists.txt
│ │ ├── tiny-nv12-scale.c
│ │ └── tiny-nv12-scale.h
│ ├── opts-parser/
│ │ ├── CMakeLists.txt
│ │ ├── opts-parser.c
│ │ └── opts-parser.h
│ ├── properties-view/
│ │ ├── CMakeLists.txt
│ │ ├── double-slider.cpp
│ │ ├── double-slider.hpp
│ │ ├── properties-view.cpp
│ │ ├── properties-view.hpp
│ │ ├── properties-view.moc.hpp
│ │ ├── spinbox-ignorewheel.cpp
│ │ └── spinbox-ignorewheel.hpp
│ └── qt/
│ ├── icon-label/
│ │ ├── CMakeLists.txt
│ │ ├── IconLabel.cpp
│ │ └── IconLabel.hpp
│ ├── idian/
│ │ ├── CMakeLists.txt
│ │ ├── components/
│ │ │ ├── CheckBox.cpp
│ │ │ ├── ComboBox.cpp
│ │ │ ├── DoubleSpinBox.cpp
│ │ │ ├── SpinBox.cpp
│ │ │ └── ToggleSwitch.cpp
│ │ ├── include/
│ │ │ └── Idian/
│ │ │ ├── CheckBox.hpp
│ │ │ ├── ComboBox.hpp
│ │ │ ├── DoubleSpinBox.hpp
│ │ │ ├── Group.hpp
│ │ │ ├── Idian.hpp
│ │ │ ├── PropertiesList.hpp
│ │ │ ├── Row.hpp
│ │ │ ├── SpinBox.hpp
│ │ │ ├── StateEventFilter.cpp
│ │ │ ├── StateEventFilter.hpp
│ │ │ ├── ToggleSwitch.hpp
│ │ │ ├── Utils.cpp
│ │ │ └── Utils.hpp
│ │ └── widgets/
│ │ ├── Group.cpp
│ │ ├── PropertiesList.cpp
│ │ └── Row.cpp
│ ├── plain-text-edit/
│ │ ├── CMakeLists.txt
│ │ ├── plain-text-edit.cpp
│ │ └── plain-text-edit.hpp
│ ├── slider-ignorewheel/
│ │ ├── CMakeLists.txt
│ │ ├── slider-ignorewheel.cpp
│ │ └── slider-ignorewheel.hpp
│ ├── vertical-scroll-area/
│ │ ├── CMakeLists.txt
│ │ ├── vertical-scroll-area.cpp
│ │ └── vertical-scroll-area.hpp
│ └── wrappers/
│ ├── CMakeLists.txt
│ ├── qt-wrappers.cpp
│ └── qt-wrappers.hpp
└── test/
├── CMakeLists.txt
├── cmocka/
│ ├── CMakeLists.txt
│ ├── test_bitstream.c
│ ├── test_darray.c
│ ├── test_os_path.c
│ └── test_serializer.c
├── osx/
│ ├── CMakeLists.txt
│ └── test.mm
├── test-input/
│ ├── CMakeLists.txt
│ ├── data/
│ │ ├── draw.effect
│ │ └── test.effect
│ ├── sync-async-source.c
│ ├── sync-audio-buffering.c
│ ├── sync-pair-aud.c
│ ├── sync-pair-vid.c
│ ├── test-filter.c
│ ├── test-input.c
│ ├── test-random.c
│ └── test-sinewave.c
└── win/
├── CMakeLists.txt
└── test.cpp
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
# please use clang-format version 16 or later
Standard: c++17
AccessModifierOffset: -8
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakStringLiterals: false # apparently unpredictable
ColumnLimit: 120
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
FixNamespaceComments: true
ForEachMacros:
- 'json_object_foreach'
- 'json_object_foreach_safe'
- 'json_array_foreach'
- 'HASH_ITER'
IncludeBlocks: Preserve
IndentCaseLabels: false
IndentPPDirectives: None
IndentWidth: 8
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: true
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 8
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 10
PenaltyBreakBeforeFirstCallParameter: 30
PenaltyBreakComment: 10
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 10
PenaltyExcessCharacter: 100
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
ReflowComments: false
SkipMacroDefinitionBody: true
SortIncludes: false
SortUsingDeclarations: false
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
StatementMacros:
- 'Q_OBJECT'
TabWidth: 8
TypenameMacros:
- 'DARRAY'
UseTab: ForContinuationAndIndentation
---
Language: ObjC
AccessModifierOffset: 2
AlignArrayOfStructures: Right
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: None
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: false
AcrossComments: true
AllowShortBlocksOnASingleLine: Never
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: None
AttributeMacros: ['__unused', '__autoreleasing', '_Nonnull', '__bridge']
BitFieldColonSpacing: Both
#BreakBeforeBraces: Webkit
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Never
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: true
BreakAfterAttributes: Never
BreakArrays: false
BreakBeforeConceptDeclarations: Allowed
BreakBeforeInlineASMColon: OnlyMultiline
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterComma
ColumnLimit: 120
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
IndentAccessModifiers: false
IndentCaseBlocks: false
IndentCaseLabels: true
IndentExternBlock: Indent
IndentGotoLabels: false
IndentRequiresClause: true
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertBraces: false
InsertNewlineAtEOF: true
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: false
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PPIndentWidth: -1
PackConstructorInitializers: NextLine
QualifierAlignment: Leave
ReferenceAlignment: Right
RemoveSemicolon: false
RequiresClausePosition: WithPreceding
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: false
#SortUsingDeclarations: LexicographicNumeric
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInConditionalStatement: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
Standard: c++17
TabWidth: 4
UseTab: Never
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: http://EditorConfig.org
# Since OBS follows the Linux kernel coding style I have started this file to
# help with automatically setting various text editors to those requirements.
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file.
[*]
insert_final_newline = true
trim_trailing_whitespace = true
charset = utf-8
indent_style = tab
indent_size = 8
# As per notr1ch, for 3rd party code that's a part of obs-outputs.
[plugins/obs-outputs/librtmp/*.{cpp,c,h}]
indent_style = space
indent_size = 4
[CMakeLists.txt]
indent_style = space
indent_size = 2
[**/CMakeLists.txt]
indent_style = space
indent_size = 2
[cmake/**/*.cmake]
indent_style = space
indent_size = 2
[plugins/{rtmp-services,win-capture}/data/**/*.json]
indent_style = space
indent_size = 4
[*.qss]
indent_style = space
indent_size = 4
[build-aux/**/*.json]
indent_style = space
indent_size = 4
[*.py]
indent_style = space
indent_size = 4
[*.yaml]
indent_style = space
indent_size = 2
[{*.zsh,.*.zsh,build-aux/.functions/*,.github/scripts/utils.zsh/*}]
indent_style = space
indent_size = 2
[*.ui]
indent_style = space
indent_size = 1
[{*.obt,*.oha,*.ovt}]
indent_style = space
indent_size = 4
================================================
FILE: .gersemirc
================================================
# yaml-language-server: $schema=https://raw.githubusercontent.com/BlankSpruce/gersemi/master/gersemi/configuration.schema.json
definitions: []
line_length: 120
indent: 2
list_expansion: favour-inlining
unsafe: false
warn_about_unknown_commands: false
================================================
FILE: .github/FUNDING.yml
================================================
open_collective: obsproject
patreon: obsproject
================================================
FILE: .github/actions/build-obs/action.yaml
================================================
name: Set Up and Build obs-studio
description: Builds obs-studio for specified architecture and build config
inputs:
target:
description: Build target for obs-studio
required: true
config:
description: Build configuration
required: false
default: RelWithDebInfo
codesign:
description: Enable codesigning (macOS only)
required: false
default: 'false'
codesignIdent:
description: Developer ID for application codesigning (macOS only)
required: false
default: '-'
codesignTeam:
description: Team ID for application codesigning (macOS only)
required: false
default: ''
provisioningProfileUUID:
description: UUID of provisioning profile (macOS only)
required: false
default: ''
workingDirectory:
description: Working directory for packaging
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Run macOS Build
if: runner.os == 'macOS'
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ inputs.workingDirectory }}
env:
CODESIGN_IDENT: ${{ inputs.codesignIdent }}
CODESIGN_TEAM: ${{ inputs.codesignTeam }}
PROVISIONING_PROFILE: ${{ inputs.provisioningProfileUUID }}
run: |
: Run macOS Build
local -a build_args=(
--config ${{ inputs.config }}
--target macos-${{ inputs.target }}
)
if (( ${+RUNNER_DEBUG} )) build_args+=(--debug)
if [[ '${{ inputs.codesign }}' == true ]] build_args+=(--codesign)
git fetch origin --no-tags --no-recurse-submodules -q
.github/scripts/build-macos ${build_args}
- name: Install Dependencies 🛍️
if: runner.os == 'Linux'
shell: bash
run: |
: Install Dependencies 🛍️
echo ::group::Install Dependencies
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
brew install --quiet zsh
echo ::endgroup::
- name: Run Ubuntu Build
if: runner.os == 'Linux'
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ inputs.workingDirectory }}
run: |
: Run Ubuntu Build
local -a build_args=(
--config ${{ inputs.config }}
--target ubuntu-${{ inputs.target }}
)
if (( ${+RUNNER_DEBUG} )) build_args+=(--debug)
git fetch origin --no-tags --no-recurse-submodules -q
.github/scripts/build-ubuntu ${build_args}
- name: Run Windows Build
if: runner.os == 'Windows'
shell: pwsh
working-directory: ${{ inputs.workingDirectory }}
run: |
# Run Windows Build
$BuildArgs = @{
Target = '${{ inputs.target }}'
Configuration = '${{ inputs.config }}'
}
if ( $Env:RUNNER_DEBUG -ne $null ) {
$BuildArgs += @{ Debug = $true }
}
git fetch origin --no-tags --no-recurse-submodules -q
.github/scripts/Build-Windows.ps1 @BuildArgs
- name: Create Summary 📊
if: runner.os == 'Linux'
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Create Summary 📊
local -a ccache_data
if (( ${+RUNNER_DEBUG} )) {
setopt XTRACE
ccache_data=("${(fA)$(ccache -s -vv)}")
} else {
ccache_data=("${(fA)$(ccache -s)}")
}
print '### ${{ runner.os }} Ccache Stats (${{ inputs.target }})' >> $GITHUB_STEP_SUMMARY
print '```' >> $GITHUB_STEP_SUMMARY
for line (${ccache_data}) {
print ${line} >> $GITHUB_STEP_SUMMARY
}
print '```' >> $GITHUB_STEP_SUMMARY
================================================
FILE: .github/actions/check-changes/action.yaml
================================================
name: Check For Changed Files
description: Checks for changed files compared to specific git reference and glob expression
inputs:
baseRef:
description: Git reference to check against
required: false
ref:
description: Git reference to check with
required: false
default: HEAD
checkGlob:
description: Glob expression to limit check to specific files
required: false
useFallback:
description: Use fallback compare against prior commit
required: false
default: 'true'
diffFilter:
description: git diff-filter string to use
required: false
default: ''
outputs:
hasChangedFiles:
value: ${{ steps.checks.outputs.hasChangedFiles }}
description: True if specified files were changed in comparison to specified git reference
changedFiles:
value: ${{ steps.checks.outputs.changedFiles }}
description: List of changed files
runs:
using: composite
steps:
- name: Check For Changed Files ✅
shell: bash
id: checks
env:
GIT_BASE_REF: ${{ inputs.baseRef }}
GIT_REF: ${{ inputs.ref }}
GITHUB_EVENT_FORCED: ${{ github.event.forced }}
GITHUB_REF_BEFORE: ${{ github.event.before }}
USE_FALLBACK: ${{ inputs.useFallback }}
DIFF_FILTER: ${{ inputs.diffFilter }}
run: |
: Check for Changed Files ✅
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
shopt -s extglob
shopt -s dotglob
# 4b825dc642cb6eb9a060e54bf8d69288fbee4904 is a "hidden" sha1 hash of
# the "empty tree", retrieved via 'git hash-object -t tree /dev/null',
# and used here as a last-resort fallback to always provide a valid
# git ref.
if [[ "${GIT_BASE_REF}" ]]; then
if ! git cat-file -e "${GIT_BASE_REF}" &> /dev/null; then
echo "::warning::Provided base reference ${GIT_BASE_REF} is invalid"
if [[ "${USE_FALLBACK}" == 'true' ]]; then
GIT_BASE_REF='HEAD~1'
fi
fi
else
if ! git cat-file -e ${GITHUB_REF_BEFORE} &> /dev/null; then
GITHUB_REF_BEFORE='4b825dc642cb6eb9a060e54bf8d69288fbee4904'
fi
GIT_BASE_REF='HEAD~1'
case "${GITHUB_EVENT_NAME}" in
pull_request) GIT_BASE_REF="origin/${GITHUB_BASE_REF}" ;;
push) if [[ "${GITHUB_EVENT_FORCED}" != 'true' ]]; then GIT_BASE_REF="${GITHUB_REF_BEFORE}"; fi ;;
*) ;;
esac
fi
changes=($(git diff --name-only --diff-filter="${DIFF_FILTER}" ${GIT_BASE_REF} ${GIT_REF} -- ${{ inputs.checkGlob }}))
if (( ${#changes[@]} )); then
file_string="${changes[*]}"
echo "hasChangedFiles=true" >> $GITHUB_OUTPUT
echo "changedFiles=[\"${file_string// /\",\"}\"]" >> $GITHUB_OUTPUT
else
echo "hasChangedFiles=false" >> $GITHUB_OUTPUT
echo "changedFiles=[]" >> GITHUB_OUTPUT
fi
================================================
FILE: .github/actions/compatibility-validator/action.yaml
================================================
name: Compatibility Data Validator
description: Checks Windows compatibility data files
inputs:
repositorySecret:
description: GitHub token for API access
required: true
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "services-validation action requires a macOS-based or Linux-based runner."
exit 2
- name: Install and Configure Python 🐍
shell: bash
run: |
: Install and Configure Python 🐍
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
echo ::group::Python Set Up
if [[ "${RUNNER_OS}" == Linux ]]; then
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
fi
brew install --quiet python3
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install jsonschema json_source_map
echo ::endgroup::
- name: Validate Compatibility Files JSON Schema 🕵️
shell: bash
working-directory: ${{ inputs.workingDirectory }}
run: |
: Validate services file JSON schema 🕵️
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
shopt -s extglob
echo ::group::Schema Validation
source .venv/bin/activate
python3 -u \
.github/scripts/utils.py/check-jsonschema.py \
--loglevel INFO \
plugins/win-capture/data/@(compatibility|package).json
echo ::endgroup::
- name: Annotate Schema Validation Errors 🏷️
uses: yuzutech/annotations-action@0e061a6e3ac848299310b6429b60d67cafd4e7f8
if: failure()
with:
repo-token: ${{ inputs.repositorySecret }}
title: Compatibility JSON Errors
input: ${{ inputs.workingDirectory }}/validation_errors.json
================================================
FILE: .github/actions/flatpak-builder-lint/action.yaml
================================================
name: Run flatpak-builder-lint
description: Runs flatpak-builder-lint with exceptions
inputs:
artifact:
description: Type of artifact to lint (builddir, repo, manifest, appstream)
required: true
path:
description: Path to flatpak-builder manifest or Flatpak build directory
required: true
workingDirectory:
description: Working directory to clone flatpak-builder-lint
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check artifact type
shell: bash
working-directory: ${{ inputs.workingDirectory }}
run: |
: Check artifact input
if ! [[ "${{ inputs.artifact }}" =~ builddir|repo|manifest|appstream ]]; then
echo "::error::Given artifact type is incorrect"
exit 2
fi
- name: Run flatpak-builder-lint
id: result
shell: bash
working-directory: ${{ inputs.workingDirectory }}
run: |
: Run flatpak-builder-lint
return=0
result="$(flatpak-builder-lint --exceptions --user-exceptions ${GITHUB_ACTION_PATH}/exceptions.json ${{ inputs.artifact }} ${{ inputs.path }})" || return=$?
if [[ ${return} != 0 && -z "${result}" ]]; then
echo "::error::Error while running flatpak-builder-lint"
exit 2
fi
if [[ "${{ inputs.artifact }}" == "appstream" ]]; then
echo "${result}"
if [[ ${return} != 0 ]]; then echo "::error::Flatpak appstream info is not valid"; fi
exit ${return}
fi
# This jq command selects any available array under the 'warnings' key in the JSON document
# or provides an empty array as a fallback if the key is not present. This array is then
# piped to the 'map' function to apply a transformation to every element in the array,
# converting it to a string prefixed with the output level, the actual element value, and
# finally the suffix string defined in 'template'.
#
# The result of this expression is concatenated with a similar expression doing the same
# but for the 'errors' key and its associated array.
#
# The second jq invocation then selects each element of the array and outputs it directly,
# which will be strings of the formats:
#
# * '::warning:: <original warning> <template text>'
# * '::error:: <original error> <template text>'
#
# If no warnings or errors were found, only empty arrays were used for 'map' and thus
# only an empty result array is generated.
template=" found in the Flatpak ${{ inputs.artifact }}"
while read -r log_line; do
if [[ "${log_line}" ]]; then echo "${log_line}"; fi
done <<< "$(echo "${result}" \
| jq -r '(.warnings // [] | try map("::warning:: " + . + "${template}")) + (.errors // [] | try map("::error:: " + . + "${template}"))' \
| jq -r '.[]')"
exit ${return}
================================================
FILE: .github/actions/flatpak-builder-lint/exceptions.json
================================================
{
"com.obsproject.Studio": [
"finish-args-flatpak-spawn-access",
"external-gitmodule-url-found",
"finish-args-host-filesystem-access",
"appstream-flathub-manifest-url-not-reachable"
]
}
================================================
FILE: .github/actions/flatpak-manifest-validator/action.yaml
================================================
name: Flatpak Manifest Validator
description: Checks order of Flatpak modules in manifest file
inputs:
manifestFile:
description: Flatpak manifest file to check
failCondition:
description: Controls whether failed checks also fail the workflow run
required: false
default: never
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "services-validation action requires a macOS-based or Linux-based runner."
exit 2
- name: Validate Flatpak Manifest 🕵️
shell: bash
working-directory: ${{ inputs.workingDirectory }}
run: |
: Validate Flatpak Manifest 🕵️
echo ::group::Run Validation
if [[ '${{ inputs.failCondition }}' == 'never' ]]; then set +e; fi
python3 -u \
build-aux/format-manifest.py \
build-aux/com.obsproject.Studio.json \
--check \
--loglevel INFO
echo ::endgroup::
================================================
FILE: .github/actions/generate-docs/action.yaml
================================================
name: Generate Documentation
description: Updates Sphinx-based documentation
inputs:
sourceDirectory:
description: Path to repository checkout
required: false
default: ${{ github.workspace }}
disableLinkExtensions:
description: Disable Sphinx link extensions
required: false
default: 'false'
runs:
using: composite
steps:
- name: Update Version Number and Copyright ↗️
id: setup
shell: bash
run: |
: Update Version Number and Copyright ↗️
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
: "${major:=}"
: "${minor:=}"
: "${patch:=}"
# This expression will first try to match all the LIBOBS_API_[...]_VER
# lines in 'obs-config.h', before removing the '#define ' prefix and
# trimming away whitespace characters and linebreaks.
# This will yield a single line with the each major, minor, and patch
# version variable name followed by its value, so every even item
# in this string will contain a version part.
read -r _ major _ minor _ patch _ <<< \
"$(grep -E -e "#define LIBOBS_API_(MAJOR|MINOR|PATCH)_VER *" libobs/obs-config.h \
| sed 's/#define //g' \
| tr -s ' ' \
| tr '\n' ' ')"
# This expression simply replaces the definition of the 'version' and
# 'release' variables in the Python script with updated variants using
# the version tokens set by the previous expression.
# The copyright variable assignment is updated to use the current
# local year as the second year value.
sed -i -E \
-e "s/version = '([0-9]+\.[0-9]+\.[0-9]+)'/version = '${major}.${minor}.${patch}'/g" \
-e "s/release = '([0-9]+\.[0-9]+\.[0-9]+)'/release = '${major}.${minor}.${patch}'/g" \
-e "s/copyright = '(2017-[0-9]+, Lain Bailey)'/copyright = '2017-$(date +"%Y"), Lain Bailey'/g" \
${{ inputs.sourceDirectory }}/docs/sphinx/conf.py
if [[ '${{ inputs.disableLinkExtensions }}' == 'true' ]]; then
sed -i -e "s/html_link_suffix = None/html_link_suffix = ''/g" \
${{ inputs.sourceDirectory }}/docs/sphinx/conf.py
echo "artifactName=OBS Studio Docs (No Extensions)" >> $GITHUB_OUTPUT
else
echo "artifactName=OBS Studio Docs" >> $GITHUB_OUTPUT
fi
echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT
- name: Install Sphinx 📜
uses: totaldebug/sphinx-publish-action@a44364271972de3b13c5b63801c2596dfde82413
with:
sphinx_src: ${{ inputs.sourceDirectory }}/docs/sphinx
build_only: true
target_branch: master
target_path: '../home/_build'
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.setup.outputs.artifactName }} ${{ steps.setup.outputs.commitHash }}
path: |
${{ runner.temp }}/_github_home/_build
!${{ runner.temp }}/_github_home/_build/.doctrees
================================================
FILE: .github/actions/package-obs/action.yaml
================================================
name: Package obs-studio
description: Packages obs-studio for specified architecture and build config
inputs:
target:
description: Build target for dependencies
required: true
config:
description: Build configuration
required: false
default: Release
codesign:
description: Enable codesigning (macOS only)
required: false
default: 'false'
notarize:
description: Enable notarization (macOS only)
required: false
default: 'false'
codesignIdent:
description: Developer ID for application codesigning (macOS only)
required: false
default: '-'
codesignUser:
description: Apple ID username for notarization (macOS only)
required: false
default: ''
codesignPass:
description: Apple ID password for notarization (macOS only)
required: false
default: ''
package:
description: Create platform-specific packages instead of archives
required: false
default: 'false'
workingDirectory:
description: Working directory for packaging
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Run macOS packaging
if: runner.os == 'macOS'
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ inputs.workingDirectory }}
env:
CODESIGN_IDENT: ${{ inputs.codesignIdent }}
CODESIGN_IDENT_USER: ${{ inputs.codesignUser }}
CODESIGN_IDENT_PASS: ${{ inputs.codesignPass }}
run: |
: Run macOS Packaging
local -a package_args=(
--target macos-${{ inputs.target }}
--config ${{ inputs.config }}
)
if (( ${+RUNNER_DEBUG} )) build_args+=(--debug)
if [[ '${{ inputs.codesign }}' == true ]] package_args+=(--codesign)
if [[ '${{ inputs.notarize }}' == true ]] package_args+=(--notarize)
if [[ '${{ inputs.package }}' == true ]] package_args+=(--package)
.github/scripts/package-macos ${package_args}
- name: Install Dependencies 🛍️
if: runner.os == 'Linux'
shell: bash
run: |
: Install Dependencies 🛍️
echo ::group::Install Dependencies
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
brew install --quiet zsh
echo ::endgroup::
- name: Run Ubuntu packaging
if: runner.os == 'Linux'
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ inputs.workingDirectory }}
run: |
: Run Ubuntu Packaging
local -a package_args=(
--target ubuntu-${{ inputs.target }}
--config ${{ inputs.config }}
)
if (( ${+RUNNER_DEBUG} )) build_args+=(--debug)
if [[ '${{ inputs.package }}' == true ]] package_args+=(--package)
${{ inputs.workingDirectory }}/.github/scripts/package-ubuntu ${package_args}
- name: Run Windows packaging
if: runner.os == 'Windows'
shell: pwsh
working-directory: ${{ inputs.workingDirectory }}
run: |
# Run Windows Packaging
$PackageArgs = @{
Target = '${{ inputs.target }}'
Configuration = '${{ inputs.config }}'
}
if ( $Env:RUNNER_DEBUG -ne $null ) {
$PackageArgs += @{ Debug = $true }
}
if ( ( Test-Path env:CI ) -and ( Test-Path env:RUNNER_DEBUG ) ) {
$BuildArgs += @{
Debug = $true
}
}
.github/scripts/Package-windows.ps1 @PackageArgs
================================================
FILE: .github/actions/qt-xml-validator/action.yaml
================================================
name: Validate UI XML
description: Validates Qt UI XML files
inputs:
failCondition:
description: Controls whether failed checks also fail the workflow run
required: false
default: never
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "::notice::qt-xml-validator action requires an Linux-based or macOS-based runner."
exit 2
- name: Install xmllint 🕵️
if: runner.os == 'Linux'
shell: bash
run: |
: Install xmllint 🕵️
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
echo ::group::Installing libxml2-utils
sudo apt-get -qq update
sudo apt-get install --no-install-recommends -y libxml2-utils
echo ::endgroup::
- name: Register Annotations 📝
uses: korelstar/xmllint-problem-matcher@1bd292d642ddf3d369d02aaa8b262834d61198c0
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
checkGlob: 'frontend/forms/**/*.ui'
- name: Validate XML 💯
if: fromJSON(steps.checks.outputs.hasChangedFiles)
id: result
shell: bash
env:
CHANGED_FILES: ${{ steps.checks.outputs.changedFiles }}
run: |
: Validate XML 💯
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
CHANGED_FILES=($(echo "${CHANGED_FILES//[\[\]\'\"]/}" | tr "," "\n"))
if (( ${#CHANGED_FILES[@]} )); then
if [[ '${{ inputs.failCondition }}' == never ]]; then set +e; fi
xmllint \
--schema ${{ github.workspace }}/frontend/forms/XML-Schema-Qt5.15.xsd \
--noout "${CHANGED_FILES[@]}"
fi
================================================
FILE: .github/actions/run-clang-format/action.yaml
================================================
name: Run clang-format
description: Runs clang-format and checks for any changes introduced by it
inputs:
failCondition:
description: Controls whether failed checks also fail the workflow run
required: false
default: never
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "::notice::run-clang-format action requires a macOS-based or Linux-based runner."
exit 2
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
checkGlob: "'*.c' '*.h' '*.cpp' '*.hpp' '*.m' '*.mm'"
diffFilter: 'ACM'
- name: Install Dependencies 🛍️
if: runner.os == 'Linux' && fromJSON(steps.checks.outputs.hasChangedFiles)
shell: bash
run: |
: Install Dependencies 🛍️
echo ::group::Install Dependencies
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
echo "/home/linuxbrew/.linuxbrew/opt/clang-format@19/bin" >> $GITHUB_PATH
brew install --quiet zsh
echo ::endgroup::
- name: Run clang-format 🐉
if: fromJSON(steps.checks.outputs.hasChangedFiles)
id: result
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ inputs.workingDirectory }}
env:
CHANGED_FILES: ${{ steps.checks.outputs.changedFiles }}
run: |
: Run clang-format 🐉
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print ::group::Install clang-format-19
brew install --quiet obsproject/tools/clang-format@19
print ::endgroup::
print ::group::Run clang-format-19
local -a changes=(${(s:,:)CHANGED_FILES//[\[\]\'\"]/})
./build-aux/run-clang-format --fail-${{ inputs.failCondition }} --check ${changes}
print ::endgroup::
================================================
FILE: .github/actions/run-gersemi/action.yaml
================================================
name: Run gersemi
description: Runs gersemi and checks for any changes introduced by it
inputs:
failCondition:
description: Controls whether failed checks also fail the workflow run
required: false
default: never
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "::notice::run-gersemi action requires a macOS-based or Linux-based runner."
exit 2
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
checkGlob: "'*.cmake' '*CMakeLists.txt'"
diffFilter: 'ACM'
- name: Install Dependencies 🛍️
if: runner.os == 'Linux' && fromJSON(steps.checks.outputs.hasChangedFiles)
shell: bash
run: |
: Install Dependencies 🛍️
echo ::group::Install Dependencies
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
brew install --quiet zsh
echo ::endgroup::
- name: Run gersemi 🎛️
if: fromJSON(steps.checks.outputs.hasChangedFiles)
id: result
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ github.workspace }}
env:
CHANGED_FILES: ${{ steps.checks.outputs.changedFiles }}
run: |
: Run gersemi 🎛️
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print ::group::Install gersemi
brew install --quiet obsproject/tools/gersemi@0.25
print ::endgroup::
print ::group::Run gersemi
local -a changes=(${(s:,:)CHANGED_FILES//[\[\]\'\"]/})
./build-aux/run-gersemi --fail-${{ inputs.failCondition }} --check ${changes}
print ::endgroup::
================================================
FILE: .github/actions/run-swift-format/action.yaml
================================================
name: Run swift-format
description: Runs swift-format and checks for any changes introduced by it
inputs:
failCondition:
description: Controls whether failed checks also fail the workflow run
required: false
default: never
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "::notice::run-swift-format action requires a macOS-based or Linux-based runner."
exit 2
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
checkGlob: "'*.swift'"
diffFilter: 'ACM'
- name: Install Dependencies 🛍️
if: runner.os == 'Linux' && fromJSON(steps.checks.outputs.hasChangedFiles)
shell: bash
run: |
: Install Dependencies 🛍️
echo ::group::Install Dependencies
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
brew install --quiet zsh
echo ::endgroup::
- name: Run swift-format 🔥
if: fromJSON(steps.checks.outputs.hasChangedFiles)
id: result
shell: zsh --no-rcs --errexit --pipefail {0}
working-directory: ${{ github.workspace }}
env:
CHANGED_FILES: ${{ steps.checks.outputs.changedFiles }}
run: |
: Run swift-format 🔥
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print ::group::Install swift-format
brew install --quiet swift-format
print ::endgroup::
print ::group::Run swift-format
local -a changes=(${(s:,:)CHANGED_FILES//[\[\]\'\"]/})
./build-aux/run-swift-format --fail-${{ inputs.failCondition }} --check ${changes}
print ::endgroup::
================================================
FILE: .github/actions/services-validator/action.yaml
================================================
name: Services Validation
description: Checks services configuration file and checks for defunct services
inputs:
repositorySecret:
description: GitHub token for API access
required: true
checkApiSecret:
description: Token for server check API
required: false
checkApiServers:
description: Servers for the check API
required: false
runSchemaChecks:
description: Enable schema checking
required: false
default: 'true'
runServiceChecks:
description: Enable defunct service checking
required: false
default: 'false'
createPullRequest:
description: Enable pull request creation after service checks
required: false
default: 'false'
workingDirectory:
description: Working directory for checks
required: false
default: ${{ github.workspace }}
outputs:
hasDefunctServices:
description: True if defunct services were found in configuration
value: ${{ steps.check.outputs.make_pr }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os == 'Windows'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "::notice::services-validation action requires a macOS-based or Linux-based runner."
exit 2
- name: Install and Configure Python 🐍
shell: bash
run: |
: Install and Configure Python 🐍
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
echo ::group::Python Set Up
if [[ "${RUNNER_OS}" == Linux ]]; then
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
brew install --overwrite --quiet python3
fi
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install jsonschema json_source_map requests aiohttp
echo ::endgroup::
- name: Validate Services File JSON Schema 🕵️
if: fromJSON(inputs.runSchemaChecks)
shell: bash
working-directory: ${{ inputs.workingDirectory }}
run: |
: Validate Services File JSON Schema 🕵️
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
shopt -s extglob
echo ::group::Run Validation
source .venv/bin/activate
python3 -u \
.github/scripts/utils.py/check-jsonschema.py \
plugins/rtmp-services/data/@(services|package).json \
--loglevel INFO
echo ::endgroup::
- name: Annotate schema validation errors 🏷️
if: fromJSON(inputs.runSchemaChecks) && failure()
uses: yuzutech/annotations-action@0e061a6e3ac848299310b6429b60d67cafd4e7f8
with:
repo-token: ${{ inputs.repositorySecret }}
title: Service JSON Errors
input: ${{ inputs.workingDirectory }}/validation_errors.json
- name: Restore Timestamp Cache ⏳
if: fromJSON(inputs.runServiceChecks)
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/other
key: service-check-${{ github.run_id }}
restore-keys: service-check-
- name: Check for defunct services 📉
id: services-check
if: fromJSON(inputs.runServiceChecks)
shell: bash
working-directory: ${{ inputs.workingDirectory }}
env:
GITHUB_TOKEN: ${{ inputs.repositorySecret }}
WORKFLOW_RUN_ID: ${{ github.run_id }}
REPOSITORY: ${{ github.repository }}
API_KEY: ${{ inputs.checkApiSecret }}
API_SERVERS: ${{ inputs.checkApiServers }}
run: |
: Check for defunct services 📉
source .venv/bin/activate
python3 -u .github/scripts/utils.py/check-services.py
- uses: actions/upload-artifact@v4
if: fromJSON(inputs.runServiceChecks)
with:
name: timestamps
path: ${{ inputs.workingDirectory }}/other/*
- name: Create pull request 🔧
uses: peter-evans/create-pull-request@d121e62763d8cc35b5fb1710e887d6e69a52d3a4
if: fromJSON(inputs.createPullRequest) && fromJSON(inputs.runServiceChecks) && fromJSON(steps.services-check.outputs.make_pr)
with:
author: 'Service Checker <commits@obsproject.com>'
commit-message: 'rtmp-services: Remove defunct servers/services'
title: 'rtmp-services: Remove defunct servers/services'
branch: 'automated/clean-services'
body: ${{ fromJSON(steps.services-check.outputs.pr_message) }}
delete-branch: true
================================================
FILE: .github/actions/setup-macos-codesigning/action.yaml
================================================
name: Set up macOS Code Signing
description: Sets up code signing certificates, provisioning profiles, and notarization information
inputs:
codesignIdentity:
description: Code signing identity
required: true
codesignCertificate:
description: PKCS12 certificate in base64 format
required: true
certificatePassword:
description: Password required to install PKCS12 certificate
required: true
keychainPassword:
description: Password to use for temporary keychain
required: false
notarizationUser:
description: Apple ID to use for notarization
required: false
notarizationPassword:
description: Application password for notarization
provisioningProfile:
description: Provisioning profile in base64 format
required: false
outputs:
haveCodesignIdent:
description: True if necessary code signing credentials were found
value: ${{ steps.codesign.outputs.haveCodesignIdent }}
haveProvisioningProfile:
description: True if necessary provisioning profile credentials were found
value: ${{ steps.provisioning.outputs.haveProvisioningProfile || steps.codesign.outputs.haveProvisioningProfile }}
provisioningProfileUUID:
description: UUID of imported provisioning profile
value: ${{ steps.provisioning.outputs.provisioningProfileUUID }}
haveNotarizationUser:
description: True if necessary notarization credentials were found
value: ${{ steps.notarization.outputs.haveNotarizationUser || steps.codesign.outputs.haveNotarizationUser }}
codesignIdent:
description: Code signing identity
value: ${{ steps.codesign.outputs.codesignIdent }}
codesignTeam:
description: Code signing team
value: ${{ steps.codesign.outputs.codesignTeam }}
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os != 'macOS'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo "setup-macos-codesigning action requires a macOS-based runner."
exit 2
- name: macOS Code Signing ✍️
id: codesign
shell: zsh --no-rcs --errexit --pipefail {0}
env:
MACOS_SIGNING_IDENTITY: ${{ inputs.codesignIdentity }}
MACOS_SIGNING_CERT: ${{ inputs.codesignCertificate }}
MACOS_SIGNING_CERT_PASSWORD: ${{ inputs.certificatePassword }}
MACOS_KEYCHAIN_PASSWORD: ${{ inputs.keychainPassword }}
run: |
: macOS Code Signing ✍️
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
if [[ ${MACOS_SIGNING_IDENTITY} && ${MACOS_SIGNING_CERT} ]] {
print 'haveCodesignIdent=true' >> $GITHUB_OUTPUT
local -r certificate_path="${RUNNER_TEMP}/build_certificate.p12"
local -r keychain_path="${RUNNER_TEMP}/app-signing.keychain-db"
print -n "${MACOS_SIGNING_CERT}" | base64 --decode --output=${certificate_path}
: "${MACOS_KEYCHAIN_PASSWORD:="$(print ${RANDOM} | shasum | head -c 32)"}"
print '::group::Keychain setup'
security create-keychain -p "${MACOS_KEYCHAIN_PASSWORD}" ${keychain_path}
security set-keychain-settings -lut 21600 ${keychain_path}
security unlock-keychain -p "${MACOS_KEYCHAIN_PASSWORD}" ${keychain_path}
security import "${certificate_path}" -P "${MACOS_SIGNING_CERT_PASSWORD}" -A \
-t cert -f pkcs12 -k ${keychain_path} \
-T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/xcrun
security set-key-partition-list -S 'apple-tool:,apple:' -k "${MACOS_KEYCHAIN_PASSWORD}" \
${keychain_path} &> /dev/null
security list-keychain -d user -s ${keychain_path} 'login-keychain'
print '::endgroup::'
local -r team_id="${${MACOS_SIGNING_IDENTITY##* }//(\(|\))/}"
print "codesignIdent=${MACOS_SIGNING_IDENTITY}" >> $GITHUB_OUTPUT
print "MACOS_KEYCHAIN_PASSWORD=${MACOS_KEYCHAIN_PASSWORD}" >> $GITHUB_ENV
print "codesignTeam=${team_id}" >> $GITHUB_OUTPUT
} else {
print 'haveCodesignIdent=false' >> $GITHUB_OUTPUT
print 'haveProvisioningProfile=false' >> $GITHUB_OUTPUT
print 'haveNotarizationUser=false' >> $GITHUB_OUTPUT
}
- name: Provisioning Profile 👤
id: provisioning
if: fromJSON(steps.codesign.outputs.haveCodesignIdent)
shell: zsh --no-rcs --errexit --pipefail {0}
env:
MACOS_SIGNING_PROVISIONING_PROFILE: ${{ inputs.provisioningProfile }}
run: |
: Provisioning Profile 👤
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
if [[ "${MACOS_SIGNING_PROVISIONING_PROFILE}" ]] {
print 'haveProvisioningProfile=true' >> $GITHUB_OUTPUT
local -r profile_path="${RUNNER_TEMP}/build_profile.provisionprofile"
print -n "${MACOS_SIGNING_PROVISIONING_PROFILE}" \
| base64 --decode --output="${profile_path}"
print '::group::Provisioning Profile Setup'
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
security cms -D -i ${profile_path} -o ${RUNNER_TEMP}/build_profile.plist
local -r uuid="$(plutil -extract UUID raw ${RUNNER_TEMP}/build_profile.plist)"
local -r team_id="$(plutil -extract TeamIdentifier.0 raw -expect string ${RUNNER_TEMP}/build_profile.plist)"
if [[ ${team_id} != '${{ steps.codesign.outputs.codesignTeam }}' ]] {
print '::notice::Code Signing team in provisioning profile does not match certificate.'
}
cp ${profile_path} ~/Library/MobileDevice/Provisioning\ Profiles/${uuid}.provisionprofile
print "provisioningProfileUUID=${uuid}" >> $GITHUB_OUTPUT
print '::endgroup::'
} else {
print 'haveProvisioningProfile=false' >> $GITHUB_OUTPUT
}
- name: Notarization 🧑💼
id: notarization
if: fromJSON(steps.codesign.outputs.haveCodesignIdent)
shell: zsh --no-rcs --errexit --pipefail {0}
env:
MACOS_NOTARIZATION_USERNAME: ${{ inputs.notarizationUser }}
MACOS_NOTARIZATION_PASSWORD: ${{ inputs.notarizationPassword }}
run: |
: Notarization 🧑💼
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
if [[ ${MACOS_NOTARIZATION_USERNAME} && ${MACOS_NOTARIZATION_PASSWORD} ]] {
print 'haveNotarizationUser=true' >> $GITHUB_OUTPUT
} else {
print 'haveNotarizationUser=false' >> $GITHUB_OUTPUT
}
================================================
FILE: .github/actions/sparkle-appcast/action.yaml
================================================
name: Generate Sparkle Appcast
description: Creates Sparkle Appcast for a new release and generates delta patch files
inputs:
sparklePrivateKey:
description: Private key used for Sparkle signing
required: true
baseImage:
description: Disk image to base the Sparkle Appcast on
required: true
channel:
description: Sparkle Appcast channel to use
required: false
default: stable
count:
description: Number of old versions to generate deltas for
required: false
default: '1'
urlPrefix:
description: URL prefix to use for Sparkle downloads
required: true
customTitle:
description: Custom title to use for Appcast
required: false
customLink:
description: Custom link to use for Appcast
required: false
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os != 'macOS'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo '::notice::sparkle-appcast action requires a macOS-based runner.'
exit 2
- name: Install Dependencies
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Install Dependencies
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print ::group::Install Dependencies
brew install --quiet coreutils pandoc
print ::endgroup::
- name: Set Up Sparkle ✨
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Set Up Sparkle ✨
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local version
local base_url
local hash
IFS=';' read -r version base_url hash <<< \
"$(jq -r '
.configurePresets[]
| select(.name=="dependencies")
| .vendor["obsproject.com/obs-studio"].tools.sparkle
| {version, baseUrl, hash}
| join(";")
' CMakePresets.json)"
mkdir -p Sparkle && pushd Sparkle
curl -s -L -O "${base_url}/${version}/Sparkle-${version}.tar.xz"
local checksum="$(sha256sum Sparkle-${version}.tar.xz | cut -d " " -f 1)"
if [[ ${hash} != ${checksum} ]] {
print "::error::Sparkle-${version}.tar.xz checksum mismatch: ${checksum} (expected: ${hash})"
exit 2
}
tar -xJf "Sparkle-${version}.tar.xz"
popd
mkdir builds
mkdir -p output/appcasts/stable
- name: Download Builds 📥
id: builds
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Download Builds 📥
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
pushd builds
local image_location=(${{ inputs.baseImage }})
hdiutil attach -readonly -noverify -noautoopen -plist ${image_location} > result.plist
local -i num_entities=$(( $(plutil -extract system-entities raw -- result.plist) - 1 ))
local keys
local mount_point
for i ({0..${num_entities}}) {
keys=($(plutil -extract system-entities.${i} raw -- result.plist))
if [[ ${keys} == *mount-point* ]] {
mount_point=$(plutil -extract system-entities.${i}.mount-point raw -- result.plist)
break
}
}
local feed_url
local info_plist=(${mount_point}/*.app/Contents/Info.plist)
if [[ -f ${info_plist} ]] {
feed_url=$(plutil -extract SUFeedURL raw -- ${info_plist})
} else {
print '::error:: No Info.plist file found in specified disk image.'
hdiutil detach ${mount_point}
exit 2
}
print "feedUrl=${feed_url}" >> $GITHUB_OUTPUT
hdiutil detach ${mount_point}
curl -s -L -O ${feed_url}
# The Xpath Xplained:
#
# //rss/channel/item - Select every <item> node, under a
# <channel> node, under a <rss> node,
# which:
# [*...] - Has a child node, which
# [local-name()='channel'] - Has the local name "channel"
# (required to match the
# namespaced sparkle:channel node),
# which in turn has
# [text()='<channel>'] - A text node that contains the
# content of inputs.channel
# /enclosure/@url - Then select the "url" attribute of
# every <enclosure> node under
# these matching <item> nodes
local -a artifacts=($(\
xmllint \
-xpath "//rss/channel/item[*[local-name()='channel'][text()='${{ inputs.channel }}']]/enclosure/@url" \
${feed_url:t} \
| sed -n 's/.*url="\(.*\)"/\1/p')
)
local url
local file_name
for i ({1..${{ inputs.count }}}) {
url="${artifacts[${i}]}"
file_name="${artifacts[${i}]:t}"
curl -s -L -O ${url}
}
mv ${{ inputs.baseImage }} ${PWD}
rm -rf - result.plist
popd
- name: Prepare Release Notes 📝
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Prepare Release Notes 📝
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
git tag -l --format='%(contents:subject)' ${GITHUB_REF_NAME} > notes.rst
echo '###################################################' >> notes.rst
echo '' >> notes.rst
git tag -l --format='%(contents:body)' ${GITHUB_REF_NAME} >> notes.rst
pandoc -f rst -t html notes.rst -o output/appcasts/notes_${{ inputs.channel }}.html
- name: Generate Appcast 🎙️
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Generate Appcast 🎙️
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print -n '${{ inputs.sparklePrivateKey }}' >> eddsa_private.key
local feed_url='${{ steps.builds.outputs.feedUrl }}'
local arch=${${${(s:_:)feed_url:t}[2]}//x86/x86_64}
local sparkle_options=(
--verbose
--ed-key-file eddsa_private.key
--download-url-prefix '${{ inputs.urlPrefix }}/'
--full-release-notes-url "${feed_url//updates_*/notes_${{ inputs.channel }}.html}"
--maximum-versions 0
--maximum-deltas '${{ inputs.count }}'
--channel '${{ inputs.channel }}'
)
if [[ '${{ inputs.channel }}' == 'stable' ]] {
sparkle_options+=(--phased-rollout-interval 86400)
}
Sparkle/bin/generate_appcast \
${sparkle_options} \
builds
local -a deltas=(builds/*.delta(N))
if (( #deltas )) {
mkdir -p output/sparkle_deltas/${arch}
mv ${deltas} output/sparkle_deltas/${arch}
}
mv builds/*.xml output/appcasts
- name: Adjust Appcast 🎙️
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Adjust Appcast 🎙️
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local feed_url='${{ steps.builds.outputs.feedUrl }}'
local arch=${${${(s:_:)feed_url:t}[2]}//x86/x86_64}
local -a appcasts=(output/appcasts/*_v2.xml)
local adjusted
for appcast (${appcasts}) {
adjusted="${appcast//.xml/-adjusted.xml}"
xsltproc \
--stringparam pDeltaUrl "${{ inputs.urlPrefix }}/sparkle_deltas/${arch}/" \
--stringparam pSparkleUrl '${{ inputs.urlPrefix }}/' \
--stringparam pCustomTitle '${{ inputs.customTitle }}' \
--stringparam pCustomLink '${{ inputs.customLink }}' \
-o ${adjusted} ${GITHUB_ACTION_PATH}/appcast_adjust.xslt ${appcast}
xmllint --format ${adjusted} >! ${appcast}
rm ${adjusted}
}
- name: Create Legacy Appcast 📟
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Create Legacy Appcast 📟
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local -a appcasts=(output/appcasts/*_v2.xml)
local legacy
local feed_url='${{ steps.builds.outputs.feedUrl }}'
local arch=${${${(s:_:)feed_url:t}[2]}//x86/x86_64}
for appcast (${appcasts}) {
legacy="${appcast//.xml/-legacy.xml}"
xsltproc \
-o ${legacy} ${GITHUB_ACTION_PATH}/appcast_legacy.xslt ${appcast}
xmllint --format ${legacy} >! output/appcasts/stable/${${appcast:t}//_v2.xml/.xml}
if [[ ${arch} == x86_64 ]] xmllint --format ${legacy} >! output/appcasts/stable/${${appcast:t}//_x86_64_v2.xml/.xml}
rm ${legacy}
}
================================================
FILE: .github/actions/sparkle-appcast/appcast_adjust.xslt
================================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no"/>
<xsl:strip-space elements="*"/>
<!-- Select /rss/channel/title and store it as default value for 'pCustomTitle' -->
<xsl:param name="pCustomTitle" select="/rss/channel/title" />
<!-- Select /rss/channel/link and store it as default value for 'pCustomLink' -->
<xsl:param name="pCustomLink" select="/rss/channel/link" />
<!-- Set empty strings as default values for pSparkleUrl and pDeltaUrl -->
<xsl:param name="pSparkleUrl" select="''" />
<xsl:param name="pDeltaUrl" select="''" />
<!-- XSLT identity rule - copy all nodes and their child nodes as well as attributes
(attributes are _not_ descendants of the nodes they belong to).
This copy rule is applied as the "default" transformation for all nodes.
-->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Match the <title> under <channel> and <rss> and do not translate it
(effectively removes it).
-->
<xsl:template match="/rss/channel/title" />
<!-- Match the <link> under <channel> and <rss> and do not translate it
(effectively removes it).
-->
<xsl:template match="/rss/channel/link" />
<!-- Match the <channel> under <rss> and apply a copy translation, which
* Creates a new <title> element with a text child node and the text content
of the pCustomTitle variable
* Creates a new <link> element with a text child node and the text content
of the pCustomLink variable
* Copies all child nodes and attributes of the original <channel> node
(this is why <title> and <link> were explicitly not translated before)
-->
<xsl:template match="/rss/channel">
<xsl:copy>
<xsl:element name="title"><xsl:value-of select="$pCustomTitle" /></xsl:element>
<xsl:element name="link"><xsl:value-of select="$pCustomLink" /></xsl:element>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Match every url attribute of <enclosure> nodes in <sparkle:deltas> nodes
(which themselves are under <item>, <channel>, and <rss> nodes respectively).
Create a new attribute with the name "url" and then set its content to either
* The original value of the attribute if it starts with the value of the
pDeltaUrl variable, OR
* The actual value of the pDeltaUrl variable, with the value of the
pSparkleUrl variable removed in front of the current url value added after
This effectively updates every url attribute on a delta <enclosure> node
that does not start with the current delta url path.
-->
<xsl:template match="/rss/channel/item/sparkle:deltas/enclosure/@url">
<xsl:attribute name="url">
<xsl:choose>
<xsl:when test="starts-with(., $pDeltaUrl)">
<xsl:value-of select="." />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$pDeltaUrl" />
<xsl:value-of select="substring-after(., $pSparkleUrl)" />
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
<!-- Match any <sparkle:fullReleaseNotesLink> node under <item>, <channel>,
and <rss> respectively, and replace it with a new node named
<sparkle:releaseNotesLink> and populate it with all child nodes and
attributes of the original node.
-->
<xsl:template match="/rss/channel/item/sparkle:fullReleaseNotesLink">
<xsl:element name="sparkle:releaseNotesLink"><xsl:apply-templates select="@* | node()" /></xsl:element>
</xsl:template>
</xsl:stylesheet>
================================================
FILE: .github/actions/sparkle-appcast/appcast_legacy.xslt
================================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no"/>
<xsl:strip-space elements="*"/>
<!-- XSLT identity rule - copy all nodes and their child nodes as well as attributes
(attributes are _not_ descendants of the nodes they belong to).
This copy rule is applied as the "default" transformation for all nodes.
-->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- Select every <item> node under a <channel> and <rss> node respectively,
which has a <sparkle:channel> child node whose text child node's value
is not equal to 'stable', then apply to translation, effectively removing
it.
-->
<xsl:template match="/rss/channel/item[sparkle:channel[text()!='stable']]" />
<!-- Select every <sparkle:channel> node under a <item> node which sits under a
<channel> and <rss> node respectively, then apply no translation, effectively
removing it.
-->
<xsl:template match="/rss/channel/item/sparkle:channel" />
<!-- Select every <sparkle:deltas> node under a <item> node which sits under a
<channel> and <rss> node respectively, then apply no translation, effectively
removing it.
-->
<xsl:template match="/rss/channel/item/sparkle:deltas" />
</xsl:stylesheet>
================================================
FILE: .github/actions/steam-upload/action.yaml
================================================
name: Steam Upload
description: Creates and uploads stable and nightly builds of obs-studio and beta builds (if available)
inputs:
steamSecret:
description: Steam auth code
required: true
steamUser:
description: Steam user name
required: true
steamPassword:
description: Steam user password
required: true
workflowSecret:
description: GitHub API token to use for API calls
required: true
tagName:
description: Tag name to use for packaging
required: false
default: ''
stableBranch:
description: Name of the stable branch to use
required: false
default: staging
betaBranch:
description: Name of the beta branch to use
required: false
default: beta_staging
nightlyBranch:
description: Name of the nightly branch to use
required: false
default: nightly
playtestBranch:
description: Name of the playtest branch to use
required: false
default: staging
customAssetWindows:
description: Custom asset for Windows
required: false
default: ''
customAssetMacOSApple:
description: Custom asset for macOS Apple Silicon
required: false
default: ''
customAssetMacOSIntel:
description: Custom asset for macOS Intel
required: false
default: ''
preview:
description: Enable preview mode (no uploads done)
required: false
default: ''
runs:
using: composite
steps:
- name: Check Runner Operating System 🏃♂️
if: runner.os != 'macOS'
shell: bash
run: |
: Check Runner Operating System 🏃♂️
echo '::error::steam-upload action requires a macOS-based runner.'
exit 2
- name: Check GitHub Event 🔬
if: contains(fromJSON('["release", "workflow_dispatch", "schedule"]'), github.event_name) != true
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Check GitHub Event 🔬
print "::error:steam-upload action can only be used with 'release', 'workflow-dispatch', or 'schedule' events."
exit 2
- name: Download Nightly Assets 🌙
id: asset-info-nightly
uses: actions/download-artifact@v4
if: github.event_name == 'schedule'
- name: Download Assets 📥
id: asset-info
shell: zsh --no-rcs --errexit --pipefail {0}
env:
GH_TOKEN: ${{ inputs.workflowSecret }}
windows_custom_asset: ${{ inputs.customAssetWindows }}
macos_apple_custom_asset: ${{ inputs.customAssetMacOSApple }}
macos_intel_custom_asset: ${{ inputs.customAssetMacOSIntel }}
run: |
: Download Assets 📥
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local root_dir="${PWD}"
local description
local is_prerelease
case ${GITHUB_EVENT_NAME} {
release)
gh release download ${{ inputs.tagName }} \
--pattern '*.dmg' \
--pattern '*.zip' \
--clobber
IFS=';' read -r is_prerelease description <<< \
"$(gh release view ${{ inputs.tagName }} --json isPrerelease,tagName --jq 'join(";")')"
;;
workflow_dispatch)
if [[ '${{ inputs.tagName }}' =~ [0-9]+\.[0-9]+\.[0-9]+(-(rc|beta)[0-9]+)*$ ]] {
gh release download ${{ inputs.tagName }} \
--pattern '*.dmg' \
--pattern '*.zip' \
--clobber
description='${{ inputs.tagName }}'
read -r is_prerelease <<< \
"$(gh release view ${{ inputs.tagName }} --json isPrerelease --jq '.isPrerelease')"
local -A custom_assets=(
windows "Windows x64;${windows_custom_asset}"
macos_apple "macOS Apple;${macos_apple_custom_asset}"
macos_intel "macOS Intel;${macos_intel_custom_asset}"
)
local display_name
local url
mkdir -p custom_assets && pushd custom_assets
for platform (windows macos_apple macos_intel) {
IFS=';' read -r display_name url <<< "${custom_assets[${platform}]}"
if [[ ${url} ]] {
print "::group::Download of ${display_name} custom asset"
curl --location --silent --remote-name ${url}
if [[ ! -f ${root_dir}/${url:t} ]] {
print "::warning::Custom asset for ${display_name} does not replace an existing release asset"
} else {
rm -rf -- ${root_dir}/${url:t}
}
mv ${url:t} ${root_dir}
print '::endgroup::'
}
}
popd
} else {
print "::error::Invalid tag name for non-release workflow run: '${{ inputs.tagName }}'."
exit 2
}
;;
schedule)
local short_hash="${GITHUB_SHA:0:9}"
mv obs-studio-windows-x64-${short_hash}/obs-studio-*-windows-x64.zip \
${root_dir}
mv obs-studio-macos-arm64-${short_hash}/obs-studio-*-macos-apple.dmg \
${root_dir}
mv obs-studio-macos-x86_64-${short_hash}/obs-studio-*-macos-intel.dmg \
${root_dir}
description="g${GITHUB_SHA:0:9}"
is_prerelease='false'
;;
}
print "description=${description}" >> $GITHUB_OUTPUT
print "is_prerelease=${is_prerelease}" >> $GITHUB_OUTPUT
- name: Prepare Builds for Steam 🍜
shell: zsh --no-rcs --errexit --pipefail --extendedglob {0}
run: |
: Prepare Builds for Steam 🍜
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local root_dir="${PWD}"
mkdir -p steam && pushd steam
print '::group::Prepare Windows x64 assets'
mkdir -p steam-windows && pushd steam-windows
unzip ${root_dir}/(#i)obs-studio-*-windows-x64.zip
rm ${root_dir}/(#i)obs-studio-*-windows*.zip
cp -r ${root_dir}/build-aux/steam/scripts_windows scripts
touch disable_updater
popd
print '::endgroup::'
print '::group::Prepare macOS Apple assets'
mkdir -p steam-macos/arm64/OBS.app
hdiutil attach -noverify -readonly -noautoopen -mountpoint /Volumes/obs-studio-arm64 ${root_dir}/(#i)obs-studio-*-macos-apple.dmg
ditto /Volumes/obs-studio-arm64/OBS.app steam-macos/arm64/OBS.app
hdiutil unmount /Volumes/obs-studio-arm64
rm ${root_dir}/(#i)obs-studio-*-macos-apple.dmg
print '::endgroup::'
print '::group::Prepare macOS Intel assets'
mkdir -p steam-macos/x86_64/OBS.app
hdiutil attach -noverify -readonly -noautoopen -mountpoint /Volumes/obs-studio-x86_64 ${root_dir}/(#i)obs-studio-*-macos-intel.dmg
ditto /Volumes/obs-studio-x86_64/OBS.app steam-macos/x86_64/OBS.app
hdiutil unmount /Volumes/obs-studio-x86_64
rm ${root_dir}/(#i)obs-studio-*-macos-intel.dmg
print '::endgroup::'
cp ${root_dir}/build-aux/steam/scripts_macos/launch.sh steam-macos/launch.sh
popd
- name: Set Up steamcmd 🚂
uses: CyberAndrii/setup-steamcmd@29e114af032a947f5ed57832409070d6e4cbfce3
- name: Generate Steam auth code 🔐
id: steam-totp
uses: CyberAndrii/steam-totp@45775c32193801a84d19d94076d72a2ece010948
if: ${{ ! fromJSON(inputs.preview) }}
with:
shared_secret: ${{ inputs.steamSecret }}
- name: Upload to Steam 📤
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Upload to Steam 📤
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local root_dir="${PWD}"
local build_file='build.vdf'
local branch_name
pushd steam
print '::group::Prepare Steam Build Script'
case ${GITHUB_EVENT_NAME} {
schedule) branch_name='${{ inputs.nightlyBranch }}' ;;
release|workflow_dispatch)
if [[ '${{ steps.asset-info.outputs.is_prerelease }}' == 'true' ]] {
branch_name='${{ inputs.betaBranch }}'
} else {
branch_name='${{ inputs.stableBranch }}'
}
;;
}
sed "s/@@DESC@@/${branch_name}-${{ steps.asset-info.outputs.description }}/;s/@@BRANCH@@/${branch_name}/" \
${root_dir}/build-aux/steam/obs_build.vdf > ${build_file}
print "Generated ${build_file}:\n$(<${build_file})"
print '::endgroup::'
print '::group::Upload to Steam'
local preview='${{ inputs.preview }}'
steamcmd \
+login '${{ inputs.steamUser }}' '${{ inputs.steamPassword }}' '${{ steps.steam-totp.outputs.code }}' \
+run_app_build ${preview:+-preview} ${build_file:a} \
+quit
print '::endgroup'
popd
- name: Generate Steam auth code 🔐
id: steam-totp-playtest
uses: CyberAndrii/steam-totp@45775c32193801a84d19d94076d72a2ece010948
if: ${{ ! fromJSON(inputs.preview) && fromJSON(steps.asset-info.outputs.is_prerelease) }}
with:
shared_secret: ${{ inputs.steamSecret }}
- name: Upload to Steam (Playtest) 📤
if: fromJSON(steps.asset-info.outputs.is_prerelease)
shell: zsh --no-rcs --errexit --pipefail {0}
run: |
: Upload to Steam Playtest 📤
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
local root_dir="${PWD}"
local build_file='build_playtest.vdf'
local branch_name='${{ inputs.playtestBranch }}'
pushd steam
print '::group::Prepare Steam Build Script'
sed "s/@@DESC@@/${branch_name}-${{ steps.asset-info.outputs.description }}/;s/@@BRANCH@@/${branch_name}/" \
${root_dir}/build-aux/steam/obs_playtest_build.vdf > ${build_file}
print "Generated ${build_file}:\n$(<${build_file})"
print '::endgroup::'
print '::group::Upload to Steam'
local preview
if [[ '${{ inputs.preview }}' == 'true' ]] preview='-preview'
steamcmd \
+login '${{ inputs.steamUser }}' '${{ inputs.steamPassword }}' '${{ steps.steam-totp-playtest.outputs.code }}' \
+run_app_build ${preview} ${build_file:a} \
+quit
print '::endgroup'
popd
- name: Upload Steam build logs
uses: actions/upload-artifact@v4
with:
name: steam-build-logs
path: ${{ github.workspace }}/steam/build/*.log
================================================
FILE: .github/actions/windows-analysis/Invoke-External.ps1
================================================
function Invoke-External {
<#
.SYNOPSIS
Invokes a non-PowerShell command.
.DESCRIPTION
Runs a non-PowerShell command, and captures its return code.
Throws an exception if the command returns non-zero.
.EXAMPLE
Invoke-External 7z x $MyArchive
#>
if ( $args.Count -eq 0 ) {
throw 'Invoke-External called without arguments.'
}
if ( ! ( Test-Path function:Log-Information ) ) {
. $PSScriptRoot/Logger.ps1
}
$Command = $args[0]
$CommandArgs = @()
if ( $args.Count -gt 1) {
$CommandArgs = $args[1..($args.Count - 1)]
}
$_EAP = $ErrorActionPreference
$ErrorActionPreference = "Continue"
Log-Debug "Invoke-External: ${Command} ${CommandArgs}"
& $command $commandArgs
$Result = $LASTEXITCODE
$ErrorActionPreference = $_EAP
if ( $Result -ne 0 ) {
throw "${Command} ${CommandArgs} exited with non-zero code ${Result}."
}
}
================================================
FILE: .github/actions/windows-analysis/Logger.ps1
================================================
function Log-Debug {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Debug $m
}
}
}
function Log-Verbose {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Verbose $m
}
}
}
function Log-Warning {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Warning $m
}
}
}
function Log-Error {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Error $m
}
}
}
function Log-Information {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ' =>'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Blue " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Group {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string[]] $Message
)
Process {
if ( $Env:CI -ne $null ) {
if ( $script:LogGroup ) {
Write-Output '::endgroup::'
$script:LogGroup = $false
}
if ( $Message.count -ge 1 ) {
Write-Output "::group::$($Message -join ' ')"
$script:LogGroup = $true
}
} else {
if ( $Message.count -ge 1 ) {
Log-Information $Message
}
}
}
}
function Log-Status {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $StageName -ne $null ) { $StageName } else { '' })
$Icon = ' >'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Green " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Output {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ''
foreach($m in $Message) {
Write-Output " ${StageName} $($Icon.PadRight(5)) ${m}"
}
}
}
}
$Columns = (Get-Host).UI.RawUI.WindowSize.Width - 5
================================================
FILE: .github/actions/windows-analysis/action.yaml
================================================
name: Run PVS-Studio Analysis
inputs:
pvsUsername:
description: PVS-Studio License Username
required: true
pvsKey:
description: PVS-Studio License Key
required: true
target:
description: Build Target
required: true
config:
description: Build Configuration
required: true
runs:
using: composite
steps:
- name: Setup PVS-Studio
shell: pwsh
run: |
choco install pvs-studio --version=7.30.81185.980 -y --no-progress
- name: Activate PVS-Studio
shell: pwsh
run: |
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
Invoke-External "C:\Program Files (x86)\PVS-Studio\PVS-Studio_Cmd.exe" credentials -u ${{ inputs.pvsUsername }} -n ${{ inputs.pvsKey }}
- name: Run PVS-Studio Analysis
shell: pwsh
run: |
[flags()] Enum PVSErrorCodes {
Success = 0
AnalyzerCrash = 1
GenericError = 2
InvalidCommandLine = 4
FileNotFound = 8
ConfigurationNotFound = 16
InvalidProject = 32
InvalidExtension = 64
LicenseInvalid = 128
CodeErrorsFound = 256
SuppressionFailed = 512
LicenseExpiringSoon = 1024
}
$pvsParams = @(
"--progress"
"--disableLicenseExpirationCheck"
"-p", "${{ inputs.target }}"
"-c", "${{ inputs.config }}"
"-t", "${{ github.workspace }}\build_x64\obs-studio.sln"
"-o", "${{ github.workspace }}\analysis.plog"
"-C", "${env:GITHUB_ACTION_PATH}\obs.pvsconfig"
)
& "C:\Program Files (x86)\PVS-Studio\PVS-Studio_Cmd.exe" @pvsParams
# Success, LicenseExpiringSoon, and CodeErrorsFound are fine as error codes, we only care if it is anything but those
$pvs_result = $LASTEXITCODE -band (-bnot ([PVSErrorCodes]::CodeErrorsFound -bor [PVSErrorCodes]::LicenseExpiringSoon))
if ($pvs_result -ne 0) {
Write-Output "PVS-Studio Errors: $([PVSErrorCodes]$pvs_result)"
}
exit $pvs_result
- name: Convert Analysis to SARIF
shell: pwsh
run: |
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
$conversionParams = @(
"-a", "GA:1,2",
"-d", "V1042,Renew"
"-t", "Sarif"
"${{ github.workspace }}\analysis.plog"
)
Invoke-External "C:\Program Files (x86)\PVS-Studio\PlogConverter.exe" @conversionParams
- name: Upload PVS-Studio Logs
uses: actions/upload-artifact@v4
with:
name: 'pvs-analysis-log'
path: |
${{ github.workspace }}/analysis.plog
${{ github.workspace }}/analysis.plog.sarif
- name: Upload PVS-Studio Report
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "${{ github.workspace }}/analysis.plog.sarif"
category: 'PVS-Studio (Windows)'
================================================
FILE: .github/actions/windows-analysis/obs.pvsconfig
================================================
//V_EXCLUDE_PATH */.deps/*
//V_EXCLUDE_PATH */blake2/*
//V_EXCLUDE_PATH */json11/*
//V_EXCLUDE_PATH */simde/*
//V_EXCLUDE_PATH */w32-pthreads/*
//V_EXCLUDE_PATH */plugins/obs-browser/*
//V_EXCLUDE_PATH */plugins/obs-outputs/ftl-sdk/*
//V_EXCLUDE_PATH */plugins/obs-websocket/*
//V_EXCLUDE_PATH */plugins/win-dshow/libdshowcapture/*
//V_EXCLUDE_PATH *_autogen/*
================================================
FILE: .github/actions/windows-patches/Ensure-Location.ps1
================================================
function Ensure-Location {
<#
.SYNOPSIS
Ensures current location to be set to specified directory.
.DESCRIPTION
If specified directory exists, switch to it. Otherwise create it,
then switch.
.EXAMPLE
Ensure-Location "My-Directory"
Ensure-Location -Path "Path-To-My-Directory"
#>
param(
[Parameter(Mandatory)]
[string] $Path
)
if ( ! ( Test-Path $Path ) ) {
$_Params = @{
ItemType = "Directory"
Path = ${Path}
ErrorAction = "SilentlyContinue"
}
New-Item @_Params | Set-Location
} else {
Set-Location -Path ${Path}
}
}
================================================
FILE: .github/actions/windows-patches/Invoke-External.ps1
================================================
function Invoke-External {
<#
.SYNOPSIS
Invokes a non-PowerShell command.
.DESCRIPTION
Runs a non-PowerShell command, and captures its return code.
Throws an exception if the command returns non-zero.
.EXAMPLE
Invoke-External 7z x $MyArchive
#>
if ( $args.Count -eq 0 ) {
throw 'Invoke-External called without arguments.'
}
if ( ! ( Test-Path function:Log-Information ) ) {
. $PSScriptRoot/Logger.ps1
}
$Command = $args[0]
$CommandArgs = @()
if ( $args.Count -gt 1) {
$CommandArgs = $args[1..($args.Count - 1)]
}
$_EAP = $ErrorActionPreference
$ErrorActionPreference = "Continue"
Log-Debug "Invoke-External: ${Command} ${CommandArgs}"
& $command $commandArgs
$Result = $LASTEXITCODE
$ErrorActionPreference = $_EAP
if ( $Result -ne 0 ) {
throw "${Command} ${CommandArgs} exited with non-zero code ${Result}."
}
}
================================================
FILE: .github/actions/windows-patches/Logger.ps1
================================================
function Log-Debug {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Debug $m
}
}
}
function Log-Verbose {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Verbose $m
}
}
}
function Log-Warning {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Warning $m
}
}
}
function Log-Error {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Error $m
}
}
}
function Log-Information {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ' =>'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Blue " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Group {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string[]] $Message
)
Process {
if ( $Env:CI -ne $null ) {
if ( $script:LogGroup ) {
Write-Output '::endgroup::'
$script:LogGroup = $false
}
if ( $Message.count -ge 1 ) {
Write-Output "::group::$($Message -join ' ')"
$script:LogGroup = $true
}
} else {
if ( $Message.count -ge 1 ) {
Log-Information $Message
}
}
}
}
function Log-Status {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $StageName -ne $null ) { $StageName } else { '' })
$Icon = ' >'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Green " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Output {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ''
foreach($m in $Message) {
Write-Output " ${StageName} $($Icon.PadRight(5)) ${m}"
}
}
}
}
$Columns = (Get-Host).UI.RawUI.WindowSize.Width - 5
================================================
FILE: .github/actions/windows-patches/action.yaml
================================================
name: Run bouf Patch Generation
description: Generates OBS updater manifest and patches
inputs:
gcsAccessKeyId:
description: GCS S3 Access Key ID
required: true
gcsAccessKeySecret:
description: GCS S3 Access Key Secret
required: true
workflowSecret:
description: GitHub API token to use for API calls
required: true
tagName:
description: GitHub Release tag
required: true
channel:
description: Update channel
required: false
default: 'stable'
architecture:
description: OBS build architecture
required: false
default: 'x64'
runs:
using: composite
steps:
- uses: actions/checkout@v4
with:
path: "repo"
fetch-depth: 0
ref: ${{ inputs.tagName }}
- name: Download Release Artifact
shell: pwsh
env:
GH_TOKEN: ${{ inputs.workflowSecret }}
run: |
# Download OBS release
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
Invoke-External gh release download "${{ inputs.tagName }}" -p "OBS-Studio-${{ inputs.tagName }}-Windows-${{ inputs.architecture }}.zip"
Invoke-External gh attestation verify "OBS-Studio-${{ inputs.tagName }}-Windows-${{ inputs.architecture }}.zip" --owner obsproject
Expand-Archive -Path "OBS-Studio-${{ inputs.tagName }}-Windows-${{ inputs.architecture }}.zip" -DestinationPath "${{ github.workspace }}/build"
- name: Setup bouf
shell: pwsh
env:
BOUF_TAG: 'v0.6.5'
BOUF_HASH: '2e16d5116415579b5dd8cd68b3fe6edaa7513938427567121942f592292605d5'
BOUF_NSIS_HASH: 'e323043627cfeebd237d306afc001c8c36a3c37f6ecef2b349a19a3209ae3450'
GH_TOKEN: ${{ github.token }}
run: |
# Download bouf release
. ${env:GITHUB_ACTION_PATH}\Ensure-Location.ps1
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
Ensure-Location bouf
$windows_zip = "bouf-windows-${env:BOUF_TAG}.zip"
$nsis_zip = "bouf-nsis-${env:BOUF_TAG}.zip"
Invoke-External gh release download "${env:BOUF_TAG}" -R "obsproject/bouf" -p $windows_zip -p $nsis_zip
if ((Get-FileHash $windows_zip -Algorithm SHA256).Hash -ne "${env:BOUF_HASH}") {
throw "bouf hash does not match."
}
if ((Get-FileHash $nsis_zip -Algorithm SHA256).Hash -ne "${env:BOUF_NSIS_HASH}") {
throw "NSIS package hash does not match."
}
Expand-Archive -Path $windows_zip -DestinationPath bin
Expand-Archive -Path $nsis_zip -DestinationPath nsis
- name: Install rclone and pandoc
shell: pwsh
run: |
choco install rclone pandoc -y --no-progress
- name: Download Previous Builds
shell: pwsh
env:
RCLONE_TRANSFERS: '100'
RCLONE_FAST_LIST: 'true'
RCLONE_EXCLUDE: '"{pdbs/**,**/${{ inputs.tagName }}/**}"'
RCLONE_S3_PROVIDER: 'GCS'
RCLONE_S3_ACCESS_KEY_ID: '${{ inputs.gcsAccessKeyId }}'
RCLONE_S3_SECRET_ACCESS_KEY: '${{ inputs.gcsAccessKeySecret }}'
RCLONE_S3_ENDPOINT: 'https://storage.googleapis.com'
run: |
rclone -q copy ":s3:obs-builds/${{ inputs.architecture }}" "${{ github.workspace }}/old_builds"
- name: Prepare Release Notes
shell: pwsh
run: |
# Release notes are just the tag body on Windows
Set-Location repo
git tag -l --format='%(contents:subject)' ${{ inputs.tagName }} > "${{ github.workspace }}/notes.rst"
Write-Output "###################################################" >> "${{ github.workspace }}/notes.rst"
Write-Output "" >> "${{ github.workspace }}/notes.rst"
git tag -l --format='%(contents:body)' ${{ inputs.tagName }} >> "${{ github.workspace }}/notes.rst"
- name: Run bouf
shell: pwsh
run: |
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
$boufArgs = @(
"--config", "${env:GITHUB_ACTION_PATH}/config.toml",
"--version", "${{ inputs.tagName }}"
"--branch", "${{ inputs.channel }}"
"--notes-file", "${{ github.workspace }}/notes.rst"
"-i", "${{ github.workspace }}/build"
"-p", "${{ github.workspace }}/old_builds"
"-o", "${{ github.workspace }}/output"
"--updater-data-only"
)
Invoke-External "${{ github.workspace }}\bouf\bin\bouf.exe" @boufArgs
- name: Upload Outputs
uses: actions/upload-artifact@v4
with:
name: windows-updater-files
compression-level: 0
path: ${{ github.workspace }}/output
================================================
FILE: .github/actions/windows-patches/config.toml
================================================
[general]
log_level = "trace"
[env]
# On CI these should be in %PATH%
sevenzip_path = "7z"
makensis_path = "makensis"
pandoc_path = "pandoc"
pdbcopy_path = "C:/Program Files (x86)/Windows Kits/10/Debuggers/x64/pdbcopy.exe"
[prepare.codesign]
skip_sign = true
[generate]
patch_type = "zstd"
compress_files = true
# Prevent some legacy plugins from being marked as deleted
exclude_from_removal = [
"enc-amf",
"win-mf",
]
[package]
[package.installer]
skip = true
[package.updater]
vc_redist_path = "bouf/nsis/VC_redist.x64.exe"
skip_sign = true
================================================
FILE: .github/actions/windows-signing/Ensure-Location.ps1
================================================
function Ensure-Location {
<#
.SYNOPSIS
Ensures current location to be set to specified directory.
.DESCRIPTION
If specified directory exists, switch to it. Otherwise create it,
then switch.
.EXAMPLE
Ensure-Location "My-Directory"
Ensure-Location -Path "Path-To-My-Directory"
#>
param(
[Parameter(Mandatory)]
[string] $Path
)
if ( ! ( Test-Path $Path ) ) {
$_Params = @{
ItemType = "Directory"
Path = ${Path}
ErrorAction = "SilentlyContinue"
}
New-Item @_Params | Set-Location
} else {
Set-Location -Path ${Path}
}
}
================================================
FILE: .github/actions/windows-signing/Invoke-External.ps1
================================================
function Invoke-External {
<#
.SYNOPSIS
Invokes a non-PowerShell command.
.DESCRIPTION
Runs a non-PowerShell command, and captures its return code.
Throws an exception if the command returns non-zero.
.EXAMPLE
Invoke-External 7z x $MyArchive
#>
if ( $args.Count -eq 0 ) {
throw 'Invoke-External called without arguments.'
}
if ( ! ( Test-Path function:Log-Information ) ) {
. $PSScriptRoot/Logger.ps1
}
$Command = $args[0]
$CommandArgs = @()
if ( $args.Count -gt 1) {
$CommandArgs = $args[1..($args.Count - 1)]
}
$_EAP = $ErrorActionPreference
$ErrorActionPreference = "Continue"
Log-Debug "Invoke-External: ${Command} ${CommandArgs}"
& $command $commandArgs
$Result = $LASTEXITCODE
$ErrorActionPreference = $_EAP
if ( $Result -ne 0 ) {
throw "${Command} ${CommandArgs} exited with non-zero code ${Result}."
}
}
================================================
FILE: .github/actions/windows-signing/Logger.ps1
================================================
function Log-Debug {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Debug $m
}
}
}
function Log-Verbose {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Verbose $m
}
}
}
function Log-Warning {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Warning $m
}
}
}
function Log-Error {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Error $m
}
}
}
function Log-Information {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ' =>'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Blue " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Group {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string[]] $Message
)
Process {
if ( $Env:CI -ne $null ) {
if ( $script:LogGroup ) {
Write-Output '::endgroup::'
$script:LogGroup = $false
}
if ( $Message.count -ge 1 ) {
Write-Output "::group::$($Message -join ' ')"
$script:LogGroup = $true
}
} else {
if ( $Message.count -ge 1 ) {
Log-Information $Message
}
}
}
}
function Log-Status {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $StageName -ne $null ) { $StageName } else { '' })
$Icon = ' >'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Green " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Output {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ''
foreach($m in $Message) {
Write-Output " ${StageName} $($Icon.PadRight(5)) ${m}"
}
}
}
}
$Columns = (Get-Host).UI.RawUI.WindowSize.Width - 5
================================================
FILE: .github/actions/windows-signing/action.yaml
================================================
name: Run bouf Packaging
description: Generates signed OBS install files
inputs:
gcpWorkloadIdentityProvider:
description: GCP Identity Provider Pool ID
required: true
gcpServiceAccountName:
description: Google service account name
required: true
version:
description: Version string (e.g., 30.0.0-rc1)
required: true
channel:
description: Update channel
required: false
default: 'stable'
architecture:
description: OBS build architecture
required: false
default: 'x64'
runs:
using: composite
steps:
- name: Extract Artifact
shell: pwsh
run: |
Expand-Archive -Path build\*.zip -DestinationPath build
Remove-Item build\*.zip
- name: Setup bouf
shell: pwsh
env:
BOUF_TAG: 'v0.6.5'
BOUF_HASH: '2e16d5116415579b5dd8cd68b3fe6edaa7513938427567121942f592292605d5'
BOUF_NSIS_HASH: 'e323043627cfeebd237d306afc001c8c36a3c37f6ecef2b349a19a3209ae3450'
GH_TOKEN: ${{ github.token }}
run: |
# Download bouf release
. ${env:GITHUB_ACTION_PATH}\Ensure-Location.ps1
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
Ensure-Location bouf
$windows_zip = "bouf-windows-${env:BOUF_TAG}.zip"
$nsis_zip = "bouf-nsis-${env:BOUF_TAG}.zip"
Invoke-External gh release download "${env:BOUF_TAG}" -R "obsproject/bouf" -p $windows_zip -p $nsis_zip
if ((Get-FileHash $windows_zip -Algorithm SHA256).Hash -ne "${env:BOUF_HASH}") {
throw "bouf hash does not match."
}
if ((Get-FileHash $nsis_zip -Algorithm SHA256).Hash -ne "${env:BOUF_NSIS_HASH}") {
throw "NSIS package hash does not match."
}
Expand-Archive -Path $windows_zip -DestinationPath bin
Expand-Archive -Path $nsis_zip -DestinationPath nsis
- name: Setup Google CNG Provider
shell: pwsh
env:
CNG_TAG: 'cng-v1.1'
GH_TOKEN: ${{ github.token }}
run: |
# Download Google CNG provider release from github
. ${env:GITHUB_ACTION_PATH}\Ensure-Location.ps1
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
Ensure-Location gcng
Invoke-External gh release download "${env:CNG_TAG}" -R "GoogleCloudPlatform/kms-integrations" -p "*amd64.zip"
Expand-Archive -Path *.zip
$sigPath = Get-ChildItem *.sig -Recurse
$msiPath = Get-ChildItem *.msi -Recurse
# Verify digital signature against Google's public key
Invoke-External openssl dgst -sha384 -verify "${env:GITHUB_ACTION_PATH}/cng-release-signing-key.pem" -signature $sigPath $msiPath
# Finally, install the CNG provider
Invoke-External msiexec /i $msiPath /qn /norestart
- name: Install rclone
shell: pwsh
run: |
choco install rclone --version=1.69.3 -y --no-progress
- name: 'Authenticate to Google Cloud'
uses: 'google-github-actions/auth@5a50e581162a13f4baa8916d01180d2acbc04363'
with:
workload_identity_provider: ${{ inputs.gcpWorkloadIdentityProvider }}
service_account: ${{ inputs.gcpServiceAccountName }}
- name: Download Previous Build
shell: pwsh
env:
RCLONE_GCS_ENV_AUTH: 'true'
run: |
. ${env:GITHUB_ACTION_PATH}\Ensure-Location.ps1
Ensure-Location "${{ github.workspace }}/old_builds"
rclone copy --transfers 100 ":gcs:obs-latest/${{ inputs.architecture }}/${{ inputs.channel }}" .
- name: Sign Game Capture with RSA cert
shell: pwsh
run: |
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
$SignToolExe = "C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe"
$signArgs = @(
"sign"
"/fd", "sha256"
"/t", "http://timestamp.digicert.com"
"/f", "repo/.github/actions/windows-signing/prod-gc.crt"
"/csp", "Google Cloud KMS Provider"
"/kc", "projects/ci-signing/locations/global/keyRings/production/cryptoKeys/game-capture-release-sign-hsm/cryptoKeyVersions/1"
"${{ github.workspace }}/build/data/obs-plugins/win-capture/*.dll"
)
Invoke-External $SignToolExe @signArgs
- name: Run bouf
shell: pwsh
run: |
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
$boufArgs = @(
"--config", "${env:GITHUB_ACTION_PATH}/config_${{ inputs.architecture }}.toml"
"--version", "${{ inputs.version }}"
"--branch", "${{ inputs.channel }}"
"-i", "${{ github.workspace }}/build"
"-p", "${{ github.workspace }}/old_builds"
"-o", "${{ github.workspace }}/output"
"--packaging-only"
)
Invoke-External "${{ github.workspace }}\bouf\bin\bouf.exe" @boufArgs
- name: Sync Latest Build
shell: pwsh
env:
RCLONE_INCLUDE: '**/${{ inputs.version }}/**'
RCLONE_GCS_ENV_AUTH: 'true'
RCLONE_GCS_BUCKET_POLICY_ONLY: 'true'
run: |
rclone sync --delete-excluded --transfers 100 "${{ github.workspace }}/old_builds" ":gcs:obs-latest/${{ inputs.architecture }}/${{ inputs.channel }}"
- name: Upload Build to Archive
shell: pwsh
env:
RCLONE_GCS_ENV_AUTH: 'true'
RCLONE_GCS_BUCKET_POLICY_ONLY: 'true'
run: |
rclone copy --transfers 100 "${{ github.workspace }}/old_builds" ":gcs:obs-builds/${{ inputs.architecture }}"
================================================
FILE: .github/actions/windows-signing/cng-release-signing-key.pem
================================================
-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtfLbXkHUVc9oUPTNyaEK3hIwmuGRoTtd
6zDhwqjJuYaMwNd1aaFQLMawTwZgR0Xn27ymVWtqJHBe0FU9BPIQ+SFmKw+9jSwu
/FuqbJnLmTnWMJ1jRCtyHNZawvv2wbiB
-----END PUBLIC KEY-----
================================================
FILE: .github/actions/windows-signing/config_arm64.toml
================================================
[general]
log_level = "trace"
[env]
# On CI these should be in %PATH%
sevenzip_path = "7z"
makensis_path = "makensis"
pandoc_path = "pandoc"
pdbcopy_path = "C:/Program Files (x86)/Windows Kits/10/Debuggers/x64/pdbcopy.exe"
## Preparation steps
[prepare]
[prepare.copy]
never_copy = [
"bin/32bit",
"obs-plugins/32bit",
".keepme",
]
[prepare.codesign]
sign_cert_file = "repo/.github/actions/windows-signing/prod.crt"
sign_kms_key_id = "projects/ci-signing/locations/global/keyRings/production/cryptoKeys/release-sign-hsm/cryptoKeyVersions/1"
sign_digest = "sha384"
sign_ts_serv = "http://timestamp.digicert.com"
sign_ts_algo = "sha256"
sign_exts = ['exe', 'dll', 'pyd']
sign_append = true
[prepare.strip_pdbs]
# PDBs to not strip
exclude = [
"obs-frontend-api.pdb",
"obs64.pdb",
"obs.pdb",
]
[package]
[package.installer]
skip = true
[package.zip]
name = "OBS-Studio-{version}-arm64.zip"
pdb_name = "OBS-Studio-{version}-arm64-pdbs.zip"
[package.updater]
skip_sign = true
================================================
FILE: .github/actions/windows-signing/config_x64.toml
================================================
[general]
log_level = "trace"
[env]
# On CI these should be in %PATH%
sevenzip_path = "7z"
makensis_path = "makensis"
pandoc_path = "pandoc"
pdbcopy_path = "C:/Program Files (x86)/Windows Kits/10/Debuggers/x64/pdbcopy.exe"
## Preparation steps
[prepare]
[prepare.copy]
never_copy = [
"bin/32bit",
"obs-plugins/32bit",
".keepme",
]
[prepare.codesign]
sign_cert_file = "repo/.github/actions/windows-signing/prod.crt"
sign_kms_key_id = "projects/ci-signing/locations/global/keyRings/production/cryptoKeys/release-sign-hsm/cryptoKeyVersions/1"
sign_digest = "sha384"
sign_ts_serv = "http://timestamp.digicert.com"
sign_ts_algo = "sha256"
sign_exts = ['exe', 'dll', 'pyd']
sign_append = true
[prepare.strip_pdbs]
# PDBs to not strip
exclude = [
"obs-frontend-api.pdb",
"obs64.pdb",
"obs.pdb",
]
[package]
[package.installer]
nsis_script = "bouf/nsis/mp-installer.nsi"
[package.zip]
name = "OBS-Studio-{version}-x64.zip"
pdb_name = "OBS-Studio-{version}-pdbs.zip"
[package.updater]
skip_sign = true
================================================
FILE: .github/actions/windows-signing/prod-gc.crt
================================================
-----BEGIN CERTIFICATE-----
MIIHYDCCBUigAwIBAgIQCTRoMeK9NItAQamXbU8PnjANBgkqhkiG9w0BAQsFADBp
MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMT
OERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0
IDIwMjEgQ0ExMB4XDTI1MTExNzAwMDAwMFoXDTI4MDExNTIzNTk1OVowaDELMAkG
A1UEBhMCVVMxEDAOBgNVBAgTB1d5b21pbmcxETAPBgNVBAcTCFNoZXJpZGFuMRkw
FwYDVQQKExBPQlMgUHJvamVjdCwgTExDMRkwFwYDVQQDExBPQlMgUHJvamVjdCwg
TExDMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA07e66QJeFjyk8p5l
1/hOBt5qXf8paJIFoBsdy38qnkC6ZTJzrmSfERilRBM7UQ7Pzo9aE/On7aUrghdW
ZfG/U/3s4KKYZMh+mQscHdx37Y4sUC0Yk/3s+1H3jAz5tEx9FlUgO30MKjSTr3Lc
HjqoibokGrZOzqSF2pLqTmSX92/P7E9ii2EnZnTSDWHHLtVmS0YkE6TKQ5v2VHYP
ynRVWuOl2wJFNctCYbcZAmBeVFne4k6w443Zvkz70m4lgtaJB24r2y2ay+vyQx2Q
gEg3RgcW+3/zh/sqjCQ6RhUjFvdBHP9nPrhCw72P/2J04JrpMnTlHbwUp1ULyH9v
rOYDu+8gk2sFgwjgKYGrjuehtwG8IokCppWPxUUyDTklFXbjDVlLQizmoPjwfUKy
K6kJd6w6WR3jUdRZYIXuHPzzIQE3G2aB68tSyYANuXjQAOXtVKkFlMiI/KGATIKb
FCnhFriqFOlG1vxeKUgqMNQqcaz52V8ZGEtVAOMZVP0FzZIDqrFwvDTQwsRVsRUU
c6ACUGZVL5X5nn90XTYIf4oZGFIs7U/P+LmH7Hngb3ZnrvwhurSreaELR554ncOl
fLJGpiJlTShkvubXycmYIiM+XLVkdziZlRFlMef5hp02fuT+825ivuWzaNTB0min
hMatLBKIwxjO5Xlk6CztRQD6ezMCAwEAAaOCAgMwggH/MB8GA1UdIwQYMBaAFGg3
4Ou2O/hfEYb7/mF7CIhl9E5CMB0GA1UdDgQWBBSNjnGJqRrmOQnj5YyA9Ax8ZpJ/
ejA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3
LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsG
AQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIw
MjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNl
cnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDCB
lAYIKwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
ZXJ0LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
L0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNB
MS5jcnQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEAKhWQvdUAI3TLwy0j
DBZflHdzq2qnsF7v7OCQEiG46CA1/37ZJrBx6B5u23Z4dS7Ruji679WAnhq5oxkC
uRVwmjtcDmZ8m1iDmbN0yZzfyhzWYUDQJfOQRtRVJC/3MKy6uPw9IZsInOZDWEeg
rVoKLnkrxSbFFRoKtzOrkFqO+bdo+atEUbYsPFAMXzvXTlEvuYqB5iWWbtA2/wN7
dFPkB1T9PBp803PU10AeKxwI4q+Ih+Iul3hiPflvFtoY4SX8JBioEWBugcmiL6w9
8A88zGnONFcuA2iVFjvJKon6g87mQMulqmZGgBjNmXipDQlsC3rUkdZHJrsKq6mI
Pkx5EFfIKJ/ibSQ5f6eKfPboh6hF7JutdoOEZ8Zo2A5M/1WV/kO18IJsKGDPEWBa
Y+kvSzdU1j9p7IGU6QRLrBTHO5yUyIoEVAXIPs4g6bRawFHVcO8zebAhg+CmDWsG
JT7BDQeiVWuFHs9w6YlQoPQsCl7SL0v8d2JeXajchK65owCyV6dNctBzIIU0/5tW
eHGB+jd9Sd6b8z8lgdTBQRBMOxBw5+GGieR6VklPqnLo6nZiX1PVPauTIrp0XP0E
Z/n6TCQpUc+EqD7dFAjxRQh0HV3Zx2Xc8QCtLc2cI+ShQrgGXyqo0GlhalNDZkj8
WbVFjeU1iU9tPlee5BDXberDjFg=
-----END CERTIFICATE-----
================================================
FILE: .github/actions/windows-signing/prod.crt
================================================
-----BEGIN CERTIFICATE-----
MIIEIzCCA6mgAwIBAgIQA/1HO4x/Q51pGXj/sSt/ZzAKBggqhkjOPQQDAzBTMQsw
CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xKzApBgNVBAMTIkRp
Z2lDZXJ0IEc1IENTIEVDQyBTSEEzODQgMjAyMSBDQTEwHhcNMjYwMzA1MDAwMDAw
WhcNMjcwMTI3MjM1OTU5WjCBzzETMBEGCysGAQQBgjc8AgEDEwJVUzEYMBYGCysG
AQQBgjc8AgECEwdXeW9taW5nMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlv
bjEXMBUGA1UEBRMOMjAyMy0wMDEyNzIyNTIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI
EwdXeW9taW5nMREwDwYDVQQHEwhTaGVyaWRhbjEZMBcGA1UEChMQT0JTIFByb2pl
Y3QsIExMQzEZMBcGA1UEAxMQT0JTIFByb2plY3QsIExMQzB2MBAGByqGSM49AgEG
BSuBBAAiA2IABKkywk1iHNOnpOU7QEAt5fddCH57pHHdxJxrgbj06UONaLHDY3AR
gjqYbVBHYIr59lW59l0Xg/ruWzaX+YHWhJrzriaCI/zTf8lambBEDJBfIkMDQD8k
JDxfza4DulU0eaOCAcMwggG/MB8GA1UdIwQYMBaAFNcdx/rG+oJ0IEVxNBIvVdWY
QZJeMB0GA1UdDgQWBBTz68Ag8TYugImX7RVRd3qem1tY2zA9BgNVHSAENjA0MDIG
BWeBDAEDMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQ
UzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgY0GA1UdHwSB
hTCBgjA/oD2gO4Y5aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0RzVD
U0VDQ1NIQTM4NDIwMjFDQTEuY3JsMD+gPaA7hjlodHRwOi8vY3JsNC5kaWdpY2Vy
dC5jb20vRGlnaUNlcnRHNUNTRUNDU0hBMzg0MjAyMUNBMS5jcmwwfgYIKwYBBQUH
AQEEcjBwMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSAYI
KwYBBQUHMAKGPGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEc1
Q1NFQ0NTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMAoGCCqGSM49BAMDA2gA
MGUCMDuU78m1lTDkCHRpMd1nOvvuRCTSglIo+pN9T0G1ziPi+MyeyVmERc2lqXlW
TANo+wIxAL+y4Ttsw4Vs9qoFArNpA0EIIz2tKdKgRGNjcPNSZq6ZQkiyVFN4xsjc
FCONL0pZJw==
-----END CERTIFICATE-----
================================================
FILE: .github/actions/windows-signing/test.crt
================================================
-----BEGIN CERTIFICATE-----
MIIBpDCCAUmgAwIBAgIUXeKu2+AXK2yR8WyuTTRg8+t6p/kwCgYIKoZIzj0EAwIw
JzElMCMGA1UEAwwcV2l6YXJkcyBvZiBPQlMgTExDIChURVNUSU5HKTAeFw0yMzEx
MDQwMDA3NDBaFw0zMzExMDEwMDA3NDBaMCcxJTAjBgNVBAMMHFdpemFyZHMgb2Yg
T0JTIExMQyAoVEVTVElORykwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARVAdL6
pkfHYuO8rtndlAjpbz9bMBIVN8elrg4cDJkReAqsjH78ulhKvkor6lfF7rbRzIKA
u026v1aDE79Z+bz+o1MwUTAdBgNVHQ4EFgQUsFQqmZEEapghq7ZPqpejjFeu8Dsw
HwYDVR0jBBgwFoAUsFQqmZEEapghq7ZPqpejjFeu8DswDwYDVR0TAQH/BAUwAwEB
/zAKBggqhkjOPQQDAgNJADBGAiEAmNSMQqZu3U9eMP+PbmssCigkbFKG8mGLNLFN
J+KfcdkCIQCVOjg6cqk4zFe7H8EKhB6CwOAIOQrgjGWLihtO2lovCw==
-----END CERTIFICATE-----
================================================
FILE: .github/scripts/.Aptfile
================================================
package 'ccache'
package 'cmake', bin: '/usr/bin/cmake'
package 'curl'
package 'git'
package 'jq'
package 'ninja-build', bin: 'ninja'
package 'pkg-config'
================================================
FILE: .github/scripts/.Brewfile
================================================
brew "cmake"
brew "git"
brew "jq"
brew "xcbeautify"
================================================
FILE: .github/scripts/.Wingetfile
================================================
package '7zip.7zip', path: '7-zip', bin: '7z'
package 'cmake', path: 'Cmake\bin', bin: 'cmake'
================================================
FILE: .github/scripts/.build.zsh
================================================
#!/usr/bin/env zsh
builtin emulate -L zsh
setopt EXTENDED_GLOB
setopt PUSHD_SILENT
setopt ERR_EXIT
setopt ERR_RETURN
setopt NO_UNSET
setopt PIPE_FAIL
setopt NO_AUTO_PUSHD
setopt NO_PUSHD_IGNORE_DUPS
setopt FUNCTION_ARGZERO
## Enable for script debugging
#setopt WARN_CREATE_GLOBAL
#setopt WARN_NESTED_VAR
#setopt XTRACE
if (( ! ${+CI} )) {
print -u2 -PR "%F{1} ✖︎ ${ZSH_ARGZERO:t:r} requires CI environment.%f"
exit 1
}
autoload -Uz is-at-least && if ! is-at-least 5.9; then
print -u2 -PR "%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.9%b is the minimum supported version. Upgrade Zsh to fix this issue."
exit 1
fi
TRAPZERR() {
print -u2 -PR "::error::%F{1} ✖︎ script execution error.%f"
print -PR -e "
Callstack:
${(j:\n :)funcfiletrace}
"
exit 2
}
build() {
if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h}
local host_os=${${(s:-:)ZSH_ARGZERO:t:r}[2]}
local project_root=${SCRIPT_HOME:A:h:h}
fpath=(${SCRIPT_HOME}/utils.zsh ${fpath})
autoload -Uz log_group log_error log_output check_${host_os}
local -i debug=0
local target
local -r -a _valid_targets=(
macos-x86_64
macos-arm64
ubuntu-x86_64
)
local config='RelWithDebInfo'
local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel)
local -i codesign=0
local -i analyze=0
local -a args
while (( # )) {
case ${1} {
-t|--target|-c|--config)
if (( # == 1 )) || [[ ${2:0:1} == '-' ]] {
log_error "Missing value for option %B${1}%b"
exit 2
}
;;
}
case ${1} {
--) shift; args+=($@); break ;;
-a|--analyze) analyze=1; shift ;;
-t|--target)
if (( ! ${_valid_targets[(Ie)${2}]} )) {
log_error "Invalid value %B${2}%b for option %B${1}%b"
exit 2
}
target=${2}
shift 2
;;
-c|--config)
if (( ! ${_valid_configs[(Ie)${2}]} )) {
log_error "Invalid value %B${2}%b for option %B${1}%b"
exit 2
}
config=${2}
shift 2
;;
-s|--codesign) codesign=1; shift ;;
--debug) debug=1; shift ;;
*) log_error "Unknown option: %B${1}%b"; log_output ${_usage}; exit 2 ;;
}
}
: "${target:="${host_os}-${CPUTYPE}"}"
set -- ${(@)args}
check_${host_os}
if [[ ${host_os} == ubuntu ]] {
autoload -Uz setup_ubuntu setup_ccache
setup_ccache
setup_ubuntu
}
local product_name='obs-studio'
pushd ${project_root}
local -a cmake_args=()
local -a cmake_build_args=(--build)
local -a cmake_install_args=(--install)
if (( debug )) cmake_args+=(--debug-output)
case ${target} {
macos-*)
cmake_args+=(
--preset 'macos-ci'
-DCMAKE_OSX_ARCHITECTURES:STRING=${target##*-}
)
if (( debug )) {
cmake_args+=(CMAKE_XCODE_ATTRIBUTE_COMPILATION_CACHE_ENABLE_DIAGNOSTIC_REMARKS:STRING=YES)
}
typeset -gx NSUnbufferedIO=YES
typeset -gx CODESIGN_IDENT="${CODESIGN_IDENT:--}"
if (( codesign )) && [[ -z ${CODESIGN_TEAM} ]] {
typeset -gx CODESIGN_TEAM="$(print "${CODESIGN_IDENT}" | /usr/bin/sed -En 's/.+\((.+)\)/\1/p')"
}
log_group "Configuring ${product_name}..."
cmake -S ${project_root} ${cmake_args}
log_group "Building ${product_name}..."
run_xcodebuild() {
if (( debug )) {
xcodebuild ${@}
} else {
if [[ ${GITHUB_EVENT_NAME} == push ]] {
xcodebuild ${@} 2>&1 | xcbeautify --renderer terminal
} else {
xcodebuild ${@} 2>&1 | xcbeautify --renderer github-actions
}
}
}
local -a build_args=(
ONLY_ACTIVE_ARCH=NO
-project obs-studio.xcodeproj
-target obs-studio
-destination "generic/platform=macOS,name=Any Mac"
-configuration ${config}
-parallelizeTargets
-hideShellScriptEnvironment
build
)
local -a archive_args=(
ONLY_ACTIVE_ARCH=NO
-project obs-studio.xcodeproj
-scheme obs-studio
-destination "generic/platform=macOS,name=Any Mac"
-archivePath obs-studio.xcarchive
-parallelizeTargets
-hideShellScriptEnvironment
archive
)
local -a export_args=(
-exportArchive
-archivePath obs-studio.xcarchive
-exportOptionsPlist exportOptions.plist
-exportPath ${project_root}/build_macos
)
local -a analyze_args=(
CLANG_ANALYZER_OUTPUT=sarif
CLANG_ANALYZER_OUTPUT_DIR=${project_root}/analytics
-project obs-studio.xcodeproj
-target obs-studio
-destination "generic/platform=macOS,name=Any Mac"
-configuration ${config}
-parallelizeTargets
-hideShellScriptEnvironment
analyze
)
pushd build_macos
if (( analyze )) {
run_xcodebuild ${analyze_args}
} else {
if [[ ${GITHUB_EVENT_NAME} == push && ${GITHUB_REF_NAME} =~ [0-9]+.[0-9]+.[0-9]+(-(rc|beta).+)? ]] {
run_xcodebuild ${archive_args}
run_xcodebuild ${export_args}
} else {
run_xcodebuild ${build_args}
rm -rf OBS.app
mkdir OBS.app
ditto frontend/${config}/OBS.app OBS.app
}
}
popd
;;
ubuntu-*)
local cmake_bin='/usr/bin/cmake'
cmake_args+=(
--preset ubuntu-ci
-DENABLE_BROWSER:BOOL=ON
-DCEF_ROOT_DIR:PATH="${project_root}/.deps/cef_binary_${CEF_VERSION}_${target//ubuntu-/linux_}"
)
cmake_build_args+=(build_${target%%-*} --config ${config} --parallel)
cmake_install_args+=(build_${target%%-*} --prefix ${project_root}/build_${target%%-*}/install/${config})
export CLICOLOR_FORCE=1
log_group "Configuring ${product_name}..."
${cmake_bin} -S ${project_root} ${cmake_args}
log_group "Building ${product_name}..."
if (( debug )) cmake_build_args+=(--verbose)
${cmake_bin} ${cmake_build_args}
log_group "Installing ${product_name}..."
if (( debug )) cmake_install_args+=(--verbose)
${cmake_bin} ${cmake_install_args}
;;
}
popd
log_group
}
build ${@}
================================================
FILE: .github/scripts/.package.zsh
================================================
#!/usr/bin/env zsh
builtin emulate -L zsh
setopt EXTENDED_GLOB
setopt PUSHD_SILENT
setopt ERR_EXIT
setopt ERR_RETURN
setopt NO_UNSET
setopt PIPE_FAIL
setopt NO_AUTO_PUSHD
setopt NO_PUSHD_IGNORE_DUPS
setopt FUNCTION_ARGZERO
## Enable for script debugging
#setopt WARN_CREATE_GLOBAL
#setopt WARN_NESTED_VAR
#setopt XTRACE
if (( ! ${+CI} )) {
print -u2 -PR "%F{1} ✖︎ ${ZSH_ARGZERO:t:r} requires CI environment%f"
exit 1
}
autoload -Uz is-at-least && if ! is-at-least 5.9; then
print -u2 -PR "%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.9%b is the minimum supported version. Upgrade Zsh to fix this issue."
exit 1
fi
TRAPZERR() {
print -u2 -PR "::error::%F{1} ✖︎ script execution error%f"
print -PR -e "
Callstack:
${(j:\n :)funcfiletrace}
"
exit 2
}
package() {
if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h}
local host_os=${${(s:-:)ZSH_ARGZERO:t:r}[2]}
local project_root=${SCRIPT_HOME:A:h:h}
fpath=(${SCRIPT_HOME}/utils.zsh ${fpath})
autoload -Uz log_error log_output log_group check_${host_os}
local -i debug=0
local target
local -r -a _valid_targets=(
macos-x86_64
macos-arm64
ubuntu-x86_64
)
local config='RelWithDebInfo'
local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel)
local -i codesign=0
local -i notarize=0
local -i package=0
local -i skip_deps=0
local -a args
while (( # )) {
case ${1} {
-t|--target|-c|--config)
if (( # == 1 )) || [[ ${2:0:1} == '-' ]] {
log_error "Missing value for option %B${1}%b"
exit 2
}
;;
}
case ${1} {
--) shift; args+=($@); break ;;
-t|--target)
if (( ! ${_valid_targets[(Ie)${2}]} )) {
log_error "Invalid value %B${2}%b for option %B${1}%b"
exit 2
}
target=${2}
shift 2
;;
-c|--config)
if (( ! ${_valid_configs[(Ie)${2}]} )) {
log_error "Invalid value %B${2}%b for option %B${1}%b"
exit 2
}
config=${2}
shift 2
;;
-s|--codesign) codesign=1; shift ;;
-n|--notarize) notarize=1; shift ;;
-p|--package) typeset -g package=1; shift ;;
--debug) debug=0; shift ;;
*) log_error "Unknown option: %B${1}%b"; log_output ${_usage}; exit 2 ;;
}
}
: "${target:="${host_os}-${CPUTYPE}"}"
set -- ${(@)args}
check_${host_os}
local product_name='obs-studio'
local commit_version='0.0.0'
local commit_distance='0'
local commit_hash
if [[ -d ${project_root}/.git ]] {
local git_description="$(git describe --tags --long)"
commit_version="${${git_description%-*}%-*}"
commit_hash="${git_description##*-g}"
commit_distance="${${git_description%-*}##*-}"
}
local output_name
if (( commit_distance > 0 )) {
output_name="obs-studio-${commit_version}-${commit_hash}"
} else {
output_name="obs-studio-${commit_version}"
}
if [[ ${host_os} == macos ]] {
if [[ ! -d build_macos/OBS.app ]] {
log_error 'No application bundle found. Run the build script to create a valid application bundle.'
return 0
}
local -A arch_names=(x86_64 Intel arm64 Apple)
output_name="${output_name}-macos-${(L)arch_names[${target##*-}]}"
local volume_name
if (( commit_distance > 0 )) {
volume_name="OBS Studio ${commit_version}-${commit_hash} (${arch_names[${target##*-}]})"
} else {
volume_name="OBS Studio ${commit_version} (${arch_names[${target##*-}]})"
}
if (( package )) {
pushd build_macos
mkdir -p obs-studio/.background
cp ${project_root}/cmake/macos/resources/background.tiff obs-studio/.background/
cp ${project_root}/cmake/macos/resources/AppIcon.icns obs-studio/.VolumeIcon.icns
ln -s /Applications obs-studio/Applications
mkdir -p obs-studio/OBS.app
ditto OBS.app obs-studio/OBS.app
local -i _status=0
autoload -Uz create_diskimage
create_diskimage obs-studio ${volume_name} ${output_name} || _status=1
rm -r obs-studio
if (( _status )) {
log_error "Disk image creation failed."
return 2
}
typeset -gx CODESIGN_IDENT="${CODESIGN_IDENT:--}"
typeset -gx CODESIGN_TEAM="$(print "${CODESIGN_IDENT}" | /usr/bin/sed -En 's/.+\((.+)\)/\1/p')"
codesign --sign "${CODESIGN_IDENT}" ${output_name}.dmg
if (( codesign && notarize )) {
if ! [[ ${CODESIGN_IDENT} != '-' && ${CODESIGN_TEAM} && ${CODESIGN_IDENT_USER} && ${CODESIGN_IDENT_PASS} ]] {
log_error "Notarization requires Apple ID and application password."
return 2
}
xcrun notarytool store-credentials 'OBS-Codesign-Password' --apple-id "${CODESIGN_IDENT_USER}" --team-id "${CODESIGN_TEAM}" --password "${CODESIGN_IDENT_PASS}"
xcrun notarytool submit "${output_name}".dmg --keychain-profile "OBS-Codesign-Password" --wait
local -i _status=0
xcrun stapler staple ${output_name}.dmg || _status=1
if (( _status )) {
log_error "Notarization failed. Use 'xcrun notarytool log <submission ID>' to check errors."
return 2
}
}
popd
} else {
log_group "Archiving obs-studio..."
pushd build_macos
XZ_OPT=-T0 tar -cvJf ${output_name}.tar.xz OBS.app
popd
}
if [[ ${config} == Release ]] {
log_group "Archiving debug symbols..."
mkdir -p build_macos/dSYMs
pushd build_macos/dSYMs
rm -rf -- *.dSYM(N)
cp -pR ${PWD:h}/**/*.dSYM .
XZ_OPT=-T0 tar -cvJf ${output_name}-dSYMs.tar.xz -- *
mv ${output_name}-dSYMs.tar.xz ${PWD:h}
popd
}
log_group
} elif [[ ${host_os} == ubuntu ]] {
local cmake_bin='/usr/bin/cmake'
local -a cmake_args=()
if (( debug )) cmake_args+=(--verbose)
if (( package )) {
log_group "Packaging obs-studio..."
pushd ${project_root}
${cmake_bin} --build build_${target%%-*} --config ${config} --target package ${cmake_args}
output_name="${output_name}-${target##*-}-ubuntu-gnu"
pushd ${project_root}/build_${target%%-*}
local -a files=(obs-studio-*-Linux*.(ddeb|deb|ddeb.sha256|deb.sha256))
for file (${files}) {
mv ${file} ${file//obs-studio-*-Linux/${output_name}}
}
popd
popd
} else {
log_group "Archiving obs-studio..."
output_name="${output_name}-${target##*-}-ubuntu-gnu"
pushd ${project_root}/build_${target%%-*}/install/${config}
XZ_OPT=-T0 tar -cvJf ${project_root}/build_${target%%-*}/${output_name}.tar.xz (bin|lib|share)
popd
}
pushd ${project_root}
${cmake_bin} --build build_${target%%-*} --config ${config} --target package_source ${cmake_args}
output_name="${output_name}-sources"
pushd ${project_root}/build_${target%%-*}
local -a files=(obs-studio-*-sources.tar.*)
for file (${files}) {
mv ${file} ${file//obs-studio-*-sources/${output_name}}
}
popd
popd
log_group
}
}
package ${@}
================================================
FILE: .github/scripts/Build-Windows.ps1
================================================
[CmdletBinding()]
param(
[ValidateSet('x64', 'arm64')]
[string] $Target = 'x64',
[ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')]
[string] $Configuration = 'RelWithDebInfo'
)
$ErrorActionPreference = 'Stop'
if ( $DebugPreference -eq 'Continue' ) {
$VerbosePreference = 'Continue'
$InformationPreference = 'Continue'
}
if ( $env:CI -eq $null ) {
throw "Build-Windows.ps1 requires CI environment"
}
if ( ! ( [System.Environment]::Is64BitOperatingSystem ) ) {
throw "obs-studio requires a 64-bit system to build and run."
}
if ( $PSVersionTable.PSVersion -lt '7.2.0' ) {
Write-Warning 'The obs-studio PowerShell build script requires PowerShell Core 7. Install or upgrade your PowerShell version: https://aka.ms/pscore6'
exit 2
}
function Build {
trap {
Pop-Location -Stack BuildTemp -ErrorAction 'SilentlyContinue'
Write-Error $_
Log-Group
exit 2
}
$ScriptHome = $PSScriptRoot
$ProjectRoot = Resolve-Path -Path "$PSScriptRoot/../.."
$UtilityFunctions = Get-ChildItem -Path $PSScriptRoot/utils.pwsh/*.ps1 -Recurse
foreach($Utility in $UtilityFunctions) {
Write-Debug "Loading $($Utility.FullName)"
. $Utility.FullName
}
Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile"
Push-Location -Stack BuildTemp
Ensure-Location $ProjectRoot
$CmakeArgs = @('--preset', "windows-ci-${Target}")
$CmakeBuildArgs = @('--build')
$CmakeInstallArgs = @()
if ( $DebugPreference -eq 'Continue' ) {
$CmakeArgs += ('--debug-output')
$CmakeBuildArgs += ('--verbose')
$CmakeInstallArgs += ('--verbose')
}
$CmakeBuildArgs += @(
'--preset', "windows-${Target}"
'--config', $Configuration
'--parallel'
'--', '/consoleLoggerParameters:Summary', '/noLogo'
)
$CmakeInstallArgs += @(
'--install', "build_${Target}"
'--prefix', "${ProjectRoot}/build_${Target}/install"
'--config', $Configuration
)
Log-Group "Configuring obs-studio..."
Invoke-External cmake @CmakeArgs
Log-Group "Building obs-studio..."
Invoke-External cmake @CmakeBuildArgs
Log-Group "Installing obs-studio..."
Invoke-External cmake @CmakeInstallArgs
Pop-Location -Stack BuildTemp
Log-Group
}
Build
================================================
FILE: .github/scripts/Package-Windows.ps1
================================================
[CmdletBinding()]
param(
[ValidateSet('x64', 'arm64')]
[string] $Target = 'x64',
[ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')]
[string] $Configuration = 'RelWithDebInfo'
)
$ErrorActionPreference = 'Stop'
if ( $DebugPreference -eq 'Continue' ) {
$VerbosePreference = 'Continue'
$InformationPreference = 'Continue'
}
if ( $env:CI -eq $null ) {
throw "Package-Windows.ps1 requires CI environment"
}
if ( ! ( [System.Environment]::Is64BitOperatingSystem ) ) {
throw "obs-studio requires a 64-bit system to build and run."
}
if ( $PSVersionTable.PSVersion -lt '7.2.0' ) {
Write-Warning 'The obs-studio packaging script requires PowerShell Core 7. Install or upgrade your PowerShell version: https://aka.ms/pscore6'
exit 2
}
function Package {
trap {
Write-Error $_
exit 2
}
$ScriptHome = $PSScriptRoot
$ProjectRoot = Resolve-Path -Path "$PSScriptRoot/../.."
$UtilityFunctions = Get-ChildItem -Path $PSScriptRoot/utils.pwsh/*.ps1 -Recurse
foreach( $Utility in $UtilityFunctions ) {
Write-Debug "Loading $($Utility.FullName)"
. $Utility.FullName
}
Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile"
$GitDescription = Invoke-External git describe --tags --long
$Tokens = ($GitDescription -split '-')
$CommitVersion = $Tokens[0..$($Tokens.Count - 3)] -join '-'
$CommitHash = $($Tokens[-1]).SubString(1)
$CommitDistance = $Tokens[-2]
if ( $CommitDistance -gt 0 ) {
$OutputName = "obs-studio-${CommitVersion}-${CommitHash}"
} else {
$OutputName = "obs-studio-${CommitVersion}"
}
$CpackArgs = @(
'-C', "${Configuration}"
)
if ( $DebugPreference -eq 'Continue' ) {
$CpackArgs += ('--verbose')
}
Log-Group "Packaging obs-studio..."
Push-Location -Stack PackageTemp "build_${Target}"
cpack @CpackArgs
$Package = Get-ChildItem -filter "obs-studio-*-windows-${Target}.zip" -File
Move-Item -Path $Package -Destination "${OutputName}-windows-${Target}.zip"
Pop-Location -Stack PackageTemp
}
Package
================================================
FILE: .github/scripts/utils.pwsh/Ensure-Location.ps1
================================================
function Ensure-Location {
<#
.SYNOPSIS
Ensures current location to be set to specified directory.
.DESCRIPTION
If specified directory exists, switch to it. Otherwise create it,
then switch.
.EXAMPLE
Ensure-Location "My-Directory"
Ensure-Location -Path "Path-To-My-Directory"
#>
param(
[Parameter(Mandatory)]
[string] $Path
)
if ( ! ( Test-Path $Path ) ) {
$_Params = @{
ItemType = "Directory"
Path = ${Path}
ErrorAction = "SilentlyContinue"
}
New-Item @_Params | Set-Location
} else {
Set-Location -Path ${Path}
}
}
================================================
FILE: .github/scripts/utils.pwsh/Install-BuildDependencies.ps1
================================================
function Install-BuildDependencies {
<#
.SYNOPSIS
Installs required build dependencies.
.DESCRIPTION
Additional packages might be needed for successful builds. This module contains additional
dependencies available for installation via winget and, if possible, adds their locations
to the environment path for future invocation.
.EXAMPLE
Install-BuildDependencies
#>
param(
[string] $WingetFile = "$PSScriptRoot/.Wingetfile"
)
if ( ! ( Test-Path function:Log-Warning ) ) {
. $PSScriptRoot/Logger.ps1
}
$Prefixes = @{
'x64' = ${env:ProgramFiles}
'x86' = ${env:ProgramFiles(x86)}
'arm64' = ${env:ProgramFiles(arm)}
}
$Paths = $env:Path -split [System.IO.Path]::PathSeparator
$WingetOptions = @('install', '--accept-package-agreements', '--accept-source-agreements')
if ( $script:Quiet ) {
$WingetOptions += '--silent'
}
Log-Group 'Check Windows build requirements'
Get-Content $WingetFile | ForEach-Object {
$_, $Package, $_, $Path, $_, $Binary, $_, $Version = $_ -replace ',','' -split " +(?=(?:[^\']*\'[^\']*\')*[^\']*$)" -replace "'",''
$Prefixes.GetEnumerator() | ForEach-Object {
$Prefix = $_.value
$FullPath = "${Prefix}\${Path}"
if ( ( Test-Path $FullPath ) -and ! ( $Paths -contains $FullPath ) ) {
$Paths = @($FullPath) + $Paths
$env:Path = $Paths -join [System.IO.Path]::PathSeparator
}
}
Log-Debug "Checking for command ${Binary}"
$Found = Get-Command -ErrorAction SilentlyContinue $Binary
if ( $Found ) {
Log-Status "Found dependency ${Binary} as $($Found.Source)"
} else {
Log-Status "Installing package ${Package} $(if ( $Version -ne $null ) { "Version: ${Version}" } )"
if ( $Version -ne $null ) {
$WingGetOptions += @('--version', ${Version})
}
try {
$Params = $WingetOptions + $Package
winget @Params
} catch {
throw "Error while installing winget package ${Package}: $_"
}
}
}
Log-Group
}
================================================
FILE: .github/scripts/utils.pwsh/Invoke-External.ps1
================================================
function Invoke-External {
<#
.SYNOPSIS
Invokes a non-PowerShell command.
.DESCRIPTION
Runs a non-PowerShell command, and captures its return code.
Throws an exception if the command returns non-zero.
.EXAMPLE
Invoke-External 7z x $MyArchive
#>
if ( $args.Count -eq 0 ) {
throw 'Invoke-External called without arguments.'
}
if ( ! ( Test-Path function:Log-Information ) ) {
. $PSScriptRoot/Logger.ps1
}
$Command = $args[0]
$CommandArgs = @()
if ( $args.Count -gt 1) {
$CommandArgs = $args[1..($args.Count - 1)]
}
$_EAP = $ErrorActionPreference
$ErrorActionPreference = "Continue"
Log-Debug "Invoke-External: ${Command} ${CommandArgs}"
& $command $commandArgs
$Result = $LASTEXITCODE
$ErrorActionPreference = $_EAP
if ( $Result -ne 0 ) {
throw "${Command} ${CommandArgs} exited with non-zero code ${Result}."
}
}
================================================
FILE: .github/scripts/utils.pwsh/Logger.ps1
================================================
function Log-Debug {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Debug $m
}
}
}
function Log-Verbose {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Verbose $m
}
}
}
function Log-Warning {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Warning $m
}
}
}
function Log-Error {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
foreach($m in $Message) {
Write-Error $m
}
}
}
function Log-Information {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ' =>'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Blue " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Group {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string[]] $Message
)
Process {
if ( $Env:CI -ne $null ) {
if ( $script:LogGroup ) {
Write-Output '::endgroup::'
$script:LogGroup = $false
}
if ( $Message.count -ge 1 ) {
Write-Output "::group::$($Message -join ' ')"
$script:LogGroup = $true
}
} else {
if ( $Message.count -ge 1 ) {
Log-Information $Message
}
}
}
}
function Log-Status {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $StageName -ne $null ) { $StageName } else { '' })
$Icon = ' >'
foreach($m in $Message) {
Write-Host -NoNewLine -ForegroundColor Green " ${StageName} $($Icon.PadRight(5)) "
Write-Host "${m}"
}
}
}
}
function Log-Output {
[CmdletBinding()]
param(
[Parameter(Mandatory,ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string[]] $Message
)
Process {
if ( ! ( $script:Quiet ) ) {
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
$Icon = ''
foreach($m in $Message) {
Write-Output " ${StageName} $($Icon.PadRight(5)) ${m}"
}
}
}
}
$Columns = (Get-Host).UI.RawUI.WindowSize.Width - 5
================================================
FILE: .github/scripts/utils.py/check-jsonschema.py
================================================
import argparse
import json
import logging
import os
import sys
from typing import Any
from json_source_map import calculate
from json_source_map.errors import InvalidInputError
from jsonschema import Draft7Validator
def discover_schema_file(filename: str) -> tuple[str | None, Any]:
logger = logging.getLogger()
with open(filename) as json_file:
json_data = json.load(json_file)
schema_filename = json_data.get("$schema", None)
if not schema_filename:
logger.info(f"ℹ️ ${filename} has no schema definition")
return (None, None)
schema_file = os.path.join(os.path.dirname(filename), schema_filename)
with open(schema_file) as schema_file:
schema_data = json.load(schema_file)
return (str(schema_file), schema_data)
def validate_json_files(
schema_data: dict[Any, Any], json_file_name: str
) -> list[dict[str, str]]:
logger = logging.getLogger()
with open(json_file_name) as json_file:
text_data = json_file.read()
json_data = json.loads(text_data)
source_map = calculate(text_data)
validator = Draft7Validator(schema_data)
violations = []
for violation in sorted(validator.iter_errors(json_data), key=str):
logger.info(
f"⚠️ Schema violation in file '{json_file_name}':\n{violation}\n----\n"
)
if len(violation.absolute_path):
error_path = "/".join(
str(path_element) for path_element in violation.absolute_path
)
error_entry = source_map["/{}".format(error_path)]
violation_data = {
"file": json_file_name,
"title": "Validation Error",
"message": violation.message,
"annotation_level": "failure",
"start_line": error_entry.value_start.line + 1,
"end_line": error_entry.value_end.line + 1,
}
violations.append(violation_data)
return violations
def main() -> int:
parser = argparse.ArgumentParser(
description="Validate JSON files by schema definition"
)
parser.add_argument(
"json_files", metavar="FILE", type=str, nargs="+", help="JSON file to validate"
)
parser.add_argument(
"--loglevel", type=str, help="Set log level", default="WARNING", required=False
)
arguments = parser.parse_args()
logging.basicConfig(level=arguments.loglevel, format="%(levelname)s - %(message)s")
logger = logging.getLogger()
schema_mappings = {}
for json_file in arguments.json_files:
try:
(schema_file, schema_data) = discover_schema_file(json_file)
except OSError as e:
logger.error(f"❌ Failed to discover schema for file '{json_file}': {e}")
return 2
if schema_file and schema_file not in schema_mappings.keys():
schema_mappings.update(
{schema_file: {"schema_data": schema_data, "files": set()}}
)
schema_mappings[schema_file]["files"].add(json_file)
validation_errors = []
for schema_entry in schema_mappings.values():
for json_file in schema_entry["files"]:
try:
new_errors = validate_json_files(schema_entry["schema_data"], json_file)
except (InvalidInputError, OSError) as e:
logger.error(
f"❌ Failed to create JSON source map for file '{json_file}': {e}"
)
return 2
[validation_errors.append(error) for error in new_errors]
if validation_errors:
try:
with open("validation_errors.json", "w") as results_file:
json.dump(validation_errors, results_file)
except OSError as e:
logger.error(f"❌ Failed to write validation results file: {e}")
return 2
return 1
return 0
if __name__ == "__main__":
sys.exit(main())
================================================
FILE: .github/scripts/utils.py/check-services.py
================================================
import asyncio
import json
import os
import time
import sys
import zipfile
import aiohttp
import requests
from io import BytesIO
from typing import List, Dict
from collections import defaultdict
MINIMUM_PURGE_AGE = 9.75 * 24 * 60 * 60 # slightly less than 10 days
TIMEOUT = 10
SKIPPED_SERVICES = {"SHOWROOM", "Dacast"}
SERVICES_FILE = "plugins/rtmp-services/data/services.json"
PACKAGE_FILE = "plugins/rtmp-services/data/package.json"
CACHE_FILE = "other/timestamps.json"
GITHUB_OUTPUT_FILE = os.environ.get("GITHUB_OUTPUT", None)
DO_NOT_PING = {"jp9000"}
PR_MESSAGE = """This is an automatically created pull request to remove unresponsive servers and services.
| Service | Action Taken | Author(s) |
| ------- | ------------ | --------- |
{table}
If you are not responsible for an affected service and want to be excluded from future pings please let us know.
Created by workflow run: https://github.com/{repository}/actions/runs/{run_id}"""
# GQL is great isn't it
GQL_QUERY = """{
repositoryOwner(login: "obsproject") {
repository(name: "obs-studio") {
object(expression: "master") {
... on Commit {
blame(path: "plugins/rtmp-services/data/services.json") {
ranges {
startingLine
endingLine
commit {
author {
user {
login
}
}
}
}
}
}
}
}
}
}"""
def get_last_artifact():
s = requests.session()
s.headers["Authorization"] = f'Bearer {os.environ["GITHUB_TOKEN"]}'
run_id = os.environ["WORKFLOW_RUN_ID"]
repo = os.environ["REPOSITORY"]
# fetch run first, get workflow id from there to get workflow runs
r = s.get(f"https://api.github.com/repos/{repo}/actions/runs/{run_id}")
r.raise_for_status()
workflow_id = r.json()["workflow_id"]
r = s.get(
f"https://api.github.com/repos/{repo}/actions/workflows/{workflow_id}/runs",
params=dict(
per_page=1,
status="completed",
branch="master",
conclusion="success",
event="schedule",
),
)
r.raise_for_status()
runs = r.json()
if not runs["workflow_runs"]:
raise ValueError("No completed workflow runs found")
r = s.get(runs["workflow_runs"][0]["artifacts_url"])
r.raise_for_status()
for artifact in r.json()["artifacts"]:
if artifact["name"] == "timestamps":
artifact_url = artifact["archive_download_url"]
break
else:
raise ValueError("No previous artifact found.")
r = s.get(artifact_url)
r.raise_for_status()
zip_data = BytesIO()
zip_data.write(r.content)
with zipfile.ZipFile(zip_data) as zip_ref:
for info in zip_ref.infolist():
if info.filename == "timestamps.json":
return json.loads(zip_ref.read(info.filename))
def find_people_to_blame(raw_services: str, servers: list[tuple[str, str]]) -> dict:
if not servers:
return dict()
# Fetch Blame data from github
s = requests.session()
s.headers["Authorization"] = f'Bearer {os.environ["GITHUB_TOKEN"]}'
r = s.post(
"https://api.github.com/graphql", json=dict(query=GQL_QUERY, variables=dict())
)
r.raise_for_status()
j = r.json()
# The file is only ~2600 lines so this isn't too crazy and makes the lookup very easy
line_author = dict()
for blame in j["data"]["repositoryOwner"]["repository"]["object"]["blame"][
"ranges"
]:
for i in range(blame["startingLine"] - 1, blame["endingLine"]):
if user := blame["commit"]["author"]["user"]:
line_author[i] = user["login"]
service_authors = defaultdict(set)
for i, line in enumerate(raw_services.splitlines()):
if '"url":' not in line:
continue
for server, service in servers:
if server in line and (author := line_author.get(i)):
if author not in DO_NOT_PING:
service_authors[service].add(author)
return service_authors
def set_output(name, value):
if not GITHUB_OUTPUT_FILE:
return
try:
with open(GITHUB_OUTPUT_FILE, "a", encoding="utf-8", newline="\n") as f:
f.write(f"{name}={value}\n")
except Exception as e:
print(f"Writing to github output files failed: {e!r}")
async def check_servers_task(
session: aiohttp.ClientSession, host: str, protocol: str, servers: List[str]
) -> List[Dict]:
query = [dict(url=h, protocol=protocol) for h in servers]
async with session.get(
f"http://{host}:8999/test_remote_servers", json=query
) as resp:
return await resp.json()
async def process_services(session: aiohttp.ClientSession, check_servers: List[str]):
try:
with open(SERVICES_FILE, encoding="utf-8") as services_file:
raw_services = services_file.read()
services = json.loads(raw_services)
with open(PACKAGE_FILE, encoding="utf-8") as package_file:
package = json.load(package_file)
except OSError as e:
print(f"❌ Could not open services/package file: {e}")
return 1
# attempt to load last check result cache
try:
with open(CACHE_FILE, encoding="utf-8") as check_file:
fail_timestamps = json.load(check_file)
except OSError as e:
# cache might be evicted or not exist yet, so this is non-fatal
print(
f"⚠️ Could not read cache file, trying to get last artifact (Exception: {e})"
)
try:
fail_timestamps = get_last_artifact()
except Exception as e:
print(f"⚠️ Could not fetch cache file, starting fresh. (Exception: {e})")
fail_timestamps = dict()
else:
print("Fetched cache file from last run artifact.")
else:
print("Successfully loaded cache file:", CACHE_FILE)
start_time = int(time.time())
affected_services = dict()
removed_servers = list()
# create temporary new list
new_services = services.copy()
new_services["services"] = []
for service in services["services"]:
# skip services that do custom stuff that we can't easily check
if service["name"] in SKIPPED_SERVICES:
new_services["services"].append(service)
continue
service_type = service.get("recommended", {}).get("output", "rtmp_output")
if service_type not in {"rtmp_output", "ffmpeg_hls_muxer"}:
print("Unknown service type:", service_type)
new_services["services"].append(service)
continue
protocol = "rtmp" if service_type == "rtmp_output" else "hls"
# create a copy to mess with
new_service = service.copy()
new_service["servers"] = []
# run checks for all the servers, and store results in timestamp cache
try:
servers = [s["url"] for s in service["servers"]]
tasks = []
for host in check_servers:
tasks.append(
asyncio.create_task(
check_servers_task(session, host, protocol, servers)
)
)
results = await asyncio.gather(*tasks)
except Exception as e:
print(
f"❌ Querying server status for \"{service['name']}\" failed with: {e}"
)
return 1
# go over results
for server, result in zip(service["servers"], zip(*results)):
failure_count = sum(not res["status"] for res in result)
probe_count = len(result)
# only treat server as failed if all check servers reported a failure
is_ok = failure_count < probe_count
if not is_ok:
failures = {res["comment"] for res in result if not res["status"]}
print(
f"⚠️ Connecting to server failed: {server['url']} (Reason(s): {failures})"
)
if ts := fail_timestamps.get(server["url"], None):
if (delta := start_time - ts) >= MINIMUM_PURGE_AGE:
print(
f'🗑️ Purging server "{server["url"]}", it has been '
f"unresponsive for {round(delta/60/60/24)} days."
)
removed_servers.append((server["url"], service["name"]))
# continuing here means not adding it to the new list, thus dropping it
continue
else:
fail_timestamps[server["url"]] = start_time
elif is_ok and server["url"] in fail_timestamps:
# remove timestamp of failed check if server is back
delta = start_time - fail_timestamps[server["url"]]
print(
f'💡 Server "{server["url"]}" is back after {round(delta/60/60/24)} days!'
)
del fail_timestamps[server["url"]]
new_service["servers"].append(server)
if (diff := len(service["servers"]) - len(new_service["servers"])) > 0:
print(f'ℹ️ Removed {diff} server(s) from {service["name"]}')
affected_services[service["name"]] = f"{diff} servers removed"
# remove services with no valid servers
if not new_service["servers"]:
print(f'💀 Service "{service["name"]}" has no valid servers left, removing!')
affected_services[service["name"]] = f"Service removed"
else:
new_services["services"].append(new_service)
# wait a bit between services
await asyncio.sleep(2.0)
# write cache file
try:
os.makedirs("other", exist_ok=True)
with open(CACHE_FILE, "w", encoding="utf-8") as cache_file:
json.dump(fail_timestamps, cache_file)
except OSError as e:
print(f"❌ Could not write cache file: {e}")
return 1
else:
print("Successfully wrote cache file:", CACHE_FILE)
if removed_servers:
# increment package version and save that as well
package["version"] += 1
package["files"][0]["version"] += 1
try:
with open(SERVICES_FILE, "w", encoding="utf-8") as services_file:
json.dump(new_services, services_file, indent=4, ensure_ascii=False)
services_file.write("\n")
with open(PACKAGE_FILE, "w", encoding="utf-8") as package_file:
json.dump(package, package_file, indent=4)
package_file.write("\n")
except OSError as e:
print(f"❌ Could not write services/package file: {e}")
return 1
else:
print(
f"Successfully wrote services/package files:\n- {SERVICES_FILE}\n- {PACKAGE_FILE}"
)
# try to find authors to ping, this is optional and is allowed to fail
try:
service_authors = find_people_to_blame(raw_services, removed_servers)
except Exception as e:
print(f"⚠ Could not fetch blame for some reason: {e}")
service_authors = dict()
# set GitHub outputs
set_output("make_pr", "true")
msg = PR_MESSAGE.format(
repository=os.environ["REPOSITORY"],
run_id=os.environ["WORKFLOW_RUN_ID"],
table="\n".join(
"| {name} | {action} | {authors} |".format(
name=name.replace("|", "\\|"),
action=action,
authors=", ".join(
f"@{author}" for author in sorted(service_authors.get(name, []))
),
)
for name, action in sorted(affected_services.items())
),
)
set_output("pr_message", json.dumps(msg))
else:
set_output("make_pr", "false")
async def main():
# check for environment variables
try:
api_key = os.environ["API_KEY"]
servers = os.environ["API_SERVERS"].split(",")
if not servers:
raise ValueError("No checker servers!")
# Mask everything except the region code
for server in servers:
prefix = server[: server.index(".") + 1]
print(f"::add-mask::{prefix}")
suffix = server[server.index(".", len(prefix)) :]
print(f"::add-mask::{suffix}")
except Exception as e:
print(f"❌ Failed getting required environment variables: {e}")
return 1
# create aiohttp session
async with aiohttp.ClientSession() as session:
session.headers["Authorization"] = api_key
session.headers["User-Agent"] = "OBS Repo Service Checker/1.0"
return await process_services(session, servers)
if __name__ == "__main__":
sys.exit(asyncio.run(main()))
================================================
FILE: .github/scripts/utils.zsh/check_macos
================================================
autoload -Uz is-at-least log_group log_info log_error log_status
local macos_version=$(sw_vers -productVersion)
log_group 'Install macOS build requirements'
log_info 'Checking macOS version...'
if ! is-at-least 12.0 ${macos_version}; then
log_error "Minimum required macOS version is 12.0, but running on macOS ${macos_version}"
return 2
else
log_status "macOS ${macos_version} is recent"
fi
log_info 'Checking for Homebrew...'
if (( ! ${+commands[brew]} )) {
log_error 'No Homebrew command found. Please install Homebrew (https://brew.sh)'
return 2
}
brew bundle --file ${SCRIPT_HOME}/.Brewfile
rehash
log_group
================================================
FILE: .github/scripts/utils.zsh/check_ubuntu
================================================
autoload -Uz log_debug log_group
log_group 'Check Ubuntu build requirements'
log_debug 'Checking Ubuntu distribution name and version...'
if [[ -f /etc/os-release ]] {
local dist_name
local dist_version
read -r dist_name dist_version <<< "$(source /etc/os-release; print "${NAME} ${VERSION_ID}")"
if [[ ${dist_name} != Ubuntu ]] {
log_error "Not running on an Ubuntu distribution. Aborting"
log_group
return 2
}
autoload -Uz is-at-least && if ! is-at-least 24.04 ${dist_version}; then
log_error "Not running on a recent-enough Ubuntu distribution. Aborting"
log_group
return 2
fi
} else {
log_error "Unable to determine local Linux distribution, but Ubuntu is required. Aborting"
log_group
return 2
}
local -a dependencies=("${(fA)$(<${SCRIPT_HOME}/.Aptfile)}")
local -a install_list
local binary
sudo apt-get update -qq
for dependency (${dependencies}) {
local -a tokens=(${=dependency//(,|:|\')/})
if [[ ! ${tokens[1]} == package ]] continue
if [[ ${#tokens} -gt 2 && ${tokens[3]} == bin ]] {
binary=${tokens[4]}
} else {
binary=${tokens[2]}
}
if (( ! ${+commands[${binary}]} )) install_list+=(${tokens[2]})
}
log_debug "List of dependencies to install: ${install_list}"
if (( #install_list )) {
sudo apt-get -y --no-install-recommends install ${install_list}
}
rehash
log_group
================================================
FILE: .github/scripts/utils.zsh/create_diskimage
================================================
autoload -Uz log_debug log_error log_info log_status log_group log_output log_warning
local -r _usage="Usage: %B${0}%b <source> <volume name> <output_name>
Create macOS disk image <volume name> <output_name> with contents of <source>"
if (( ! # )) {
log_error 'Called without arguments.'
log_output ${_usage}
return 2
}
local source=${1}
local volume_name=${2}
local output_name=${3}
log_group "Create macOS disk image"
trap "safe_hdiutil detach /Volumes/${output_name}; rm temp.dmg; log_group; return 2" ERR
safe_hdiutil() {
local _status=0
local -r -a _backoff=(2 5 10 15 30)
for i ({1..5}) {
hdiutil ${@} && _status=0 || _status=1
if (( _status )) {
log_warning "Unable to run 'hdiutil ${@}' (attempt #${i}). Retrying."
if (( ${+CI} )) sudo pkill -9 XProtect >/dev/null || true
sleep ${_backoff[${i}]}
} else {
break
}
}
if (( _status )) {
log_error "Unable to run 'hdiutil ${@}'. Aborting"
log_group
return 2
}
}
safe_hdiutil create \
-volname "${volume_name}" \
-srcfolder ${source} \
-ov \
-fs HFS+ \
-format UDRW \
temp.dmg
safe_hdiutil attach \
-noverify \
-readwrite \
-mountpoint /Volumes/${output_name} \
temp.dmg
log_info "Waiting 2 seconds to ensure mounted volume is available..."
sleep 2
log_status "Done"
log_info "Setting up disk volume..."
log_status "Volume icon"
SetFile -c icnC /Volumes/${output_name}/.VolumeIcon.icns
log_status "Icon positions"
osascript package.applescript ${output_name}
log_status "File permissions"
chmod -Rf go-w /Volumes/${output_name}
SetFile -a C /Volumes/${output_name}
rm -rf -- /Volumes/${output_name}/.fseventsd(N)
log_info "Converting disk image..."
safe_hdiutil detach /Volumes/${output_name}
safe_hdiutil convert \
-format ULFO \
-ov \
-o ${output_name}.dmg temp.dmg
rm temp.dmg
trap '' ERR
log_group
return 0
================================================
FILE: .github/scripts/utils.zsh/log_debug
================================================
if (( debug )) print -PR -e "::debug::%F{220}DEBUG: ${@}%f"
================================================
FILE: .github/scripts/utils.zsh/log_error
================================================
print -u2 -PR "::error::%F{1} ✖︎%f ${@}"
================================================
FILE: .github/scripts/utils.zsh/log_group
================================================
autoload -Uz log_info
if (( ! ${+_log_group} )) typeset -g _log_group=0
if (( _log_group )) {
print "::endgroup::"
typeset -g _log_group=0
}
if (( # )) {
print "::group::${@}"
typeset -g _log_group=1
}
================================================
FILE: .github/scripts/utils.zsh/log_info
================================================
print -PR "%F{4} =>%f %B${@}%b"
================================================
FILE: .github/scripts/utils.zsh/log_output
================================================
print -PR " ${@}"
================================================
FILE: .github/scripts/utils.zsh/log_status
================================================
print -PR "%F{2} >%f ${@}"
================================================
FILE: .github/scripts/utils.zsh/log_warning
================================================
print -PR "::warning::%F{3} => ${@}%f"
================================================
FILE: .github/scripts/utils.zsh/mkcd
================================================
[[ -n ${1} ]] && mkdir -p ${1} && builtin cd ${1}
================================================
FILE: .github/scripts/utils.zsh/setup_ccache
================================================
autoload -Uz is-at-least log_debug log_warning
if (( ${+commands[ccache]} )) {
log_debug "Found ccache at ${commands[ccache]}"
local ccache_version=$(ccache --version | head -1 | cut -d ' ' -f 3)
if ! is-at-least 4.12 ${ccache_version}; then
ccache --set-config=run_second_cpp=true
fi
ccache --set-config=direct_mode=true
ccache --set-config=inode_cache=true
ccache --set-config=compiler_check=content
ccache --set-config=file_clone=true
local -a sloppiness=(
include_file_mtime
include_file_ctime
file_stat_matches
system_headers
)
if [[ ${host_os} == macos ]] {
sloppiness+=(
modules
clang_index_store
)
ccache --set-config=sloppiness=${(j:,:)sloppiness}
}
ccache --set-config=cache_dir="${GITHUB_WORKSPACE:-${HOME}}/.ccache"
ccache --set-config=max_size="${CCACHE_SIZE:-1G}"
ccache -z > /dev/null
} else {
log_warning "Ccache not available"
}
================================================
FILE: .github/scripts/utils.zsh/setup_ubuntu
================================================
autoload -Uz log_group log_error log_status log_info log_debug
if (( ! ${+commands[curl]} )) {
log_error 'curl not available.'
return 2
}
if (( ! ${+commands[jq]} )) {
log_error 'jq not available.'
return 2
}
local -a curl_opts=(--show-error --silent --location -O ${@})
pushd ${project_root}
log_group 'Installing obs-studio build dependencies...'
mkdir -p ${project_root}/.deps
local deps_version
local deps_baseurl
local deps_label
local deps_hash
IFS=';' read -r deps_version deps_baseurl deps_label deps_hash deps_revision <<< \
"$(jq -r --arg target "${target}" '
.configurePresets[]
| select(.name=="dependencies")
| .vendor["obsproject.com/obs-studio"].dependencies["cef"]
| {version, baseUrl, "label", "hash": .hashes[$target], "revision": .revision[$target]}
| join(";")
' ${project_root}/CMakePresets.json)"
if (( ! deps_version )) {
log_error 'No valid cef spec found in buildspec.json.'
return 2
}
log_group 'Setting up pre-built Chromium Embedded Framework...'
pushd ${project_root}/.deps
local _filename="cef_binary_${deps_version}_${target//ubuntu-/linux_}${deps_revision:+"_v${deps_revision}"}.tar.xz"
local _url=${deps_baseurl}/${_filename}
local _target="cef_binary_${deps_version}_${target//ubuntu-/linux_}"
typeset -g CEF_VERSION=${deps_version}
log_debug "Running curl ${curl_opts} ${_url}"
curl ${curl_opts} ${_url} && \
log_status "Downloaded ${deps_label} for ${target}."
read -r artifact_checksum _ <<< "$(sha256sum ${_filename})"
if [[ ${deps_hash} != ${artifact_checksum} ]] {
log_error "Checksum of downloaded ${deps_label} does not match specification.
Expected : ${deps_hash}
Actual : ${artifact_checksum}"
return 2
}
log_status "Checksum of downloaded ${deps_label} matches."
mkdir -p ${_target} && pushd ${_target}
XZ_OPT=-T0 tar --strip-components 1 -xJf ../${_filename} && log_status "${deps_label} extracted."
popd
log_group 'Installing obs-studio build dependencies from apt...'
sudo apt-get install -y --no-install-recommends \
build-essential libglib2.0-dev \
extra-cmake-modules lsb-release dh-cmake \
libcurl4-openssl-dev \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
libswresample-dev libswscale-dev \
libjansson-dev \
libx11-xcb-dev \
libgles2-mesa-dev \
libwayland-dev \
libpipewire-0.3-dev \
libpulse-dev \
libx264-dev \
libmbedtls-dev \
libgl1-mesa-dev \
libjansson-dev \
uthash-dev \
libsimde-dev \
libluajit-5.1-dev python3-dev \
libx11-dev libxcb-randr0-dev libxcb-shm0-dev libxcb-xinerama0-dev \
libxcb-composite0-dev libxinerama-dev libxcb1-dev libx11-xcb-dev libxcb-xfixes0-dev \
swig libcmocka-dev libxss-dev libglvnd-dev \
libxkbcommon-dev libatk1.0-dev libatk-bridge2.0-dev libxcomposite-dev libxdamage-dev \
libasound2-dev libfdk-aac-dev libfontconfig-dev libfreetype6-dev libjack-jackd2-dev \
libpulse-dev libsndio-dev libspeexdsp-dev libudev-dev libv4l-dev libva-dev libvlc-dev \
libpci-dev libdrm-dev \
nlohmann-json3-dev libwebsocketpp-dev libasio-dev libqrcodegencpp-dev \
libffmpeg-nvenc-dev librist-dev libsrt-openssl-dev \
qt6-base-dev libqt6svg6-dev qt6-base-private-dev \
libvpl-dev libvpl2
================================================
FILE: .github/workflows/analyze-project.yaml
================================================
name: Analyze Project
on:
workflow_call:
jobs:
windows:
name: Windows 🪟 (PVS-Studio)
runs-on: windows-2022
if: false && github.repository_owner == 'obsproject'
defaults:
run:
shell: pwsh
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Build OBS Studio 🧱
uses: ./.github/actions/build-obs
env:
TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
GPU_PRIORITY_VAL: ${{ secrets.GPU_PRIORITY_VAL }}
with:
target: x64
config: Debug
- name: Run PVS-Studio Analysis
uses: ./.github/actions/windows-analysis
with:
pvsUsername: ${{ secrets.PVS_NAME }}
pvsKey: ${{ secrets.PVS_KEY }}
target: x64
config: Debug
macos:
name: macOS 🍏 (clang-analyze)
runs-on: macos-15
defaults:
run:
shell: zsh --no-rcs --errexit --pipefail {0}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Set Up Environment 🔧
id: setup
run: |
: Set Up Environment 🔧
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print '::group::Enable Xcode 16.4'
sudo xcode-select --switch /Applications/Xcode_16.4.app/Contents/Developer
print '::endgroup::'
print '::group::Clean Homebrew Environment'
local -a unwanted_formulas=()
local -a remove_formulas=()
for formula (${unwanted_formulas}) {
if [[ -d ${HOMEBREW_PREFIX}/Cellar/${formula} ]] remove_formulas+=(${formula})
}
if (( #remove_formulas )) brew uninstall --ignore-dependencies ${remove_formulas}
print '::endgroup::'
- name: Set Up Code Signing 🔑
uses: ./.github/actions/setup-macos-codesigning
id: codesign
with:
codesignIdentity: ${{ secrets.MACOS_SIGNING_IDENTITY }}
codesignCertificate: ${{ secrets.MACOS_SIGNING_CERT }}
certificatePassword: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }}
keychainPassword: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
provisioningProfile: ${{ secrets.MACOS_SIGNING_PROVISIONING_PROFILE }}
notarizationUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
notarizationPassword: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}
- name: Build OBS Studio 🧱
env:
TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
CODESIGN_IDENT: ${{ steps.codesign.outputs.codesignIdent }}
CODESIGN_TEAM: ${{ steps.codesign.outputs.codesignTeam }}
PROVISIONING_PROFILE: ${{ steps.codesign.outputs.provisioningProfileUUID }}
run: |
: Run macOS Build
local -a build_args=(
--config Debug
--target macos-arm64
--codesign
--analyze
)
if (( ${+RUNNER_DEBUG} )) build_args+=(--debug)
git fetch origin --no-tags --no-recurse-submodules -q
.github/scripts/build-macos ${build_args}
- name: Compile Analytics Data 📊
run: |
: Compile Analytics Data 📊
local analytics_root='${{ github.workspace }}/analytics'
local -a analytics_files=(${analytics_root}/StaticAnalyzer/obs-studio/**/*.plist)
for file (${analytics_files}) {
mv ${file} ${analytics_root}/${${file:t}//plist/sarif}
}
pushd ${analytics_root}
npx @microsoft/sarif-multitool merge --merge-runs *.sarif
popd
- name: Upload SARIF report files 📦
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: "${{ github.workspace }}/analytics/merged.sarif"
category: 'clang-analyze (macOS Apple Silicon)'
================================================
FILE: .github/workflows/build-project.yaml
================================================
name: Build Project
on:
workflow_call:
jobs:
check-event:
name: Event Data 🔎
runs-on: ubuntu-24.04
defaults:
run:
shell: bash
outputs:
package: ${{ steps.setup.outputs.package }}
codesign: ${{ steps.setup.outputs.codesign }}
notarize: ${{ steps.setup.outputs.notarize }}
config: ${{ steps.setup.outputs.config }}
commitHash: ${{ steps.setup.outputs.commitHash }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check Event Data ☑️
id: setup
env:
GH_TOKEN: ${{ github.token }}
run: |
: Check Event Data ☑️
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
case "${GITHUB_EVENT_NAME}" in
pull_request)
config_data=('codesign:false' 'notarize:false' 'package:false' 'config:RelWithDebInfo')
if gh pr view ${{ github.event.number }} --json labels \
| jq -e -r '.labels[] | select(.name == "Seeking Testers")' > /dev/null; then
config_data[0]='codesign:true'
config_data[2]='package:true'
fi
;;
push)
config_data=('codesign:true' 'notarize:false' 'package:true' 'config:RelWithDebInfo')
if [[ ${GITHUB_REF_NAME} =~ [0-9]+.[0-9]+.[0-9]+(-(rc|beta).+)? ]]; then
config_data[1]='notarize:true'
config_data[3]='config:Release'
fi
;;
workflow_dispatch)
config_data=('codesign:true' 'notarize:false' 'package:false' 'config:RelWithDebInfo')
;;
schedule)
config_data=('codesign:true' 'notarize:false' 'package:true' 'config:RelWithDebInfo')
;;
*) ;;
esac
for config in "${config_data[@]}"; do
IFS=':' read -r key value <<< "${config}"
echo "${key}=${value}" >> $GITHUB_OUTPUT
done
echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT
macos-build:
name: macOS 🍏
runs-on: macos-15
needs: check-event
strategy:
fail-fast: false
matrix:
target: [arm64, x86_64]
defaults:
run:
shell: zsh --no-rcs --errexit --pipefail {0}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Set Up Environment 🔧
id: setup
run: |
: Set Up Environment 🔧
if (( ${+RUNNER_DEBUG} )) setopt XTRACE
print '::group::Enable Xcode 26.1'
sudo xcode-select --switch /Applications/Xcode_26.1.app/Contents/Developer
print '::endgroup::'
print '::group::Clean Homebrew Environment'
local -a unwanted_formulas=()
local -a remove_formulas=()
for formula (${unwanted_formulas}) {
if [[ -d ${HOMEBREW_PREFIX}/Cellar/${formula} ]] remove_formulas+=(${formula})
}
if (( #remove_formulas )) brew uninstall --ignore-dependencies ${remove_formulas}
print '::endgroup::'
local -A arch_names=(x86_64 intel arm64 apple)
print "cpuName=${arch_names[${{ matrix.target }}]}" >> $GITHUB_OUTPUT
local xcode_cas_path="${HOME}/Library/Developer/Xcode/DerivedData/CompilationCache.noindex"
if ! [[ -d ${xcode_cas_path} ]] mkdir -p ${xcode_cas_path}
print "xcodeCasPath=${xcode_cas_path}" >> $GITHUB_OUTPUT
- uses: actions/cache/restore@v4
id: xcode-cache
with:
path: ${{ steps.setup.outputs.xcodeCasPath }}
key: ${{ runner.os }}-xcode-${{ matrix.target }}-${{ needs.check-event.outputs.config }}
restore-keys: |
${{ runner.os }}-xcode-${{ matrix.target }}-
- name: Set Up Code Signing 🔑
uses: ./.github/actions/setup-macos-codesigning
if: fromJSON(needs.check-event.outputs.codesign)
id: codesign
with:
codesignIdentity: ${{ secrets.MACOS_SIGNING_IDENTITY }}
codesignCertificate: ${{ secrets.MACOS_SIGNING_CERT }}
certificatePassword: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }}
keychainPassword: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
provisioningProfile: ${{ secrets.MACOS_SIGNING_PROVISIONING_PROFILE }}
notarizationUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
notarizationPassword: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}
- name: Build OBS Studio 🧱
uses: ./.github/actions/build-obs
env:
TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
XCODE_CAS_PATH: ${{ steps.setup.outputs.xcodeCasPath }}
with:
target: ${{ matrix.target }}
config: ${{ needs.check-event.outputs.config }}
codesign: ${{ fromJSON(needs.check-event.outputs.codesign) }}
codesignIdent: ${{ steps.codesign.outputs.codesignIdent }}
codesignTeam: ${{ steps.codesign.outputs.codesignTeam }}
provisioningProfileUUID: ${{ steps.codesign.outputs.provisioningProfileUUID }}
- name: Package OBS Studio 📀
uses: ./.github/actions/package-obs
with:
target: ${{ matrix.target }}
config: ${{ needs.check-event.outputs.config }}
package: ${{ fromJSON(needs.check-event.outputs.package) }}
codesign: ${{ fromJSON(needs.check-event.outputs.codesign) && fromJSON(steps.codesign.outputs.haveCodesignIdent) }}
codesignIdent: ${{ steps.codesign.outputs.codesignIdent }}
notarize: ${{ fromJSON(needs.check-event.outputs.notarize) && fromJSON(steps.codesign.outputs.haveNotarizationUser) }}
codesignUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
codesignPass: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}
- name: Upload Artifacts 📡
uses: actions/upload-artifact@v4
with:
name: obs-studio-macos-${{ matrix.target }}-${{ needs.check-event.outputs.commitHash }}
path: ${{ github.workspace }}/build_macos/obs-studio-*-macos-${{ steps.setup.outputs.cpuName }}.*
- name: Upload Debug Symbol Artifacts 🪲
uses: actions/upload-artifact@v4
if: ${{ needs.check-event.outputs.config == 'Release' }}
with:
name: obs-studio-macos-${{ matrix.target }}-${{ needs.check-event.outputs.commitHash }}-dSYMs
path: ${{ github.workspace }}/build_macos/obs-studio-*-macos-${{ steps.setup.outputs.cpuName }}-dSYMs.tar.xz
- uses: actions/cache/save@v4
if: github.event_name != 'pull_request' && steps.xcode-cache.outputs.cache-hit != 'true'
with:
path: ${{ steps.setup.outputs.xcodeCasPath }}
key: ${{ runner.os }}-xcode-${{ matrix.target }}-${{ needs.check-event.outputs.config }}
ubuntu-build:
name: Ubuntu 🐧
strategy:
matrix:
os: [ubuntu-24.04]
runs-on: ${{ matrix.os }}
needs: check-event
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- uses: actions/cache/restore@v4
id: ccache-cache
with:
path: ${{ github.workspace }}/.ccache
key: ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
restore-keys: |
${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-
- name: Build OBS Studio 🧱
uses: ./.github/actions/build-obs
env:
TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
with:
target: x86_64
config: ${{ needs.check-event.outputs.config }}
- name: Package OBS Studio 📀
uses: ./.github/actions/package-obs
with:
target: x86_64
config: ${{ needs.check-event.outputs.config }}
package: ${{ fromJSON(needs.check-event.outputs.package) }}
- name: Upload Source Tarball 🗜️
uses: actions/upload-artifact@v4
with:
name: obs-studio-${{ matrix.os }}-sources-${{ needs.check-event.outputs.commitHash }}
path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-sources.*
- name: Upload Artifacts 📡
uses: actions/upload-artifact@v4
with:
name: obs-studio-${{ matrix.os }}-x86_64-${{ needs.check-event.outputs.commitHash }}
path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-x86_64-ubuntu-gnu.*
- name: Upload Debug Symbol Artifacts 🪲
uses: actions/upload-artifact@v4
if: ${{ fromJSON(needs.check-event.outputs.package) }}
with:
name: obs-studio-${{ matrix.os }}-x86_64-${{ needs.check-event.outputs.commitHash }}-dbgsym
path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-x86_64-ubuntu-gnu-dbgsym.ddeb
- uses: actions/cache/save@v4
if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true'
with:
path: ${{ github.workspace }}/.ccache
key: ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
flatpak-build:
name: Flatpak 📦
runs-on: ubuntu-24.04
needs: check-event
defaults:
run:
shell: bash
env:
FLATPAK_BUILD_SHARE_PATH: flatpak_app/files/share
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08
options: --privileged
volumes:
- /usr/local/lib/android:/to_clean/android
- /opt/hostedtoolcache/CodeQL:/to_clean/codeql
- /usr/local/.ghcup:/to_clean/ghcup
- /opt/hostedtoolcache/Python:/to_clean/python
- /usr/share/swift:/to_clean/swift
- /usr/share/dotnet:/to_clean/dotnet
steps:
- name: Prepare build space
shell: bash
run: |
: Prepare build space
echo ::group::Available storage
df -h
echo ::endgroup::
echo ::group::Remove Android stuff
rm -rf /to_clean/android/*
echo ::endgroup::
echo ::group::Remove CodeQL stuff
rm -rf /to_clean/codeql/*
echo ::endgroup::
echo ::group::Remove GHCup stuff
rm -rf /to_clean/ghcup/*
echo ::endgroup::
echo ::group::Remove Python stuff
rm -rf /to_clean/python/*
echo ::endgroup::
echo ::group::Remove Swift stuff
rm -rf /to_clean/swift/*
echo ::endgroup::
echo ::group::Remove .NET stuff
rm -rf /to_clean/dotnet/*
echo ::endgroup::
echo ::group::Available storage
df -h
echo ::endgroup::
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
set-safe-directory: ${{ env.GITHUB_WORKSPACE }}
- name: Set Up Environment 🔧
id: setup
env:
GH_TOKEN: ${{ github.token }}
run: |
: Set Up Environment 🔧
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
git config --global --add safe.directory "${GITHUB_WORKSPACE}"
cache_key='flatpak-builder-${{ hashFiles('build-aux/com.obsproject.Studio.json') }}'
cache_ref='master'
read -r id key size unit created accessed <<< \
"$(gh cache list --ref "refs/heads/${cache_ref}" --key "${cache_key}-x86_64" | head -1)"
if [[ "${key}" ]]; then
echo "cacheHit=true" >> $GITHUB_OUTPUT
else
echo "cacheHit=false" >> $GITHUB_OUTPUT
fi
echo "cacheKey=${cache_key}" >> $GITHUB_OUTPUT
- name: Validate Flatpak manifest
uses: ./.github/actions/flatpak-builder-lint
with:
artifact: manifest
path: build-aux/com.obsproject.Studio.json
- name: Build Flatpak Manifest 🧾
uses: flatpak/flatpak-github-actions/flatpak-builder@b8a638469ea7ec62844d7b6e487b697e6f249576
with:
build-bundle: ${{ fromJSON(needs.check-event.outputs.package) }}
bundle: obs-studio-flatpak-${{ needs.check-event.outputs.commitHash }}.flatpak
manifest-path: ${{ github.workspace }}/build-aux/com.obsproject.Studio.json
cache: ${{ fromJSON(steps.setup.outputs.cacheHit) || (github.event_name == 'push' && github.ref_name == 'master')}}
restore-cache: ${{ fromJSON(steps.setup.outputs.cacheHit) }}
cache-key: ${{ steps.setup.outputs.cacheKey }}
mirror-screenshots-url: https://dl.flathub.org/media
- name: Validate AppStream
uses: ./.github/actions/flatpak-builder-lint
with:
artifact: appstream
path: ${{ env.FLATPAK_BUILD_SHARE_PATH }}/metainfo/com.obsproject.Studio.metainfo.xml
- name: Verify Icon and Metadata in app-info
working-directory: ${{ env.FLATPAK_BUILD_SHARE_PATH }}
run: |
: Verify Icon and Metadata in app-info
test -f app-info/icons/flatpak/128x128/com.obsproject.Studio.png || { echo "::error::Missing 128x128 icon in app-info"; exit 1; }
test -f app-info/xmls/com.obsproject.Studio.xml.gz || { echo "::error::Missing com.obsproject.Studio.xml.gz in app-info"; exit 1; }
- name: Validate build directory
uses: ./.github/actions/flatpak-builder-lint
with:
artifact: builddir
path: flatpak_app
- name: Validate repository
uses: ./.github/actions/flatpak-builder-lint
with:
artifact: repo
path: repo
windows-build:
name: Windows 🪟
strategy:
matrix:
architecture: [x64, arm64]
runs-on: windows-2022
needs: check-event
defaults:
run:
shell: pwsh
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Build OBS Studio 🧱
uses: ./.github/actions/build-obs
env:
TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
GPU_PRIORITY_VAL: ${{ secrets.GPU_PRIORITY_VAL }}
with:
target: ${{ matrix.architecture }}
config: ${{ needs.check-event.outputs.config }}
- name: Package OBS Studio 📀
uses: ./.github/actions/package-obs
with:
target: ${{ matrix.architecture }}
config: ${{ needs.check-event.outputs.config }}
package: ${{ fromJSON(needs.check-event.outputs.package) }}
- name: Upload Artifacts 📡
uses: actions/upload-artifact@v4
with:
name: obs-studio-windows-${{ matrix.architecture }}-${{ needs.check-event.outputs.commitHash }}
path: ${{ github.workspace }}/build_${{ matrix.architecture }}/obs-studio-*-windows-${{ matrix.architecture }}.zip
================================================
FILE: .github/workflows/check-format.yaml
================================================
name: Check Code Formatting 🛠️
on:
workflow_call:
jobs:
clang-format:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: clang-format Check 🐉
id: clang-format
uses: ./.github/actions/run-clang-format
with:
failCondition: error
swift-format:
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: swift-format Check 🔥
id: swift-format
uses: ./.github/actions/run-swift-format
with:
failCondition: error
gersemi:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: gersemi Check 🎛️
id: gersemi
uses: ./.github/actions/run-gersemi
with:
failCondition: error
flatpak-validator:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Flatpak Manifest Check 📦
id: flatpak-check
uses: ./.github/actions/flatpak-manifest-validator
with:
failCondition: error
qt-xml-validator:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Qt XML Check 🖼️
id: qt-xml-check
uses: ./.github/actions/qt-xml-validator
with:
failCondition: error
================================================
FILE: .github/workflows/dispatch.yaml
================================================
name: Dispatch
run-name: Dispatched Repository Actions - ${{ inputs.job }} ⌛️
on:
workflow_dispatch:
inputs:
job:
description: Dispatch job to run
required: true
type: choice
options:
- steam
- services
- translations
- documentation
- patches
ref:
description: GitHub reference to use for job
type: string
required: false
customAssetWindows:
description: Custom Windows build for Steam Upload
type: string
required: false
customAssetMacOSApple:
description: Custom macOS Apple Silicon build for Steam Upload
type: string
required: false
customAssetMacOSIntel:
description: Custom macOS Intel build for Steam Upload
type: string
required: false
channel:
description: Channel to use when generating Windows update files
type: string
required: false
permissions:
contents: write
jobs:
services-validation:
name: Validate Services 🕵️
if: github.repository_owner == 'obsproject' && inputs.job == 'services'
runs-on: macos-15
permissions:
checks: write
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Check for Defunct Services 📉
uses: ./.github/actions/services-validator
with:
repositorySecret: ${{ secrets.GITHUB_TOKEN }}
checkApiSecret: ${{ secrets.CHECK_SERVERS_API_KEY }}
checkApiServers: ${{ secrets.CHECK_SERVERS_LIST }}
runSchemaChecks: true
runServiceChecks: true
createPullRequest: true
download-language-files:
name: Download Language Files 🌐
if: github.repository_owner == 'obsproject' && inputs.job == 'translations'
runs-on: ubuntu-24.04
env:
CROWDIN_PAT: ${{ secrets.CROWDIN_SYNC_CROWDIN_PAT }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
token: ${{ secrets.CROWDIN_SYNC_GITHUB_PAT }}
fetch-depth: 0
- uses: obsproject/obs-crowdin-sync/download@430665179ed13233af2d83ec192c2ae8c40a29ae
steam-upload:
name: Upload Steam Builds 🚂
if: github.repository_owner == 'obsproject' && inputs.job == 'steam'
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/steam-upload
with:
steamSecret: ${{ secrets.STEAM_SHARED_SECRET }}
steamUser: ${{ secrets.STEAM_USER }}
steamPassword: ${{ secrets.STEAM_PASSWORD }}
tagName: ${{ inputs.ref }}
customAssetWindows: ${{ inputs.customAssetWindows }}
customAssetMacOSApple: ${{ inputs.customAssetMacOSApple }}
customAssetMacOSIntel: ${{ inputs.customAssetMacOSIntel }}
workflowSecret: ${{ github.token }}
preview: false
update-documentation:
name: Update Documentation 📖
if: github.repository_owner == 'obsproject' && inputs.job == 'documentation'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/generate-docs
update-documentation-cloudflare:
name: Update Documentation for Cloudflare ☁️
if: github.repository_owner == 'obsproject' && inputs.job == 'documentation'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/generate-docs
with:
disableLinkExtensions: true
deploy-documentation:
name: Deploy Documentation to Cloudflare ☁️
if: github.repository_owner == 'obsproject' && inputs.job == 'documentation'
runs-on: ubuntu-24.04
needs: update-documentation-cloudflare
defaults:
run:
shell: bash
environment:
name: cf-pages-deploy
steps:
- name: Get Commit Information 🆔
id: setup
run: |
: Get Commit Hash 🆔
echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: OBS Studio Docs (No Extensions) ${{ steps.setup.outputs.commitHash }}
path: docs
- name: Publish to Live Page
uses: cloudflare/wrangler-action@4c10c1822abba527d820b29e6333e7f5dac2cabd
with:
workingDirectory: docs
apiToken: ${{ secrets.CF_API_TOKEN }}
accountId: ${{ secrets.CF_ACCOUNT_ID }}
command: pages publish . --project-name=${{ vars.CF_PAGES_PROJECT }} --commit-hash='${{ steps.setup.outputs.commitHash }}'
windows-patches:
name: Create Windows Patches 🩹
if: github.repository_owner == 'obsproject' && inputs.job == 'patches'
runs-on: windows-2022
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/windows-patches
with:
tagName: ${{ inputs.ref }}
workflowSecret: ${{ github.token }}
channel: ${{ inputs.channel }}
gcsAccessKeyId: ${{ secrets.GCS_ACCESS_KEY_ID }}
gcsAccessKeySecret: ${{ secrets.GCS_ACCESS_KEY_SECRET }}
================================================
FILE: .github/workflows/pr-pull.yaml
================================================
name: Pull
run-name: ${{ github.event.pull_request.title }} pull request run 🚀
on:
workflow_dispatch:
pull_request:
paths-ignore:
- '**.md'
branches: [master]
types: [ opened, synchronize, reopened ]
permissions:
contents: read
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true
jobs:
check-format:
name: Format 🔍
uses: ./.github/workflows/check-format.yaml
permissions:
contents: read
build-project:
name: Build 🧱
uses: ./.github/workflows/build-project.yaml
secrets: inherit
permissions:
contents: read
compatibility-validation:
name: Validate Compatibility 🕵️
if: github.base_ref == 'master'
runs-on: ubuntu-24.04
permissions:
checks: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
baseRef: origin/${{ github.base_ref }}
checkGlob: plugins/win-capture/data/*.json
- name: Check for Invalid Compatibility Data 📉
if: fromJSON(steps.checks.outputs.hasChangedFiles)
uses: ./.github/actions/compatibility-validator
services-validation:
name: Validate Services 🕵️
if: github.base_ref == 'master'
runs-on: ubuntu-24.04
permissions:
checks: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
baseRef: origin/${{ github.base_ref }}
checkGlob: plugins/rtmp-services/data/*.json
- name: Check Services JSON Schema 📉
if: fromJSON(steps.checks.outputs.hasChangedFiles)
uses: ./.github/actions/services-validator
with:
repositorySecret: ${{ secrets.GITHUB_TOKEN }}
runSchemaChecks: true
runServiceChecks: false
update-documentation:
name: Update Documentation 📖
if: github.repository_owner == 'obsproject' && github.base_ref == 'master'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check for Changed Files ✅
uses: ./.github/actions/check-changes
id: checks
with:
baseRef: origin/${{ github.base_ref }}
checkGlob: docs/sphinx
- uses: ./.github/actions/generate-docs
if: fromJSON(steps.checks.outputs.hasChangedFiles)
================================================
FILE: .github/workflows/publish.yaml
================================================
name: Publish
run-name: Publish Repository Actions 🛫
on:
release:
types:
- published
branches:
- master
- 'release/**'
permissions:
contents: read
concurrency:
group: '${{ github.workflow }} @ ${{ github.head_ref || github.ref }}'
cancel-in-progress: true
jobs:
check-tag:
name: Check Release Tag
if: github.repository_owner == 'obsproject'
runs-on: ubuntu-24.04
outputs:
validTag: ${{ steps.check.outputs.validTag }}
flatpakMatrix: ${{ steps.check.outputs.flatpakMatrix }}
updateChannel: ${{ steps.check.outputs.updateChannel }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
set-safe-directory: ${{ env.GITHUB_WORKSPACE }}
- name: Check Release Tag ☑️
id: check
env:
GH_TOKEN: ${{ github.token }}
run: |
: Check Release Tag ☑️
if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
shopt -s extglob
case "${GITHUB_REF_NAME}" in
+([0-9]).+([0-9]).+([0-9]) )
lastPreRelease="$(gh release list --exclude-drafts --limit 10 --json "publishedAt,tagName,isPrerelease" \
--jq '[.[] | select(.isPrerelease == true)] | first | .tagName')"
currentRelease="${GITHUB_REF_NAME}"
isPreReleaseAhead=false
printf '%s\n%s\n' "${currentRelease}" "${lastPreRelease}" | sort --version-sort --reverse --check=quiet &&
isPreReleaseAhead=false || isPreReleaseAhead=true
# Edge case: Sort considers the non-suffixed version older than a suffixed one
if ${isPreReleaseAhead} && [[ "${currentRelease}" == "${lastPreRelease//-*}" ]]; then
isPreReleaseAhead=false
fi
echo 'validTag=true' >> $GITHUB_OUTPUT
if ! ${isPreReleaseAhead}; then
echo 'flatpakMatrix=["beta", "stable"]' >> $GITHUB_OUTPUT
else
echo 'flatpakMatrix=["stable"]' >> $GITHUB_OUTPUT
fi
echo 'updateChannel=stable' >> $GITHUB_OUTPUT
;;
+([0-9]).+([0-9]).+([0-9])-@(beta|rc)*([0-9]) )
echo 'validTag=true' >> $GITHUB_OUTPUT
echo 'flatpakMatrix=["beta"]' >> $GITHUB_OUTPUT
echo 'updateChannel=beta' >> $GITHUB_OUTPUT
;;
*) echo 'validTag=false' >> $GITHUB_OUTPUT ;;
esac
flatpak-publish:
name: Flathub 📦
needs: c
gitextract_bhk1839_/
├── .clang-format
├── .editorconfig
├── .gersemirc
├── .github/
│ ├── FUNDING.yml
│ ├── actions/
│ │ ├── build-obs/
│ │ │ └── action.yaml
│ │ ├── check-changes/
│ │ │ └── action.yaml
│ │ ├── compatibility-validator/
│ │ │ └── action.yaml
│ │ ├── flatpak-builder-lint/
│ │ │ ├── action.yaml
│ │ │ └── exceptions.json
│ │ ├── flatpak-manifest-validator/
│ │ │ └── action.yaml
│ │ ├── generate-docs/
│ │ │ └── action.yaml
│ │ ├── package-obs/
│ │ │ └── action.yaml
│ │ ├── qt-xml-validator/
│ │ │ └── action.yaml
│ │ ├── run-clang-format/
│ │ │ └── action.yaml
│ │ ├── run-gersemi/
│ │ │ └── action.yaml
│ │ ├── run-swift-format/
│ │ │ └── action.yaml
│ │ ├── services-validator/
│ │ │ └── action.yaml
│ │ ├── setup-macos-codesigning/
│ │ │ └── action.yaml
│ │ ├── sparkle-appcast/
│ │ │ ├── action.yaml
│ │ │ ├── appcast_adjust.xslt
│ │ │ └── appcast_legacy.xslt
│ │ ├── steam-upload/
│ │ │ └── action.yaml
│ │ ├── windows-analysis/
│ │ │ ├── Invoke-External.ps1
│ │ │ ├── Logger.ps1
│ │ │ ├── action.yaml
│ │ │ └── obs.pvsconfig
│ │ ├── windows-patches/
│ │ │ ├── Ensure-Location.ps1
│ │ │ ├── Invoke-External.ps1
│ │ │ ├── Logger.ps1
│ │ │ ├── action.yaml
│ │ │ └── config.toml
│ │ └── windows-signing/
│ │ ├── Ensure-Location.ps1
│ │ ├── Invoke-External.ps1
│ │ ├── Logger.ps1
│ │ ├── action.yaml
│ │ ├── cng-release-signing-key.pem
│ │ ├── config_arm64.toml
│ │ ├── config_x64.toml
│ │ ├── prod-gc.crt
│ │ ├── prod.crt
│ │ └── test.crt
│ ├── scripts/
│ │ ├── .Aptfile
│ │ ├── .Brewfile
│ │ ├── .Wingetfile
│ │ ├── .build.zsh
│ │ ├── .package.zsh
│ │ ├── Build-Windows.ps1
│ │ ├── Package-Windows.ps1
│ │ ├── utils.pwsh/
│ │ │ ├── Ensure-Location.ps1
│ │ │ ├── Install-BuildDependencies.ps1
│ │ │ ├── Invoke-External.ps1
│ │ │ └── Logger.ps1
│ │ ├── utils.py/
│ │ │ ├── check-jsonschema.py
│ │ │ └── check-services.py
│ │ └── utils.zsh/
│ │ ├── check_macos
│ │ ├── check_ubuntu
│ │ ├── create_diskimage
│ │ ├── log_debug
│ │ ├── log_error
│ │ ├── log_group
│ │ ├── log_info
│ │ ├── log_output
│ │ ├── log_status
│ │ ├── log_warning
│ │ ├── mkcd
│ │ ├── setup_ccache
│ │ └── setup_ubuntu
│ └── workflows/
│ ├── analyze-project.yaml
│ ├── build-project.yaml
│ ├── check-format.yaml
│ ├── dispatch.yaml
│ ├── pr-pull.yaml
│ ├── publish.yaml
│ ├── push.yaml
│ ├── scheduled.yaml
│ └── sign-windows.yaml
├── .gitignore
├── .gitmodules
├── .mailmap
├── .swift-format
├── AUTHORS
├── CMakeLists.txt
├── CMakePresets.json
├── COC.rst
├── COMMITMENT
├── CONTRIBUTING.rst
├── COPYING
├── INSTALL
├── README.rst
├── build-aux/
│ ├── .functions/
│ │ ├── log_debug
│ │ ├── log_error
│ │ ├── log_group
│ │ ├── log_info
│ │ ├── log_output
│ │ ├── log_status
│ │ ├── log_warning
│ │ └── set_loglevel
│ ├── .run-format.zsh
│ ├── README.md
│ ├── com.obsproject.Studio.json
│ ├── format-manifest.py
│ └── steam/
│ ├── obs_build.vdf
│ ├── obs_playtest_build.vdf
│ ├── scripts_macos/
│ │ └── launch.sh
│ └── scripts_windows/
│ ├── install.bat
│ ├── installscript.vdf
│ └── uninstall.bat
├── cmake/
│ ├── bundle/
│ │ └── windows/
│ │ ├── ALL_BUILD.vcxproj.user.in
│ │ └── obs-module.rc.in
│ ├── common/
│ │ ├── bootstrap.cmake
│ │ ├── buildnumber.cmake
│ │ ├── buildspec_common.cmake
│ │ ├── ccache.cmake
│ │ ├── compiler_common.cmake
│ │ ├── cpackconfig_common.cmake
│ │ ├── helpers_common.cmake
│ │ ├── osconfig.cmake
│ │ ├── policies.cmake
│ │ └── versionconfig.cmake
│ ├── finders/
│ │ ├── FindAMF.cmake
│ │ ├── FindAsio.cmake
│ │ ├── FindCEF.cmake
│ │ ├── FindDetours.cmake
│ │ ├── FindFFmpeg.cmake
│ │ ├── FindFFnvcodec.cmake
│ │ ├── FindGio.cmake
│ │ ├── FindJack.cmake
│ │ ├── FindLibAJANTV2.cmake
│ │ ├── FindLibUUID.cmake
│ │ ├── FindLibVLC.cmake
│ │ ├── FindLibdrm.cmake
│ │ ├── FindLibfdk.cmake
│ │ ├── FindLibpci.cmake
│ │ ├── FindLibrist.cmake
│ │ ├── FindLibrnnoise.cmake
│ │ ├── FindLibspeexdsp.cmake
│ │ ├── FindLibsrt.cmake
│ │ ├── FindLibudev.cmake
│ │ ├── FindLibv4l2.cmake
│ │ ├── FindLibva.cmake
│ │ ├── FindLibx264.cmake
│ │ ├── FindLuajit.cmake
│ │ ├── FindMbedTLS.cmake
│ │ ├── FindOSS.cmake
│ │ ├── FindPipeWire.cmake
│ │ ├── FindPulseAudio.cmake
│ │ ├── FindSIMDe.cmake
│ │ ├── FindSndio.cmake
│ │ ├── FindSysinfo.cmake
│ │ ├── FindUthash.cmake
│ │ ├── FindVPL.cmake
│ │ ├── FindWebsocketpp.cmake
│ │ ├── FindXkbcommon.cmake
│ │ ├── Findjansson.cmake
│ │ └── Findqrcodegencpp.cmake
│ ├── linux/
│ │ ├── compilerconfig.cmake
│ │ ├── cpackconfig.cmake
│ │ ├── defaults.cmake
│ │ ├── ecmconfig.cmake
│ │ ├── helpers.cmake
│ │ ├── toolchain-aarch64-clang.cmake
│ │ ├── toolchain-aarch64-gcc.cmake
│ │ └── toolchain-x86_64-gcc.cmake
│ ├── macos/
│ │ ├── buildspec.cmake
│ │ ├── compilerconfig.cmake
│ │ ├── defaults.cmake
│ │ ├── helpers.cmake
│ │ ├── resources/
│ │ │ ├── AppIcon.icns
│ │ │ ├── background.tiff
│ │ │ └── package.applescript
│ │ └── xcode.cmake
│ └── windows/
│ ├── FindPython.cmake
│ ├── architecture.cmake
│ ├── buildspec.cmake
│ ├── compilerconfig.cmake
│ ├── cpackconfig.cmake
│ ├── defaults.cmake
│ ├── helpers.cmake
│ └── idlfilehelper.cmake
├── deps/
│ ├── blake2/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE.blake2
│ │ └── src/
│ │ ├── blake2-impl.h
│ │ ├── blake2.h
│ │ └── blake2b-ref.c
│ ├── glad/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ ├── EGL/
│ │ │ │ └── eglplatform.h
│ │ │ ├── KHR/
│ │ │ │ └── khrplatform.h
│ │ │ └── glad/
│ │ │ ├── glad.h
│ │ │ ├── glad_egl.h
│ │ │ └── glad_wgl.h
│ │ └── src/
│ │ ├── glad.c
│ │ ├── glad_egl.c
│ │ └── glad_wgl.c
│ ├── json11/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE.txt
│ │ ├── json11.cpp
│ │ └── json11.hpp
│ ├── libcaption/
│ │ ├── .clang-format
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── Doxyfile.in
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── caption/
│ │ │ ├── caption.h
│ │ │ ├── cea708.h
│ │ │ ├── dvtcc.h
│ │ │ ├── eia608.h
│ │ │ ├── eia608_charmap.h
│ │ │ ├── mpeg.h
│ │ │ ├── scc.h
│ │ │ ├── srt.h
│ │ │ ├── utf8.h
│ │ │ ├── vtt.h
│ │ │ └── xds.h
│ │ ├── format.sh
│ │ └── src/
│ │ ├── caption.c
│ │ ├── cea708.c
│ │ ├── dvtcc.c
│ │ ├── eia608.c
│ │ ├── eia608_charmap.c
│ │ ├── eia608_from_utf8.c
│ │ ├── eia608_from_utf8.re2c
│ │ ├── mpeg.c
│ │ ├── scc.c
│ │ ├── srt.c
│ │ ├── utf8.c
│ │ ├── vtt.c
│ │ └── xds.c
│ ├── libdshowcapture/
│ │ └── CMakeLists.txt
│ └── w32-pthreads/
│ ├── .clang-format
│ ├── ANNOUNCE
│ ├── BUGS
│ ├── Bmakefile
│ ├── CMakeLists.txt
│ ├── CONTRIBUTORS
│ ├── COPYING
│ ├── COPYING.LIB
│ ├── ChangeLog
│ ├── FAQ
│ ├── GNUmakefile
│ ├── MAINTAINERS
│ ├── Makefile
│ ├── NEWS
│ ├── Nmakefile
│ ├── Nmakefile.tests
│ ├── PROGRESS
│ ├── README
│ ├── README.Borland
│ ├── README.CV
│ ├── README.NONPORTABLE
│ ├── README.Watcom
│ ├── README.WinCE
│ ├── TODO
│ ├── WinCE-PORT
│ ├── attr.c
│ ├── autostatic.c
│ ├── barrier.c
│ ├── builddmc.bat
│ ├── cancel.c
│ ├── cleanup.c
│ ├── cmake/
│ │ ├── w32-pthreadsConfig.cmake.in
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── condvar.c
│ ├── config.h
│ ├── context.h
│ ├── create.c
│ ├── dll.c
│ ├── errno.c
│ ├── exit.c
│ ├── fork.c
│ ├── global.c
│ ├── implement.h
│ ├── libpthreadGC2.a
│ ├── libpthreadGC2.stamp
│ ├── manual/
│ │ ├── ChangeLog
│ │ ├── PortabilityIssues.html
│ │ ├── index.html
│ │ ├── pthreadCancelableWait.html
│ │ ├── pthread_attr_init.html
│ │ ├── pthread_attr_setstackaddr.html
│ │ ├── pthread_attr_setstacksize.html
│ │ ├── pthread_barrier_init.html
│ │ ├── pthread_barrier_wait.html
│ │ ├── pthread_barrierattr_init.html
│ │ ├── pthread_barrierattr_setpshared.html
│ │ ├── pthread_cancel.html
│ │ ├── pthread_cleanup_push.html
│ │ ├── pthread_cond_init.html
│ │ ├── pthread_condattr_init.html
│ │ ├── pthread_condattr_setpshared.html
│ │ ├── pthread_create.html
│ │ ├── pthread_delay_np.html
│ │ ├── pthread_detach.html
│ │ ├── pthread_equal.html
│ │ ├── pthread_exit.html
│ │ ├── pthread_getunique_np.html
│ │ ├── pthread_getw32threadhandle_np.html
│ │ ├── pthread_join.html
│ │ ├── pthread_key_create.html
│ │ ├── pthread_kill.html
│ │ ├── pthread_mutex_init.html
│ │ ├── pthread_mutexattr_init.html
│ │ ├── pthread_mutexattr_setpshared.html
│ │ ├── pthread_num_processors_np.html
│ │ ├── pthread_once.html
│ │ ├── pthread_rwlock_init.html
│ │ ├── pthread_rwlock_rdlock.html
│ │ ├── pthread_rwlock_timedrdlock.html
│ │ ├── pthread_rwlock_timedwrlock.html
│ │ ├── pthread_rwlock_unlock.html
│ │ ├── pthread_rwlock_wrlock.html
│ │ ├── pthread_rwlockattr_init.html
│ │ ├── pthread_rwlockattr_setpshared.html
│ │ ├── pthread_self.html
│ │ ├── pthread_setcancelstate.html
│ │ ├── pthread_setcanceltype.html
│ │ ├── pthread_setconcurrency.html
│ │ ├── pthread_setschedparam.html
│ │ ├── pthread_spin_init.html
│ │ ├── pthread_spin_lock.html
│ │ ├── pthread_spin_unlock.html
│ │ ├── pthread_timechange_handler_np.html
│ │ ├── pthread_win32_attach_detach_np.html
│ │ ├── pthread_win32_test_features_np.html
│ │ ├── sched_get_priority_max.html
│ │ ├── sched_getscheduler.html
│ │ ├── sched_setscheduler.html
│ │ ├── sched_yield.html
│ │ └── sem_init.html
│ ├── misc.c
│ ├── mutex.c
│ ├── need_errno.h
│ ├── nonportable.c
│ ├── private.c
│ ├── pthread.c
│ ├── pthread.dsp
│ ├── pthread.dsw
│ ├── pthread.h
│ ├── pthread.lastbuildstate
│ ├── pthread.sln
│ ├── pthread.vcxproj
│ ├── pthread.vcxproj.filters
│ ├── pthread_attr_destroy.c
│ ├── pthread_attr_getdetachstate.c
│ ├── pthread_attr_getinheritsched.c
│ ├── pthread_attr_getschedparam.c
│ ├── pthread_attr_getschedpolicy.c
│ ├── pthread_attr_getscope.c
│ ├── pthread_attr_getstackaddr.c
│ ├── pthread_attr_getstacksize.c
│ ├── pthread_attr_init.c
│ ├── pthread_attr_setdetachstate.c
│ ├── pthread_attr_setinheritsched.c
│ ├── pthread_attr_setschedparam.c
│ ├── pthread_attr_setschedpolicy.c
│ ├── pthread_attr_setscope.c
│ ├── pthread_attr_setstackaddr.c
│ ├── pthread_attr_setstacksize.c
│ ├── pthread_barrier_destroy.c
│ ├── pthread_barrier_init.c
│ ├── pthread_barrier_wait.c
│ ├── pthread_barrierattr_destroy.c
│ ├── pthread_barrierattr_getpshared.c
│ ├── pthread_barrierattr_init.c
│ ├── pthread_barrierattr_setpshared.c
│ ├── pthread_cancel.c
│ ├── pthread_cond_destroy.c
│ ├── pthread_cond_init.c
│ ├── pthread_cond_signal.c
│ ├── pthread_cond_wait.c
│ ├── pthread_condattr_destroy.c
│ ├── pthread_condattr_getpshared.c
│ ├── pthread_condattr_init.c
│ ├── pthread_condattr_setpshared.c
│ ├── pthread_delay_np.c
│ ├── pthread_detach.c
│ ├── pthread_equal.c
│ ├── pthread_exit.c
│ ├── pthread_getconcurrency.c
│ ├── pthread_getschedparam.c
│ ├── pthread_getspecific.c
│ ├── pthread_getunique_np.c
│ ├── pthread_getw32threadhandle_np.c
│ ├── pthread_join.c
│ ├── pthread_key_create.c
│ ├── pthread_key_delete.c
│ ├── pthread_kill.c
│ ├── pthread_mutex_consistent.c
│ ├── pthread_mutex_destroy.c
│ ├── pthread_mutex_init.c
│ ├── pthread_mutex_lock.c
│ ├── pthread_mutex_timedlock.c
│ ├── pthread_mutex_trylock.c
│ ├── pthread_mutex_unlock.c
│ ├── pthread_mutexattr_destroy.c
│ ├── pthread_mutexattr_getkind_np.c
│ ├── pthread_mutexattr_getpshared.c
│ ├── pthread_mutexattr_getrobust.c
│ ├── pthread_mutexattr_gettype.c
│ ├── pthread_mutexattr_init.c
│ ├── pthread_mutexattr_setkind_np.c
│ ├── pthread_mutexattr_setpshared.c
│ ├── pthread_mutexattr_setrobust.c
│ ├── pthread_mutexattr_settype.c
│ ├── pthread_num_processors_np.c
│ ├── pthread_once.c
│ ├── pthread_rwlock_destroy.c
│ ├── pthread_rwlock_init.c
│ ├── pthread_rwlock_rdlock.c
│ ├── pthread_rwlock_timedrdlock.c
│ ├── pthread_rwlock_timedwrlock.c
│ ├── pthread_rwlock_tryrdlock.c
│ ├── pthread_rwlock_trywrlock.c
│ ├── pthread_rwlock_unlock.c
│ ├── pthread_rwlock_wrlock.c
│ ├── pthread_rwlockattr_destroy.c
│ ├── pthread_rwlockattr_getpshared.c
│ ├── pthread_rwlockattr_init.c
│ ├── pthread_rwlockattr_setpshared.c
│ ├── pthread_self.c
│ ├── pthread_setcancelstate.c
│ ├── pthread_setcanceltype.c
│ ├── pthread_setconcurrency.c
│ ├── pthread_setschedparam.c
│ ├── pthread_setspecific.c
│ ├── pthread_spin_destroy.c
│ ├── pthread_spin_init.c
│ ├── pthread_spin_lock.c
│ ├── pthread_spin_trylock.c
│ ├── pthread_spin_unlock.c
│ ├── pthread_testcancel.c
│ ├── pthread_timechange_handler_np.c
│ ├── pthread_win32_attach_detach_np.c
│ ├── ptw32_MCS_lock.c
│ ├── ptw32_OLL_lock.c
│ ├── ptw32_callUserDestroyRoutines.c
│ ├── ptw32_calloc.c
│ ├── ptw32_cond_check_need_init.c
│ ├── ptw32_getprocessors.c
│ ├── ptw32_is_attr.c
│ ├── ptw32_mutex_check_need_init.c
│ ├── ptw32_new.c
│ ├── ptw32_processInitialize.c
│ ├── ptw32_processTerminate.c
│ ├── ptw32_relmillisecs.c
│ ├── ptw32_reuse.c
│ ├── ptw32_rwlock_cancelwrwait.c
│ ├── ptw32_rwlock_check_need_init.c
│ ├── ptw32_semwait.c
│ ├── ptw32_spinlock_check_need_init.c
│ ├── ptw32_threadDestroy.c
│ ├── ptw32_threadStart.c
│ ├── ptw32_throw.c
│ ├── ptw32_timespec.c
│ ├── ptw32_tkAssocCreate.c
│ ├── ptw32_tkAssocDestroy.c
│ ├── rwlock.c
│ ├── sched.c
│ ├── sched.h
│ ├── sched_get_priority_max.c
│ ├── sched_get_priority_min.c
│ ├── sched_getscheduler.c
│ ├── sched_setscheduler.c
│ ├── sched_yield.c
│ ├── sem_close.c
│ ├── sem_destroy.c
│ ├── sem_getvalue.c
│ ├── sem_init.c
│ ├── sem_open.c
│ ├── sem_post.c
│ ├── sem_post_multiple.c
│ ├── sem_timedwait.c
│ ├── sem_trywait.c
│ ├── sem_unlink.c
│ ├── sem_wait.c
│ ├── semaphore.c
│ ├── semaphore.h
│ ├── signal.c
│ ├── spin.c
│ ├── sync.c
│ ├── tests/
│ │ ├── Bmakefile
│ │ ├── ChangeLog
│ │ ├── Debug.dsp
│ │ ├── Debug.dsw
│ │ ├── Debug.plg
│ │ ├── Debug.txt
│ │ ├── GNUmakefile
│ │ ├── Makefile
│ │ ├── README
│ │ ├── README.BENCHTESTS
│ │ ├── SIZES.GC
│ │ ├── SIZES.GCE
│ │ ├── SIZES.VC
│ │ ├── SIZES.VCE
│ │ ├── SIZES.VSE
│ │ ├── Wmakefile
│ │ ├── barrier1.c
│ │ ├── barrier2.c
│ │ ├── barrier3.c
│ │ ├── barrier4.c
│ │ ├── barrier5.c
│ │ ├── barrier6.c
│ │ ├── benchlib.c
│ │ ├── benchtest.h
│ │ ├── benchtest1.c
│ │ ├── benchtest2.c
│ │ ├── benchtest3.c
│ │ ├── benchtest4.c
│ │ ├── benchtest5.c
│ │ ├── cancel1.c
│ │ ├── cancel2.c
│ │ ├── cancel3.c
│ │ ├── cancel4.c
│ │ ├── cancel5.c
│ │ ├── cancel6a.c
│ │ ├── cancel6d.c
│ │ ├── cancel7.c
│ │ ├── cancel8.c
│ │ ├── cancel9.c
│ │ ├── cleanup0.c
│ │ ├── cleanup1.c
│ │ ├── cleanup2.c
│ │ ├── cleanup3.c
│ │ ├── condvar1.c
│ │ ├── condvar1_1.c
│ │ ├── condvar1_2.c
│ │ ├── condvar2.c
│ │ ├── condvar2_1.c
│ │ ├── condvar3.c
│ │ ├── condvar3_1.c
│ │ ├── condvar3_2.c
│ │ ├── condvar3_3.c
│ │ ├── condvar4.c
│ │ ├── condvar5.c
│ │ ├── condvar6.c
│ │ ├── condvar7.c
│ │ ├── condvar8.c
│ │ ├── condvar9.c
│ │ ├── context1.c
│ │ ├── count1.c
│ │ ├── create1.c
│ │ ├── create2.c
│ │ ├── create3.c
│ │ ├── delay1.c
│ │ ├── delay2.c
│ │ ├── detach1.c
│ │ ├── equal1.c
│ │ ├── errno1.c
│ │ ├── exception1.c
│ │ ├── exception2.c
│ │ ├── exception3.c
│ │ ├── exit1.c
│ │ ├── exit2.c
│ │ ├── exit3.c
│ │ ├── exit4.c
│ │ ├── exit5.c
│ │ ├── eyal1.c
│ │ ├── inherit1.c
│ │ ├── join0.c
│ │ ├── join1.c
│ │ ├── join2.c
│ │ ├── join3.c
│ │ ├── kill1.c
│ │ ├── loadfree.c
│ │ ├── mutex1.c
│ │ ├── mutex1e.c
│ │ ├── mutex1n.c
│ │ ├── mutex1r.c
│ │ ├── mutex2.c
│ │ ├── mutex2e.c
│ │ ├── mutex2r.c
│ │ ├── mutex3.c
│ │ ├── mutex3e.c
│ │ ├── mutex3r.c
│ │ ├── mutex4.c
│ │ ├── mutex5.c
│ │ ├── mutex6.c
│ │ ├── mutex6e.c
│ │ ├── mutex6es.c
│ │ ├── mutex6n.c
│ │ ├── mutex6r.c
│ │ ├── mutex6rs.c
│ │ ├── mutex6s.c
│ │ ├── mutex7.c
│ │ ├── mutex7e.c
│ │ ├── mutex7n.c
│ │ ├── mutex7r.c
│ │ ├── mutex8.c
│ │ ├── mutex8e.c
│ │ ├── mutex8n.c
│ │ ├── mutex8r.c
│ │ ├── once1.c
│ │ ├── once2.c
│ │ ├── once3.c
│ │ ├── once4.c
│ │ ├── openmp1.c
│ │ ├── priority1.c
│ │ ├── priority2.c
│ │ ├── reuse1.c
│ │ ├── reuse2.c
│ │ ├── robust1.c
│ │ ├── robust2.c
│ │ ├── robust3.c
│ │ ├── robust4.c
│ │ ├── robust5.c
│ │ ├── rwlock1.c
│ │ ├── rwlock2.c
│ │ ├── rwlock2_t.c
│ │ ├── rwlock3.c
│ │ ├── rwlock3_t.c
│ │ ├── rwlock4.c
│ │ ├── rwlock4_t.c
│ │ ├── rwlock5.c
│ │ ├── rwlock5_t.c
│ │ ├── rwlock6.c
│ │ ├── rwlock6_t.c
│ │ ├── rwlock6_t2.c
│ │ ├── rwlock7.c
│ │ ├── rwlock8.c
│ │ ├── self1.c
│ │ ├── self2.c
│ │ ├── semaphore1.c
│ │ ├── semaphore2.c
│ │ ├── semaphore3.c
│ │ ├── semaphore4.c
│ │ ├── semaphore4t.c
│ │ ├── semaphore5.c
│ │ ├── sequence1.c
│ │ ├── sizes.c
│ │ ├── spin1.c
│ │ ├── spin2.c
│ │ ├── spin3.c
│ │ ├── spin4.c
│ │ ├── stress1.c
│ │ ├── test.h
│ │ ├── tryentercs.c
│ │ ├── tryentercs2.c
│ │ ├── tsd1.c
│ │ ├── tsd2.c
│ │ ├── valid1.c
│ │ └── valid2.c
│ ├── tsd.c
│ ├── version.rc
│ ├── w32-pthreadsConfig.cmake.in
│ ├── w32-pthreadsConfigVersion.cmake.in
│ └── w32_CancelableWait.c
├── docs/
│ └── sphinx/
│ ├── Makefile
│ ├── _build/
│ │ └── .gitignore
│ ├── _static/
│ │ ├── .gitignore
│ │ └── css/
│ │ └── custom.css
│ ├── _templates/
│ │ └── .gitignore
│ ├── backend-design.rst
│ ├── conf.py
│ ├── frontends.rst
│ ├── graphics.rst
│ ├── index.rst
│ ├── make.bat
│ ├── plugins.rst
│ ├── reference-canvases.rst
│ ├── reference-core-objects.rst
│ ├── reference-core.rst
│ ├── reference-encoders.rst
│ ├── reference-frontend-api.rst
│ ├── reference-libobs-callback.rst
│ ├── reference-libobs-graphics-axisang.rst
│ ├── reference-libobs-graphics-effects.rst
│ ├── reference-libobs-graphics-graphics.rst
│ ├── reference-libobs-graphics-image-file.rst
│ ├── reference-libobs-graphics-math.rst
│ ├── reference-libobs-graphics-matrix4.rst
│ ├── reference-libobs-graphics-quat.rst
│ ├── reference-libobs-graphics-vec2.rst
│ ├── reference-libobs-graphics-vec3.rst
│ ├── reference-libobs-graphics-vec4.rst
│ ├── reference-libobs-graphics.rst
│ ├── reference-libobs-media-io.rst
│ ├── reference-libobs-util-base.rst
│ ├── reference-libobs-util-bmem.rst
│ ├── reference-libobs-util-config-file.rst
│ ├── reference-libobs-util-darray.rst
│ ├── reference-libobs-util-deque.rst
│ ├── reference-libobs-util-dstr.rst
│ ├── reference-libobs-util-platform.rst
│ ├── reference-libobs-util-profiler.rst
│ ├── reference-libobs-util-serializers.rst
│ ├── reference-libobs-util-source-profiler.rst
│ ├── reference-libobs-util-text-lookup.rst
│ ├── reference-libobs-util-threading.rst
│ ├── reference-libobs-util.rst
│ ├── reference-modules.rst
│ ├── reference-outputs.rst
│ ├── reference-properties.rst
│ ├── reference-scenes.rst
│ ├── reference-services.rst
│ ├── reference-settings.rst
│ ├── reference-sources.rst
│ ├── requirements.txt
│ └── scripting.rst
├── frontend/
│ ├── CMakeLists.txt
│ ├── OBSApp.cpp
│ ├── OBSApp.hpp
│ ├── OBSApp_Themes.cpp
│ ├── OBSStudioAPI.cpp
│ ├── OBSStudioAPI.hpp
│ ├── api/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── linux/
│ │ │ │ └── obs-frontend-api.pc.in
│ │ │ ├── obs-frontend-apiConfig.cmake.in
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── obs-frontend-api.cpp
│ │ ├── obs-frontend-api.h
│ │ └── obs-frontend-internal.hpp
│ ├── cmake/
│ │ ├── feature-browserpanels.cmake
│ │ ├── feature-idian-playground.cmake
│ │ ├── feature-importers.cmake
│ │ ├── feature-macos-update.cmake
│ │ ├── feature-plugin-manager.cmake
│ │ ├── feature-restream.cmake
│ │ ├── feature-sparkle.cmake
│ │ ├── feature-twitch.cmake
│ │ ├── feature-whatsnew.cmake
│ │ ├── feature-youtube.cmake
│ │ ├── linux/
│ │ │ ├── com.obsproject.Studio.desktop
│ │ │ └── com.obsproject.Studio.metainfo.xml.in
│ │ ├── macos/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist.in
│ │ │ ├── entitlements-extension.plist
│ │ │ ├── entitlements.plist
│ │ │ ├── exportOptions-extension.plist.in
│ │ │ ├── exportOptions.plist.in
│ │ │ └── qt.conf
│ │ ├── os-freebsd.cmake
│ │ ├── os-linux.cmake
│ │ ├── os-macos.cmake
│ │ ├── os-windows.cmake
│ │ ├── templates/
│ │ │ └── ui-config.h.in
│ │ ├── ui-components.cmake
│ │ ├── ui-dialogs.cmake
│ │ ├── ui-docks.cmake
│ │ ├── ui-models.cmake
│ │ ├── ui-oauth.cmake
│ │ ├── ui-qt.cmake
│ │ ├── ui-settings.cmake
│ │ ├── ui-utility.cmake
│ │ ├── ui-widgets.cmake
│ │ ├── ui-wizards.cmake
│ │ └── windows/
│ │ ├── obs.manifest
│ │ └── obs.rc.in
│ ├── components/
│ │ ├── AbsoluteSlider.cpp
│ │ ├── AbsoluteSlider.hpp
│ │ ├── AccessibleAlignmentCell.cpp
│ │ ├── AccessibleAlignmentCell.hpp
│ │ ├── AccessibleAlignmentSelector.cpp
│ │ ├── AccessibleAlignmentSelector.hpp
│ │ ├── AlignmentSelector.cpp
│ │ ├── AlignmentSelector.hpp
│ │ ├── ApplicationAudioCaptureToolbar.cpp
│ │ ├── ApplicationAudioCaptureToolbar.hpp
│ │ ├── AudioCaptureToolbar.cpp
│ │ ├── AudioCaptureToolbar.hpp
│ │ ├── BalanceSlider.hpp
│ │ ├── BrowserToolbar.cpp
│ │ ├── BrowserToolbar.hpp
│ │ ├── ClickableLabel.hpp
│ │ ├── ColorSourceToolbar.cpp
│ │ ├── ColorSourceToolbar.hpp
│ │ ├── ComboSelectToolbar.cpp
│ │ ├── ComboSelectToolbar.hpp
│ │ ├── DelButton.hpp
│ │ ├── DeviceCaptureToolbar.cpp
│ │ ├── DeviceCaptureToolbar.hpp
│ │ ├── DisplayCaptureToolbar.cpp
│ │ ├── DisplayCaptureToolbar.hpp
│ │ ├── EditWidget.hpp
│ │ ├── FocusList.cpp
│ │ ├── FocusList.hpp
│ │ ├── GameCaptureToolbar.cpp
│ │ ├── GameCaptureToolbar.hpp
│ │ ├── ImageSourceToolbar.cpp
│ │ ├── ImageSourceToolbar.hpp
│ │ ├── MediaControls.cpp
│ │ ├── MediaControls.hpp
│ │ ├── MenuButton.cpp
│ │ ├── MenuButton.hpp
│ │ ├── MenuCheckBox.cpp
│ │ ├── MenuCheckBox.hpp
│ │ ├── Multiview.cpp
│ │ ├── Multiview.hpp
│ │ ├── MuteCheckBox.hpp
│ │ ├── OBSAdvAudioCtrl.cpp
│ │ ├── OBSAdvAudioCtrl.hpp
│ │ ├── OBSPreviewScalingComboBox.cpp
│ │ ├── OBSPreviewScalingComboBox.hpp
│ │ ├── OBSPreviewScalingLabel.cpp
│ │ ├── OBSPreviewScalingLabel.hpp
│ │ ├── OBSSourceLabel.cpp
│ │ ├── OBSSourceLabel.hpp
│ │ ├── SceneTree.cpp
│ │ ├── SceneTree.hpp
│ │ ├── SilentUpdateCheckBox.hpp
│ │ ├── SilentUpdateSpinBox.hpp
│ │ ├── SourceToolbar.cpp
│ │ ├── SourceToolbar.hpp
│ │ ├── SourceTree.cpp
│ │ ├── SourceTree.hpp
│ │ ├── SourceTreeDelegate.cpp
│ │ ├── SourceTreeDelegate.hpp
│ │ ├── SourceTreeItem.cpp
│ │ ├── SourceTreeItem.hpp
│ │ ├── SourceTreeModel.cpp
│ │ ├── SourceTreeModel.hpp
│ │ ├── TextSourceToolbar.cpp
│ │ ├── TextSourceToolbar.hpp
│ │ ├── UIValidation.cpp
│ │ ├── UIValidation.hpp
│ │ ├── UrlPushButton.cpp
│ │ ├── UrlPushButton.hpp
│ │ ├── VisibilityItemDelegate.cpp
│ │ ├── VisibilityItemDelegate.hpp
│ │ ├── VisibilityItemWidget.cpp
│ │ ├── VisibilityItemWidget.hpp
│ │ ├── VolumeAccessibleInterface.cpp
│ │ ├── VolumeAccessibleInterface.hpp
│ │ ├── VolumeControl.cpp
│ │ ├── VolumeControl.hpp
│ │ ├── VolumeMeter.cpp
│ │ ├── VolumeMeter.hpp
│ │ ├── VolumeName.cpp
│ │ ├── VolumeName.hpp
│ │ ├── VolumeSlider.cpp
│ │ ├── VolumeSlider.hpp
│ │ ├── WindowCaptureToolbar.cpp
│ │ └── WindowCaptureToolbar.hpp
│ ├── data/
│ │ ├── OBSPublicRSAKey.pem
│ │ ├── license/
│ │ │ └── gplv2.txt
│ │ ├── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bem-ZM.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── eo-UY.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── lv-LV.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pa-IN.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── te-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── locale.ini
│ │ ├── striped_line.effect
│ │ └── themes/
│ │ ├── System.obt
│ │ ├── Yami.obt
│ │ ├── Yami_Acri.ovt
│ │ ├── Yami_Classic.ovt
│ │ ├── Yami_Default.ovt
│ │ ├── Yami_Grey.ovt
│ │ ├── Yami_Light.ovt
│ │ └── Yami_Rachni.ovt
│ ├── dialogs/
│ │ ├── LogUploadDialog.cpp
│ │ ├── LogUploadDialog.hpp
│ │ ├── NameDialog.cpp
│ │ ├── NameDialog.hpp
│ │ ├── OAuthLogin.cpp
│ │ ├── OAuthLogin.hpp
│ │ ├── OBSAbout.cpp
│ │ ├── OBSAbout.hpp
│ │ ├── OBSBasicAdvAudio.cpp
│ │ ├── OBSBasicAdvAudio.hpp
│ │ ├── OBSBasicFilters.cpp
│ │ ├── OBSBasicFilters.hpp
│ │ ├── OBSBasicInteraction.cpp
│ │ ├── OBSBasicInteraction.hpp
│ │ ├── OBSBasicProperties.cpp
│ │ ├── OBSBasicProperties.hpp
│ │ ├── OBSBasicSourceSelect.cpp
│ │ ├── OBSBasicSourceSelect.hpp
│ │ ├── OBSBasicTransform.cpp
│ │ ├── OBSBasicTransform.hpp
│ │ ├── OBSBasicVCamConfig.cpp
│ │ ├── OBSBasicVCamConfig.hpp
│ │ ├── OBSExtraBrowsers.cpp
│ │ ├── OBSExtraBrowsers.hpp
│ │ ├── OBSIdianPlayground.cpp
│ │ ├── OBSIdianPlayground.hpp
│ │ ├── OBSLogViewer.cpp
│ │ ├── OBSLogViewer.hpp
│ │ ├── OBSMissingFiles.cpp
│ │ ├── OBSMissingFiles.hpp
│ │ ├── OBSPermissions.cpp
│ │ ├── OBSPermissions.hpp
│ │ ├── OBSRemux.cpp
│ │ ├── OBSRemux.hpp
│ │ ├── OBSUpdate.cpp
│ │ ├── OBSUpdate.hpp
│ │ ├── OBSWhatsNew.cpp
│ │ ├── OBSWhatsNew.hpp
│ │ ├── OBSYoutubeActions.cpp
│ │ └── OBSYoutubeActions.hpp
│ ├── docks/
│ │ ├── BrowserDock.cpp
│ │ ├── BrowserDock.hpp
│ │ ├── OBSDock.cpp
│ │ ├── OBSDock.hpp
│ │ ├── YouTubeAppDock.cpp
│ │ ├── YouTubeAppDock.hpp
│ │ ├── YouTubeChatDock.cpp
│ │ └── YouTubeChatDock.hpp
│ ├── forms/
│ │ ├── AutoConfigFinishPage.ui
│ │ ├── AutoConfigStartPage.ui
│ │ ├── AutoConfigStreamPage.ui
│ │ ├── AutoConfigTestPage.ui
│ │ ├── AutoConfigVideoPage.ui
│ │ ├── ColorSelect.ui
│ │ ├── LogUploadDialog.ui
│ │ ├── OBSAbout.ui
│ │ ├── OBSAdvAudio.ui
│ │ ├── OBSBasic.ui
│ │ ├── OBSBasicControls.ui
│ │ ├── OBSBasicFilters.ui
│ │ ├── OBSBasicInteraction.ui
│ │ ├── OBSBasicProperties.ui
│ │ ├── OBSBasicSettings.ui
│ │ ├── OBSBasicSourceSelect.ui
│ │ ├── OBSBasicTransform.ui
│ │ ├── OBSBasicVCamConfig.ui
│ │ ├── OBSExtraBrowsers.ui
│ │ ├── OBSIdianPlayground.ui
│ │ ├── OBSImporter.ui
│ │ ├── OBSLogViewer.ui
│ │ ├── OBSMissingFiles.ui
│ │ ├── OBSPermissions.ui
│ │ ├── OBSRemux.ui
│ │ ├── OBSUpdate.ui
│ │ ├── OBSYoutubeActions.ui
│ │ ├── PluginManagerWindow.ui
│ │ ├── StatusBarWidget.ui
│ │ ├── XML-Schema-Qt5.15.xsd
│ │ ├── obs.qrc
│ │ └── source-toolbar/
│ │ ├── browser-source-toolbar.ui
│ │ ├── color-source-toolbar.ui
│ │ ├── device-select-toolbar.ui
│ │ ├── game-capture-toolbar.ui
│ │ ├── image-source-toolbar.ui
│ │ ├── media-controls.ui
│ │ └── text-source-toolbar.ui
│ ├── importer/
│ │ ├── ImporterEntryPathItemDelegate.cpp
│ │ ├── ImporterEntryPathItemDelegate.hpp
│ │ ├── ImporterModel.cpp
│ │ ├── ImporterModel.hpp
│ │ ├── OBSImporter.cpp
│ │ └── OBSImporter.hpp
│ ├── importers/
│ │ ├── classic.cpp
│ │ ├── importers.cpp
│ │ ├── importers.hpp
│ │ ├── sl.cpp
│ │ ├── studio.cpp
│ │ └── xsplit.cpp
│ ├── models/
│ │ ├── Rect.cpp
│ │ ├── Rect.hpp
│ │ ├── SceneCollection.cpp
│ │ └── SceneCollection.hpp
│ ├── oauth/
│ │ ├── Auth.cpp
│ │ ├── Auth.hpp
│ │ ├── AuthListener.cpp
│ │ ├── AuthListener.hpp
│ │ ├── OAuth.cpp
│ │ ├── OAuth.hpp
│ │ ├── RestreamAuth.cpp
│ │ ├── RestreamAuth.hpp
│ │ ├── TwitchAuth.cpp
│ │ ├── TwitchAuth.hpp
│ │ ├── YoutubeAuth.cpp
│ │ └── YoutubeAuth.hpp
│ ├── obs-main.cpp
│ ├── plugin-manager/
│ │ ├── PluginManager.cpp
│ │ ├── PluginManager.hpp
│ │ ├── PluginManagerWindow.cpp
│ │ └── PluginManagerWindow.hpp
│ ├── plugins/
│ │ ├── CMakeLists.txt
│ │ ├── aja-output-ui/
│ │ │ ├── AJAOutputUI.cpp
│ │ │ ├── AJAOutputUI.h
│ │ │ ├── CMakeLists.txt
│ │ │ ├── aja-ui-main.cpp
│ │ │ ├── aja-ui-main.h
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ ├── data/
│ │ │ │ └── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── lv-LV.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── ur-PK.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── forms/
│ │ │ └── output.ui
│ │ ├── decklink-captions/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ ├── data/
│ │ │ │ └── .keepme
│ │ │ ├── decklink-captions.cpp
│ │ │ ├── decklink-captions.h
│ │ │ └── forms/
│ │ │ └── captions.ui
│ │ ├── decklink-output-ui/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── DecklinkOutputUI.cpp
│ │ │ ├── DecklinkOutputUI.h
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ ├── data/
│ │ │ │ └── .keepme
│ │ │ ├── decklink-ui-main.cpp
│ │ │ ├── decklink-ui-main.h
│ │ │ └── forms/
│ │ │ └── output.ui
│ │ └── frontend-tools/
│ │ ├── CMakeLists.txt
│ │ ├── auto-scene-switcher-nix.cpp
│ │ ├── auto-scene-switcher-osx.mm
│ │ ├── auto-scene-switcher-win.cpp
│ │ ├── auto-scene-switcher.cpp
│ │ ├── auto-scene-switcher.hpp
│ │ ├── captions-handler.cpp
│ │ ├── captions-handler.hpp
│ │ ├── captions-mssapi-stream.cpp
│ │ ├── captions-mssapi-stream.hpp
│ │ ├── captions-mssapi.cpp
│ │ ├── captions-mssapi.hpp
│ │ ├── captions.cpp
│ │ ├── captions.hpp
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── an-ES.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── is-IS.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── lt-LT.ini
│ │ │ │ ├── lv-LV.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── oc-FR.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── scripts/
│ │ │ ├── clock-source.lua
│ │ │ ├── countdown.lua
│ │ │ ├── instant-replay.lua
│ │ │ ├── pause-scene.lua
│ │ │ └── url-text.py
│ │ ├── forms/
│ │ │ ├── auto-scene-switcher.ui
│ │ │ ├── captions.ui
│ │ │ ├── output-timer.ui
│ │ │ └── scripts.ui
│ │ ├── frontend-tools-config.h.in
│ │ ├── frontend-tools.c
│ │ ├── output-timer.cpp
│ │ ├── output-timer.hpp
│ │ ├── scripts.cpp
│ │ ├── scripts.hpp
│ │ └── tool-helpers.hpp
│ ├── settings/
│ │ ├── OBSBasicSettings.cpp
│ │ ├── OBSBasicSettings.hpp
│ │ ├── OBSBasicSettings_A11y.cpp
│ │ ├── OBSBasicSettings_Appearance.cpp
│ │ ├── OBSBasicSettings_Stream.cpp
│ │ ├── OBSHotkeyEdit.cpp
│ │ ├── OBSHotkeyEdit.hpp
│ │ ├── OBSHotkeyLabel.cpp
│ │ ├── OBSHotkeyLabel.hpp
│ │ ├── OBSHotkeyWidget.cpp
│ │ └── OBSHotkeyWidget.hpp
│ ├── updater/
│ │ ├── CMakeLists.txt
│ │ ├── hash.cpp
│ │ ├── helpers.cpp
│ │ ├── helpers.hpp
│ │ ├── http.cpp
│ │ ├── init-hook-files.c
│ │ ├── manifest.hpp
│ │ ├── patch.cpp
│ │ ├── resource.h
│ │ ├── updater.cpp
│ │ ├── updater.hpp
│ │ ├── updater.manifest
│ │ └── updater.rc
│ ├── utility/
│ │ ├── AdvancedOutput.cpp
│ │ ├── AdvancedOutput.hpp
│ │ ├── AutoUpdateThread.cpp
│ │ ├── AutoUpdateThread.hpp
│ │ ├── BaseLexer.hpp
│ │ ├── BasicOutputHandler.cpp
│ │ ├── BasicOutputHandler.hpp
│ │ ├── CrashHandler.cpp
│ │ ├── CrashHandler.hpp
│ │ ├── CrashHandler_FreeBSD.cpp
│ │ ├── CrashHandler_Linux.cpp
│ │ ├── CrashHandler_MacOS.mm
│ │ ├── CrashHandler_Windows.cpp
│ │ ├── ExtraBrowsersDelegate.cpp
│ │ ├── ExtraBrowsersDelegate.hpp
│ │ ├── ExtraBrowsersModel.cpp
│ │ ├── ExtraBrowsersModel.hpp
│ │ ├── FFmpegCodec.cpp
│ │ ├── FFmpegCodec.hpp
│ │ ├── FFmpegFormat.cpp
│ │ ├── FFmpegFormat.hpp
│ │ ├── FFmpegShared.hpp
│ │ ├── GoLiveAPI_CensoredJson.cpp
│ │ ├── GoLiveAPI_CensoredJson.hpp
│ │ ├── GoLiveAPI_Network.cpp
│ │ ├── GoLiveAPI_Network.hpp
│ │ ├── GoLiveAPI_PostData.cpp
│ │ ├── GoLiveAPI_PostData.hpp
│ │ ├── MacUpdateThread.cpp
│ │ ├── MacUpdateThread.hpp
│ │ ├── MissingFilesModel.cpp
│ │ ├── MissingFilesModel.hpp
│ │ ├── MissingFilesPathItemDelegate.cpp
│ │ ├── MissingFilesPathItemDelegate.hpp
│ │ ├── MultitrackVideoError.cpp
│ │ ├── MultitrackVideoError.hpp
│ │ ├── MultitrackVideoOutput.cpp
│ │ ├── MultitrackVideoOutput.hpp
│ │ ├── NativeEventFilter.cpp
│ │ ├── NativeEventFilter.hpp
│ │ ├── NativeEventFilter_Windows.cpp
│ │ ├── OBSCanvas.cpp
│ │ ├── OBSCanvas.hpp
│ │ ├── OBSEventFilter.hpp
│ │ ├── OBSProxyStyle.cpp
│ │ ├── OBSProxyStyle.hpp
│ │ ├── OBSSparkle.hpp
│ │ ├── OBSSparkle.mm
│ │ ├── OBSTheme.hpp
│ │ ├── OBSThemeVariable.hpp
│ │ ├── OBSTranslator.cpp
│ │ ├── OBSTranslator.hpp
│ │ ├── OBSUpdateDelegate.h
│ │ ├── OBSUpdateDelegate.mm
│ │ ├── PreviewProgramSizeObserver.cpp
│ │ ├── PreviewProgramSizeObserver.hpp
│ │ ├── QuickTransition.cpp
│ │ ├── QuickTransition.hpp
│ │ ├── RemoteTextThread.cpp
│ │ ├── RemoteTextThread.hpp
│ │ ├── RemuxEntryPathItemDelegate.cpp
│ │ ├── RemuxEntryPathItemDelegate.hpp
│ │ ├── RemuxQueueModel.cpp
│ │ ├── RemuxQueueModel.hpp
│ │ ├── RemuxWorker.cpp
│ │ ├── RemuxWorker.hpp
│ │ ├── SceneRenameDelegate.cpp
│ │ ├── SceneRenameDelegate.hpp
│ │ ├── ScreenshotObj.cpp
│ │ ├── ScreenshotObj.hpp
│ │ ├── SettingsEventFilter.hpp
│ │ ├── SimpleOutput.cpp
│ │ ├── SimpleOutput.hpp
│ │ ├── StartMultiTrackVideoStreamingGuard.hpp
│ │ ├── SurfaceEventFilter.hpp
│ │ ├── VCamConfig.hpp
│ │ ├── WHIPSimulcastEncoders.hpp
│ │ ├── WhatsNewBrowserInitThread.cpp
│ │ ├── WhatsNewBrowserInitThread.hpp
│ │ ├── WhatsNewInfoThread.cpp
│ │ ├── WhatsNewInfoThread.hpp
│ │ ├── YoutubeApiWrappers.cpp
│ │ ├── YoutubeApiWrappers.hpp
│ │ ├── audio-encoders.cpp
│ │ ├── audio-encoders.hpp
│ │ ├── crypto-helpers-mac.mm
│ │ ├── crypto-helpers-mbedtls.cpp
│ │ ├── crypto-helpers.hpp
│ │ ├── display-helpers.hpp
│ │ ├── item-widget-helpers.cpp
│ │ ├── item-widget-helpers.hpp
│ │ ├── models/
│ │ │ ├── branches.hpp
│ │ │ ├── multitrack-video.hpp
│ │ │ └── whatsnew.hpp
│ │ ├── obf.c
│ │ ├── obf.h
│ │ ├── platform-osx.mm
│ │ ├── platform-windows.cpp
│ │ ├── platform-x11.cpp
│ │ ├── platform.hpp
│ │ ├── system-info-macos.mm
│ │ ├── system-info-posix.cpp
│ │ ├── system-info-windows.cpp
│ │ ├── system-info.hpp
│ │ ├── undo_stack.cpp
│ │ ├── undo_stack.hpp
│ │ ├── update-helpers.cpp
│ │ ├── update-helpers.hpp
│ │ └── win-dll-blocklist.c
│ ├── widgets/
│ │ ├── AudioMixer.cpp
│ │ ├── AudioMixer.hpp
│ │ ├── ColorSelect.cpp
│ │ ├── ColorSelect.hpp
│ │ ├── OBSBasic.cpp
│ │ ├── OBSBasic.hpp
│ │ ├── OBSBasicControls.cpp
│ │ ├── OBSBasicControls.hpp
│ │ ├── OBSBasicPreview.cpp
│ │ ├── OBSBasicPreview.hpp
│ │ ├── OBSBasicStats.cpp
│ │ ├── OBSBasicStats.hpp
│ │ ├── OBSBasicStatusBar.cpp
│ │ ├── OBSBasicStatusBar.hpp
│ │ ├── OBSBasic_Browser.cpp
│ │ ├── OBSBasic_Canvases.cpp
│ │ ├── OBSBasic_Clipboard.cpp
│ │ ├── OBSBasic_ContextToolbar.cpp
│ │ ├── OBSBasic_Docks.cpp
│ │ ├── OBSBasic_Dropfiles.cpp
│ │ ├── OBSBasic_Hotkeys.cpp
│ │ ├── OBSBasic_Icons.cpp
│ │ ├── OBSBasic_MainControls.cpp
│ │ ├── OBSBasic_OutputHandler.cpp
│ │ ├── OBSBasic_Preview.cpp
│ │ ├── OBSBasic_Profiles.cpp
│ │ ├── OBSBasic_Projectors.cpp
│ │ ├── OBSBasic_Recording.cpp
│ │ ├── OBSBasic_ReplayBuffer.cpp
│ │ ├── OBSBasic_SceneCollections.cpp
│ │ ├── OBSBasic_SceneItems.cpp
│ │ ├── OBSBasic_Scenes.cpp
│ │ ├── OBSBasic_Screenshots.cpp
│ │ ├── OBSBasic_Service.cpp
│ │ ├── OBSBasic_StatusBar.cpp
│ │ ├── OBSBasic_Streaming.cpp
│ │ ├── OBSBasic_StudioMode.cpp
│ │ ├── OBSBasic_SysTray.cpp
│ │ ├── OBSBasic_Transitions.cpp
│ │ ├── OBSBasic_Updater.cpp
│ │ ├── OBSBasic_VirtualCam.cpp
│ │ ├── OBSBasic_YouTube.cpp
│ │ ├── OBSMainWindow.hpp
│ │ ├── OBSProjector.cpp
│ │ ├── OBSProjector.hpp
│ │ ├── OBSQTDisplay.cpp
│ │ ├── OBSQTDisplay.hpp
│ │ ├── StatusBarWidget.cpp
│ │ └── StatusBarWidget.hpp
│ └── wizards/
│ ├── AutoConfig.cpp
│ ├── AutoConfig.hpp
│ ├── AutoConfigStartPage.cpp
│ ├── AutoConfigStartPage.hpp
│ ├── AutoConfigStreamPage.cpp
│ ├── AutoConfigStreamPage.hpp
│ ├── AutoConfigTestPage.cpp
│ ├── AutoConfigTestPage.hpp
│ ├── AutoConfigVideoPage.cpp
│ ├── AutoConfigVideoPage.hpp
│ └── TestMode.hpp
├── libobs/
│ ├── CMakeLists.txt
│ ├── audio-monitoring/
│ │ ├── null/
│ │ │ └── null-audio-monitoring.c
│ │ ├── osx/
│ │ │ ├── coreaudio-enum-devices.c
│ │ │ ├── coreaudio-monitoring-available.c
│ │ │ ├── coreaudio-output.c
│ │ │ └── mac-helpers.h
│ │ ├── pulse/
│ │ │ ├── pulseaudio-enum-devices.c
│ │ │ ├── pulseaudio-monitoring-available.c
│ │ │ ├── pulseaudio-output.c
│ │ │ ├── pulseaudio-wrapper.c
│ │ │ └── pulseaudio-wrapper.h
│ │ └── win32/
│ │ ├── wasapi-enum-devices.c
│ │ ├── wasapi-monitoring-available.c
│ │ ├── wasapi-output.c
│ │ └── wasapi-output.h
│ ├── callback/
│ │ ├── calldata.c
│ │ ├── calldata.h
│ │ ├── decl.c
│ │ ├── decl.h
│ │ ├── proc.c
│ │ ├── proc.h
│ │ ├── signal.c
│ │ └── signal.h
│ ├── cmake/
│ │ ├── libobsConfig.cmake.in
│ │ ├── linux/
│ │ │ └── libobs.pc.in
│ │ ├── macos/
│ │ │ └── entitlements.plist
│ │ ├── obs-version.cmake
│ │ ├── os-freebsd.cmake
│ │ ├── os-linux.cmake
│ │ ├── os-macos.cmake
│ │ ├── os-windows.cmake
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── data/
│ │ ├── area.effect
│ │ ├── bicubic_scale.effect
│ │ ├── bilinear_lowres_scale.effect
│ │ ├── color.effect
│ │ ├── default.effect
│ │ ├── default_rect.effect
│ │ ├── deinterlace_base.effect
│ │ ├── deinterlace_blend.effect
│ │ ├── deinterlace_blend_2x.effect
│ │ ├── deinterlace_discard.effect
│ │ ├── deinterlace_discard_2x.effect
│ │ ├── deinterlace_linear.effect
│ │ ├── deinterlace_linear_2x.effect
│ │ ├── deinterlace_yadif.effect
│ │ ├── deinterlace_yadif_2x.effect
│ │ ├── format_conversion.effect
│ │ ├── lanczos_scale.effect
│ │ ├── opaque.effect
│ │ ├── premultiplied_alpha.effect
│ │ ├── repeat.effect
│ │ └── solid.effect
│ ├── graphics/
│ │ ├── axisang.c
│ │ ├── axisang.h
│ │ ├── basemath.hpp
│ │ ├── bounds.c
│ │ ├── bounds.h
│ │ ├── device-exports.h
│ │ ├── effect-parser.c
│ │ ├── effect-parser.h
│ │ ├── effect.c
│ │ ├── effect.h
│ │ ├── graphics-ffmpeg.c
│ │ ├── graphics-imports.c
│ │ ├── graphics-internal.h
│ │ ├── graphics.c
│ │ ├── graphics.h
│ │ ├── half.h
│ │ ├── image-file.c
│ │ ├── image-file.h
│ │ ├── input.h
│ │ ├── libnsgif/
│ │ │ ├── .clang-format
│ │ │ ├── LICENSE.libnsgif
│ │ │ ├── libnsgif.c
│ │ │ └── libnsgif.h
│ │ ├── math-defs.h
│ │ ├── math-extra.c
│ │ ├── math-extra.h
│ │ ├── matrix3.c
│ │ ├── matrix3.h
│ │ ├── matrix4.c
│ │ ├── matrix4.h
│ │ ├── plane.c
│ │ ├── plane.h
│ │ ├── quat.c
│ │ ├── quat.h
│ │ ├── shader-parser.c
│ │ ├── shader-parser.h
│ │ ├── srgb.h
│ │ ├── texture-render.c
│ │ ├── vec2.c
│ │ ├── vec2.h
│ │ ├── vec3.c
│ │ ├── vec3.h
│ │ ├── vec4.c
│ │ └── vec4.h
│ ├── media-io/
│ │ ├── audio-io.c
│ │ ├── audio-io.h
│ │ ├── audio-math.h
│ │ ├── audio-resampler-ffmpeg.c
│ │ ├── audio-resampler.h
│ │ ├── format-conversion.c
│ │ ├── format-conversion.h
│ │ ├── frame-rate.h
│ │ ├── media-io-defs.h
│ │ ├── media-remux.c
│ │ ├── media-remux.h
│ │ ├── video-fourcc.c
│ │ ├── video-frame.c
│ │ ├── video-frame.h
│ │ ├── video-io.c
│ │ ├── video-io.h
│ │ ├── video-matrices.c
│ │ ├── video-scaler-ffmpeg.c
│ │ └── video-scaler.h
│ ├── obs-audio-controls.c
│ ├── obs-audio-controls.h
│ ├── obs-audio.c
│ ├── obs-av1.c
│ ├── obs-av1.h
│ ├── obs-avc.c
│ ├── obs-avc.h
│ ├── obs-canvas.c
│ ├── obs-cocoa.m
│ ├── obs-config.h
│ ├── obs-data.c
│ ├── obs-data.h
│ ├── obs-defs.h
│ ├── obs-display.c
│ ├── obs-encoder.c
│ ├── obs-encoder.h
│ ├── obs-ffmpeg-compat.h
│ ├── obs-hevc.c
│ ├── obs-hevc.h
│ ├── obs-hotkey-name-map.c
│ ├── obs-hotkey.c
│ ├── obs-hotkey.h
│ ├── obs-hotkeys.h
│ ├── obs-interaction.h
│ ├── obs-internal.h
│ ├── obs-missing-files.c
│ ├── obs-missing-files.h
│ ├── obs-module.c
│ ├── obs-module.h
│ ├── obs-nal.c
│ ├── obs-nal.h
│ ├── obs-nix-platform.c
│ ├── obs-nix-platform.h
│ ├── obs-nix-wayland.c
│ ├── obs-nix-wayland.h
│ ├── obs-nix-x11.c
│ ├── obs-nix-x11.h
│ ├── obs-nix.c
│ ├── obs-nix.h
│ ├── obs-output-delay.c
│ ├── obs-output.c
│ ├── obs-output.h
│ ├── obs-properties.c
│ ├── obs-properties.h
│ ├── obs-scene.c
│ ├── obs-scene.h
│ ├── obs-service.c
│ ├── obs-service.h
│ ├── obs-source-deinterlace.c
│ ├── obs-source-transition.c
│ ├── obs-source.c
│ ├── obs-source.h
│ ├── obs-video-gpu-encode.c
│ ├── obs-video.c
│ ├── obs-view.c
│ ├── obs-win-crash-handler.c
│ ├── obs-windows.c
│ ├── obs.c
│ ├── obs.h
│ ├── obs.hpp
│ ├── obsconfig.h.in
│ ├── obsversion.c.in
│ ├── obsversion.h
│ ├── pkgconfig/
│ │ └── libobs.pc.in
│ └── util/
│ ├── apple/
│ │ └── cfstring-utils.h
│ ├── array-serializer.c
│ ├── array-serializer.h
│ ├── base.c
│ ├── base.h
│ ├── bitstream.c
│ ├── bitstream.h
│ ├── bmem.c
│ ├── bmem.h
│ ├── buffered-file-serializer.c
│ ├── buffered-file-serializer.h
│ ├── c99defs.h
│ ├── cf-lexer.c
│ ├── cf-lexer.h
│ ├── cf-parser.c
│ ├── cf-parser.h
│ ├── config-file.c
│ ├── config-file.h
│ ├── crc32.c
│ ├── crc32.h
│ ├── curl/
│ │ └── curl-helper.h
│ ├── darray.h
│ ├── deque.h
│ ├── dstr.c
│ ├── dstr.h
│ ├── dstr.hpp
│ ├── file-serializer.c
│ ├── file-serializer.h
│ ├── lexer.c
│ ├── lexer.h
│ ├── pipe-posix.c
│ ├── pipe-windows.c
│ ├── pipe.c
│ ├── pipe.h
│ ├── platform-cocoa.m
│ ├── platform-nix-dbus.c
│ ├── platform-nix-portal.c
│ ├── platform-nix.c
│ ├── platform-windows.c
│ ├── platform.c
│ ├── platform.h
│ ├── profiler.c
│ ├── profiler.h
│ ├── profiler.hpp
│ ├── serializer.h
│ ├── source-profiler.c
│ ├── source-profiler.h
│ ├── sse-intrin.h
│ ├── task.c
│ ├── task.h
│ ├── text-lookup.c
│ ├── text-lookup.h
│ ├── threading-posix.c
│ ├── threading-posix.h
│ ├── threading-windows.c
│ ├── threading-windows.h
│ ├── threading.h
│ ├── utf8.c
│ ├── utf8.h
│ ├── uthash.h
│ ├── util.hpp
│ ├── util_uint128.h
│ ├── util_uint64.h
│ └── windows/
│ ├── CoTaskMemPtr.hpp
│ ├── ComPtr.hpp
│ ├── HRError.hpp
│ ├── WinHandle.hpp
│ ├── device-enum.c
│ ├── device-enum.h
│ ├── obfuscate.c
│ ├── obfuscate.h
│ ├── win-registry.h
│ ├── win-version.h
│ ├── window-helpers.c
│ └── window-helpers.h
├── libobs-d3d11/
│ ├── CMakeLists.txt
│ ├── cmake/
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── d3d11-duplicator.cpp
│ ├── d3d11-indexbuffer.cpp
│ ├── d3d11-rebuild.cpp
│ ├── d3d11-samplerstate.cpp
│ ├── d3d11-shader.cpp
│ ├── d3d11-shaderprocessor.cpp
│ ├── d3d11-shaderprocessor.hpp
│ ├── d3d11-stagesurf.cpp
│ ├── d3d11-subsystem.cpp
│ ├── d3d11-subsystem.hpp
│ ├── d3d11-texture2d.cpp
│ ├── d3d11-texture3d.cpp
│ ├── d3d11-vertexbuffer.cpp
│ └── d3d11-zstencilbuffer.cpp
├── libobs-metal/
│ ├── CMakeLists.txt
│ ├── CVPixelFormat+Extensions.swift
│ ├── MTLCullMode+Extensions.swift
│ ├── MTLOrigin+Extensions.swift
│ ├── MTLPixelFormat+Extensions.swift
│ ├── MTLRegion+Extensions.swift
│ ├── MTLSize+Extensions.swift
│ ├── MTLTexture+Extensions.swift
│ ├── MTLTextureDescriptor+Extensions.swift
│ ├── MTLTextureType+Extensions.swift
│ ├── MTLViewport+Extensions.swift
│ ├── MetalBuffer.swift
│ ├── MetalDevice.swift
│ ├── MetalError.swift
│ ├── MetalRenderState.swift
│ ├── MetalShader+Extensions.swift
│ ├── MetalShader.swift
│ ├── MetalStageBuffer.swift
│ ├── MetalTexture.swift
│ ├── OBSShader.swift
│ ├── OBSSwapChain.swift
│ ├── README.md
│ ├── Sequence+Hashable.swift
│ ├── libobs+Extensions.swift
│ ├── libobs+SignalHandlers.swift
│ ├── libobs-metal-Bridging-Header.h
│ ├── metal-indexbuffer.swift
│ ├── metal-samplerstate.swift
│ ├── metal-shader.swift
│ ├── metal-stagesurf.swift
│ ├── metal-subsystem.swift
│ ├── metal-swapchain.swift
│ ├── metal-texture2d.swift
│ ├── metal-texture3d.swift
│ ├── metal-unimplemented.swift
│ ├── metal-vertexbuffer.swift
│ └── metal-zstencilbuffer.swift
├── libobs-opengl/
│ ├── CMakeLists.txt
│ ├── cmake/
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── gl-cocoa.m
│ ├── gl-egl-common.c
│ ├── gl-egl-common.h
│ ├── gl-helpers.c
│ ├── gl-helpers.h
│ ├── gl-indexbuffer.c
│ ├── gl-nix.c
│ ├── gl-nix.h
│ ├── gl-shader.c
│ ├── gl-shaderparser.c
│ ├── gl-shaderparser.h
│ ├── gl-stagesurf.c
│ ├── gl-subsystem.c
│ ├── gl-subsystem.h
│ ├── gl-texture2d.c
│ ├── gl-texture3d.c
│ ├── gl-texturecube.c
│ ├── gl-vertexbuffer.c
│ ├── gl-wayland-egl.c
│ ├── gl-wayland-egl.h
│ ├── gl-windows.c
│ ├── gl-x11-egl.c
│ ├── gl-x11-egl.h
│ └── gl-zstencil.c
├── libobs-winrt/
│ ├── CMakeLists.txt
│ ├── winrt-capture.cpp
│ ├── winrt-capture.h
│ ├── winrt-dispatch.cpp
│ └── winrt-dispatch.h
├── plugins/
│ ├── CMakeLists.txt
│ ├── aja/
│ │ ├── CMakeLists.txt
│ │ ├── README.md
│ │ ├── aja-card-manager.cpp
│ │ ├── aja-card-manager.hpp
│ │ ├── aja-common.cpp
│ │ ├── aja-common.hpp
│ │ ├── aja-enums.hpp
│ │ ├── aja-output.cpp
│ │ ├── aja-output.hpp
│ │ ├── aja-presets.cpp
│ │ ├── aja-presets.hpp
│ │ ├── aja-props.cpp
│ │ ├── aja-props.hpp
│ │ ├── aja-routing.cpp
│ │ ├── aja-routing.hpp
│ │ ├── aja-source.cpp
│ │ ├── aja-source.hpp
│ │ ├── aja-ui-props.hpp
│ │ ├── aja-vpid-data.cpp
│ │ ├── aja-vpid-data.hpp
│ │ ├── aja-widget-io.cpp
│ │ ├── aja-widget-io.hpp
│ │ ├── audio-repack.c
│ │ ├── audio-repack.h
│ │ ├── audio-repack.hpp
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── main.cpp
│ ├── coreaudio-encoder/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── eo-UY.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── encoder.cpp
│ │ └── windows-imports.h
│ ├── decklink/
│ │ ├── CMakeLists.txt
│ │ ├── DecklinkBase.cpp
│ │ ├── DecklinkBase.h
│ │ ├── DecklinkInput.cpp
│ │ ├── DecklinkInput.hpp
│ │ ├── DecklinkOutput.cpp
│ │ ├── DecklinkOutput.hpp
│ │ ├── LICENSE.decklink-sdk
│ │ ├── OBSVideoFrame.cpp
│ │ ├── OBSVideoFrame.h
│ │ ├── audio-repack.c
│ │ ├── audio-repack.h
│ │ ├── audio-repack.hpp
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── const.h
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── eo-UY.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── decklink-device-discovery.cpp
│ │ ├── decklink-device-discovery.hpp
│ │ ├── decklink-device-instance.cpp
│ │ ├── decklink-device-instance.hpp
│ │ ├── decklink-device-mode.cpp
│ │ ├── decklink-device-mode.hpp
│ │ ├── decklink-device.cpp
│ │ ├── decklink-device.hpp
│ │ ├── decklink-devices.cpp
│ │ ├── decklink-devices.hpp
│ │ ├── decklink-output.cpp
│ │ ├── decklink-source.cpp
│ │ ├── linux/
│ │ │ ├── decklink-sdk/
│ │ │ │ ├── .clang-format
│ │ │ │ ├── DeckLinkAPI.h
│ │ │ │ ├── DeckLinkAPIConfiguration.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_11.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_2.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_4.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_5.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_9.h
│ │ │ │ ├── DeckLinkAPIDeckControl.h
│ │ │ │ ├── DeckLinkAPIDiscovery.h
│ │ │ │ ├── DeckLinkAPIDispatch.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_11.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_8.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v7_6.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v8_0.cpp
│ │ │ │ ├── DeckLinkAPIModes.h
│ │ │ │ ├── DeckLinkAPITypes.h
│ │ │ │ ├── DeckLinkAPIVersion.h
│ │ │ │ ├── DeckLinkAPIVideoEncoderInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_4.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_5_1.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v11_4.h
│ │ │ │ ├── DeckLinkAPI_v10_11.h
│ │ │ │ ├── DeckLinkAPI_v10_2.h
│ │ │ │ ├── DeckLinkAPI_v10_4.h
│ │ │ │ ├── DeckLinkAPI_v10_5.h
│ │ │ │ ├── DeckLinkAPI_v10_6.h
│ │ │ │ ├── DeckLinkAPI_v10_9.h
│ │ │ │ ├── DeckLinkAPI_v11_5.h
│ │ │ │ ├── DeckLinkAPI_v11_5_1.h
│ │ │ │ ├── DeckLinkAPI_v7_1.h
│ │ │ │ ├── DeckLinkAPI_v7_3.h
│ │ │ │ ├── DeckLinkAPI_v7_6.h
│ │ │ │ ├── DeckLinkAPI_v7_9.h
│ │ │ │ ├── DeckLinkAPI_v8_0.h
│ │ │ │ ├── DeckLinkAPI_v8_1.h
│ │ │ │ ├── DeckLinkAPI_v9_2.h
│ │ │ │ ├── DeckLinkAPI_v9_9.h
│ │ │ │ └── LinuxCOM.h
│ │ │ └── platform.cpp
│ │ ├── mac/
│ │ │ ├── decklink-sdk/
│ │ │ │ ├── .clang-format
│ │ │ │ ├── DeckLinkAPI.h
│ │ │ │ ├── DeckLinkAPIConfiguration.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_11.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_2.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_4.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_5.h
│ │ │ │ ├── DeckLinkAPIConfiguration_v10_9.h
│ │ │ │ ├── DeckLinkAPIDeckControl.h
│ │ │ │ ├── DeckLinkAPIDiscovery.h
│ │ │ │ ├── DeckLinkAPIDispatch.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_11.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v10_8.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v7_6.cpp
│ │ │ │ ├── DeckLinkAPIDispatch_v8_0.cpp
│ │ │ │ ├── DeckLinkAPIModes.h
│ │ │ │ ├── DeckLinkAPIStreaming.h
│ │ │ │ ├── DeckLinkAPIStreaming_v10_11.h
│ │ │ │ ├── DeckLinkAPITypes.h
│ │ │ │ ├── DeckLinkAPIVersion.h
│ │ │ │ ├── DeckLinkAPIVideoEncoderInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_4.h
│ │ │ │ ├── DeckLinkAPIVideoInput_v11_5_1.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v10_11.h
│ │ │ │ ├── DeckLinkAPIVideoOutput_v11_4.h
│ │ │ │ ├── DeckLinkAPI_v10_11.h
│ │ │ │ ├── DeckLinkAPI_v10_2.h
│ │ │ │ ├── DeckLinkAPI_v10_4.h
│ │ │ │ ├── DeckLinkAPI_v10_5.h
│ │ │ │ ├── DeckLinkAPI_v10_6.h
│ │ │ │ ├── DeckLinkAPI_v10_9.h
│ │ │ │ ├── DeckLinkAPI_v11_5.h
│ │ │ │ ├── DeckLinkAPI_v11_5_1.h
│ │ │ │ ├── DeckLinkAPI_v7_1.h
│ │ │ │ ├── DeckLinkAPI_v7_3.h
│ │ │ │ ├── DeckLinkAPI_v7_6.h
│ │ │ │ ├── DeckLinkAPI_v7_9.h
│ │ │ │ ├── DeckLinkAPI_v8_0.h
│ │ │ │ ├── DeckLinkAPI_v8_1.h
│ │ │ │ ├── DeckLinkAPI_v9_2.h
│ │ │ │ └── DeckLinkAPI_v9_9.h
│ │ │ └── platform.cpp
│ │ ├── platform.hpp
│ │ ├── plugin-main.cpp
│ │ ├── util.cpp
│ │ ├── util.hpp
│ │ └── win/
│ │ ├── decklink-sdk/
│ │ │ ├── DeckLinkAPI.idl
│ │ │ ├── DeckLinkAPIConfiguration.idl
│ │ │ ├── DeckLinkAPIDeckControl.idl
│ │ │ ├── DeckLinkAPIDiscovery.idl
│ │ │ ├── DeckLinkAPIModes.idl
│ │ │ ├── DeckLinkAPIStreaming.idl
│ │ │ ├── DeckLinkAPIStreaming_v10_8.idl
│ │ │ ├── DeckLinkAPITypes.idl
│ │ │ ├── DeckLinkAPIVersion.h
│ │ │ ├── DeckLinkAPI_v10_11.idl
│ │ │ ├── DeckLinkAPI_v10_2.idl
│ │ │ ├── DeckLinkAPI_v10_4.idl
│ │ │ ├── DeckLinkAPI_v10_5.idl
│ │ │ ├── DeckLinkAPI_v10_6.idl
│ │ │ ├── DeckLinkAPI_v10_8.idl
│ │ │ ├── DeckLinkAPI_v10_9.idl
│ │ │ ├── DeckLinkAPI_v11_4.idl
│ │ │ ├── DeckLinkAPI_v11_5.idl
│ │ │ ├── DeckLinkAPI_v11_5_1.idl
│ │ │ ├── DeckLinkAPI_v7_1.idl
│ │ │ ├── DeckLinkAPI_v7_3.idl
│ │ │ ├── DeckLinkAPI_v7_6.idl
│ │ │ ├── DeckLinkAPI_v7_9.idl
│ │ │ ├── DeckLinkAPI_v8_0.idl
│ │ │ ├── DeckLinkAPI_v8_1.idl
│ │ │ ├── DeckLinkAPI_v9_2.idl
│ │ │ └── DeckLinkAPI_v9_9.idl
│ │ └── platform.cpp
│ ├── image-source/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── color-source.c
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pa-IN.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── image-source.c
│ │ ├── obs-slideshow-mk2.c
│ │ └── obs-slideshow.c
│ ├── linux-alsa/
│ │ ├── CMakeLists.txt
│ │ ├── alsa-input.c
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── linux-alsa.c
│ ├── linux-capture/
│ │ ├── CMakeLists.txt
│ │ ├── README
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lv-LV.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── te-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── linux-capture.c
│ │ ├── xcomposite-input.c
│ │ ├── xcomposite-input.h
│ │ ├── xcursor-xcb.c
│ │ ├── xcursor-xcb.h
│ │ ├── xhelpers.c
│ │ ├── xhelpers.h
│ │ └── xshm-input.c
│ ├── linux-jack/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── jack-input.c
│ │ ├── jack-wrapper.c
│ │ ├── jack-wrapper.h
│ │ └── linux-jack.c
│ ├── linux-pipewire/
│ │ ├── CMakeLists.txt
│ │ ├── camera-portal.c
│ │ ├── camera-portal.h
│ │ ├── data/
│ │ │ ├── .gitkeep
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── formats.c
│ │ ├── formats.h
│ │ ├── linux-pipewire.c
│ │ ├── pipewire.c
│ │ ├── pipewire.h
│ │ ├── portal.c
│ │ ├── portal.h
│ │ ├── screencast-portal.c
│ │ └── screencast-portal.h
│ ├── linux-pulseaudio/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── linux-pulseaudio.c
│ │ ├── pulse-input.c
│ │ ├── pulse-wrapper.c
│ │ └── pulse-wrapper.h
│ ├── linux-v4l2/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── linux-v4l2.c
│ │ ├── v4l2-controls.c
│ │ ├── v4l2-controls.h
│ │ ├── v4l2-decoder.c
│ │ ├── v4l2-decoder.h
│ │ ├── v4l2-helpers.c
│ │ ├── v4l2-helpers.h
│ │ ├── v4l2-input.c
│ │ ├── v4l2-output.c
│ │ ├── v4l2-udev.c
│ │ └── v4l2-udev.h
│ ├── mac-avcapture/
│ │ ├── AVCaptureDeviceFormat+OBSListable.h
│ │ ├── AVCaptureDeviceFormat+OBSListable.m
│ │ ├── CMakeLists.txt
│ │ ├── OBSAVCapture.h
│ │ ├── OBSAVCapture.m
│ │ ├── OBSAVCapturePresetInfo.h
│ │ ├── OBSAVCapturePresetInfo.m
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── legacy/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── av-capture.mm
│ │ │ ├── left-right.hpp
│ │ │ └── scope-guard.hpp
│ │ ├── plugin-main.h
│ │ ├── plugin-main.m
│ │ ├── plugin-properties.h
│ │ └── plugin-properties.m
│ ├── mac-capture/
│ │ ├── CMakeLists.txt
│ │ ├── audio-device-enum.c
│ │ ├── audio-device-enum.h
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── mac-audio.c
│ │ ├── mac-display-capture.m
│ │ ├── mac-sck-audio-capture.m
│ │ ├── mac-sck-common.h
│ │ ├── mac-sck-common.m
│ │ ├── mac-sck-video-capture.m
│ │ ├── mac-window-capture.m
│ │ ├── plugin-main.c
│ │ ├── window-utils.h
│ │ └── window-utils.m
│ ├── mac-syphon/
│ │ ├── CMakeLists.txt
│ │ ├── SyphonOBSClient.h
│ │ ├── SyphonOBSClient.m
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── oc-FR.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── syphon_license.txt
│ │ ├── plugin-main.c
│ │ └── syphon.m
│ ├── mac-videotoolbox/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── encoder.c
│ ├── mac-virtualcam/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ └── en-US.ini
│ │ └── src/
│ │ ├── camera-extension/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── OBSCameraDeviceSource.swift
│ │ │ ├── OBSCameraProviderSource.swift
│ │ │ ├── OBSCameraStreamSink.swift
│ │ │ ├── OBSCameraStreamSource.swift
│ │ │ ├── cmake/
│ │ │ │ └── macos/
│ │ │ │ ├── Info.plist.in
│ │ │ │ └── entitlements.plist
│ │ │ └── main.swift
│ │ ├── common/
│ │ │ └── MachProtocol.h
│ │ ├── dal-plugin/
│ │ │ ├── CMSampleBufferUtils.h
│ │ │ ├── CMSampleBufferUtils.mm
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Defines.h
│ │ │ ├── Logging.h
│ │ │ ├── OBSDALDevice.h
│ │ │ ├── OBSDALDevice.mm
│ │ │ ├── OBSDALMachClient.h
│ │ │ ├── OBSDALMachClient.mm
│ │ │ ├── OBSDALObjectStore.h
│ │ │ ├── OBSDALObjectStore.mm
│ │ │ ├── OBSDALPlugIn.h
│ │ │ ├── OBSDALPlugIn.mm
│ │ │ ├── OBSDALPlugInInterface.h
│ │ │ ├── OBSDALPlugInInterface.mm
│ │ │ ├── OBSDALPlugInMain.mm
│ │ │ ├── OBSDALStream.h
│ │ │ ├── OBSDALStream.mm
│ │ │ └── cmake/
│ │ │ └── macos/
│ │ │ └── Info.plist.in
│ │ └── obs-plugin/
│ │ ├── CMakeLists.txt
│ │ ├── Defines.h
│ │ ├── OBSDALMachServer.h
│ │ ├── OBSDALMachServer.mm
│ │ ├── cmake/
│ │ │ └── macos/
│ │ │ └── Info.plist.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── plugin-main.mm
│ ├── nv-filters/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── color.effect
│ │ │ ├── locale/
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── rtx_blur.effect
│ │ │ └── rtx_greenscreen.effect
│ │ ├── nv-filters.c
│ │ ├── nv_sdk_versions.h
│ │ ├── nvafx-load.h
│ │ ├── nvidia-audiofx-filter.c
│ │ ├── nvidia-videofx-filter.c
│ │ └── nvvfx-load.h
│ ├── obs-ffmpeg/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── dependencies.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── ffmpeg-mux/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── ffmpeg-mux.c
│ │ │ └── ffmpeg-mux.h
│ │ ├── obs-amf-test/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obs-amf-test.cpp
│ │ ├── obs-ffmpeg-audio-encoders.c
│ │ ├── obs-ffmpeg-av1.c
│ │ ├── obs-ffmpeg-compat.h
│ │ ├── obs-ffmpeg-config.h.in
│ │ ├── obs-ffmpeg-formats.h
│ │ ├── obs-ffmpeg-hls-mux.c
│ │ ├── obs-ffmpeg-logging.c
│ │ ├── obs-ffmpeg-mpegts.c
│ │ ├── obs-ffmpeg-mux.c
│ │ ├── obs-ffmpeg-mux.h
│ │ ├── obs-ffmpeg-nvenc.c
│ │ ├── obs-ffmpeg-openh264.c
│ │ ├── obs-ffmpeg-output.c
│ │ ├── obs-ffmpeg-output.h
│ │ ├── obs-ffmpeg-rist.h
│ │ ├── obs-ffmpeg-source.c
│ │ ├── obs-ffmpeg-srt.h
│ │ ├── obs-ffmpeg-url.h
│ │ ├── obs-ffmpeg-vaapi.c
│ │ ├── obs-ffmpeg-video-encoders.c
│ │ ├── obs-ffmpeg-video-encoders.h
│ │ ├── obs-ffmpeg.c
│ │ ├── texture-amf-opts.hpp
│ │ ├── texture-amf.cpp
│ │ ├── vaapi-utils.c
│ │ └── vaapi-utils.h
│ ├── obs-filters/
│ │ ├── CMakeLists.txt
│ │ ├── async-delay-filter.c
│ │ ├── chroma-key-filter.c
│ │ ├── cmake/
│ │ │ ├── rnnoise.cmake
│ │ │ ├── speexdsp.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── color-correction-filter.c
│ │ ├── color-grade-filter.c
│ │ ├── color-key-filter.c
│ │ ├── compressor-filter.c
│ │ ├── crop-filter.c
│ │ ├── data/
│ │ │ ├── LUTs/
│ │ │ │ ├── grayscale.cube
│ │ │ │ └── original.cube
│ │ │ ├── blend_add_filter.effect
│ │ │ ├── blend_mul_filter.effect
│ │ │ ├── blend_sub_filter.effect
│ │ │ ├── chroma_key_filter.effect
│ │ │ ├── chroma_key_filter_v2.effect
│ │ │ ├── color.effect
│ │ │ ├── color_correction_filter.effect
│ │ │ ├── color_grade_filter.effect
│ │ │ ├── color_key_filter.effect
│ │ │ ├── color_key_filter_v2.effect
│ │ │ ├── crop_filter.effect
│ │ │ ├── hdr_tonemap_filter.effect
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── luma_key_filter.effect
│ │ │ ├── luma_key_filter_v2.effect
│ │ │ ├── mask_alpha_filter.effect
│ │ │ ├── mask_color_filter.effect
│ │ │ └── sharpness.effect
│ │ ├── eq-filter.c
│ │ ├── expander-filter.c
│ │ ├── gain-filter.c
│ │ ├── gpu-delay.c
│ │ ├── hdr-tonemap-filter.c
│ │ ├── invert-audio-polarity.c
│ │ ├── limiter-filter.c
│ │ ├── luma-key-filter.c
│ │ ├── mask-filter.c
│ │ ├── noise-gate-filter.c
│ │ ├── noise-suppress-filter.c
│ │ ├── obs-filters-config.h.in
│ │ ├── obs-filters.c
│ │ ├── rnnoise/
│ │ │ ├── .clang-format
│ │ │ ├── AUTHORS
│ │ │ ├── COPYING
│ │ │ ├── README
│ │ │ ├── include/
│ │ │ │ └── rnnoise.h
│ │ │ └── src/
│ │ │ ├── _kiss_fft_guts.h
│ │ │ ├── arch.h
│ │ │ ├── celt_lpc.c
│ │ │ ├── celt_lpc.h
│ │ │ ├── common.h
│ │ │ ├── compile.sh
│ │ │ ├── denoise.c
│ │ │ ├── kiss_fft.c
│ │ │ ├── kiss_fft.h
│ │ │ ├── opus_types.h
│ │ │ ├── pitch.c
│ │ │ ├── pitch.h
│ │ │ ├── rnn.c
│ │ │ ├── rnn.h
│ │ │ ├── rnn_data.c
│ │ │ ├── rnn_data.h
│ │ │ ├── rnn_reader.c
│ │ │ ├── rnn_train.py
│ │ │ └── tansig_table.h
│ │ ├── scale-filter.c
│ │ ├── scroll-filter.c
│ │ └── sharpness-filter.c
│ ├── obs-libfdk/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── obs-libfdk.c
│ ├── obs-nvenc/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── cuda-helpers.c
│ │ ├── cuda-helpers.h
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── nvenc-compat.c
│ │ ├── nvenc-cuda.c
│ │ ├── nvenc-d3d11.c
│ │ ├── nvenc-helpers.c
│ │ ├── nvenc-helpers.h
│ │ ├── nvenc-internal.h
│ │ ├── nvenc-opengl.c
│ │ ├── nvenc-opts-parser.c
│ │ ├── nvenc-properties.c
│ │ ├── nvenc.c
│ │ ├── obs-nvenc-test/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obs-nvenc-test.cpp
│ │ ├── obs-nvenc.c
│ │ └── obs-nvenc.h
│ ├── obs-outputs/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── flv-mux.c
│ │ ├── flv-mux.h
│ │ ├── flv-output.c
│ │ ├── librtmp/
│ │ │ ├── .clang-format
│ │ │ ├── COPYING
│ │ │ ├── amf.c
│ │ │ ├── amf.h
│ │ │ ├── bytes.h
│ │ │ ├── cencode.c
│ │ │ ├── cencode.h
│ │ │ ├── handshake.h
│ │ │ ├── hashswf.c
│ │ │ ├── http.h
│ │ │ ├── log.c
│ │ │ ├── log.h
│ │ │ ├── md5.c
│ │ │ ├── md5.h
│ │ │ ├── parseurl.c
│ │ │ ├── rtmp.c
│ │ │ ├── rtmp.h
│ │ │ └── rtmp_sys.h
│ │ ├── mp4-mux-internal.h
│ │ ├── mp4-mux.c
│ │ ├── mp4-mux.h
│ │ ├── mp4-output.c
│ │ ├── net-if.c
│ │ ├── net-if.h
│ │ ├── null-output.c
│ │ ├── obs-output-ver.h
│ │ ├── obs-outputs.c
│ │ ├── rtmp-av1.c
│ │ ├── rtmp-av1.h
│ │ ├── rtmp-helpers.h
│ │ ├── rtmp-hevc.c
│ │ ├── rtmp-hevc.h
│ │ ├── rtmp-stream.c
│ │ ├── rtmp-stream.h
│ │ ├── rtmp-windows.c
│ │ └── utils.h
│ ├── obs-qsv11/
│ │ ├── CMakeLists.txt
│ │ ├── QSV11-License-Clarification-Email.txt
│ │ ├── QSV_Encoder.cpp
│ │ ├── QSV_Encoder.h
│ │ ├── QSV_Encoder_Internal.cpp
│ │ ├── QSV_Encoder_Internal.h
│ │ ├── bits/
│ │ │ ├── .clang-format
│ │ │ ├── linux_defs.h
│ │ │ └── windows_defs.h
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── common_directx11.cpp
│ │ ├── common_directx11.h
│ │ ├── common_utils.cpp
│ │ ├── common_utils.h
│ │ ├── common_utils_linux.cpp
│ │ ├── common_utils_windows.cpp
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── is-IS.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── obs-qsv-test/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obs-qsv-test.cpp
│ │ ├── obs-qsv11-LICENSE.txt
│ │ ├── obs-qsv11-plugin-main.c
│ │ └── obs-qsv11.c
│ ├── obs-text/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ └── gdiplus/
│ │ └── obs-text.cpp
│ ├── obs-transitions/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── fade_to_color_transition.effect
│ │ │ ├── fade_transition.effect
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── luma_wipe_transition.effect
│ │ │ ├── luma_wipes/
│ │ │ │ └── wipes.json
│ │ │ ├── slide_transition.effect
│ │ │ ├── stinger_matte_transition.effect
│ │ │ └── swipe_transition.effect
│ │ ├── easings.h
│ │ ├── obs-transitions.c
│ │ ├── transition-cut.c
│ │ ├── transition-fade-to-color.c
│ │ ├── transition-fade.c
│ │ ├── transition-luma-wipe.c
│ │ ├── transition-slide.c
│ │ ├── transition-stinger.c
│ │ └── transition-swipe.c
│ ├── obs-vst/
│ │ ├── CMakeLists.txt
│ │ ├── EditorWidget.cpp
│ │ ├── VSTPlugin.cpp
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── headers/
│ │ │ ├── EditorWidget.h
│ │ │ ├── VSTPlugin.h
│ │ │ └── vst-plugin-callbacks.hpp
│ │ ├── linux/
│ │ │ ├── EditorWidget-linux.cpp
│ │ │ └── VSTPlugin-linux.cpp
│ │ ├── mac/
│ │ │ ├── EditorWidget-osx.mm
│ │ │ └── VSTPlugin-osx.mm
│ │ ├── obs-vst.cpp
│ │ ├── vst_header/
│ │ │ ├── .clang-format
│ │ │ └── aeffectx.h
│ │ └── win/
│ │ ├── EditorWidget-win.cpp
│ │ └── VSTPlugin-win.cpp
│ ├── obs-webrtc/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── obs-webrtc.cpp
│ │ ├── whip-output.cpp
│ │ ├── whip-output.h
│ │ ├── whip-service.cpp
│ │ ├── whip-service.h
│ │ └── whip-utils.h
│ ├── obs-x264/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── windows/
│ │ │ │ └── obs-module.rc.in
│ │ │ └── x264-test.cmake
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lv-LV.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── oc-FR.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── obs-x264-plugin-main.c
│ │ ├── obs-x264-test.c
│ │ └── obs-x264.c
│ ├── oss-audio/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── ur-PK.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── oss-audio.c
│ │ ├── oss-input.c
│ │ └── oss-platform.h.in
│ ├── rtmp-services/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── ur-PK.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── package.json
│ │ │ ├── schema/
│ │ │ │ ├── package-schema.json
│ │ │ │ └── service-schema-v5.json
│ │ │ └── services.json
│ │ ├── lookup-config.h.in
│ │ ├── rtmp-common.c
│ │ ├── rtmp-custom.c
│ │ ├── rtmp-format-ver.h
│ │ ├── rtmp-services-main.c
│ │ └── service-specific/
│ │ ├── amazon-ivs.c
│ │ ├── amazon-ivs.h
│ │ ├── dacast.c
│ │ ├── dacast.h
│ │ ├── nimotv.c
│ │ ├── nimotv.h
│ │ ├── service-ingest.c
│ │ ├── service-ingest.h
│ │ ├── showroom.c
│ │ ├── showroom.h
│ │ ├── twitch.c
│ │ └── twitch.h
│ ├── sndio/
│ │ ├── CMakeLists.txt
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── sndio-input.c
│ │ ├── sndio-input.h
│ │ └── sndio.c
│ ├── text-freetype2/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── eo-UY.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── szl-PL.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ └── text_default.effect
│ │ ├── find-font-cocoa.m
│ │ ├── find-font-iconv.c
│ │ ├── find-font-unix.c
│ │ ├── find-font-windows.c
│ │ ├── find-font.c
│ │ ├── find-font.h
│ │ ├── obs-convenience.c
│ │ ├── obs-convenience.h
│ │ ├── text-freetype2.c
│ │ ├── text-freetype2.h
│ │ └── text-functionality.c
│ ├── vlc-video/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── lt-LT.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── vlc-video-plugin.c
│ │ ├── vlc-video-plugin.h
│ │ └── vlc-video-source.c
│ ├── win-capture/
│ │ ├── CMakeLists.txt
│ │ ├── app-helpers.c
│ │ ├── app-helpers.h
│ │ ├── audio-helpers.c
│ │ ├── audio-helpers.h
│ │ ├── compat-config.h.in
│ │ ├── compat-format-ver.h
│ │ ├── compat-helpers.c
│ │ ├── compat-helpers.h
│ │ ├── cursor-capture.c
│ │ ├── cursor-capture.h
│ │ ├── data/
│ │ │ ├── compatibility.json
│ │ │ ├── locale/
│ │ │ │ ├── af-ZA.ini
│ │ │ │ ├── ar-SA.ini
│ │ │ │ ├── az-AZ.ini
│ │ │ │ ├── ba-RU.ini
│ │ │ │ ├── be-BY.ini
│ │ │ │ ├── bg-BG.ini
│ │ │ │ ├── bn-BD.ini
│ │ │ │ ├── ca-ES.ini
│ │ │ │ ├── cs-CZ.ini
│ │ │ │ ├── da-DK.ini
│ │ │ │ ├── de-DE.ini
│ │ │ │ ├── el-GR.ini
│ │ │ │ ├── en-GB.ini
│ │ │ │ ├── en-US.ini
│ │ │ │ ├── es-ES.ini
│ │ │ │ ├── et-EE.ini
│ │ │ │ ├── eu-ES.ini
│ │ │ │ ├── fa-IR.ini
│ │ │ │ ├── fi-FI.ini
│ │ │ │ ├── fil-PH.ini
│ │ │ │ ├── fr-FR.ini
│ │ │ │ ├── gd-GB.ini
│ │ │ │ ├── gl-ES.ini
│ │ │ │ ├── he-IL.ini
│ │ │ │ ├── hi-IN.ini
│ │ │ │ ├── hr-HR.ini
│ │ │ │ ├── hu-HU.ini
│ │ │ │ ├── hy-AM.ini
│ │ │ │ ├── id-ID.ini
│ │ │ │ ├── is-IS.ini
│ │ │ │ ├── it-IT.ini
│ │ │ │ ├── ja-JP.ini
│ │ │ │ ├── ka-GE.ini
│ │ │ │ ├── kaa.ini
│ │ │ │ ├── kab-KAB.ini
│ │ │ │ ├── kmr-TR.ini
│ │ │ │ ├── ko-KR.ini
│ │ │ │ ├── lo-LA.ini
│ │ │ │ ├── lt-LT.ini
│ │ │ │ ├── mn-MN.ini
│ │ │ │ ├── ms-MY.ini
│ │ │ │ ├── nb-NO.ini
│ │ │ │ ├── nl-NL.ini
│ │ │ │ ├── nn-NO.ini
│ │ │ │ ├── pl-PL.ini
│ │ │ │ ├── pt-BR.ini
│ │ │ │ ├── pt-PT.ini
│ │ │ │ ├── ro-RO.ini
│ │ │ │ ├── ru-RU.ini
│ │ │ │ ├── si-LK.ini
│ │ │ │ ├── sk-SK.ini
│ │ │ │ ├── sl-SI.ini
│ │ │ │ ├── sq-AL.ini
│ │ │ │ ├── sr-CS.ini
│ │ │ │ ├── sr-SP.ini
│ │ │ │ ├── sv-SE.ini
│ │ │ │ ├── ta-IN.ini
│ │ │ │ ├── th-TH.ini
│ │ │ │ ├── tl-PH.ini
│ │ │ │ ├── tr-TR.ini
│ │ │ │ ├── tt-RU.ini
│ │ │ │ ├── ug-CN.ini
│ │ │ │ ├── uk-UA.ini
│ │ │ │ ├── vi-VN.ini
│ │ │ │ ├── zh-CN.ini
│ │ │ │ └── zh-TW.ini
│ │ │ ├── package.json
│ │ │ └── schema/
│ │ │ ├── compatibility-schema-v1.json
│ │ │ └── package-schema.json
│ │ ├── dc-capture.c
│ │ ├── dc-capture.h
│ │ ├── duplicator-monitor-capture.c
│ │ ├── game-capture-file-init.c
│ │ ├── game-capture.c
│ │ ├── get-graphics-offsets/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── d3d8-offsets.cpp
│ │ │ ├── d3d9-offsets.cpp
│ │ │ ├── ddraw-offsets.cpp
│ │ │ ├── dxgi-offsets.cpp
│ │ │ ├── get-graphics-offsets.c
│ │ │ └── get-graphics-offsets.h
│ │ ├── graphics-hook/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── d3d10-capture.cpp
│ │ │ ├── d3d11-capture.cpp
│ │ │ ├── d3d12-capture.cpp
│ │ │ ├── d3d8-capture.cpp
│ │ │ ├── d3d9-capture.cpp
│ │ │ ├── d3d9-patches.hpp
│ │ │ ├── dxgi-capture.cpp
│ │ │ ├── dxgi-helpers.hpp
│ │ │ ├── gl-capture.c
│ │ │ ├── gl-decs.h
│ │ │ ├── graphics-hook-config.h.in
│ │ │ ├── graphics-hook.c
│ │ │ ├── graphics-hook.h
│ │ │ ├── graphics-hook.rc
│ │ │ ├── obs-vulkan32.json
│ │ │ ├── obs-vulkan64.json
│ │ │ ├── vulkan-capture.c
│ │ │ └── vulkan-capture.h
│ │ ├── inject-helper/
│ │ │ ├── CMakeLists.txt
│ │ │ └── inject-helper.c
│ │ ├── load-graphics-offsets.c
│ │ ├── monitor-capture.c
│ │ ├── nt-stuff.c
│ │ ├── nt-stuff.h
│ │ ├── plugin-main.c
│ │ └── window-capture.c
│ ├── win-dshow/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── libdshowcapture.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── data/
│ │ │ └── locale/
│ │ │ ├── af-ZA.ini
│ │ │ ├── an-ES.ini
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── be-BY.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── hy-AM.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kaa.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── si-LK.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sq-AL.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── szl-PL.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── th-TH.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── tt-RU.ini
│ │ │ ├── ug-CN.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ │ ├── dshow-plugin.cpp
│ │ ├── encode-dstr.hpp
│ │ ├── ffmpeg-decode.c
│ │ ├── ffmpeg-decode.h
│ │ ├── shared-memory-queue.c
│ │ ├── shared-memory-queue.h
│ │ ├── tiny-nv12-scale.c
│ │ ├── tiny-nv12-scale.h
│ │ ├── virtualcam-module/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── cmake/
│ │ │ │ └── windows/
│ │ │ │ ├── obs-module.rc.in
│ │ │ │ ├── virtualcam-module-arm64.def
│ │ │ │ ├── virtualcam-module32.def
│ │ │ │ └── virtualcam-module64.def
│ │ │ ├── placeholder.cpp
│ │ │ ├── sleepto.c
│ │ │ ├── sleepto.h
│ │ │ ├── virtualcam-filter.cpp
│ │ │ ├── virtualcam-filter.hpp
│ │ │ ├── virtualcam-guid.h.in
│ │ │ ├── virtualcam-install.bat.in
│ │ │ ├── virtualcam-module.cpp
│ │ │ ├── virtualcam-module.def.in
│ │ │ └── virtualcam-uninstall.bat.in
│ │ ├── virtualcam.c
│ │ ├── win-dshow-encoder.cpp
│ │ └── win-dshow.cpp
│ └── win-wasapi/
│ ├── CMakeLists.txt
│ ├── cmake/
│ │ └── windows/
│ │ └── obs-module.rc.in
│ ├── data/
│ │ └── locale/
│ │ ├── af-ZA.ini
│ │ ├── an-ES.ini
│ │ ├── ar-SA.ini
│ │ ├── az-AZ.ini
│ │ ├── ba-RU.ini
│ │ ├── be-BY.ini
│ │ ├── bg-BG.ini
│ │ ├── bn-BD.ini
│ │ ├── ca-ES.ini
│ │ ├── cs-CZ.ini
│ │ ├── da-DK.ini
│ │ ├── de-DE.ini
│ │ ├── el-GR.ini
│ │ ├── en-GB.ini
│ │ ├── en-US.ini
│ │ ├── es-ES.ini
│ │ ├── et-EE.ini
│ │ ├── eu-ES.ini
│ │ ├── fa-IR.ini
│ │ ├── fi-FI.ini
│ │ ├── fil-PH.ini
│ │ ├── fr-FR.ini
│ │ ├── gd-GB.ini
│ │ ├── gl-ES.ini
│ │ ├── he-IL.ini
│ │ ├── hi-IN.ini
│ │ ├── hr-HR.ini
│ │ ├── hu-HU.ini
│ │ ├── hy-AM.ini
│ │ ├── id-ID.ini
│ │ ├── is-IS.ini
│ │ ├── it-IT.ini
│ │ ├── ja-JP.ini
│ │ ├── ka-GE.ini
│ │ ├── kaa.ini
│ │ ├── kab-KAB.ini
│ │ ├── kmr-TR.ini
│ │ ├── ko-KR.ini
│ │ ├── lo-LA.ini
│ │ ├── lt-LT.ini
│ │ ├── mn-MN.ini
│ │ ├── ms-MY.ini
│ │ ├── nb-NO.ini
│ │ ├── nl-NL.ini
│ │ ├── nn-NO.ini
│ │ ├── pl-PL.ini
│ │ ├── pt-BR.ini
│ │ ├── pt-PT.ini
│ │ ├── ro-RO.ini
│ │ ├── ru-RU.ini
│ │ ├── si-LK.ini
│ │ ├── sk-SK.ini
│ │ ├── sl-SI.ini
│ │ ├── sq-AL.ini
│ │ ├── sr-CS.ini
│ │ ├── sr-SP.ini
│ │ ├── sv-SE.ini
│ │ ├── szl-PL.ini
│ │ ├── ta-IN.ini
│ │ ├── th-TH.ini
│ │ ├── tl-PH.ini
│ │ ├── tr-TR.ini
│ │ ├── tt-RU.ini
│ │ ├── ug-CN.ini
│ │ ├── uk-UA.ini
│ │ ├── ur-PK.ini
│ │ ├── vi-VN.ini
│ │ ├── zh-CN.ini
│ │ └── zh-TW.ini
│ ├── enum-wasapi.cpp
│ ├── enum-wasapi.hpp
│ ├── plugin-main.cpp
│ ├── wasapi-notify.cpp
│ ├── wasapi-notify.hpp
│ └── win-wasapi.cpp
├── shared/
│ ├── bpm/
│ │ ├── CMakeLists.txt
│ │ ├── bpm-internal.h
│ │ ├── bpm.c
│ │ └── bpm.h
│ ├── file-updater/
│ │ ├── CMakeLists.txt
│ │ └── file-updater/
│ │ ├── file-updater.c
│ │ └── file-updater.h
│ ├── happy-eyeballs/
│ │ ├── CMakeLists.txt
│ │ ├── happy-eyeballs.c
│ │ └── happy-eyeballs.h
│ ├── ipc-util/
│ │ ├── CMakeLists.txt
│ │ └── ipc-util/
│ │ ├── pipe-posix.c
│ │ ├── pipe-posix.h
│ │ ├── pipe-windows.c
│ │ ├── pipe-windows.h
│ │ └── pipe.h
│ ├── media-playback/
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE.media-playback
│ │ └── media-playback/
│ │ ├── cache.c
│ │ ├── cache.h
│ │ ├── closest-format.h
│ │ ├── decode.c
│ │ ├── decode.h
│ │ ├── media-playback.c
│ │ ├── media-playback.h
│ │ ├── media.c
│ │ └── media.h
│ ├── obs-d3d8-api/
│ │ ├── .clang-format
│ │ ├── CMakeLists.txt
│ │ ├── d3d8.h
│ │ ├── d3d8caps.h
│ │ └── d3d8types.h
│ ├── obs-hook-config/
│ │ ├── CMakeLists.txt
│ │ ├── graphics-hook-info.h
│ │ ├── graphics-hook-ver.h
│ │ └── hook-helpers.h
│ ├── obs-inject-library/
│ │ ├── CMakeLists.txt
│ │ ├── inject-library.c
│ │ └── inject-library.h
│ ├── obs-scripting/
│ │ ├── CMakeLists.txt
│ │ ├── cmake/
│ │ │ ├── cstrcache.cmake
│ │ │ ├── lua.cmake
│ │ │ ├── python.cmake
│ │ │ └── windows/
│ │ │ └── obs-module.rc.in
│ │ ├── cstrcache.cpp
│ │ ├── cstrcache.h
│ │ ├── obs-scripting-callback.h
│ │ ├── obs-scripting-config.h.in
│ │ ├── obs-scripting-internal.h
│ │ ├── obs-scripting-logging.c
│ │ ├── obs-scripting-lua-frontend.c
│ │ ├── obs-scripting-lua-source.c
│ │ ├── obs-scripting-lua.c
│ │ ├── obs-scripting-lua.h
│ │ ├── obs-scripting-python-frontend.c
│ │ ├── obs-scripting-python-import.c
│ │ ├── obs-scripting-python-import.h
│ │ ├── obs-scripting-python.c
│ │ ├── obs-scripting-python.h
│ │ ├── obs-scripting.c
│ │ ├── obs-scripting.h
│ │ ├── obslua/
│ │ │ ├── CMakeLists.txt
│ │ │ └── obslua.i
│ │ └── obspython/
│ │ ├── CMakeLists.txt
│ │ └── obspython.i
│ ├── obs-shared-memory-queue/
│ │ ├── CMakeLists.txt
│ │ ├── shared-memory-queue.c
│ │ └── shared-memory-queue.h
│ ├── obs-tiny-nv12-scale/
│ │ ├── CMakeLists.txt
│ │ ├── tiny-nv12-scale.c
│ │ └── tiny-nv12-scale.h
│ ├── opts-parser/
│ │ ├── CMakeLists.txt
│ │ ├── opts-parser.c
│ │ └── opts-parser.h
│ ├── properties-view/
│ │ ├── CMakeLists.txt
│ │ ├── double-slider.cpp
│ │ ├── double-slider.hpp
│ │ ├── properties-view.cpp
│ │ ├── properties-view.hpp
│ │ ├── properties-view.moc.hpp
│ │ ├── spinbox-ignorewheel.cpp
│ │ └── spinbox-ignorewheel.hpp
│ └── qt/
│ ├── icon-label/
│ │ ├── CMakeLists.txt
│ │ ├── IconLabel.cpp
│ │ └── IconLabel.hpp
│ ├── idian/
│ │ ├── CMakeLists.txt
│ │ ├── components/
│ │ │ ├── CheckBox.cpp
│ │ │ ├── ComboBox.cpp
│ │ │ ├── DoubleSpinBox.cpp
│ │ │ ├── SpinBox.cpp
│ │ │ └── ToggleSwitch.cpp
│ │ ├── include/
│ │ │ └── Idian/
│ │ │ ├── CheckBox.hpp
│ │ │ ├── ComboBox.hpp
│ │ │ ├── DoubleSpinBox.hpp
│ │ │ ├── Group.hpp
│ │ │ ├── Idian.hpp
│ │ │ ├── PropertiesList.hpp
│ │ │ ├── Row.hpp
│ │ │ ├── SpinBox.hpp
│ │ │ ├── StateEventFilter.cpp
│ │ │ ├── StateEventFilter.hpp
│ │ │ ├── ToggleSwitch.hpp
│ │ │ ├── Utils.cpp
│ │ │ └── Utils.hpp
│ │ └── widgets/
│ │ ├── Group.cpp
│ │ ├── PropertiesList.cpp
│ │ └── Row.cpp
│ ├── plain-text-edit/
│ │ ├── CMakeLists.txt
│ │ ├── plain-text-edit.cpp
│ │ └── plain-text-edit.hpp
│ ├── slider-ignorewheel/
│ │ ├── CMakeLists.txt
│ │ ├── slider-ignorewheel.cpp
│ │ └── slider-ignorewheel.hpp
│ ├── vertical-scroll-area/
│ │ ├── CMakeLists.txt
│ │ ├── vertical-scroll-area.cpp
│ │ └── vertical-scroll-area.hpp
│ └── wrappers/
│ ├── CMakeLists.txt
│ ├── qt-wrappers.cpp
│ └── qt-wrappers.hpp
└── test/
├── CMakeLists.txt
├── cmocka/
│ ├── CMakeLists.txt
│ ├── test_bitstream.c
│ ├── test_darray.c
│ ├── test_os_path.c
│ └── test_serializer.c
├── osx/
│ ├── CMakeLists.txt
│ └── test.mm
├── test-input/
│ ├── CMakeLists.txt
│ ├── data/
│ │ ├── draw.effect
│ │ └── test.effect
│ ├── sync-async-source.c
│ ├── sync-audio-buffering.c
│ ├── sync-pair-aud.c
│ ├── sync-pair-vid.c
│ ├── test-filter.c
│ ├── test-input.c
│ ├── test-random.c
│ └── test-sinewave.c
└── win/
├── CMakeLists.txt
└── test.cpp
Showing preview only (678K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7378 symbols across 766 files)
FILE: .github/scripts/utils.py/check-jsonschema.py
function discover_schema_file (line 13) | def discover_schema_file(filename: str) -> tuple[str | None, Any]:
function validate_json_files (line 33) | def validate_json_files(
function main (line 72) | def main() -> int:
FILE: .github/scripts/utils.py/check-services.py
function get_last_artifact (line 60) | def get_last_artifact():
function find_people_to_blame (line 108) | def find_people_to_blame(raw_services: str, servers: list[tuple[str, str...
function set_output (line 143) | def set_output(name, value):
function check_servers_task (line 154) | async def check_servers_task(
function process_services (line 165) | async def process_services(session: aiohttp.ClientSession, check_servers...
function main (line 347) | async def main():
FILE: build-aux/format-manifest.py
function main (line 10) | def main() -> int:
FILE: deps/blake2/src/blake2-impl.h
function BLAKE2_INLINE (line 33) | static BLAKE2_INLINE uint32_t load32( const void *src )
function BLAKE2_INLINE (line 48) | static BLAKE2_INLINE uint64_t load64( const void *src )
function BLAKE2_INLINE (line 67) | static BLAKE2_INLINE uint16_t load16( const void *src )
function BLAKE2_INLINE (line 80) | static BLAKE2_INLINE void store16( void *dst, uint16_t w )
function BLAKE2_INLINE (line 91) | static BLAKE2_INLINE void store32( void *dst, uint32_t w )
function BLAKE2_INLINE (line 104) | static BLAKE2_INLINE void store64( void *dst, uint64_t w )
function BLAKE2_INLINE (line 121) | static BLAKE2_INLINE uint64_t load48( const void *src )
function BLAKE2_INLINE (line 132) | static BLAKE2_INLINE void store48( void *dst, uint64_t w )
function BLAKE2_INLINE (line 143) | static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c )
function BLAKE2_INLINE (line 148) | static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c )
function BLAKE2_INLINE (line 154) | static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n)
FILE: deps/blake2/src/blake2.h
type blake2s_constant (line 31) | enum blake2s_constant
type blake2b_constant (line 40) | enum blake2b_constant
type blake2s_state (line 49) | typedef struct blake2s_state__
type blake2b_state (line 60) | typedef struct blake2b_state__
type blake2sp_state (line 71) | typedef struct blake2sp_state__
type blake2bp_state (line 80) | typedef struct blake2bp_state__
type blake2s_param__ (line 90) | struct blake2s_param__
type blake2s_param (line 106) | typedef struct blake2s_param__ blake2s_param;
type blake2b_param__ (line 108) | struct blake2b_param__
type blake2b_param (line 124) | typedef struct blake2b_param__ blake2b_param;
type blake2xs_state (line 126) | typedef struct blake2xs_state__
type blake2xb_state (line 132) | typedef struct blake2xb_state__
FILE: deps/blake2/src/blake2b-ref.c
function blake2b_set_lastnode (line 48) | static void blake2b_set_lastnode( blake2b_state *S )
function blake2b_is_lastblock (line 54) | static int blake2b_is_lastblock( const blake2b_state *S )
function blake2b_set_lastblock (line 59) | static void blake2b_set_lastblock( blake2b_state *S )
function blake2b_increment_counter (line 66) | static void blake2b_increment_counter( blake2b_state *S, const uint64_t ...
function blake2b_init0 (line 72) | static void blake2b_init0( blake2b_state *S )
function blake2b_init_param (line 81) | int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
function blake2b_init (line 98) | int blake2b_init( blake2b_state *S, size_t outlen )
function blake2b_init_key (line 120) | int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, ...
function blake2b_compress (line 177) | static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAK...
function blake2b_update (line 221) | int blake2b_update( blake2b_state *S, const void *pin, size_t inlen )
function blake2b_final (line 248) | int blake2b_final( blake2b_state *S, void *out, size_t outlen )
function blake2b (line 273) | int blake2b( void *out, size_t outlen, const void *in, size_t inlen, con...
function blake2 (line 302) | int blake2( void *out, size_t outlen, const void *in, size_t inlen, cons...
function crypto_hash (line 307) | int crypto_hash( unsigned char *out, unsigned char *in, unsigned long lo...
function main (line 316) | int main( void )
FILE: deps/glad/include/EGL/eglplatform.h
type HDC (line 63) | typedef HDC EGLNativeDisplayType;
type HBITMAP (line 64) | typedef HBITMAP EGLNativePixmapType;
type HWND (line 65) | typedef HWND EGLNativeWindowType;
type khronos_uintptr_t (line 69) | typedef khronos_uintptr_t EGLNativeDisplayType;
type _screen_pixmap (line 70) | struct _screen_pixmap
type _screen_window (line 71) | struct _screen_window
type EGLNativeDisplayType (line 75) | typedef int EGLNativeDisplayType;
type EGLNativePixmapType (line 76) | typedef int EGLNativePixmapType;
type EGLNativeWindowType (line 77) | typedef int EGLNativeWindowType;
type EGLNativeDisplayType (line 81) | typedef int EGLNativeDisplayType;
type wl_display (line 87) | struct wl_display
type wl_egl_pixmap (line 88) | struct wl_egl_pixmap
type wl_egl_window (line 89) | struct wl_egl_window
type gbm_device (line 93) | struct gbm_device
type gbm_bo (line 94) | struct gbm_bo
type ANativeWindow (line 99) | struct ANativeWindow
type egl_native_pixmap_t (line 100) | struct egl_native_pixmap_t
type egl_native_pixmap_t (line 103) | struct egl_native_pixmap_t
type ANativeWindow (line 104) | struct ANativeWindow
type EGLNativeDisplayType (line 108) | typedef intptr_t EGLNativeDisplayType;
type EGLNativePixmapType (line 109) | typedef intptr_t EGLNativePixmapType;
type EGLNativeWindowType (line 110) | typedef intptr_t EGLNativeWindowType;
type Display (line 118) | typedef Display *EGLNativeDisplayType;
type Pixmap (line 119) | typedef Pixmap EGLNativePixmapType;
type Window (line 120) | typedef Window EGLNativeWindowType;
type khronos_uintptr_t (line 125) | typedef khronos_uintptr_t EGLNativePixmapType;
type khronos_uintptr_t (line 126) | typedef khronos_uintptr_t EGLNativeWindowType;
type EGLNativeDisplayType (line 130) | typedef int EGLNativeDisplayType;
type khronos_uintptr_t (line 139) | typedef khronos_uintptr_t EGLNativePixmapType;
type khronos_uintptr_t (line 140) | typedef khronos_uintptr_t EGLNativeWindowType;
type khronos_uintptr_t (line 145) | typedef khronos_uintptr_t EGLNativePixmapType;
type khronos_uintptr_t (line 146) | typedef khronos_uintptr_t EGLNativeWindowType;
type EGLNativeDisplayType (line 153) | typedef EGLNativeDisplayType NativeDisplayType;
type EGLNativePixmapType (line 154) | typedef EGLNativePixmapType NativePixmapType;
type EGLNativeWindowType (line 155) | typedef EGLNativeWindowType NativeWindowType;
type khronos_int32_t (line 165) | typedef khronos_int32_t EGLint;
FILE: deps/glad/include/KHR/khrplatform.h
type khronos_int32_t (line 150) | typedef int32_t khronos_int32_t;
type khronos_uint32_t (line 151) | typedef uint32_t khronos_uint32_t;
type khronos_int64_t (line 152) | typedef int64_t khronos_int64_t;
type khronos_uint64_t (line 153) | typedef uint64_t khronos_uint64_t;
type khronos_int32_t (line 177) | typedef int32_t khronos_int32_t;
type khronos_uint32_t (line 178) | typedef uint32_t khronos_uint32_t;
type khronos_int64_t (line 179) | typedef int64_t khronos_int64_t;
type khronos_uint64_t (line 180) | typedef uint64_t khronos_uint64_t;
type __int32 (line 189) | typedef __int32 khronos_int32_t;
type khronos_uint32_t (line 190) | typedef unsigned __int32 khronos_uint32_t;
type __int64 (line 191) | typedef __int64 khronos_int64_t;
type khronos_uint64_t (line 192) | typedef unsigned __int64 khronos_uint64_t;
type khronos_int32_t (line 201) | typedef int khronos_int32_t;
type khronos_uint32_t (line 202) | typedef unsigned int khronos_uint32_t;
type khronos_int64_t (line 204) | typedef long int khronos_int64_t;
type khronos_uint64_t (line 205) | typedef unsigned long int khronos_uint64_t;
type khronos_int64_t (line 207) | typedef long long int khronos_int64_t;
type khronos_uint64_t (line 208) | typedef unsigned long long int khronos_uint64_t;
type khronos_int32_t (line 218) | typedef int khronos_int32_t;
type khronos_uint32_t (line 219) | typedef unsigned int khronos_uint32_t;
type khronos_int32_t (line 229) | typedef int32_t khronos_int32_t;
type khronos_uint32_t (line 230) | typedef uint32_t khronos_uint32_t;
type khronos_int64_t (line 231) | typedef int64_t khronos_int64_t;
type khronos_uint64_t (line 232) | typedef uint64_t khronos_uint64_t;
type khronos_int8_t (line 242) | typedef signed char khronos_int8_t;
type khronos_uint8_t (line 243) | typedef unsigned char khronos_uint8_t;
type khronos_int16_t (line 244) | typedef signed short int khronos_int16_t;
type khronos_uint16_t (line 245) | typedef unsigned short int khronos_uint16_t;
type khronos_intptr_t (line 253) | typedef intptr_t khronos_intptr_t;
type khronos_uintptr_t (line 254) | typedef uintptr_t khronos_uintptr_t;
type khronos_intptr_t (line 256) | typedef signed long long int khronos_intptr_t;
type khronos_uintptr_t (line 257) | typedef unsigned long long int khronos_uintptr_t;
type khronos_intptr_t (line 259) | typedef signed long int khronos_intptr_t;
type khronos_uintptr_t (line 260) | typedef unsigned long int khronos_uintptr_t;
type khronos_ssize_t (line 264) | typedef signed long long int khronos_ssize_t;
type khronos_usize_t (line 265) | typedef unsigned long long int khronos_usize_t;
type khronos_ssize_t (line 267) | typedef signed long int khronos_ssize_t;
type khronos_usize_t (line 268) | typedef unsigned long int khronos_usize_t;
type khronos_float_t (line 275) | typedef float khronos_float_t;
type khronos_uint64_t (line 288) | typedef khronos_uint64_t khronos_utime_nanoseconds_t;
type khronos_int64_t (line 289) | typedef khronos_int64_t khronos_stime_nanoseconds_t;
type khronos_boolean_enum_t (line 305) | typedef enum {
FILE: deps/glad/include/glad/glad.h
type gladGLversionStruct (line 25) | struct gladGLversionStruct {
type __int32 (line 97) | typedef __int32 int32_t;
type __int64 (line 98) | typedef __int64 int64_t;
type GLenum (line 105) | typedef unsigned int GLenum;
type GLboolean (line 106) | typedef unsigned char GLboolean;
type GLbitfield (line 107) | typedef unsigned int GLbitfield;
type GLvoid (line 108) | typedef void GLvoid;
type GLbyte (line 109) | typedef signed char GLbyte;
type GLshort (line 110) | typedef short GLshort;
type GLint (line 111) | typedef int GLint;
type GLclampx (line 112) | typedef int GLclampx;
type GLubyte (line 113) | typedef unsigned char GLubyte;
type GLushort (line 114) | typedef unsigned short GLushort;
type GLuint (line 115) | typedef unsigned int GLuint;
type GLsizei (line 116) | typedef int GLsizei;
type GLfloat (line 117) | typedef float GLfloat;
type GLclampf (line 118) | typedef float GLclampf;
type GLdouble (line 119) | typedef double GLdouble;
type GLclampd (line 120) | typedef double GLclampd;
type GLchar (line 122) | typedef char GLchar;
type GLcharARB (line 123) | typedef char GLcharARB;
type GLhandleARB (line 127) | typedef unsigned int GLhandleARB;
type GLhalfARB (line 129) | typedef unsigned short GLhalfARB;
type GLhalf (line 130) | typedef unsigned short GLhalf;
type GLint (line 131) | typedef GLint GLfixed;
type GLintptr (line 132) | typedef ptrdiff_t GLintptr;
type GLsizeiptr (line 133) | typedef ptrdiff_t GLsizeiptr;
type GLint64 (line 134) | typedef int64_t GLint64;
type GLuint64 (line 135) | typedef uint64_t GLuint64;
type GLintptrARB (line 136) | typedef ptrdiff_t GLintptrARB;
type GLsizeiptrARB (line 137) | typedef ptrdiff_t GLsizeiptrARB;
type GLint64EXT (line 138) | typedef int64_t GLint64EXT;
type GLuint64EXT (line 139) | typedef uint64_t GLuint64EXT;
type __GLsync (line 140) | struct __GLsync
type _cl_context (line 141) | struct _cl_context
type _cl_event (line 142) | struct _cl_event
type GLhalfNV (line 147) | typedef unsigned short GLhalfNV;
type GLintptr (line 148) | typedef GLintptr GLvdpauSurfaceNV;
type GLubyte (line 1564) | typedef const GLubyte* (APIENTRYP PFNGLGETSTRINGPROC)(GLenum);
type GLchar (line 1831) | typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint, const GLcha...
type GLchar (line 1849) | typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint, const GLch...
type GLchar (line 2202) | typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint, const GLc...
type GLubyte (line 2253) | typedef const GLubyte* (APIENTRYP PFNGLGETSTRINGIPROC)(GLenum, GLuint);
type GLchar (line 2362) | typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint, const G...
type GLbitfield (line 2402) | typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync, GLbitfield, G...
type GLchar (line 2442) | typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC)(GLuint, const GLchar*);
type GLenum (line 2692) | typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint, ...
type GLenum (line 2695) | typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC)(GLuint, GLenum, c...
type GLsizei (line 2789) | typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC)(GLenum, GLsizei...
type GLenum (line 3118) | typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint, GLen...
type GLenum (line 3127) | typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint, GL...
type GLenum (line 3130) | typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuin...
type GLsizei (line 3175) | typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC)(GLuint, GLsizei, ...
type GLchar (line 6735) | typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC)(GLenum, const...
type GLsizei (line 6744) | typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC)(GLenum, GLsi...
type GLcharARB (line 6998) | typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB, co...
type GLchar (line 7387) | typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC)(GLuint, const GL...
type _cl_event (line 7508) | struct _cl_event
type GLuint (line 7579) | typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei, c...
type GLint (line 8137) | typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC)(GLuint, GLint, GL...
type GLsizei (line 8180) | typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC)(GLuint, GLsize...
type GLcharARB (line 8375) | typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB, con...
type GLuint (line 9454) | typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei, co...
type GLenum (line 9700) | typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC)(GLenum, GLenum, GLenum...
type GLenum (line 9748) | typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC)(GLenum, GLenu...
type GLint (line 10900) | typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC)(GLuint, GLint, G...
type GLuint (line 11137) | typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC)(GLuint, GLuint*, GLui...
type GLuint (line 11307) | typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC)(GLenum, GLuint,...
type GLuint (line 11310) | typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC)(GLenum, GLuin...
type GLchar (line 11395) | typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC)(GLuint, const ...
type GLsizei (line 11455) | typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC)(GLuint, GLsize...
type GLsizei (line 11981) | typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC)(GLuint, GLsize...
type GLchar (line 12105) | typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC)(GLint, const GLc...
type GLuint (line 12268) | typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC)(GLuint, GLuin...
type GLfloat (line 12271) | typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC)(GLuint, GLf...
type GLsizei (line 12274) | typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC)(GLuint, GLsizei, GL...
type GLsizei (line 12277) | typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC)(GLuint, GLsizei,...
type GLsizei (line 12449) | typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC...
type GLsizei (line 12452) | typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPRO...
type GLintptr (line 12719) | typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC)(GLenum, GLintptr, GLbi...
FILE: deps/glad/include/glad/glad_egl.h
type AHardwareBuffer (line 71) | struct AHardwareBuffer
type wl_buffer (line 72) | struct wl_buffer
type wl_display (line 73) | struct wl_display
type wl_resource (line 74) | struct wl_resource
type EGLBoolean (line 75) | typedef unsigned int EGLBoolean;
type EGLenum (line 76) | typedef unsigned int EGLenum;
type EGLAttribKHR (line 77) | typedef intptr_t EGLAttribKHR;
type EGLAttrib (line 78) | typedef intptr_t EGLAttrib;
type khronos_utime_nanoseconds_t (line 96) | typedef khronos_utime_nanoseconds_t EGLTimeKHR;
type khronos_utime_nanoseconds_t (line 97) | typedef khronos_utime_nanoseconds_t EGLTime;
type khronos_utime_nanoseconds_t (line 98) | typedef khronos_utime_nanoseconds_t EGLTimeNV;
type khronos_utime_nanoseconds_t (line 99) | typedef khronos_utime_nanoseconds_t EGLuint64NV;
type khronos_uint64_t (line 100) | typedef khronos_uint64_t EGLuint64KHR;
type khronos_stime_nanoseconds_t (line 101) | typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;
type EGLNativeFileDescriptorKHR (line 102) | typedef int EGLNativeFileDescriptorKHR;
type khronos_ssize_t (line 103) | typedef khronos_ssize_t EGLsizeiANDROID;
type EGLsizeiANDROID (line 105) | typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsi...
type EGLClientPixmapHI (line 106) | struct EGLClientPixmapHI {
type const (line 429) | typedef EGLDisplay (APIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum p...
type const (line 432) | typedef EGLSurface (APIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(...
type const (line 435) | typedef EGLSurface (APIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)(...
FILE: deps/glad/include/glad/glad_wgl.h
type _GPU_DEVICE (line 63) | struct _GPU_DEVICE {
type GPU_DEVICE (line 77) | typedef struct _GPU_DEVICE GPU_DEVICE;
type _GPU_DEVICE (line 78) | struct _GPU_DEVICE
type DWORD (line 338) | typedef LPVOID (APIENTRYP PFNWGLCREATEIMAGEBUFFERI3DPROC)(HDC, DWORD, UI...
type HANDLE (line 344) | typedef BOOL (APIENTRYP PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)(HDC, co...
type LPVOID (line 347) | typedef BOOL (APIENTRYP PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)(HDC, cons...
type INT64 (line 385) | typedef BOOL (APIENTRYP PFNWGLGETSYNCVALUESOMLPROC)(HDC, INT64*, INT64*,...
type INT32 (line 388) | typedef BOOL (APIENTRYP PFNWGLGETMSCRATEOMLPROC)(HDC, INT32*, INT32*);
type INT64 (line 391) | typedef INT64 (APIENTRYP PFNWGLSWAPBUFFERSMSCOMLPROC)(HDC, INT64, INT64,...
type INT64 (line 394) | typedef INT64 (APIENTRYP PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)(HDC, int, INT...
type INT64 (line 397) | typedef BOOL (APIENTRYP PFNWGLWAITFORMSCOMLPROC)(HDC, INT64, INT64, INT6...
type INT64 (line 400) | typedef BOOL (APIENTRYP PFNWGLWAITFORSBCOMLPROC)(HDC, INT64, INT64*, INT...
type HGLRC (line 411) | typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC, HGLRC, ...
type GLuint (line 424) | typedef BOOL (APIENTRYP PFNWGLQUERYSWAPGROUPNVPROC)(HDC, GLuint*, GLuint*);
type GLuint (line 427) | typedef BOOL (APIENTRYP PFNWGLQUERYMAXSWAPGROUPSNVPROC)(HDC, GLuint*, GL...
type GLuint (line 430) | typedef BOOL (APIENTRYP PFNWGLQUERYFRAMECOUNTNVPROC)(HDC, GLuint*);
type HGPUNV (line 440) | typedef BOOL (APIENTRYP PFNWGLENUMGPUSNVPROC)(UINT, HGPUNV*);
type UINT (line 443) | typedef BOOL (APIENTRYP PFNWGLENUMGPUDEVICESNVPROC)(HGPUNV, UINT, PGPU_D...
type UINT (line 449) | typedef BOOL (APIENTRYP PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)(HDC, UINT, H...
type UINT (line 459) | typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)(HDC, int, i...
type UINT (line 462) | typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)(HDC, int, i...
type UINT (line 465) | typedef BOOL (APIENTRYP PFNWGLCHOOSEPIXELFORMATEXTPROC)(HDC, const int*,...
type HVIDEOINPUTDEVICENV (line 482) | typedef UINT (APIENTRYP PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)(HDC, H...
type HVIDEOINPUTDEVICENV (line 488) | typedef BOOL (APIENTRYP PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)(HDC, HVIDEO...
type UINT (line 531) | typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC, int, i...
type UINT (line 534) | typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC, int, i...
type UINT (line 537) | typedef BOOL (APIENTRYP PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC, const int*,...
type BOOL (line 554) | typedef BOOL (APIENTRYP PFNWGLISENABLEDGENLOCKI3DPROC)(HDC, BOOL*);
type UINT (line 560) | typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSOURCEI3DPROC)(HDC, UINT*);
type UINT (line 566) | typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)(HDC, UINT*);
type UINT (line 572) | typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSAMPLERATEI3DPROC)(HDC, UINT*);
type UINT (line 578) | typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)(HDC, UINT*);
type UINT (line 581) | typedef BOOL (APIENTRYP PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)(HDC, UI...
type GLuint (line 597) | typedef HANDLE (APIENTRYP PFNWGLDXREGISTEROBJECTNVPROC)(HANDLE, void*, G...
type GLint (line 606) | typedef BOOL (APIENTRYP PFNWGLDXLOCKOBJECTSNVPROC)(HANDLE, GLint, HANDLE*);
type GLint (line 609) | typedef BOOL (APIENTRYP PFNWGLDXUNLOCKOBJECTSNVPROC)(HANDLE, GLint, HAND...
type const (line 623) | typedef HPBUFFEREXT (APIENTRYP PFNWGLCREATEPBUFFEREXTPROC)(HDC, int, int...
type HPVIDEODEV (line 658) | typedef BOOL (APIENTRYP PFNWGLGETVIDEODEVICENVPROC)(HDC, int, HPVIDEODEV*);
type HPBUFFERARB (line 664) | typedef BOOL (APIENTRYP PFNWGLBINDVIDEOIMAGENVPROC)(HPVIDEODEV, HPBUFFER...
type const (line 691) | typedef BOOL (APIENTRYP PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)(HDC, int, ...
type USHORT (line 694) | typedef BOOL (APIENTRYP PFNWGLGETGAMMATABLEI3DPROC)(HDC, int, USHORT*, U...
type const (line 697) | typedef BOOL (APIENTRYP PFNWGLSETGAMMATABLEI3DPROC)(HDC, int, const
type GLuint (line 708) | typedef BOOL (APIENTRYP PFNWGLCOPYIMAGESUBDATANVPROC)(HGLRC, GLuint, GLe...
type HVIDEOOUTPUTDEVICENV (line 722) | typedef BOOL (APIENTRYP PFNWGLBINDVIDEODEVICENVPROC)(HDC, unsigned int, ...
type HDC (line 740) | typedef BOOL (APIENTRYP PFNWGLMAKECONTEXTCURRENTARBPROC)(HDC, HDC, HGLRC);
type const (line 786) | typedef BOOL (APIENTRYP PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)(HDC, int...
type const (line 793) | typedef HPBUFFERARB (APIENTRYP PFNWGLCREATEPBUFFERARBPROC)(HDC, int, int...
type UINT (line 822) | typedef UINT (APIENTRYP PFNWGLGETGPUIDSAMDPROC)(UINT, UINT*);
type GLenum (line 825) | typedef INT (APIENTRYP PFNWGLGETGPUINFOAMDPROC)(UINT, int, GLenum, UINT,...
type HGLRC (line 834) | typedef HGLRC (APIENTRYP PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)(UI...
type GLint (line 846) | typedef VOID (APIENTRYP PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)(HGLRC, GLin...
type HDC (line 857) | typedef BOOL (APIENTRYP PFNWGLMAKECONTEXTCURRENTEXTPROC)(HDC, HDC, HGLRC);
type UINT (line 883) | typedef HANDLE (APIENTRYP PFNWGLCREATEBUFFERREGIONARBPROC)(HDC, int, UINT);
FILE: deps/glad/src/glad.c
function open_gl (line 13) | static
function close_gl (line 25) | static
function open_gl (line 41) | static
function close_gl (line 72) | static
function gladLoadGL (line 102) | int gladLoadGL(void) {
type gladGLversionStruct (line 111) | struct gladGLversionStruct
function has_ext (line 117) | static int has_ext(const char *ext) {
function load_GL_VERSION_1_0 (line 3069) | static void load_GL_VERSION_1_0(GLADloadproc load) {
function load_GL_VERSION_1_1 (line 3120) | static void load_GL_VERSION_1_1(GLADloadproc load) {
function load_GL_VERSION_1_2 (line 3136) | static void load_GL_VERSION_1_2(GLADloadproc load) {
function load_GL_VERSION_1_3 (line 3143) | static void load_GL_VERSION_1_3(GLADloadproc load) {
function load_GL_VERSION_1_4 (line 3155) | static void load_GL_VERSION_1_4(GLADloadproc load) {
function load_GL_VERSION_1_5 (line 3167) | static void load_GL_VERSION_1_5(GLADloadproc load) {
function load_GL_VERSION_2_0 (line 3189) | static void load_GL_VERSION_2_0(GLADloadproc load) {
function load_GL_VERSION_2_1 (line 3285) | static void load_GL_VERSION_2_1(GLADloadproc load) {
function load_GL_VERSION_3_0 (line 3294) | static void load_GL_VERSION_3_0(GLADloadproc load) {
function load_GL_VERSION_3_1 (line 3381) | static void load_GL_VERSION_3_1(GLADloadproc load) {
function load_GL_VERSION_3_2 (line 3396) | static void load_GL_VERSION_3_2(GLADloadproc load) {
function load_GL_VERSION_3_3 (line 3418) | static void load_GL_VERSION_3_3(GLADloadproc load) {
function load_GL_VERSION_4_0 (line 3479) | static void load_GL_VERSION_4_0(GLADloadproc load) {
function load_GL_VERSION_4_1 (line 3528) | static void load_GL_VERSION_4_1(GLADloadproc load) {
function load_GL_VERSION_4_2 (line 3619) | static void load_GL_VERSION_4_2(GLADloadproc load) {
function load_GL_VERSION_4_3 (line 3634) | static void load_GL_VERSION_4_3(GLADloadproc load) {
function load_GL_VERSION_4_4 (line 3680) | static void load_GL_VERSION_4_4(GLADloadproc load) {
function load_GL_NV_point_sprite (line 3692) | static void load_GL_NV_point_sprite(GLADloadproc load) {
function load_GL_APPLE_element_array (line 3697) | static void load_GL_APPLE_element_array(GLADloadproc load) {
function load_GL_AMD_multi_draw_indirect (line 3705) | static void load_GL_AMD_multi_draw_indirect(GLADloadproc load) {
function load_GL_SGIX_tag_sample_buffer (line 3710) | static void load_GL_SGIX_tag_sample_buffer(GLADloadproc load) {
function load_GL_ATI_separate_stencil (line 3714) | static void load_GL_ATI_separate_stencil(GLADloadproc load) {
function load_GL_EXT_texture_buffer_object (line 3719) | static void load_GL_EXT_texture_buffer_object(GLADloadproc load) {
function load_GL_ARB_vertex_blend (line 3723) | static void load_GL_ARB_vertex_blend(GLADloadproc load) {
function load_GL_ARB_program_interface_query (line 3736) | static void load_GL_ARB_program_interface_query(GLADloadproc load) {
function load_GL_EXT_index_func (line 3745) | static void load_GL_EXT_index_func(GLADloadproc load) {
function load_GL_NV_shader_buffer_load (line 3749) | static void load_GL_NV_shader_buffer_load(GLADloadproc load) {
function load_GL_EXT_color_subtable (line 3766) | static void load_GL_EXT_color_subtable(GLADloadproc load) {
function load_GL_SUNX_constant_data (line 3771) | static void load_GL_SUNX_constant_data(GLADloadproc load) {
function load_GL_EXT_multi_draw_arrays (line 3775) | static void load_GL_EXT_multi_draw_arrays(GLADloadproc load) {
function load_GL_ARB_shader_atomic_counters (line 3780) | static void load_GL_ARB_shader_atomic_counters(GLADloadproc load) {
function load_GL_NV_conditional_render (line 3784) | static void load_GL_NV_conditional_render(GLADloadproc load) {
function load_GL_MESA_resize_buffers (line 3789) | static void load_GL_MESA_resize_buffers(GLADloadproc load) {
function load_GL_ARB_texture_view (line 3793) | static void load_GL_ARB_texture_view(GLADloadproc load) {
function load_GL_ARB_map_buffer_range (line 3797) | static void load_GL_ARB_map_buffer_range(GLADloadproc load) {
function load_GL_EXT_convolution (line 3802) | static void load_GL_EXT_convolution(GLADloadproc load) {
function load_GL_NV_vertex_attrib_integer_64bit (line 3818) | static void load_GL_NV_vertex_attrib_integer_64bit(GLADloadproc load) {
function load_GL_EXT_paletted_texture (line 3840) | static void load_GL_EXT_paletted_texture(GLADloadproc load) {
function load_GL_ARB_texture_buffer_object (line 3847) | static void load_GL_ARB_texture_buffer_object(GLADloadproc load) {
function load_GL_ATI_pn_triangles (line 3851) | static void load_GL_ATI_pn_triangles(GLADloadproc load) {
function load_GL_SGIX_flush_raster (line 3856) | static void load_GL_SGIX_flush_raster(GLADloadproc load) {
function load_GL_EXT_light_texture (line 3860) | static void load_GL_EXT_light_texture(GLADloadproc load) {
function load_GL_AMD_draw_buffers_blend (line 3866) | static void load_GL_AMD_draw_buffers_blend(GLADloadproc load) {
function load_GL_MESA_window_pos (line 3873) | static void load_GL_MESA_window_pos(GLADloadproc load) {
function load_GL_NV_texture_barrier (line 3900) | static void load_GL_NV_texture_barrier(GLADloadproc load) {
function load_GL_ARB_vertex_type_2_10_10_10_rev (line 3904) | static void load_GL_ARB_vertex_type_2_10_10_10_rev(GLADloadproc load) {
function load_GL_3DFX_tbuffer (line 3945) | static void load_GL_3DFX_tbuffer(GLADloadproc load) {
function load_GL_GREMEDY_frame_terminator (line 3949) | static void load_GL_GREMEDY_frame_terminator(GLADloadproc load) {
function load_GL_ARB_blend_func_extended (line 3953) | static void load_GL_ARB_blend_func_extended(GLADloadproc load) {
function load_GL_EXT_separate_shader_objects (line 3958) | static void load_GL_EXT_separate_shader_objects(GLADloadproc load) {
function load_GL_NV_texture_multisample (line 4009) | static void load_GL_NV_texture_multisample(GLADloadproc load) {
function load_GL_ARB_shader_objects (line 4018) | static void load_GL_ARB_shader_objects(GLADloadproc load) {
function load_GL_ARB_framebuffer_object (line 4060) | static void load_GL_ARB_framebuffer_object(GLADloadproc load) {
function load_GL_ATI_envmap_bumpmap (line 4083) | static void load_GL_ATI_envmap_bumpmap(GLADloadproc load) {
function load_GL_ATI_map_object_buffer (line 4090) | static void load_GL_ATI_map_object_buffer(GLADloadproc load) {
function load_GL_ARB_robustness (line 4095) | static void load_GL_ARB_robustness(GLADloadproc load) {
function load_GL_NV_pixel_data_range (line 4118) | static void load_GL_NV_pixel_data_range(GLADloadproc load) {
function load_GL_EXT_framebuffer_blit (line 4123) | static void load_GL_EXT_framebuffer_blit(GLADloadproc load) {
function load_GL_ARB_gpu_shader_fp64 (line 4127) | static void load_GL_ARB_gpu_shader_fp64(GLADloadproc load) {
function load_GL_EXT_vertex_weighting (line 4148) | static void load_GL_EXT_vertex_weighting(GLADloadproc load) {
function load_GL_GREMEDY_string_marker (line 4154) | static void load_GL_GREMEDY_string_marker(GLADloadproc load) {
function load_GL_EXT_subtexture (line 4158) | static void load_GL_EXT_subtexture(GLADloadproc load) {
function load_GL_NV_evaluators (line 4163) | static void load_GL_NV_evaluators(GLADloadproc load) {
function load_GL_SGIS_texture_filter4 (line 4175) | static void load_GL_SGIS_texture_filter4(GLADloadproc load) {
function load_GL_AMD_performance_monitor (line 4180) | static void load_GL_AMD_performance_monitor(GLADloadproc load) {
function load_GL_EXT_stencil_clear_tag (line 4194) | static void load_GL_EXT_stencil_clear_tag(GLADloadproc load) {
function load_GL_NV_present_video (line 4198) | static void load_GL_NV_present_video(GLADloadproc load) {
function load_GL_EXT_gpu_program_parameters (line 4207) | static void load_GL_EXT_gpu_program_parameters(GLADloadproc load) {
function load_GL_ARB_draw_elements_base_vertex (line 4212) | static void load_GL_ARB_draw_elements_base_vertex(GLADloadproc load) {
function load_GL_NV_transform_feedback (line 4219) | static void load_GL_NV_transform_feedback(GLADloadproc load) {
function load_GL_NV_fragment_program (line 4234) | static void load_GL_NV_fragment_program(GLADloadproc load) {
function load_GL_AMD_stencil_operation_extended (line 4243) | static void load_GL_AMD_stencil_operation_extended(GLADloadproc load) {
function load_GL_ARB_instanced_arrays (line 4247) | static void load_GL_ARB_instanced_arrays(GLADloadproc load) {
function load_GL_EXT_polygon_offset (line 4251) | static void load_GL_EXT_polygon_offset(GLADloadproc load) {
function load_GL_AMD_sparse_texture (line 4255) | static void load_GL_AMD_sparse_texture(GLADloadproc load) {
function load_GL_NV_fence (line 4260) | static void load_GL_NV_fence(GLADloadproc load) {
function load_GL_ARB_texture_buffer_range (line 4270) | static void load_GL_ARB_texture_buffer_range(GLADloadproc load) {
function load_GL_SUN_mesh_array (line 4274) | static void load_GL_SUN_mesh_array(GLADloadproc load) {
function load_GL_ARB_vertex_attrib_binding (line 4278) | static void load_GL_ARB_vertex_attrib_binding(GLADloadproc load) {
function load_GL_ARB_framebuffer_no_attachments (line 4287) | static void load_GL_ARB_framebuffer_no_attachments(GLADloadproc load) {
function load_GL_ARB_cl_event (line 4292) | static void load_GL_ARB_cl_event(GLADloadproc load) {
function load_GL_OES_single_precision (line 4296) | static void load_GL_OES_single_precision(GLADloadproc load) {
function load_GL_NV_primitive_restart (line 4305) | static void load_GL_NV_primitive_restart(GLADloadproc load) {
function load_GL_SUN_global_alpha (line 4310) | static void load_GL_SUN_global_alpha(GLADloadproc load) {
function load_GL_EXT_texture_object (line 4321) | static void load_GL_EXT_texture_object(GLADloadproc load) {
function load_GL_AMD_name_gen_delete (line 4330) | static void load_GL_AMD_name_gen_delete(GLADloadproc load) {
function load_GL_ARB_buffer_storage (line 4336) | static void load_GL_ARB_buffer_storage(GLADloadproc load) {
function load_GL_APPLE_vertex_program_evaluators (line 4340) | static void load_GL_APPLE_vertex_program_evaluators(GLADloadproc load) {
function load_GL_ARB_multi_bind (line 4350) | static void load_GL_ARB_multi_bind(GLADloadproc load) {
function load_GL_SGIX_list_priority (line 4359) | static void load_GL_SGIX_list_priority(GLADloadproc load) {
function load_GL_NV_vertex_buffer_unified_memory (line 4368) | static void load_GL_NV_vertex_buffer_unified_memory(GLADloadproc load) {
function load_GL_NV_blend_equation_advanced (line 4383) | static void load_GL_NV_blend_equation_advanced(GLADloadproc load) {
function load_GL_SGIS_sharpen_texture (line 4388) | static void load_GL_SGIS_sharpen_texture(GLADloadproc load) {
function load_GL_ARB_vertex_program (line 4393) | static void load_GL_ARB_vertex_program(GLADloadproc load) {
function load_GL_ARB_vertex_buffer_object (line 4458) | static void load_GL_ARB_vertex_buffer_object(GLADloadproc load) {
function load_GL_NV_vertex_array_range (line 4472) | static void load_GL_NV_vertex_array_range(GLADloadproc load) {
function load_GL_SGIX_fragment_lighting (line 4477) | static void load_GL_SGIX_fragment_lighting(GLADloadproc load) {
function load_GL_NV_framebuffer_multisample_coverage (line 4498) | static void load_GL_NV_framebuffer_multisample_coverage(GLADloadproc loa...
function load_GL_EXT_timer_query (line 4502) | static void load_GL_EXT_timer_query(GLADloadproc load) {
function load_GL_NV_bindless_texture (line 4507) | static void load_GL_NV_bindless_texture(GLADloadproc load) {
function load_GL_KHR_debug (line 4523) | static void load_GL_KHR_debug(GLADloadproc load) {
function load_GL_ATI_vertex_attrib_array_object (line 4548) | static void load_GL_ATI_vertex_attrib_array_object(GLADloadproc load) {
function load_GL_EXT_geometry_shader4 (line 4554) | static void load_GL_EXT_geometry_shader4(GLADloadproc load) {
function load_GL_EXT_bindable_uniform (line 4558) | static void load_GL_EXT_bindable_uniform(GLADloadproc load) {
function load_GL_ATI_element_array (line 4564) | static void load_GL_ATI_element_array(GLADloadproc load) {
function load_GL_SGIX_reference_plane (line 4570) | static void load_GL_SGIX_reference_plane(GLADloadproc load) {
function load_GL_EXT_stencil_two_side (line 4574) | static void load_GL_EXT_stencil_two_side(GLADloadproc load) {
function load_GL_NV_explicit_multisample (line 4578) | static void load_GL_NV_explicit_multisample(GLADloadproc load) {
function load_GL_IBM_static_data (line 4584) | static void load_GL_IBM_static_data(GLADloadproc load) {
function load_GL_EXT_texture_perturb_normal (line 4588) | static void load_GL_EXT_texture_perturb_normal(GLADloadproc load) {
function load_GL_EXT_point_parameters (line 4592) | static void load_GL_EXT_point_parameters(GLADloadproc load) {
function load_GL_PGI_misc_hints (line 4597) | static void load_GL_PGI_misc_hints(GLADloadproc load) {
function load_GL_ARB_vertex_shader (line 4601) | static void load_GL_ARB_vertex_shader(GLADloadproc load) {
function load_GL_ARB_tessellation_shader (line 4650) | static void load_GL_ARB_tessellation_shader(GLADloadproc load) {
function load_GL_EXT_draw_buffers2 (line 4655) | static void load_GL_EXT_draw_buffers2(GLADloadproc load) {
function load_GL_ARB_vertex_attrib_64bit (line 4664) | static void load_GL_ARB_vertex_attrib_64bit(GLADloadproc load) {
function load_GL_AMD_interleaved_elements (line 4677) | static void load_GL_AMD_interleaved_elements(GLADloadproc load) {
function load_GL_ARB_fragment_program (line 4681) | static void load_GL_ARB_fragment_program(GLADloadproc load) {
function load_GL_ARB_texture_storage (line 4703) | static void load_GL_ARB_texture_storage(GLADloadproc load) {
function load_GL_ARB_copy_image (line 4709) | static void load_GL_ARB_copy_image(GLADloadproc load) {
function load_GL_SGIS_pixel_texture (line 4713) | static void load_GL_SGIS_pixel_texture(GLADloadproc load) {
function load_GL_SGIX_instruments (line 4722) | static void load_GL_SGIX_instruments(GLADloadproc load) {
function load_GL_ARB_shader_storage_buffer_object (line 4731) | static void load_GL_ARB_shader_storage_buffer_object(GLADloadproc load) {
function load_GL_EXT_blend_minmax (line 4735) | static void load_GL_EXT_blend_minmax(GLADloadproc load) {
function load_GL_ARB_base_instance (line 4739) | static void load_GL_ARB_base_instance(GLADloadproc load) {
function load_GL_EXT_texture_integer (line 4745) | static void load_GL_EXT_texture_integer(GLADloadproc load) {
function load_GL_ARB_texture_multisample (line 4754) | static void load_GL_ARB_texture_multisample(GLADloadproc load) {
function load_GL_AMD_vertex_shader_tessellator (line 4761) | static void load_GL_AMD_vertex_shader_tessellator(GLADloadproc load) {
function load_GL_ARB_invalidate_subdata (line 4766) | static void load_GL_ARB_invalidate_subdata(GLADloadproc load) {
function load_GL_EXT_index_material (line 4775) | static void load_GL_EXT_index_material(GLADloadproc load) {
function load_GL_INTEL_parallel_arrays (line 4779) | static void load_GL_INTEL_parallel_arrays(GLADloadproc load) {
function load_GL_ATI_draw_buffers (line 4786) | static void load_GL_ATI_draw_buffers(GLADloadproc load) {
function load_GL_SGIX_pixel_texture (line 4790) | static void load_GL_SGIX_pixel_texture(GLADloadproc load) {
function load_GL_ARB_timer_query (line 4794) | static void load_GL_ARB_timer_query(GLADloadproc load) {
function load_GL_NV_parameter_buffer_object (line 4800) | static void load_GL_NV_parameter_buffer_object(GLADloadproc load) {
function load_GL_ARB_uniform_buffer_object (line 4806) | static void load_GL_ARB_uniform_buffer_object(GLADloadproc load) {
function load_GL_NV_transform_feedback2 (line 4816) | static void load_GL_NV_transform_feedback2(GLADloadproc load) {
function load_GL_EXT_blend_color (line 4826) | static void load_GL_EXT_blend_color(GLADloadproc load) {
function load_GL_EXT_histogram (line 4830) | static void load_GL_EXT_histogram(GLADloadproc load) {
function load_GL_SGIS_point_parameters (line 4843) | static void load_GL_SGIS_point_parameters(GLADloadproc load) {
function load_GL_EXT_direct_state_access (line 4848) | static void load_GL_EXT_direct_state_access(GLADloadproc load) {
function load_GL_AMD_sample_positions (line 5106) | static void load_GL_AMD_sample_positions(GLADloadproc load) {
function load_GL_NV_vertex_program (line 5110) | static void load_GL_NV_vertex_program(GLADloadproc load) {
function load_GL_NVX_conditional_render (line 5177) | static void load_GL_NVX_conditional_render(GLADloadproc load) {
function load_GL_EXT_vertex_shader (line 5182) | static void load_GL_EXT_vertex_shader(GLADloadproc load) {
function load_GL_EXT_blend_func_separate (line 5227) | static void load_GL_EXT_blend_func_separate(GLADloadproc load) {
function load_GL_APPLE_fence (line 5231) | static void load_GL_APPLE_fence(GLADloadproc load) {
function load_GL_OES_byte_coordinates (line 5242) | static void load_GL_OES_byte_coordinates(GLADloadproc load) {
function load_GL_ARB_transpose_matrix (line 5267) | static void load_GL_ARB_transpose_matrix(GLADloadproc load) {
function load_GL_ARB_provoking_vertex (line 5274) | static void load_GL_ARB_provoking_vertex(GLADloadproc load) {
function load_GL_EXT_fog_coord (line 5278) | static void load_GL_EXT_fog_coord(GLADloadproc load) {
function load_GL_EXT_vertex_array (line 5286) | static void load_GL_EXT_vertex_array(GLADloadproc load) {
function load_GL_EXT_blend_equation_separate (line 5298) | static void load_GL_EXT_blend_equation_separate(GLADloadproc load) {
function load_GL_ARB_multi_draw_indirect (line 5302) | static void load_GL_ARB_multi_draw_indirect(GLADloadproc load) {
function load_GL_NV_copy_image (line 5307) | static void load_GL_NV_copy_image(GLADloadproc load) {
function load_GL_ARB_transform_feedback2 (line 5311) | static void load_GL_ARB_transform_feedback2(GLADloadproc load) {
function load_GL_ARB_transform_feedback3 (line 5321) | static void load_GL_ARB_transform_feedback3(GLADloadproc load) {
function load_GL_EXT_debug_marker (line 5328) | static void load_GL_EXT_debug_marker(GLADloadproc load) {
function load_GL_EXT_pixel_transform (line 5334) | static void load_GL_EXT_pixel_transform(GLADloadproc load) {
function load_GL_ATI_fragment_shader (line 5343) | static void load_GL_ATI_fragment_shader(GLADloadproc load) {
function load_GL_ARB_vertex_array_object (line 5360) | static void load_GL_ARB_vertex_array_object(GLADloadproc load) {
function load_GL_SUN_triangle_list (line 5367) | static void load_GL_SUN_triangle_list(GLADloadproc load) {
function load_GL_ARB_transform_feedback_instanced (line 5377) | static void load_GL_ARB_transform_feedback_instanced(GLADloadproc load) {
function load_GL_SGIX_async (line 5382) | static void load_GL_SGIX_async(GLADloadproc load) {
function load_GL_INTEL_performance_query (line 5391) | static void load_GL_INTEL_performance_query(GLADloadproc load) {
function load_GL_NV_gpu_shader5 (line 5404) | static void load_GL_NV_gpu_shader5(GLADloadproc load) {
function load_GL_ARB_ES2_compatibility (line 5440) | static void load_GL_ARB_ES2_compatibility(GLADloadproc load) {
function load_GL_ARB_indirect_parameters (line 5448) | static void load_GL_ARB_indirect_parameters(GLADloadproc load) {
function load_GL_NV_half_float (line 5453) | static void load_GL_NV_half_float(GLADloadproc load) {
function load_GL_EXT_coordinate_frame (line 5502) | static void load_GL_EXT_coordinate_frame(GLADloadproc load) {
function load_GL_EXT_compiled_vertex_array (line 5527) | static void load_GL_EXT_compiled_vertex_array(GLADloadproc load) {
function load_GL_NV_depth_buffer_float (line 5532) | static void load_GL_NV_depth_buffer_float(GLADloadproc load) {
function load_GL_NV_occlusion_query (line 5538) | static void load_GL_NV_occlusion_query(GLADloadproc load) {
function load_GL_APPLE_flush_buffer_range (line 5548) | static void load_GL_APPLE_flush_buffer_range(GLADloadproc load) {
function load_GL_ARB_imaging (line 5553) | static void load_GL_ARB_imaging(GLADloadproc load) {
function load_GL_ARB_draw_buffers_blend (line 5590) | static void load_GL_ARB_draw_buffers_blend(GLADloadproc load) {
function load_GL_ARB_clear_buffer_object (line 5597) | static void load_GL_ARB_clear_buffer_object(GLADloadproc load) {
function load_GL_ARB_multisample (line 5602) | static void load_GL_ARB_multisample(GLADloadproc load) {
function load_GL_EXT_debug_label (line 5606) | static void load_GL_EXT_debug_label(GLADloadproc load) {
function load_GL_ARB_sample_shading (line 5611) | static void load_GL_ARB_sample_shading(GLADloadproc load) {
function load_GL_INTEL_map_texture (line 5615) | static void load_GL_INTEL_map_texture(GLADloadproc load) {
function load_GL_ARB_compute_shader (line 5621) | static void load_GL_ARB_compute_shader(GLADloadproc load) {
function load_GL_IBM_vertex_array_lists (line 5626) | static void load_GL_IBM_vertex_array_lists(GLADloadproc load) {
function load_GL_ARB_color_buffer_float (line 5637) | static void load_GL_ARB_color_buffer_float(GLADloadproc load) {
function load_GL_ARB_bindless_texture (line 5641) | static void load_GL_ARB_bindless_texture(GLADloadproc load) {
function load_GL_ARB_window_pos (line 5660) | static void load_GL_ARB_window_pos(GLADloadproc load) {
function load_GL_ARB_internalformat_query (line 5679) | static void load_GL_ARB_internalformat_query(GLADloadproc load) {
function load_GL_EXT_shader_image_load_store (line 5683) | static void load_GL_EXT_shader_image_load_store(GLADloadproc load) {
function load_GL_EXT_copy_texture (line 5688) | static void load_GL_EXT_copy_texture(GLADloadproc load) {
function load_GL_NV_register_combiners2 (line 5696) | static void load_GL_NV_register_combiners2(GLADloadproc load) {
function load_GL_NV_draw_texture (line 5701) | static void load_GL_NV_draw_texture(GLADloadproc load) {
function load_GL_EXT_draw_instanced (line 5705) | static void load_GL_EXT_draw_instanced(GLADloadproc load) {
function load_GL_ARB_viewport_array (line 5710) | static void load_GL_ARB_viewport_array(GLADloadproc load) {
function load_GL_ARB_separate_shader_objects (line 5723) | static void load_GL_ARB_separate_shader_objects(GLADloadproc load) {
function load_GL_EXT_depth_bounds_test (line 5786) | static void load_GL_EXT_depth_bounds_test(GLADloadproc load) {
function load_GL_HP_image_transform (line 5790) | static void load_GL_HP_image_transform(GLADloadproc load) {
function load_GL_NV_video_capture (line 5799) | static void load_GL_NV_video_capture(GLADloadproc load) {
function load_GL_ARB_sampler_objects (line 5814) | static void load_GL_ARB_sampler_objects(GLADloadproc load) {
function load_GL_ARB_matrix_palette (line 5831) | static void load_GL_ARB_matrix_palette(GLADloadproc load) {
function load_GL_SGIS_texture_color_mask (line 5839) | static void load_GL_SGIS_texture_color_mask(GLADloadproc load) {
function load_GL_ARB_texture_compression (line 5843) | static void load_GL_ARB_texture_compression(GLADloadproc load) {
function load_GL_ARB_shader_subroutine (line 5853) | static void load_GL_ARB_shader_subroutine(GLADloadproc load) {
function load_GL_ARB_texture_storage_multisample (line 5864) | static void load_GL_ARB_texture_storage_multisample(GLADloadproc load) {
function load_GL_EXT_vertex_attrib_64bit (line 5869) | static void load_GL_EXT_vertex_attrib_64bit(GLADloadproc load) {
function load_GL_OES_query_matrix (line 5882) | static void load_GL_OES_query_matrix(GLADloadproc load) {
function load_GL_APPLE_texture_range (line 5886) | static void load_GL_APPLE_texture_range(GLADloadproc load) {
function load_GL_ARB_copy_buffer (line 5891) | static void load_GL_ARB_copy_buffer(GLADloadproc load) {
function load_GL_APPLE_object_purgeable (line 5895) | static void load_GL_APPLE_object_purgeable(GLADloadproc load) {
function load_GL_ARB_occlusion_query (line 5901) | static void load_GL_ARB_occlusion_query(GLADloadproc load) {
function load_GL_SGI_color_table (line 5912) | static void load_GL_SGI_color_table(GLADloadproc load) {
function load_GL_EXT_gpu_shader4 (line 5922) | static void load_GL_EXT_gpu_shader4(GLADloadproc load) {
function load_GL_NV_geometry_program4 (line 5936) | static void load_GL_NV_geometry_program4(GLADloadproc load) {
function load_GL_AMD_debug_output (line 5943) | static void load_GL_AMD_debug_output(GLADloadproc load) {
function load_GL_ARB_multitexture (line 5950) | static void load_GL_ARB_multitexture(GLADloadproc load) {
function load_GL_SGIX_polynomial_ffd (line 5987) | static void load_GL_SGIX_polynomial_ffd(GLADloadproc load) {
function load_GL_EXT_provoking_vertex (line 5994) | static void load_GL_EXT_provoking_vertex(GLADloadproc load) {
function load_GL_ARB_point_parameters (line 5998) | static void load_GL_ARB_point_parameters(GLADloadproc load) {
function load_GL_ARB_shader_image_load_store (line 6003) | static void load_GL_ARB_shader_image_load_store(GLADloadproc load) {
function load_GL_SGIX_framezoom (line 6008) | static void load_GL_SGIX_framezoom(GLADloadproc load) {
function load_GL_NV_bindless_multi_draw_indirect (line 6012) | static void load_GL_NV_bindless_multi_draw_indirect(GLADloadproc load) {
function load_GL_EXT_transform_feedback (line 6017) | static void load_GL_EXT_transform_feedback(GLADloadproc load) {
function load_GL_NV_gpu_program4 (line 6027) | static void load_GL_NV_gpu_program4(GLADloadproc load) {
function load_GL_NV_gpu_program5 (line 6046) | static void load_GL_NV_gpu_program5(GLADloadproc load) {
function load_GL_ARB_geometry_shader4 (line 6051) | static void load_GL_ARB_geometry_shader4(GLADloadproc load) {
function load_GL_SGIX_sprite (line 6058) | static void load_GL_SGIX_sprite(GLADloadproc load) {
function load_GL_ARB_get_program_binary (line 6065) | static void load_GL_ARB_get_program_binary(GLADloadproc load) {
function load_GL_AMD_occlusion_query_event (line 6071) | static void load_GL_AMD_occlusion_query_event(GLADloadproc load) {
function load_GL_SGIS_multisample (line 6075) | static void load_GL_SGIS_multisample(GLADloadproc load) {
function load_GL_EXT_framebuffer_object (line 6080) | static void load_GL_EXT_framebuffer_object(GLADloadproc load) {
function load_GL_APPLE_vertex_array_range (line 6100) | static void load_GL_APPLE_vertex_array_range(GLADloadproc load) {
function load_GL_NV_register_combiners (line 6106) | static void load_GL_NV_register_combiners(GLADloadproc load) {
function load_GL_ARB_draw_buffers (line 6122) | static void load_GL_ARB_draw_buffers(GLADloadproc load) {
function load_GL_ARB_clear_texture (line 6126) | static void load_GL_ARB_clear_texture(GLADloadproc load) {
function load_GL_ARB_debug_output (line 6131) | static void load_GL_ARB_debug_output(GLADloadproc load) {
function load_GL_EXT_cull_vertex (line 6138) | static void load_GL_EXT_cull_vertex(GLADloadproc load) {
function load_GL_IBM_multimode_draw_arrays (line 6143) | static void load_GL_IBM_multimode_draw_arrays(GLADloadproc load) {
function load_GL_APPLE_vertex_array_object (line 6148) | static void load_GL_APPLE_vertex_array_object(GLADloadproc load) {
function load_GL_SGIS_detail_texture (line 6155) | static void load_GL_SGIS_detail_texture(GLADloadproc load) {
function load_GL_ARB_draw_instanced (line 6160) | static void load_GL_ARB_draw_instanced(GLADloadproc load) {
function load_GL_ARB_shading_language_include (line 6165) | static void load_GL_ARB_shading_language_include(GLADloadproc load) {
function load_GL_INGR_blend_func_separate (line 6174) | static void load_GL_INGR_blend_func_separate(GLADloadproc load) {
function load_GL_NV_path_rendering (line 6178) | static void load_GL_NV_path_rendering(GLADloadproc load) {
function load_GL_ATI_vertex_streams (line 6230) | static void load_GL_ATI_vertex_streams(GLADloadproc load) {
function load_GL_NV_vdpau_interop (line 6278) | static void load_GL_NV_vdpau_interop(GLADloadproc load) {
function load_GL_ARB_internalformat_query2 (line 6291) | static void load_GL_ARB_internalformat_query2(GLADloadproc load) {
function load_GL_SUN_vertex (line 6295) | static void load_GL_SUN_vertex(GLADloadproc load) {
function load_GL_SGIX_igloo_interface (line 6338) | static void load_GL_SGIX_igloo_interface(GLADloadproc load) {
function load_GL_ARB_draw_indirect (line 6342) | static void load_GL_ARB_draw_indirect(GLADloadproc load) {
function load_GL_NV_vertex_program4 (line 6347) | static void load_GL_NV_vertex_program4(GLADloadproc load) {
function load_GL_SGIS_fog_function (line 6373) | static void load_GL_SGIS_fog_function(GLADloadproc load) {
function load_GL_EXT_x11_sync_object (line 6378) | static void load_GL_EXT_x11_sync_object(GLADloadproc load) {
function load_GL_ARB_sync (line 6382) | static void load_GL_ARB_sync(GLADloadproc load) {
function load_GL_ARB_compute_variable_group_size (line 6392) | static void load_GL_ARB_compute_variable_group_size(GLADloadproc load) {
function load_GL_OES_fixed_point (line 6396) | static void load_GL_OES_fixed_point(GLADloadproc load) {
function load_GL_EXT_framebuffer_multisample (line 6507) | static void load_GL_EXT_framebuffer_multisample(GLADloadproc load) {
function load_GL_SGIS_texture4D (line 6511) | static void load_GL_SGIS_texture4D(GLADloadproc load) {
function load_GL_EXT_texture3D (line 6516) | static void load_GL_EXT_texture3D(GLADloadproc load) {
function load_GL_EXT_multisample (line 6521) | static void load_GL_EXT_multisample(GLADloadproc load) {
function load_GL_EXT_secondary_color (line 6526) | static void load_GL_EXT_secondary_color(GLADloadproc load) {
function load_GL_ATI_vertex_array_object (line 6546) | static void load_GL_ATI_vertex_array_object(GLADloadproc load) {
function load_GL_ARB_sparse_texture (line 6561) | static void load_GL_ARB_sparse_texture(GLADloadproc load) {
function load_GL_EXT_draw_range_elements (line 6565) | static void load_GL_EXT_draw_range_elements(GLADloadproc load) {
function find_extensionsGL (line 6569) | static void find_extensionsGL(void) {
function find_coreGL (line 7053) | static void find_coreGL(void) {
function gladLoadGLLoader (line 7077) | void gladLoadGLLoader(GLADloadproc load) {
FILE: deps/glad/src/glad_egl.c
function gladLoadEGL (line 41) | int gladLoadEGL(void) {
function load_EGL_ANDROID_native_fence_sync (line 59) | static void load_EGL_ANDROID_native_fence_sync(GLADloadproc load) {
function load_EGL_EXT_device_base (line 62) | static void load_EGL_EXT_device_base(GLADloadproc load) {
function load_EGL_EXT_image_dma_buf_import_modifiers (line 68) | static void load_EGL_EXT_image_dma_buf_import_modifiers(GLADloadproc loa...
function load_EGL_EXT_platform_base (line 72) | static void load_EGL_EXT_platform_base(GLADloadproc load) {
function load_EGL_KHR_image_base (line 77) | static void load_EGL_KHR_image_base(GLADloadproc load) {
function load_EGL_MESA_image_dma_buf_export (line 81) | static void load_EGL_MESA_image_dma_buf_export(GLADloadproc load) {
function find_extensionsEGL (line 85) | static int find_extensionsEGL(void) {
function find_coreEGL (line 89) | static void find_coreEGL(void) {
function gladLoadEGLLoader (line 92) | int gladLoadEGLLoader(GLADloadproc load) {
FILE: deps/glad/src/glad_wgl.c
function open_gl (line 13) | static
function close_gl (line 25) | static
function open_gl (line 41) | static
function close_gl (line 72) | static
function gladLoadWGL (line 102) | int gladLoadWGL(HDC hdc) {
function has_ext (line 114) | static int has_ext(const char *ext) {
function load_WGL_I3D_image_buffer (line 318) | static void load_WGL_I3D_image_buffer(GLADloadproc load) {
function load_WGL_I3D_swap_frame_usage (line 325) | static void load_WGL_I3D_swap_frame_usage(GLADloadproc load) {
function load_WGL_NV_delay_before_swap (line 332) | static void load_WGL_NV_delay_before_swap(GLADloadproc load) {
function load_WGL_OML_sync_control (line 336) | static void load_WGL_OML_sync_control(GLADloadproc load) {
function load_WGL_ARB_create_context (line 345) | static void load_WGL_ARB_create_context(GLADloadproc load) {
function load_WGL_NV_swap_group (line 349) | static void load_WGL_NV_swap_group(GLADloadproc load) {
function load_WGL_NV_gpu_affinity (line 358) | static void load_WGL_NV_gpu_affinity(GLADloadproc load) {
function load_WGL_EXT_pixel_format (line 366) | static void load_WGL_EXT_pixel_format(GLADloadproc load) {
function load_WGL_ARB_extensions_string (line 372) | static void load_WGL_ARB_extensions_string(GLADloadproc load) {
function load_WGL_NV_video_capture (line 376) | static void load_WGL_NV_video_capture(GLADloadproc load) {
function load_WGL_ARB_render_texture (line 384) | static void load_WGL_ARB_render_texture(GLADloadproc load) {
function load_WGL_ARB_pixel_format (line 390) | static void load_WGL_ARB_pixel_format(GLADloadproc load) {
function load_WGL_I3D_genlock (line 396) | static void load_WGL_I3D_genlock(GLADloadproc load) {
function load_WGL_NV_DX_interop (line 411) | static void load_WGL_NV_DX_interop(GLADloadproc load) {
function load_WGL_3DL_stereo_control (line 422) | static void load_WGL_3DL_stereo_control(GLADloadproc load) {
function load_WGL_EXT_pbuffer (line 426) | static void load_WGL_EXT_pbuffer(GLADloadproc load) {
function load_WGL_EXT_display_color_table (line 434) | static void load_WGL_EXT_display_color_table(GLADloadproc load) {
function load_WGL_NV_video_output (line 441) | static void load_WGL_NV_video_output(GLADloadproc load) {
function load_WGL_I3D_gamma (line 450) | static void load_WGL_I3D_gamma(GLADloadproc load) {
function load_WGL_NV_copy_image (line 457) | static void load_WGL_NV_copy_image(GLADloadproc load) {
function load_WGL_NV_present_video (line 461) | static void load_WGL_NV_present_video(GLADloadproc load) {
function load_WGL_ARB_make_current_read (line 467) | static void load_WGL_ARB_make_current_read(GLADloadproc load) {
function load_WGL_EXT_extensions_string (line 472) | static void load_WGL_EXT_extensions_string(GLADloadproc load) {
function load_WGL_EXT_swap_control (line 476) | static void load_WGL_EXT_swap_control(GLADloadproc load) {
function load_WGL_I3D_digital_video_control (line 481) | static void load_WGL_I3D_digital_video_control(GLADloadproc load) {
function load_WGL_ARB_pbuffer (line 486) | static void load_WGL_ARB_pbuffer(GLADloadproc load) {
function load_WGL_NV_vertex_array_range (line 494) | static void load_WGL_NV_vertex_array_range(GLADloadproc load) {
function load_WGL_AMD_gpu_association (line 499) | static void load_WGL_AMD_gpu_association(GLADloadproc load) {
function load_WGL_EXT_make_current_read (line 511) | static void load_WGL_EXT_make_current_read(GLADloadproc load) {
function load_WGL_I3D_swap_frame_lock (line 516) | static void load_WGL_I3D_swap_frame_lock(GLADloadproc load) {
function load_WGL_ARB_buffer_region (line 523) | static void load_WGL_ARB_buffer_region(GLADloadproc load) {
function find_extensionsWGL (line 530) | static void find_extensionsWGL(void) {
function find_coreWGL (line 585) | static void find_coreWGL(HDC hdc) {
function gladLoadWGLLoader (line 591) | void gladLoadWGLLoader(GLADloadproc load, HDC hdc) {
FILE: deps/json11/json11.cpp
type json11 (line 30) | namespace json11 {
type NullStruct (line 45) | struct NullStruct {
function dump (line 54) | static void dump(NullStruct, string &out) {
function dump (line 58) | static void dump(double value, string &out) {
function dump (line 68) | static void dump(int value, string &out) {
function dump (line 74) | static void dump(bool value, string &out) {
function dump (line 78) | static void dump(const string &value, string &out) {
function dump (line 115) | static void dump(const Json::array &values, string &out) {
function dump (line 127) | static void dump(const Json::object &values, string &out) {
class Value (line 150) | class Value : public JsonValue {
method Value (line 154) | explicit Value(const T &value) : m_value(value) {}
method Value (line 155) | explicit Value(T &&value) : m_value(move(value)) {}
method type (line 158) | Json::Type type() const override {
method equals (line 163) | bool equals(const JsonValue * other) const override {
method less (line 166) | bool less(const JsonValue * other) const override {
method dump (line 171) | void dump(string &out) const override { json11::dump(m_value, out); }
class JsonDouble (line 174) | class JsonDouble final : public Value<Json::NUMBER, double> {
method number_value (line 175) | double number_value() const override { return m_value; }
method int_value (line 176) | int int_value() const override { return static_cast<int>(m_value); }
method equals (line 177) | bool equals(const JsonValue * other) const override { return m_value...
method less (line 178) | bool less(const JsonValue * other) const override { return m_value...
method JsonDouble (line 180) | explicit JsonDouble(double value) : Value(value) {}
class JsonInt (line 183) | class JsonInt final : public Value<Json::NUMBER, int> {
method number_value (line 184) | double number_value() const override { return m_value; }
method int_value (line 185) | int int_value() const override { return m_value; }
method equals (line 186) | bool equals(const JsonValue * other) const override { return m_value...
method less (line 187) | bool less(const JsonValue * other) const override { return m_value...
method JsonInt (line 189) | explicit JsonInt(int value) : Value(value) {}
class JsonBoolean (line 192) | class JsonBoolean final : public Value<Json::BOOL, bool> {
method bool_value (line 193) | bool bool_value() const override { return m_value; }
method JsonBoolean (line 195) | explicit JsonBoolean(bool value) : Value(value) {}
class JsonString (line 198) | class JsonString final : public Value<Json::STRING, string> {
method string (line 199) | const string &string_value() const override { return m_value; }
method JsonString (line 201) | explicit JsonString(const string &value) : Value(value) {}
method JsonString (line 202) | explicit JsonString(string &&value) : Value(move(value)) {}
class JsonArray (line 205) | class JsonArray final : public Value<Json::ARRAY, Json::array> {
method JsonArray (line 209) | explicit JsonArray(const Json::array &value) : Value(value) {}
method JsonArray (line 210) | explicit JsonArray(Json::array &&value) : Value(move(value)) {}
class JsonObject (line 213) | class JsonObject final : public Value<Json::OBJECT, Json::object> {
method JsonObject (line 217) | explicit JsonObject(const Json::object &value) : Value(value) {}
method JsonObject (line 218) | explicit JsonObject(Json::object &&value) : Value(move(value)) {}
class JsonNull (line 221) | class JsonNull final : public Value<Json::NUL, NullStruct> {
method JsonNull (line 223) | JsonNull() : Value({}) {}
type Statics (line 229) | struct Statics {
method Statics (line 236) | Statics() {}
function Statics (line 239) | static const Statics & statics() {
method Statics (line 236) | Statics() {}
function Json (line 244) | static const Json & static_null() {
function string (line 275) | const string & Json::string_value() const { return m_ptr...
function Json (line 278) | const Json & Json::operator[] (size_t i) const { return (*m_p...
function Json (line 279) | const Json & Json::operator[] (const string &key) const { return (*m_p...
function string (line 284) | const string & JsonValue::string_value() const...
function Json (line 287) | const Json & JsonValue::operator[] (size_t) const...
function Json (line 288) | const Json & JsonValue::operator[] (const string &) const...
function Json (line 290) | const Json & JsonObject::operator[] (const string &key) const {
function Json (line 294) | const Json & JsonArray::operator[] (size_t i) const {
function string (line 329) | static inline string esc(char c) {
function in_range (line 339) | static inline bool in_range(long x, long lower, long upper) {
type JsonParser (line 348) | struct JsonParser final {
method Json (line 362) | Json fail(string &&msg) {
method T (line 367) | T fail(string &&msg, const T err_ret) {
method consume_whitespace (line 378) | void consume_whitespace() {
method consume_comment (line 387) | bool consume_comment() {
method consume_garbage (line 425) | void consume_garbage() {
method get_next_token (line 443) | char get_next_token() {
method encode_utf8 (line 456) | void encode_utf8(long pt, string & out) {
method string (line 481) | string parse_string() {
method Json (line 574) | Json parse_number() {
method Json (line 630) | Json expect(const string &expected, Json res) {
method Json (line 645) | Json parse_json(int depth) {
function Json (line 733) | Json Json::parse(const string &in, string &err, JsonParse strategy) {
FILE: deps/json11/json11.hpp
type json11 (line 71) | namespace json11 {
type JsonParse (line 73) | enum JsonParse {
class JsonValue (line 77) | class JsonValue
class Json (line 79) | class Json final {
type Type (line 82) | enum Type {
method Json (line 106) | Json(const T & t) : Json(t.to_json()) {}
method Json (line 113) | Json(const M & m) : Json(object(m.begin(), m.end())) {}
method Json (line 119) | Json(const V & v) : Json(array(v.begin(), v.end())) {}
method Json (line 123) | Json(void *) = delete;
method is_null (line 128) | bool is_null() const { return type() == NUL; }
method is_number (line 129) | bool is_number() const { return type() == NUMBER; }
method is_bool (line 130) | bool is_bool() const { return type() == BOOL; }
method is_string (line 131) | bool is_string() const { return type() == STRING; }
method is_array (line 132) | bool is_array() const { return type() == ARRAY; }
method is_object (line 133) | bool is_object() const { return type() == OBJECT; }
method dump (line 157) | std::string dump() const {
method Json (line 167) | static Json parse(const char * in,
method parse_multi (line 184) | static inline std::vector<Json> parse_multi(
class JsonValue (line 212) | class JsonValue {
FILE: deps/libcaption/caption/caption.h
type libcaption_stauts_t (line 43) | typedef enum {
function libcaption_stauts_t (line 49) | static inline libcaption_stauts_t libcaption_status_update(libcaption_st...
type caption_frame_cell_t (line 57) | typedef struct {
type caption_frame_buffer_t (line 63) | typedef struct {
type caption_frame_state_t (line 67) | typedef struct {
type caption_frame_t (line 76) | typedef struct {
function caption_frame_popon (line 94) | static inline int caption_frame_popon(caption_frame_t* frame) { return (...
function caption_frame_painton (line 98) | static inline int caption_frame_painton(caption_frame_t* frame) { return...
function caption_frame_rollup (line 103) | static inline int caption_frame_rollup(caption_frame_t* frame) { return ...
function caption_frame_timestamp (line 107) | static inline double caption_frame_timestamp(caption_frame_t* frame) { r...
FILE: deps/libcaption/caption/cea708.h
type cea708_cc_type_t (line 34) | typedef enum {
type cc_data_t (line 41) | typedef struct {
type user_data_t (line 48) | typedef struct {
type itu_t_t35_country_code_t (line 71) | typedef enum {
type itu_t_t35_provider_code_t (line 75) | typedef enum {
type cea708_t (line 80) | typedef struct {
FILE: deps/libcaption/caption/dvtcc.h
type dtvcc_packet_t (line 7) | struct dtvcc_packet_t {
FILE: deps/libcaption/caption/eia608.h
function eia608_parity_byte (line 51) | static inline uint8_t eia608_parity_byte(uint8_t cc_data) { return eia60...
function eia608_parity_word (line 55) | static inline uint16_t eia608_parity_word(uint16_t cc_data) { return (ui...
function eia608_parity (line 59) | static inline uint16_t eia608_parity(uint16_t cc_data) { return eia608_p...
function eia608_parity_varify (line 63) | static inline int eia608_parity_varify(uint16_t cc_data) { return eia608...
function eia608_parity_strip (line 67) | static inline int eia608_parity_strip(uint16_t cc_data) { return cc_data...
function eia608_test_second_channel_bit (line 71) | static inline int eia608_test_second_channel_bit(uint16_t cc_data) { ret...
function eia608_is_basicna (line 78) | static inline int eia608_is_basicna(uint16_t cc_data) { return 0x0000 !=...
function eia608_is_preamble (line 82) | static inline int eia608_is_preamble(uint16_t cc_data) { return 0x1040 =...
function eia608_is_midrowchange (line 86) | static inline int eia608_is_midrowchange(uint16_t cc_data) { return 0x11...
function eia608_is_specialna (line 90) | static inline int eia608_is_specialna(uint16_t cc_data) { return 0x1130 ...
function eia608_is_xds (line 94) | static inline int eia608_is_xds(uint16_t cc_data) { return 0x0000 == (0x...
function eia608_is_westeu (line 98) | static inline int eia608_is_westeu(uint16_t cc_data) { return 0x1220 == ...
function eia608_is_control (line 102) | static inline int eia608_is_control(uint16_t cc_data) { return 0x1420 ==...
function eia608_is_norpak (line 106) | static inline int eia608_is_norpak(uint16_t cc_data) { return 0x1724 == ...
function eia608_is_padding (line 110) | static inline int eia608_is_padding(uint16_t cc_data) { return 0x8080 ==...
type eia608_style_t (line 114) | typedef enum {
type eia608_control_t (line 147) | typedef enum {
function eia608_tab (line 176) | static inline uint16_t eia608_tab(int size, int cc) { return eia608_cont...
FILE: deps/libcaption/caption/mpeg.h
type mpeg_bitstream_t (line 44) | typedef struct {
function libcaption_stauts_t (line 66) | static inline libcaption_stauts_t mpeg_bitstream_status(mpeg_bitstream_t...
type sei_msgtype_t (line 74) | typedef enum {
type sei_message_t (line 99) | typedef struct _sei_message_t {
type sei_t (line 105) | typedef struct {
function sei_message_t (line 134) | static inline sei_message_t* sei_message_head(sei_t* sei) { return sei->...
function sei_message_t (line 138) | static inline sei_message_t* sei_message_tail(sei_t* sei) { return sei->...
function sei_message_t (line 162) | static inline sei_message_t* sei_message_copy(sei_message_t* msg)
FILE: deps/libcaption/caption/scc.h
type scc_t (line 32) | typedef struct _scc_t {
FILE: deps/libcaption/caption/srt.h
type vtt_t (line 35) | typedef vtt_t srt_t;
type vtt_block_t (line 36) | typedef vtt_block_t srt_cue_t;
function vtt_block_t (line 59) | static inline vtt_block_t* srt_next(vtt_block_t* srt) { return srt->next; }
function utf8_char_t (line 64) | static inline utf8_char_t* srt_cue_data(srt_cue_t* cue) { return vtt_blo...
function srt_cue_t (line 69) | static inline srt_cue_t* srt_cue_from_caption_frame(caption_frame_t* fra...
function srt_cue_free_head (line 74) | static inline void srt_cue_free_head(srt_t* srt) { vtt_cue_free_head(srt...
function srt_cue_t (line 79) | static inline srt_cue_t* srt_cue_new(srt_t* srt, const utf8_char_t* data...
function srt_cue_to_caption_frame (line 84) | static inline int srt_cue_to_caption_frame(srt_cue_t* cue, caption_frame...
FILE: deps/libcaption/caption/utf8.h
type utf8_char_t (line 38) | typedef char utf8_char_t;
type utf8_size_t (line 39) | typedef size_t utf8_size_t;
FILE: deps/libcaption/caption/vtt.h
type VTT_BLOCK_TYPE (line 33) | enum VTT_BLOCK_TYPE {
type vtt_block_t (line 41) | typedef struct _vtt_block_t {
type vtt_t (line 56) | typedef struct _vtt_t {
type VTT_BLOCK_TYPE (line 77) | enum VTT_BLOCK_TYPE
function vtt_block_t (line 108) | static inline vtt_block_t* vtt_cue_next(vtt_block_t* block) { return blo...
function utf8_char_t (line 113) | static inline utf8_char_t* vtt_block_data(vtt_block_t* block) { return (...
function vtt_crack_time (line 118) | static inline void vtt_crack_time(double tt, int* hh, int* mm, int* ss, ...
FILE: deps/libcaption/caption/xds.h
type xds_t (line 33) | typedef struct {
FILE: deps/libcaption/src/caption.c
function caption_frame_buffer_clear (line 31) | void caption_frame_buffer_clear(caption_frame_buffer_t* buff)
function caption_frame_state_clear (line 36) | void caption_frame_state_clear(caption_frame_t* frame)
function caption_frame_init (line 43) | void caption_frame_init(caption_frame_t* frame)
function caption_frame_cell_t (line 52) | static caption_frame_cell_t* frame_buffer_cell(caption_frame_buffer_t* b...
function caption_frame_write_char (line 62) | int caption_frame_write_char(caption_frame_t* frame, int row, int col, e...
function utf8_char_t (line 79) | const utf8_char_t* caption_frame_read_char(caption_frame_t* frame, int r...
function libcaption_stauts_t (line 109) | libcaption_stauts_t caption_frame_carriage_return(caption_frame_t* frame)
function libcaption_stauts_t (line 133) | libcaption_stauts_t eia608_write_char(caption_frame_t* frame, char* c)
function libcaption_stauts_t (line 144) | libcaption_stauts_t caption_frame_end(caption_frame_t* frame)
function libcaption_stauts_t (line 151) | libcaption_stauts_t caption_frame_decode_preamble(caption_frame_t* frame...
function libcaption_stauts_t (line 166) | libcaption_stauts_t caption_frame_decode_midrowchange(caption_frame_t* f...
function libcaption_stauts_t (line 179) | libcaption_stauts_t caption_frame_backspace(caption_frame_t* frame)
function libcaption_stauts_t (line 187) | libcaption_stauts_t caption_frame_delete_to_end_of_row(caption_frame_t* ...
function libcaption_stauts_t (line 203) | libcaption_stauts_t caption_frame_decode_control(caption_frame_t* frame,...
function libcaption_stauts_t (line 275) | libcaption_stauts_t caption_frame_decode_text(caption_frame_t* frame, ui...
function libcaption_stauts_t (line 297) | libcaption_stauts_t caption_frame_decode(caption_frame_t* frame, uint16_...
function caption_frame_from_text (line 351) | int caption_frame_from_text(caption_frame_t* frame, const utf8_char_t* d...
function caption_frame_to_text (line 380) | size_t caption_frame_to_text(caption_frame_t* frame, utf8_char_t* data)
FILE: deps/libcaption/src/cea708.c
function cea708_cc_count (line 29) | int cea708_cc_count(user_data_t* data)
function cea708_cc_data (line 34) | uint16_t cea708_cc_data(user_data_t* data, int index, int* valid, cea708...
function cea708_init (line 41) | int cea708_init(cea708_t* cea708, double timestamp)
function cea708_parse_user_data_type_strcture (line 58) | void cea708_parse_user_data_type_strcture(const uint8_t* data, size_t si...
function libcaption_stauts_t (line 77) | libcaption_stauts_t cea708_parse_h264(const uint8_t* data, size_t size, ...
function libcaption_stauts_t (line 141) | libcaption_stauts_t cea708_parse_h262(const uint8_t* data, size_t size, ...
function cea708_add_cc_data (line 156) | int cea708_add_cc_data(cea708_t* cea708, int valid, cea708_cc_type_t typ...
function cea708_render (line 170) | int cea708_render(cea708_t* cea708, uint8_t* data, size_t size)
function cc_data_t (line 229) | cc_data_t cea708_encode_cc_data(int cc_valid, cea708_cc_type_t type, uin...
function cea708_dump (line 235) | void cea708_dump(cea708_t* cea708)
function libcaption_stauts_t (line 265) | libcaption_stauts_t cea708_to_caption_frame(caption_frame_t* frame, cea7...
FILE: deps/libcaption/src/dvtcc.c
type dtvcc_packet_t (line 3) | struct dtvcc_packet_t
function dtvcc_packet_data (line 15) | void dtvcc_packet_data(struct dtvcc_packet_t* dvtcc, uint8_t cc_data1, u...
FILE: deps/libcaption/src/eia608.c
function eia608_row_pramble (line 43) | static inline uint16_t eia608_row_pramble(int row, int chan, int x, int ...
function eia608_row_column_pramble (line 49) | uint16_t eia608_row_column_pramble(int row, int col, int chan, int under...
function eia608_row_style_pramble (line 50) | uint16_t eia608_row_style_pramble(int row, int chan, eia608_style_t styl...
function eia608_midrow_change (line 51) | uint16_t eia608_midrow_change(int chan, eia608_style_t style, int underl...
function eia608_parse_preamble (line 53) | int eia608_parse_preamble(uint16_t cc_data, int* row, int* col, eia608_s...
function eia608_parse_midrowchange (line 70) | int eia608_parse_midrowchange(uint16_t cc_data, int* chan, eia608_style_...
function eia608_control_t (line 83) | eia608_control_t eia608_parse_control(uint16_t cc_data, int* cc)
function eia608_control_command (line 94) | uint16_t eia608_control_command(eia608_control_t cmd, int cc)
function eia608_to_index (line 108) | static int eia608_to_index(uint16_t cc_data, int* chan, int* c1, int* c2)
function eia608_to_utf8 (line 153) | int eia608_to_utf8(uint16_t c, int* chan, char* str1, char* str2)
function eia608_from_basicna (line 162) | uint16_t eia608_from_basicna(uint16_t bna1, uint16_t bna2)
function eia608_from_utf8_1 (line 173) | uint16_t eia608_from_utf8_1(const utf8_char_t* c, int chan)
function eia608_from_utf8_2 (line 188) | uint16_t eia608_from_utf8_2(const utf8_char_t* c1, const utf8_char_t* c2)
function eia608_dump (line 195) | void eia608_dump(uint16_t cc_data)
FILE: deps/libcaption/src/eia608_from_utf8.c
function _eia608_from_utf8 (line 29) | uint16_t _eia608_from_utf8 (const utf8_char_t* s)
FILE: deps/libcaption/src/mpeg.c
function _find_emulation_prevention_byte (line 33) | static size_t _find_emulation_prevention_byte(const uint8_t* data, size_...
function _copy_to_rbsp (line 59) | static size_t _copy_to_rbsp(uint8_t* destData, size_t destSize, const ui...
function _find_emulated (line 89) | static inline size_t _find_emulated(uint8_t* data, size_t size)
function _copy_from_rbsp (line 112) | size_t _copy_from_rbsp(uint8_t* data, uint8_t* payloadData, size_t paylo...
function sei_message_t (line 139) | sei_message_t* sei_message_next(sei_message_t* msg) { return ((struct _s...
function sei_msgtype_t (line 140) | sei_msgtype_t sei_message_type(sei_message_t* msg) { return ((struct _se...
function sei_message_size (line 141) | size_t sei_message_size(sei_message_t* msg) { return ((struct _sei_messa...
type _sei_message_t (line 142) | struct _sei_message_t
function sei_message_free (line 143) | void sei_message_free(sei_message_t* msg)
function sei_message_t (line 150) | sei_message_t* sei_message_new(sei_msgtype_t type, uint8_t* data, size_t...
function sei_init (line 166) | void sei_init(sei_t* sei, double timestamp)
function sei_message_append (line 173) | void sei_message_append(sei_t* sei, sei_message_t* msg)
function sei_cat (line 184) | void sei_cat(sei_t* to, sei_t* from, int itu_t_t35)
function sei_free (line 198) | void sei_free(sei_t* sei)
function sei_dump (line 211) | void sei_dump(sei_t* sei)
function sei_dump_messages (line 217) | void sei_dump_messages(sei_message_t* head, double timestamp)
function sei_render_size (line 247) | size_t sei_render_size(sei_t* sei)
function sei_render (line 265) | size_t sei_render(sei_t* sei, uint8_t* data)
function libcaption_stauts_t (line 325) | libcaption_stauts_t sei_parse(sei_t* sei, const uint8_t* data, size_t si...
function libcaption_stauts_t (line 379) | libcaption_stauts_t sei_to_caption_frame(sei_t* sei, caption_frame_t* fr...
function sei_append_708 (line 403) | void sei_append_708(sei_t* sei, cea708_t* cea708)
function sei_encode_eia608 (line 414) | void sei_encode_eia608(sei_t* sei, cea708_t* cea708, uint16_t cc_data)
function libcaption_stauts_t (line 438) | libcaption_stauts_t sei_from_caption_frame(sei_t* sei, caption_frame_t* ...
function libcaption_stauts_t (line 532) | libcaption_stauts_t sei_from_scc(sei_t* sei, const scc_t* scc)
function libcaption_stauts_t (line 553) | libcaption_stauts_t sei_from_caption_clear(sei_t* sei)
function mpeg_bitstream_init (line 568) | void mpeg_bitstream_init(mpeg_bitstream_t* packet)
function mpeg_bitstream_packet_type (line 578) | uint8_t mpeg_bitstream_packet_type(mpeg_bitstream_t* packet, unsigned st...
function find_start_code (line 610) | static size_t find_start_code(const uint8_t* data, size_t size)
function cea708_t (line 623) | cea708_t* _mpeg_bitstream_cea708_at(mpeg_bitstream_t* packet, size_t pos...
function cea708_t (line 624) | cea708_t* _mpeg_bitstream_cea708_front(mpeg_bitstream_t* packet) { retur...
function cea708_t (line 625) | cea708_t* _mpeg_bitstream_cea708_back(mpeg_bitstream_t* packet) { return...
function cea708_t (line 626) | cea708_t* _mpeg_bitstream_cea708_emplace_back(mpeg_bitstream_t* packet, ...
function _mpeg_bitstream_cea708_sort (line 634) | void _mpeg_bitstream_cea708_sort(mpeg_bitstream_t* packet)
function mpeg_bitstream_flush (line 653) | size_t mpeg_bitstream_flush(mpeg_bitstream_t* packet, caption_frame_t* f...
function _mpeg_bitstream_cea708_sort_flush (line 665) | void _mpeg_bitstream_cea708_sort_flush(mpeg_bitstream_t* packet, caption...
function mpeg_bitstream_parse (line 674) | size_t mpeg_bitstream_parse(mpeg_bitstream_t* packet, caption_frame_t* f...
FILE: deps/libcaption/src/scc.c
function scc_t (line 30) | static scc_t* scc_relloc(scc_t* scc, unsigned int cc_count)
function scc_t (line 41) | scc_t* scc_new(int cc_count)
function scc_t (line 49) | scc_t* scc_free(scc_t* scc)
function scc_time_to_timestamp (line 55) | double scc_time_to_timestamp(int hh, int mm, int ss, int ff)
function scc_to_608 (line 61) | size_t scc_to_608(scc_t** scc, const utf8_char_t* data)
FILE: deps/libcaption/src/srt.c
function srt_t (line 31) | srt_t* srt_new()
function srt_free (line 36) | void srt_free(srt_t* srt)
function vtt_t (line 41) | vtt_t* srt_parse(const utf8_char_t* data, size_t size)
function srt_dump (line 46) | void srt_dump(srt_t* srt)
FILE: deps/libcaption/src/utf8.c
function utf8_char_t (line 30) | const utf8_char_t* utf8_char_next(const utf8_char_t* c)
function utf8_char_length (line 37) | size_t utf8_char_length(const utf8_char_t* c)
function utf8_char_whitespace (line 51) | int utf8_char_whitespace(const utf8_char_t* c)
function utf8_string_length (line 68) | size_t utf8_string_length(const utf8_char_t* data, utf8_size_t size)
function utf8_char_copy (line 88) | size_t utf8_char_copy(utf8_char_t* dst, const utf8_char_t* src)
function utf8_size_t (line 102) | utf8_size_t utf8_char_count(const char* data, size_t size)
function utf8_trimmed_length (line 121) | size_t utf8_trimmed_length(const utf8_char_t* data, utf8_size_t charcters)
function _utf8_newline (line 135) | size_t _utf8_newline(const utf8_char_t* data)
function utf8_line_length (line 147) | size_t utf8_line_length(const utf8_char_t* data)
function utf8_size_t (line 161) | utf8_size_t utf8_wrap_length(const utf8_char_t* data, utf8_size_t size)
function utf8_line_count (line 180) | int utf8_line_count(const utf8_char_t* data)
function utf8_char_t (line 194) | utf8_char_t* utf8_load_text_file(const char* path, size_t* size)
FILE: deps/libcaption/src/vtt.c
function vtt_t (line 32) | vtt_t* vtt_new()
function vtt_free (line 39) | void vtt_free(vtt_t* vtt)
function vtt_block_t (line 53) | vtt_block_t* vtt_block_new(vtt_t* vtt, const utf8_char_t* data, size_t s...
function vtt_block_t (line 104) | vtt_block_t* vtt_block_free_head(vtt_block_t* head)
function vtt_cue_free_head (line 117) | void vtt_cue_free_head(vtt_t* vtt)
function vtt_style_free_head (line 125) | void vtt_style_free_head(vtt_t* vtt)
function vtt_region_free_head (line 133) | void vtt_region_free_head(vtt_t* vtt)
function parse_timestamp (line 142) | double parse_timestamp(const utf8_char_t* line)
function parse_timestamps (line 154) | void parse_timestamps(const utf8_char_t* line, double* start_pts, double...
function vtt_t (line 181) | vtt_t* vtt_parse(const utf8_char_t* data, size_t size)
function vtt_t (line 186) | vtt_t* _vtt_parse(const utf8_char_t* data, size_t size, int srt_mode)
function vtt_cue_to_caption_frame (line 296) | int vtt_cue_to_caption_frame(vtt_block_t* cue, caption_frame_t* frame)
function vtt_block_t (line 302) | vtt_block_t* vtt_cue_from_caption_frame(caption_frame_t* frame, vtt_t* vtt)
function _dump (line 319) | static void _dump(vtt_t* vtt)
function vtt_dump (line 357) | void vtt_dump(vtt_t* head) { _dump(head); }
FILE: deps/libcaption/src/xds.c
function xds_init (line 29) | void xds_init(xds_t* xds)
function xds_decode (line 34) | int xds_decode(xds_t* xds, uint16_t cc)
FILE: deps/w32-pthreads/autostatic.c
function on_process_init (line 44) | static void on_process_init(void)
function on_process_exit (line 49) | static void on_process_exit(void)
FILE: deps/w32-pthreads/cleanup.c
function ptw32_cleanup_t (line 49) | ptw32_cleanup_t *
function ptw32_push_cleanup (line 98) | void
FILE: deps/w32-pthreads/create.c
function pthread_create (line 44) | int
FILE: deps/w32-pthreads/dll.c
function BOOL (line 56) | BOOL WINAPI
FILE: deps/w32-pthreads/implement.h
type PThreadState (line 114) | typedef enum
type ptw32_mcs_local_node_t (line 137) | typedef struct ptw32_mcs_node_t_ ptw32_mcs_local_node_t;
type ptw32_mcs_node_t_ (line 138) | struct ptw32_mcs_node_t_
type ptw32_robust_node_t (line 139) | typedef struct ptw32_robust_node_t_ ptw32_robust_node_t;
type ptw32_thread_t (line 140) | typedef struct ptw32_thread_t_ ptw32_thread_t;
type ptw32_thread_t_ (line 143) | struct ptw32_thread_t_
type pthread_attr_t_ (line 186) | struct pthread_attr_t_
type sem_t_ (line 209) | struct sem_t_
type pthread_mutex_t_ (line 222) | struct pthread_mutex_t_
type ptw32_robust_state_t_ (line 241) | enum ptw32_robust_state_t_
type ptw32_robust_state_t (line 248) | typedef enum ptw32_robust_state_t_ ptw32_robust_state_t;
type ptw32_robust_node_t_ (line 253) | struct ptw32_robust_node_t_
type pthread_mutexattr_t_ (line 261) | struct pthread_mutexattr_t_
type pthread_spinlock_t_ (line 290) | struct pthread_spinlock_t_
type ptw32_mcs_node_t_ (line 303) | struct ptw32_mcs_node_t_
type pthread_barrier_t_ (line 314) | struct pthread_barrier_t_
type pthread_barrierattr_t_ (line 324) | struct pthread_barrierattr_t_
type pthread_key_t_ (line 329) | struct pthread_key_t_
type ThreadParms (line 338) | typedef struct ThreadParms ThreadParms;
type ThreadParms (line 340) | struct ThreadParms
type pthread_cond_t_ (line 348) | struct pthread_cond_t_
type pthread_condattr_t_ (line 366) | struct pthread_condattr_t_
type pthread_rwlock_t_ (line 373) | struct pthread_rwlock_t_
type pthread_rwlockattr_t_ (line 384) | struct pthread_rwlockattr_t_
type ThreadKeyAssoc (line 389) | typedef struct ThreadKeyAssoc ThreadKeyAssoc;
type ThreadKeyAssoc (line 391) | struct ThreadKeyAssoc
type timespec (line 654) | struct timespec
type timespec (line 665) | struct timespec
type timespec (line 666) | struct timespec
FILE: deps/w32-pthreads/pthread.h
type DWORD_PTR (line 205) | typedef unsigned long DWORD_PTR;
type ULONG_PTR (line 206) | typedef unsigned long ULONG_PTR;
type timespec (line 324) | struct timespec {
type ptw32_handle_t (line 584) | typedef struct {
type ptw32_handle_t (line 589) | typedef ptw32_handle_t pthread_t;
type pthread_attr_t_ (line 590) | struct pthread_attr_t_
type pthread_once_t (line 591) | typedef struct pthread_once_t_ pthread_once_t;
type pthread_key_t_ (line 592) | struct pthread_key_t_
type pthread_mutex_t_ (line 593) | struct pthread_mutex_t_
type pthread_mutexattr_t_ (line 594) | struct pthread_mutexattr_t_
type pthread_cond_t_ (line 595) | struct pthread_cond_t_
type pthread_condattr_t_ (line 596) | struct pthread_condattr_t_
type pthread_rwlock_t_ (line 598) | struct pthread_rwlock_t_
type pthread_rwlockattr_t_ (line 599) | struct pthread_rwlockattr_t_
type pthread_spinlock_t_ (line 600) | struct pthread_spinlock_t_
type pthread_barrier_t_ (line 601) | struct pthread_barrier_t_
type pthread_barrierattr_t_ (line 602) | struct pthread_barrierattr_t_
type pthread_once_t_ (line 681) | struct pthread_once_t_
type ptw32_cleanup_t (line 733) | typedef struct ptw32_cleanup_t ptw32_cleanup_t;
type ptw32_cleanup_t (line 746) | struct ptw32_cleanup_t
function class (line 805) | class PThreadCleanup {
function execute (line 853) | void execute( int exec )
type sched_param (line 918) | struct sched_param
type sched_param (line 921) | struct sched_param
type timespec (line 1045) | struct timespec
type timespec (line 1103) | struct timespec
type sched_param (line 1114) | struct sched_param
type sched_param (line 1118) | struct sched_param
type timespec (line 1139) | struct timespec
type timespec (line 1144) | struct timespec
type timespec (line 1181) | struct timespec
type ptw32_features (line 1198) | enum ptw32_features {
function class (line 1277) | class ptw32_exception {}
function class (line 1278) | class ptw32_exception_cancel : public ptw32_exception {}
function class (line 1279) | class ptw32_exception_exit : public ptw32_exception {}
FILE: deps/w32-pthreads/pthread_attr_destroy.c
function pthread_attr_destroy (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_getdetachstate.c
function pthread_attr_getdetachstate (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_getinheritsched.c
function pthread_attr_getinheritsched (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_getschedparam.c
function pthread_attr_getschedparam (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_getschedpolicy.c
function pthread_attr_getschedpolicy (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_getscope.c
function pthread_attr_getscope (line 45) | int
FILE: deps/w32-pthreads/pthread_attr_getstackaddr.c
function pthread_attr_getstackaddr (line 45) | int
FILE: deps/w32-pthreads/pthread_attr_getstacksize.c
function pthread_attr_getstacksize (line 45) | int
FILE: deps/w32-pthreads/pthread_attr_init.c
function pthread_attr_init (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_setdetachstate.c
function pthread_attr_setdetachstate (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_setinheritsched.c
function pthread_attr_setinheritsched (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_setschedparam.c
function pthread_attr_setschedparam (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_setschedpolicy.c
function pthread_attr_setschedpolicy (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_setscope.c
function pthread_attr_setscope (line 45) | int
FILE: deps/w32-pthreads/pthread_attr_setstackaddr.c
function pthread_attr_setstackaddr (line 41) | int
FILE: deps/w32-pthreads/pthread_attr_setstacksize.c
function pthread_attr_setstacksize (line 41) | int
FILE: deps/w32-pthreads/pthread_barrier_destroy.c
function pthread_barrier_destroy (line 40) | int
FILE: deps/w32-pthreads/pthread_barrier_init.c
function pthread_barrier_init (line 41) | int
FILE: deps/w32-pthreads/pthread_barrier_wait.c
function pthread_barrier_wait (line 41) | int
FILE: deps/w32-pthreads/pthread_barrierattr_destroy.c
function pthread_barrierattr_destroy (line 41) | int
FILE: deps/w32-pthreads/pthread_barrierattr_getpshared.c
function pthread_barrierattr_getpshared (line 41) | int
FILE: deps/w32-pthreads/pthread_barrierattr_init.c
function pthread_barrierattr_init (line 41) | int
FILE: deps/w32-pthreads/pthread_barrierattr_setpshared.c
function pthread_barrierattr_setpshared (line 41) | int
FILE: deps/w32-pthreads/pthread_cancel.c
function ptw32_cancel_self (line 41) | static void
function ptw32_cancel_callback (line 49) | static void CALLBACK
function DWORD (line 62) | DWORD
function pthread_cancel (line 74) | int
FILE: deps/w32-pthreads/pthread_cond_destroy.c
function pthread_cond_destroy (line 41) | int
FILE: deps/w32-pthreads/pthread_cond_init.c
function pthread_cond_init (line 42) | int
FILE: deps/w32-pthreads/pthread_cond_signal.c
function INLINE (line 45) | static INLINE int
function pthread_cond_signal (line 152) | int
function pthread_cond_broadcast (line 194) | int
FILE: deps/w32-pthreads/pthread_cond_wait.c
type ptw32_cond_wait_cleanup_args_t (line 268) | typedef struct
function ptw32_cond_wait_cleanup (line 275) | static void PTW32_CDECL
function INLINE (line 353) | static INLINE int
function pthread_cond_wait (line 453) | int
function pthread_cond_timedwait (line 511) | int
FILE: deps/w32-pthreads/pthread_condattr_destroy.c
function pthread_condattr_destroy (line 42) | int
FILE: deps/w32-pthreads/pthread_condattr_getpshared.c
function pthread_condattr_getpshared (line 42) | int
FILE: deps/w32-pthreads/pthread_condattr_init.c
function pthread_condattr_init (line 42) | int
FILE: deps/w32-pthreads/pthread_condattr_setpshared.c
function pthread_condattr_setpshared (line 42) | int
FILE: deps/w32-pthreads/pthread_delay_np.c
function pthread_delay_np (line 81) | int
FILE: deps/w32-pthreads/pthread_detach.c
function pthread_detach (line 50) | int
FILE: deps/w32-pthreads/pthread_equal.c
function pthread_equal (line 41) | int
FILE: deps/w32-pthreads/pthread_exit.c
function pthread_exit (line 44) | void
FILE: deps/w32-pthreads/pthread_getconcurrency.c
function pthread_getconcurrency (line 41) | int
FILE: deps/w32-pthreads/pthread_getschedparam.c
function pthread_getschedparam (line 41) | int
FILE: deps/w32-pthreads/pthread_getunique_np.c
function pthread_getunique_np (line 43) | unsigned __int64
FILE: deps/w32-pthreads/pthread_getw32threadhandle_np.c
function HANDLE (line 49) | HANDLE
function DWORD (line 61) | DWORD
FILE: deps/w32-pthreads/pthread_join.c
function pthread_join (line 50) | int
FILE: deps/w32-pthreads/pthread_key_create.c
function pthread_key_create (line 46) | int
FILE: deps/w32-pthreads/pthread_key_delete.c
function pthread_key_delete (line 41) | int
FILE: deps/w32-pthreads/pthread_kill.c
function pthread_kill (line 48) | int
FILE: deps/w32-pthreads/pthread_mutex_consistent.c
function INLINE (line 42) | INLINE
function INLINE (line 81) | INLINE
function INLINE (line 107) | INLINE
function pthread_mutex_consistent (line 132) | int
FILE: deps/w32-pthreads/pthread_mutex_destroy.c
function pthread_mutex_destroy (line 41) | int
FILE: deps/w32-pthreads/pthread_mutex_init.c
function pthread_mutex_init (line 41) | int
FILE: deps/w32-pthreads/pthread_mutex_lock.c
function pthread_mutex_lock (line 43) | int
FILE: deps/w32-pthreads/pthread_mutex_timedlock.c
function INLINE (line 41) | static INLINE int
function pthread_mutex_timedlock (line 108) | int
FILE: deps/w32-pthreads/pthread_mutex_trylock.c
function pthread_mutex_trylock (line 41) | int
FILE: deps/w32-pthreads/pthread_mutex_unlock.c
function pthread_mutex_unlock (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_destroy.c
function pthread_mutexattr_destroy (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_getkind_np.c
function pthread_mutexattr_getkind_np (line 40) | int
FILE: deps/w32-pthreads/pthread_mutexattr_getpshared.c
function pthread_mutexattr_getpshared (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_getrobust.c
function pthread_mutexattr_getrobust (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_gettype.c
function pthread_mutexattr_gettype (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_init.c
function pthread_mutexattr_init (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_setkind_np.c
function pthread_mutexattr_setkind_np (line 40) | int
FILE: deps/w32-pthreads/pthread_mutexattr_setpshared.c
function pthread_mutexattr_setpshared (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_setrobust.c
function pthread_mutexattr_setrobust (line 41) | int
FILE: deps/w32-pthreads/pthread_mutexattr_settype.c
function pthread_mutexattr_settype (line 41) | int
FILE: deps/w32-pthreads/pthread_num_processors_np.c
function pthread_num_processors_np (line 45) | int
FILE: deps/w32-pthreads/pthread_once.c
function pthread_once (line 40) | int
FILE: deps/w32-pthreads/pthread_rwlock_destroy.c
function pthread_rwlock_destroy (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_init.c
function pthread_rwlock_init (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_rdlock.c
function pthread_rwlock_rdlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_timedrdlock.c
function pthread_rwlock_timedrdlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_timedwrlock.c
function pthread_rwlock_timedwrlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_tryrdlock.c
function pthread_rwlock_tryrdlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_trywrlock.c
function pthread_rwlock_trywrlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_unlock.c
function pthread_rwlock_unlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlock_wrlock.c
function pthread_rwlock_wrlock (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlockattr_destroy.c
function pthread_rwlockattr_destroy (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlockattr_getpshared.c
function pthread_rwlockattr_getpshared (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlockattr_init.c
function pthread_rwlockattr_init (line 42) | int
FILE: deps/w32-pthreads/pthread_rwlockattr_setpshared.c
function pthread_rwlockattr_setpshared (line 42) | int
FILE: deps/w32-pthreads/pthread_self.c
function pthread_t (line 40) | pthread_t
FILE: deps/w32-pthreads/pthread_setcancelstate.c
function pthread_setcancelstate (line 41) | int
FILE: deps/w32-pthreads/pthread_setcanceltype.c
function pthread_setcanceltype (line 41) | int
FILE: deps/w32-pthreads/pthread_setconcurrency.c
function pthread_setconcurrency (line 41) | int
FILE: deps/w32-pthreads/pthread_setschedparam.c
function pthread_setschedparam (line 41) | int
function ptw32_setthreadpriority (line 70) | int
FILE: deps/w32-pthreads/pthread_setspecific.c
function pthread_setspecific (line 41) | int
FILE: deps/w32-pthreads/pthread_spin_destroy.c
function pthread_spin_destroy (line 41) | int
FILE: deps/w32-pthreads/pthread_spin_init.c
function pthread_spin_init (line 41) | int
FILE: deps/w32-pthreads/pthread_spin_lock.c
function pthread_spin_lock (line 41) | int
FILE: deps/w32-pthreads/pthread_spin_trylock.c
function pthread_spin_trylock (line 41) | int
FILE: deps/w32-pthreads/pthread_spin_unlock.c
function pthread_spin_unlock (line 41) | int
FILE: deps/w32-pthreads/pthread_testcancel.c
function pthread_testcancel (line 41) | void
FILE: deps/w32-pthreads/pthread_win32_attach_detach_np.c
function BOOL (line 47) | BOOL
function BOOL (line 144) | BOOL
function BOOL (line 193) | BOOL
function BOOL (line 199) | BOOL
function BOOL (line 254) | BOOL
FILE: deps/w32-pthreads/ptw32_MCS_lock.c
function INLINE (line 102) | INLINE void
function INLINE (line 122) | INLINE void
function ptw32_mcs_lock_acquire (line 157) | void
function ptw32_mcs_lock_release (line 191) | void
function ptw32_mcs_lock_try_acquire (line 228) | int
function ptw32_mcs_node_transfer (line 256) | void
FILE: deps/w32-pthreads/ptw32_OLL_lock.c
type ptw32_oll_counter_t (line 55) | typedef union ptw32_oll_counter_t_ ptw32_oll_counter_t;
type ptw32_oll_snziRoot_t (line 56) | typedef struct ptw32_oll_snziRoot_t_ ptw32_oll_snziRoot_t;
type ptw32_oll_snziNode_t (line 57) | typedef struct ptw32_oll_snziNode_t_ ptw32_oll_snziNode_t;
type ptw32_oll_snziNodeOrRoot_t (line 58) | typedef union ptw32_oll_snziNodeOrRoot_t_ ptw32_oll_snziNodeOrRoot_t;
type ptw32_oll_queryResult_t (line 59) | typedef struct ptw32_oll_queryResult_t_ ptw32_oll_queryResult_t;
type ptw32_oll_ticket_t (line 60) | typedef struct ptw32_oll_ticket_t_ ptw32_oll_ticket_t;
type ptw32_oll_csnzi_t (line 61) | typedef struct ptw32_oll_csnzi_t_ ptw32_oll_csnzi_t;
type ptw32_oll_snziRoot_t_ (line 90) | struct ptw32_oll_snziRoot_t_
type ptw32_oll_queryResult_t_ (line 122) | struct ptw32_oll_queryResult_t_
type ptw32_oll_snziNode_t_ (line 134) | struct ptw32_oll_snziNode_t_
type ptw32_oll_ticket_t_ (line 143) | struct ptw32_oll_ticket_t_
type ptw32_oll_csnzi_t_ (line 150) | struct ptw32_oll_csnzi_t_
type ptw32_foll_node_t (line 160) | typedef struct ptw32_foll_node_t_ ptw32_foll_node_t;
type ptw32_foll_local_t (line 161) | typedef struct ptw32_foll_local_t_ ptw32_foll_local_t;
type ptw32_foll_rwlock_t (line 162) | typedef struct ptw32_foll_rwlock_t_ ptw32_foll_rwlock_t;
type ptw32_foll_node_t_ (line 176) | struct ptw32_foll_node_t_
type ptw32_foll_local_t_ (line 186) | struct ptw32_foll_local_t_
type ptw32_foll_rwlock_t_ (line 194) | struct ptw32_foll_rwlock_t_
function BOOL (line 210) | BOOL
function ptw32_oll_GetLeafForThread (line 216) | size_t
function ptw32_oll_ticket_t (line 232) | ptw32_oll_ticket_t
function BOOL (line 276) | BOOL
function BOOL (line 288) | BOOL
function BOOL (line 343) | BOOL
function ptw32_oll_Open (line 384) | void
function ptw32_oll_OpenWithArrivals (line 395) | void
function BOOL (line 407) | BOOL
function BOOL (line 433) | BOOL
function ptw32_oll_queryResult_t (line 458) | ptw32_oll_queryResult_t
function BOOL (line 473) | BOOL
function ptw32_oll_ticket_t (line 483) | ptw32_oll_ticket_t
type ptw32_srwl_rwlock_t (line 493) | typedef struct ptw32_srwl_rwlock_t_ ptw32_srwl_rwlock_t;
type ptw32_srwl_node_t (line 494) | typedef struct ptw32_srwl_node_t_ ptw32_srwl_node_t;
type ptw32_srwl_local_t (line 495) | typedef struct ptw32_srwl_local_t_ ptw32_srwl_local_t;
type ptw32_srwl_rwlock_t_ (line 509) | struct ptw32_srwl_rwlock_t_
type ptw32_srwl_node_t_ (line 515) | struct ptw32_srwl_node_t_
type ptw32_srwl_local_t_ (line 530) | struct ptw32_srwl_local_t_
function ptw32_srwl_node_t (line 539) | ptw32_srwl_node_t*
function ptw32_srwl_FreeReaderNode (line 564) | void
function ptw32_srwl_WriterLock (line 570) | void
function ptw32_srwl_WriterUnlock (line 607) | void
function ptw32_srwl_ReaderLock (line 630) | void
function ptw32_srwl_ReaderUnlock (line 713) | void
function main (line 729) | int main()
FILE: deps/w32-pthreads/ptw32_callUserDestroyRoutines.c
function ptw32_callUserDestroyRoutines (line 58) | void
FILE: deps/w32-pthreads/ptw32_cond_check_need_init.c
function INLINE (line 42) | INLINE int
FILE: deps/w32-pthreads/ptw32_getprocessors.c
function ptw32_getprocessors (line 55) | int
FILE: deps/w32-pthreads/ptw32_is_attr.c
function ptw32_is_attr (line 40) | int
FILE: deps/w32-pthreads/ptw32_mutex_check_need_init.c
type pthread_mutexattr_t_ (line 40) | struct pthread_mutexattr_t_
type pthread_mutexattr_t_ (line 42) | struct pthread_mutexattr_t_
function INLINE (line 48) | INLINE int
FILE: deps/w32-pthreads/ptw32_new.c
function pthread_t (line 41) | pthread_t
FILE: deps/w32-pthreads/ptw32_processInitialize.c
function ptw32_processInitialize (line 42) | int
FILE: deps/w32-pthreads/ptw32_processTerminate.c
function ptw32_processTerminate (line 42) | void
FILE: deps/w32-pthreads/ptw32_relmillisecs.c
function DWORD (line 47) | DWORD
FILE: deps/w32-pthreads/ptw32_reuse.c
function pthread_t (line 75) | pthread_t
function ptw32_threadReusePush (line 113) | void
FILE: deps/w32-pthreads/ptw32_rwlock_cancelwrwait.c
function ptw32_rwlock_cancelwrwait (line 40) | void
FILE: deps/w32-pthreads/ptw32_rwlock_check_need_init.c
function INLINE (line 40) | INLINE int
FILE: deps/w32-pthreads/ptw32_semwait.c
function ptw32_semwait (line 44) | int
FILE: deps/w32-pthreads/ptw32_spinlock_check_need_init.c
function INLINE (line 41) | INLINE int
FILE: deps/w32-pthreads/ptw32_threadDestroy.c
function ptw32_threadDestroy (line 42) | void
FILE: deps/w32-pthreads/ptw32_threadStart.c
function DWORD (line 48) | static DWORD
type terminate_handler (line 92) | typedef terminate_handler
type terminate_handler (line 106) | typedef terminate_handler
function ptw32_terminate (line 113) | void
function ptw32_threadStart (line 124) | unsigned
FILE: deps/w32-pthreads/ptw32_throw.c
function ptw32_pop_cleanup_all (line 168) | void
function DWORD (line 177) | DWORD
FILE: deps/w32-pthreads/ptw32_timespec.c
function INLINE (line 50) | INLINE void
function INLINE (line 65) | INLINE void
FILE: deps/w32-pthreads/ptw32_tkAssocCreate.c
function ptw32_tkAssocCreate (line 42) | int
FILE: deps/w32-pthreads/ptw32_tkAssocDestroy.c
function ptw32_tkAssocDestroy (line 42) | void
FILE: deps/w32-pthreads/sched.h
type pid_t (line 126) | typedef int pid_t;
type pid_t (line 129) | typedef int pid_t;
type sched_param (line 142) | struct sched_param {
FILE: deps/w32-pthreads/sched_get_priority_max.c
function sched_get_priority_max (line 118) | int
FILE: deps/w32-pthreads/sched_get_priority_min.c
function sched_get_priority_min (line 119) | int
FILE: deps/w32-pthreads/sched_getscheduler.c
function sched_getscheduler (line 41) | int
FILE: deps/w32-pthreads/sched_setscheduler.c
function sched_setscheduler (line 41) | int
FILE: deps/w32-pthreads/sched_yield.c
function sched_yield (line 41) | int
FILE: deps/w32-pthreads/sem_close.c
function sem_close (line 53) | int
FILE: deps/w32-pthreads/sem_destroy.c
function sem_destroy (line 49) | int
FILE: deps/w32-pthreads/sem_getvalue.c
function sem_getvalue (line 49) | int
FILE: deps/w32-pthreads/sem_init.c
function sem_init (line 46) | int
FILE: deps/w32-pthreads/sem_open.c
function sem_open (line 53) | int
FILE: deps/w32-pthreads/sem_post.c
function sem_post (line 49) | int
FILE: deps/w32-pthreads/sem_post_multiple.c
function sem_post_multiple (line 49) | int
FILE: deps/w32-pthreads/sem_timedwait.c
type sem_timedwait_cleanup_args_t (line 49) | typedef struct {
function ptw32_sem_timedwait_cleanup (line 55) | static void PTW32_CDECL
function sem_timedwait (line 97) | int
FILE: deps/w32-pthreads/sem_trywait.c
function sem_trywait (line 49) | int
FILE: deps/w32-pthreads/sem_unlink.c
function sem_unlink (line 53) | int
FILE: deps/w32-pthreads/sem_wait.c
function ptw32_sem_wait_cleanup (line 49) | static void PTW32_CDECL
function sem_wait (line 82) | int
FILE: deps/w32-pthreads/semaphore.h
type mode_t (line 126) | typedef unsigned int mode_t;
type sem_t_ (line 130) | struct sem_t_
type timespec (line 143) | struct timespec
FILE: deps/w32-pthreads/signal.c
function ptw32_signal_thread (line 89) | static void
function ptw32_signal_callhandler (line 94) | static void
function pthread_sigmask (line 99) | int
function sigwait (line 167) | int
function sigaction (line 174) | int
FILE: deps/w32-pthreads/tests/barrier1.c
function main (line 44) | int
FILE: deps/w32-pthreads/tests/barrier2.c
function main (line 45) | int
FILE: deps/w32-pthreads/tests/barrier3.c
function main (line 51) | int
FILE: deps/w32-pthreads/tests/barrier4.c
function main (line 78) | int
FILE: deps/w32-pthreads/tests/barrier5.c
function main (line 78) | int
FILE: deps/w32-pthreads/tests/barrier6.c
function main (line 72) | int
FILE: deps/w32-pthreads/tests/benchlib.c
function dummy_call (line 54) | void
function interlocked_inc_with_conditionals (line 59) | void
function interlocked_dec_with_conditionals (line 69) | void
function old_mutex_init (line 79) | int
function old_mutex_lock (line 182) | int
function old_mutex_unlock (line 221) | int
function old_mutex_trylock (line 254) | int
function old_mutex_destroy (line 307) | int
FILE: deps/w32-pthreads/tests/benchtest.h
type old_mutex_t_ (line 44) | struct old_mutex_t_ {
type old_mutex_t_ (line 49) | struct old_mutex_t_
type old_mutexattr_t_ (line 51) | struct old_mutexattr_t_ {
type old_mutexattr_t_ (line 55) | struct old_mutexattr_t_
FILE: deps/w32-pthreads/tests/benchtest1.c
function runTest (line 79) | void
function main (line 103) | int
FILE: deps/w32-pthreads/tests/benchtest2.c
function runTest (line 143) | void
function main (line 176) | int
FILE: deps/w32-pthreads/tests/benchtest3.c
function runTest (line 98) | void
function main (line 122) | int
FILE: deps/w32-pthreads/tests/benchtest4.c
function oldRunTest (line 76) | void
function runTest (line 82) | void
function main (line 106) | int
FILE: deps/w32-pthreads/tests/benchtest5.c
function reportTest (line 77) | void
function main (line 89) | int
FILE: deps/w32-pthreads/tests/cancel1.c
type bag_t (line 84) | typedef struct bag_t_ bag_t;
type bag_t_ (line 85) | struct bag_t_ {
function main (line 125) | int
FILE: deps/w32-pthreads/tests/cancel2.c
type bag_t (line 89) | typedef struct bag_t_ bag_t;
type bag_t_ (line 90) | struct bag_t_ {
function PtW32CatchAll (line 146) | PtW32CatchAll
function main (line 166) | int
function main (line 250) | int
FILE: deps/w32-pthreads/tests/cancel3.c
type bag_t (line 85) | typedef struct bag_t_ bag_t;
type bag_t_ (line 86) | struct bag_t_
function main (line 122) | int
FILE: deps/w32-pthreads/tests/cancel4.c
type bag_t (line 88) | typedef struct bag_t_ bag_t;
type bag_t_ (line 89) | struct bag_t_ {
function main (line 124) | int
FILE: deps/w32-pthreads/tests/cancel5.c
type bag_t (line 85) | typedef struct bag_t_ bag_t;
type bag_t_ (line 86) | struct bag_t_
function main (line 122) | int
FILE: deps/w32-pthreads/tests/cancel6a.c
type bag_t (line 75) | typedef struct bag_t_ bag_t;
type bag_t_ (line 76) | struct bag_t_ {
function main (line 111) | int
FILE: deps/w32-pthreads/tests/cancel6d.c
type bag_t (line 76) | typedef struct bag_t_ bag_t;
type bag_t_ (line 77) | struct bag_t_ {
function main (line 115) | int
FILE: deps/w32-pthreads/tests/cancel7.c
type bag_t (line 87) | typedef struct bag_t_ bag_t;
type bag_t_ (line 88) | struct bag_t_ {
function Win32thread (line 101) | void
function main (line 126) | int
FILE: deps/w32-pthreads/tests/cancel8.c
type bag_t (line 87) | typedef struct bag_t_ bag_t;
type bag_t_ (line 88) | struct bag_t_ {
function Win32thread (line 104) | void
function main (line 127) | int
FILE: deps/w32-pthreads/tests/cancel9.c
type sockaddr_in (line 82) | struct sockaddr_in
type sockaddr_in (line 83) | struct sockaddr_in
type sockaddr (line 111) | struct sockaddr
type sockaddr_in (line 112) | struct sockaddr_in
type sockaddr (line 118) | struct sockaddr
type sockaddr (line 124) | struct sockaddr
function main (line 161) | int
FILE: deps/w32-pthreads/tests/cleanup0.c
type bag_t (line 85) | typedef struct bag_t_ bag_t;
type bag_t_ (line 86) | struct bag_t_ {
type sharedInt_t (line 95) | typedef struct {
function increment_pop_count (line 102) | static void
function main (line 143) | int
function main (line 223) | int
FILE: deps/w32-pthreads/tests/cleanup1.c
type bag_t (line 85) | typedef struct bag_t_ bag_t;
type bag_t_ (line 86) | struct bag_t_ {
type sharedInt_t (line 95) | typedef struct {
function main (line 152) | int
function main (line 236) | int
FILE: deps/w32-pthreads/tests/cleanup2.c
type bag_t (line 85) | typedef struct bag_t_ bag_t;
type bag_t_ (line 86) | struct bag_t_ {
type sharedInt_t (line 95) | typedef struct {
function increment_pop_count (line 102) | static void
function main (line 137) | int
function main (line 211) | int
FILE: deps/w32-pthreads/tests/cleanup3.c
type bag_t (line 86) | typedef struct bag_t_ bag_t;
type bag_t_ (line 87) | struct bag_t_ {
type sharedInt_t (line 96) | typedef struct {
function increment_pop_count (line 103) | static void
function main (line 142) | int
function main (line 216) | int
FILE: deps/w32-pthreads/tests/condvar1.c
function main (line 83) | int
FILE: deps/w32-pthreads/tests/condvar1_1.c
function main (line 86) | int
FILE: deps/w32-pthreads/tests/condvar1_2.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/condvar2.c
function main (line 86) | int
FILE: deps/w32-pthreads/tests/condvar2_1.c
type timespec (line 83) | struct timespec
function main (line 103) | int
FILE: deps/w32-pthreads/tests/condvar3.c
function main (line 110) | int
FILE: deps/w32-pthreads/tests/condvar3_1.c
type timespec (line 87) | struct timespec
function main (line 124) | int
FILE: deps/w32-pthreads/tests/condvar3_2.c
type timespec (line 85) | struct timespec
type timespec (line 86) | struct timespec
function main (line 125) | int
FILE: deps/w32-pthreads/tests/condvar3_3.c
function main (line 85) | int main()
FILE: deps/w32-pthreads/tests/condvar4.c
type cvthing_t (line 80) | typedef struct cvthing_t_ cvthing_t;
type cvthing_t_ (line 82) | struct cvthing_t_ {
function main (line 110) | int
FILE: deps/w32-pthreads/tests/condvar5.c
type cvthing_t (line 79) | typedef struct cvthing_t_ cvthing_t;
type cvthing_t_ (line 81) | struct cvthing_t_ {
function main (line 109) | int
FILE: deps/w32-pthreads/tests/condvar6.c
type bag_t (line 84) | typedef struct bag_t_ bag_t;
type bag_t_ (line 85) | struct bag_t_ {
type cvthing_t (line 93) | typedef struct cvthing_t_ cvthing_t;
type cvthing_t_ (line 95) | struct cvthing_t_ {
type timespec (line 109) | struct timespec
function main (line 140) | int
FILE: deps/w32-pthreads/tests/condvar7.c
type bag_t (line 84) | typedef struct bag_t_ bag_t;
type bag_t_ (line 85) | struct bag_t_ {
type cvthing_t (line 93) | typedef struct cvthing_t_ cvthing_t;
type cvthing_t_ (line 95) | struct cvthing_t_ {
type timespec (line 109) | struct timespec
function main (line 150) | int
FILE: deps/w32-pthreads/tests/condvar8.c
type bag_t (line 84) | typedef struct bag_t_ bag_t;
type bag_t_ (line 85) | struct bag_t_ {
type cvthing_t (line 93) | typedef struct cvthing_t_ cvthing_t;
type cvthing_t_ (line 95) | struct cvthing_t_ {
type timespec (line 109) | struct timespec
function main (line 150) | int
FILE: deps/w32-pthreads/tests/condvar9.c
type bag_t (line 85) | typedef struct bag_t_ bag_t;
type bag_t_ (line 86) | struct bag_t_ {
type cvthing_t (line 95) | typedef struct cvthing_t_ cvthing_t;
type cvthing_t_ (line 97) | struct cvthing_t_ {
type timespec (line 111) | struct timespec
function main (line 157) | int
FILE: deps/w32-pthreads/tests/context1.c
function anotherEnding (line 91) | static void
function main (line 102) | int
FILE: deps/w32-pthreads/tests/count1.c
function main (line 58) | int
FILE: deps/w32-pthreads/tests/create1.c
function main (line 52) | int
FILE: deps/w32-pthreads/tests/create2.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/create3.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/delay1.c
function main (line 42) | int
FILE: deps/w32-pthreads/tests/delay2.c
type timespec (line 47) | struct timespec
function main (line 64) | int
FILE: deps/w32-pthreads/tests/detach1.c
function main (line 59) | int
FILE: deps/w32-pthreads/tests/equal1.c
function main (line 47) | int
FILE: deps/w32-pthreads/tests/errno1.c
type bag_t (line 83) | typedef struct bag_t_ bag_t;
type bag_t_ (line 84) | struct bag_t_ {
function main (line 118) | int
FILE: deps/w32-pthreads/tests/exception1.c
function PtW32CatchAll (line 126) | PtW32CatchAll
function PtW32CatchAll (line 177) | PtW32CatchAll
function main (line 190) | int
function main (line 256) | int
FILE: deps/w32-pthreads/tests/exception2.c
function main (line 115) | int
function main (line 151) | int
FILE: deps/w32-pthreads/tests/exception3.c
function terminateFunction (line 99) | void
function main (line 140) | int
function main (line 176) | int
FILE: deps/w32-pthreads/tests/exit1.c
function main (line 41) | int
FILE: deps/w32-pthreads/tests/exit2.c
function main (line 54) | int
FILE: deps/w32-pthreads/tests/exit3.c
function main (line 52) | int
FILE: deps/w32-pthreads/tests/exit4.c
type bag_t (line 87) | typedef struct bag_t_ bag_t;
type bag_t_ (line 88) | struct bag_t_ {
function Win32thread (line 100) | void
function main (line 119) | int
FILE: deps/w32-pthreads/tests/exit5.c
type bag_t (line 87) | typedef struct bag_t_ bag_t;
type bag_t_ (line 88) | struct bag_t_ {
function Win32thread (line 101) | void
function main (line 123) | int
FILE: deps/w32-pthreads/tests/eyal1.c
type thread_control (line 83) | struct thread_control {
type TC (line 94) | typedef struct thread_control TC;
function die (line 107) | static void
function waste_time (line 121) | static double
function do_work_unit (line 142) | static int
function print_server (line 183) | static int
function dosync (line 237) | static void
function dowork (line 262) | static void
function main (line 272) | int
FILE: deps/w32-pthreads/tests/inherit1.c
type sched_param (line 89) | struct sched_param
type sched_param (line 102) | struct sched_param
function main (line 122) | int
FILE: deps/w32-pthreads/tests/join0.c
function main (line 52) | int
FILE: deps/w32-pthreads/tests/join1.c
function main (line 54) | int
FILE: deps/w32-pthreads/tests/join2.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/join3.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/kill1.c
function main (line 77) | int
FILE: deps/w32-pthreads/tests/loadfree.c
function main (line 60) | int main() {
FILE: deps/w32-pthreads/tests/mutex1.c
function main (line 50) | int
FILE: deps/w32-pthreads/tests/mutex1e.c
function main (line 52) | int
FILE: deps/w32-pthreads/tests/mutex1n.c
function main (line 52) | int
FILE: deps/w32-pthreads/tests/mutex1r.c
function main (line 52) | int
FILE: deps/w32-pthreads/tests/mutex2.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/mutex2e.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/mutex2r.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/mutex3.c
function main (line 60) | int
FILE: deps/w32-pthreads/tests/mutex3e.c
function main (line 60) | int
FILE: deps/w32-pthreads/tests/mutex3r.c
function main (line 60) | int
FILE: deps/w32-pthreads/tests/mutex4.c
function main (line 60) | int
FILE: deps/w32-pthreads/tests/mutex5.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/mutex6.c
function main (line 66) | int
FILE: deps/w32-pthreads/tests/mutex6e.c
function main (line 73) | int
FILE: deps/w32-pthreads/tests/mutex6es.c
function main (line 72) | int
FILE: deps/w32-pthreads/tests/mutex6n.c
function main (line 71) | int
FILE: deps/w32-pthreads/tests/mutex6r.c
function main (line 72) | int
FILE: deps/w32-pthreads/tests/mutex6rs.c
function main (line 71) | int
FILE: deps/w32-pthreads/tests/mutex6s.c
function main (line 66) | int
FILE: deps/w32-pthreads/tests/mutex7.c
function main (line 65) | int
FILE: deps/w32-pthreads/tests/mutex7e.c
function main (line 72) | int
FILE: deps/w32-pthreads/tests/mutex7n.c
function main (line 68) | int
FILE: deps/w32-pthreads/tests/mutex7r.c
function main (line 72) | int
FILE: deps/w32-pthreads/tests/mutex8.c
type timespec (line 46) | struct timespec
function main (line 64) | int
FILE: deps/w32-pthreads/tests/mutex8e.c
type timespec (line 54) | struct timespec
function main (line 72) | int
FILE: deps/w32-pthreads/tests/mutex8n.c
type timespec (line 54) | struct timespec
function main (line 72) | int
FILE: deps/w32-pthreads/tests/mutex8r.c
type timespec (line 54) | struct timespec
function main (line 72) | int
FILE: deps/w32-pthreads/tests/once1.c
function myfunc (line 49) | void
function main (line 63) | int
FILE: deps/w32-pthreads/tests/once2.c
type sharedInt_t (line 52) | typedef struct {
function myfunc (line 60) | void
function main (line 80) | int
FILE: deps/w32-pthreads/tests/once3.c
type sharedInt_t (line 58) | typedef struct {
function myfunc (line 66) | void
function main (line 96) | int
FILE: deps/w32-pthreads/tests/once4.c
type sharedInt_t (line 56) | typedef struct {
type bag_t (line 64) | typedef struct {
function mycleanupfunc (line 75) | void
function myinitfunc (line 89) | void
type sched_param (line 105) | struct sched_param
function main (line 137) | int
FILE: deps/w32-pthreads/tests/openmp1.c
function MainThread (line 53) | void MainThread() {
function main (line 74) | int main(int argc, char *argv[]) {
FILE: deps/w32-pthreads/tests/priority1.c
type sched_param (line 89) | struct sched_param
function main (line 129) | int
FILE: deps/w32-pthreads/tests/priority2.c
type sched_param (line 90) | struct sched_param
type sched_param (line 108) | struct sched_param
function main (line 128) | int
FILE: deps/w32-pthreads/tests/reuse1.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/reuse2.c
function main (line 98) | int
FILE: deps/w32-pthreads/tests/robust1.c
function main (line 78) | int
FILE: deps/w32-pthreads/tests/robust2.c
function main (line 80) | int
FILE: deps/w32-pthreads/tests/robust3.c
function main (line 82) | int
FILE: deps/w32-pthreads/tests/robust4.c
function main (line 94) | int
FILE: deps/w32-pthreads/tests/robust5.c
function main (line 86) | int
FILE: deps/w32-pthreads/tests/rwlock1.c
function main (line 47) | int
FILE: deps/w32-pthreads/tests/rwlock2.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/rwlock2_t.c
function main (line 49) | int
FILE: deps/w32-pthreads/tests/rwlock3.c
function main (line 62) | int
FILE: deps/w32-pthreads/tests/rwlock3_t.c
function main (line 61) | int
FILE: deps/w32-pthreads/tests/rwlock4.c
function main (line 62) | int
FILE: deps/w32-pthreads/tests/rwlock4_t.c
function main (line 61) | int
FILE: deps/w32-pthreads/tests/rwlock5.c
function main (line 64) | int
FILE: deps/w32-pthreads/tests/rwlock5_t.c
function main (line 63) | int
FILE: deps/w32-pthreads/tests/rwlock6.c
function main (line 74) | int
FILE: deps/w32-pthreads/tests/rwlock6_t.c
type timespec (line 64) | struct timespec
function main (line 91) | int
FILE: deps/w32-pthreads/tests/rwlock6_t2.c
type timespec (line 50) | struct timespec
function main (line 83) | int
FILE: deps/w32-pthreads/tests/rwlock7.c
type thread_t (line 22) | typedef struct thread_tag {
type data_t (line 34) | typedef struct data_tag {
function main (line 102) | int
FILE: deps/w32-pthreads/tests/rwlock8.c
type thread_t (line 25) | typedef struct thread_tag {
type data_t (line 37) | typedef struct data_tag {
function main (line 108) | int
FILE: deps/w32-pthreads/tests/self1.c
function main (line 48) | int
FILE: deps/w32-pthreads/tests/self2.c
function main (line 60) | int
FILE: deps/w32-pthreads/tests/semaphore1.c
function main (line 111) | int
FILE: deps/w32-pthreads/tests/semaphore2.c
function main (line 78) | int
FILE: deps/w32-pthreads/tests/semaphore3.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/semaphore4.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/semaphore4t.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/semaphore5.c
function main (line 87) | int
FILE: deps/w32-pthreads/tests/sequence1.c
function main (line 105) | int
FILE: deps/w32-pthreads/tests/sizes.c
function main (line 6) | int
FILE: deps/w32-pthreads/tests/spin1.c
function main (line 45) | int
FILE: deps/w32-pthreads/tests/spin2.c
function main (line 56) | int
FILE: deps/w32-pthreads/tests/spin3.c
function main (line 57) | int
FILE: deps/w32-pthreads/tests/spin4.c
function main (line 63) | int
FILE: deps/w32-pthreads/tests/stress1.c
type mysig_t (line 87) | typedef struct {
type timespec (line 111) | struct timespec
type timespec (line 112) | struct timespec
type timespec (line 206) | struct timespec
function main (line 233) | int
FILE: deps/w32-pthreads/tests/tryentercs.c
function main (line 57) | int
FILE: deps/w32-pthreads/tests/tryentercs2.c
function main (line 56) | int
FILE: deps/w32-pthreads/tests/tsd1.c
function destroy_key (line 92) | static void
function setkey (line 104) | static void
function main (line 138) | int
FILE: deps/w32-pthreads/tests/tsd2.c
function destroy_key (line 92) | static void
function setkey (line 108) | static void
function main (line 142) | int
FILE: deps/w32-pthreads/tests/valid1.c
function main (line 88) | int
FILE: deps/w32-pthreads/tests/valid2.c
function main (line 76) | int
FILE: deps/w32-pthreads/w32_CancelableWait.c
function INLINE (line 41) | static INLINE int
function pthreadCancelableWait (line 151) | int
function pthreadCancelableTimedWait (line 157) | int
FILE: frontend/OBSApp.cpp
type UncleanLaunchAction (line 86) | struct UncleanLaunchAction {
function UncleanLaunchAction (line 91) | UncleanLaunchAction handleUncleanShutdown(bool enableCrashUpload)
function QAccessibleInterface (line 143) | QAccessibleInterface *alignmentSelectorFactory(const QString &classname,...
function QObject (line 153) | QObject *CreateShortcutFilter()
function string (line 277) | string CurrentDateTimeString()
function do_mkdir (line 396) | static bool do_mkdir(const char *path)
function MakeUserDirs (line 406) | static bool MakeUserDirs()
function MakeUserProfileDirs (line 451) | static bool MakeUserProfileDirs()
function ParseBranchesJson (line 777) | void ParseBranchesJson(const std::string &jsonString, vector<UpdateBranc...
function LoadBranchesFile (line 809) | bool LoadBranchesFile(vector<UpdateBranch> &out)
function move_basic_to_profiles (line 942) | static void move_basic_to_profiles(void)
function move_basic_to_scene_collections (line 1006) | static void move_basic_to_scene_collections(void)
function StartupOBS (line 1134) | static bool StartupOBS(const char *locale, profiler_name_store_t *store)
function ui_task_handler (line 1178) | static void ui_task_handler(obs_task_t task, void *param, bool wait)
function string (line 1303) | string OBSApp::GetVersionString(bool platform) const
function QStyle (line 1437) | QStyle *OBSApp::GetInvisibleCursorStyle()
function string (line 1482) | string GenerateTimeDateFilename(const char *extension, bool noSpace)
function string (line 1496) | string GenerateSpecifiedFilename(const char *extension, bool noSpace, co...
function FindBestFilename (line 1502) | static void FindBestFilename(string &strPath, bool noSpace)
function ensure_directory_exists (line 1532) | static void ensure_directory_exists(string &path)
function remove_reserved_file_characters (line 1544) | static void remove_reserved_file_characters(string &s)
function string (line 1556) | string GetFormatString(const char *format, const char *prefix, const cha...
function string (line 1593) | string GetFormatExt(const char *container)
function string (line 1608) | string GetOutputFilename(const char *path, const char *container, bool n...
function GetLocaleNames (line 1640) | vector<pair<string, string>> GetLocaleNames()
function GetAppConfigPath (line 1677) | int GetAppConfigPath(char *path, size_t size, const char *name)
function GetProgramDataPath (line 1713) | int GetProgramDataPath(char *path, size_t size, const char *name)
function GetFileSafeName (line 1723) | bool GetFileSafeName(const char *name, std::string &file)
function GetClosestUnusedFileName (line 1757) | bool GetClosestUnusedFileName(std::string &path, const char *extension)
function WindowPositionValid (line 1782) | bool WindowPositionValid(QRect rect)
type obs_module_failure_info (line 1985) | struct obs_module_failure_info
FILE: frontend/OBSApp.hpp
class QFileSystemWatcher (line 45) | class QFileSystemWatcher
class QSocketNotifier (line 46) | class QSocketNotifier
type OBS (line 48) | namespace OBS {
class CrashHandler (line 49) | class CrashHandler
type LogFileType (line 51) | enum class LogFileType { NoType, CurrentAppLog, LastAppLog, CrashLog }
type LogFileState (line 52) | enum class LogFileState { NoState, New, Uploaded }
class PluginManager (line 53) | class PluginManager
type UpdateBranch (line 56) | struct UpdateBranch {
class OBSApp (line 64) | class OBSApp : public QApplication {
class OBS::NativeEventFilter (line 67) | class OBS::NativeEventFilter
method HotkeysEnabledInFocus (line 151) | inline bool HotkeysEnabledInFocus() const { return enableHotkeysInFocu...
method QMainWindow (line 153) | inline QMainWindow *GetMainWindow() const { return mainWindow.data(); }
method config_t (line 155) | inline config_t *GetAppConfig() const { return appConfig; }
method config_t (line 156) | inline config_t *GetUserConfig() const { return userConfig; }
method OBSTheme (line 164) | OBSTheme *GetTheme() const { return currentTheme; }
method GetThemes (line 165) | QList<OBSTheme> GetThemes() const { return themes.values(); }
method IsThemeDark (line 168) | bool IsThemeDark() const { return currentTheme ? currentTheme->isDark ...
method lookup_t (line 174) | inline lookup_t *GetTextLookup() const { return textLookup; }
method profiler_name_store_t (line 180) | profiler_name_store_t *GetProfilerNameStore() const { return profilerN...
method IncrementSleepInhibition (line 202) | inline void IncrementSleepInhibition()
method DecrementSleepInhibition (line 210) | inline void DecrementSleepInhibition()
method PushUITranslation (line 220) | inline void PushUITranslation(obs_frontend_translate_ui_cb cb) { trans...
method PopUITranslation (line 222) | inline void PopUITranslation() { translatorHooks.pop_front(); }
type obs_module_failure_info (line 230) | struct obs_module_failure_info
function OBSApp (line 253) | inline OBSApp *App()
class OBS::NativeEventFilter (line 67) | class OBS::NativeEventFilter
method HotkeysEnabledInFocus (line 151) | inline bool HotkeysEnabledInFocus() const { return enableHotkeysInFocu...
method QMainWindow (line 153) | inline QMainWindow *GetMainWindow() const { return mainWindow.data(); }
method config_t (line 155) | inline config_t *GetAppConfig() const { return appConfig; }
method config_t (line 156) | inline config_t *GetUserConfig() const { return userConfig; }
method OBSTheme (line 164) | OBSTheme *GetTheme() const { return currentTheme; }
method GetThemes (line 165) | QList<OBSTheme> GetThemes() const { return themes.values(); }
method IsThemeDark (line 168) | bool IsThemeDark() const { return currentTheme ? currentTheme->isDark ...
method lookup_t (line 174) | inline lookup_t *GetTextLookup() const { return textLookup; }
method profiler_name_store_t (line 180) | profiler_name_store_t *GetProfilerNameStore() const { return profilerN...
method IncrementSleepInhibition (line 202) | inline void IncrementSleepInhibition()
method DecrementSleepInhibition (line 210) | inline void DecrementSleepInhibition()
method PushUITranslation (line 220) | inline void PushUITranslation(obs_frontend_translate_ui_cb cb) { trans...
method PopUITranslation (line 222) | inline void PopUITranslation() { translatorHooks.pop_front(); }
type obs_module_failure_info (line 230) | struct obs_module_failure_info
function QString (line 263) | inline QString QTStr(const char *lookupVal)
FILE: frontend/OBSApp_Themes.cpp
type CFParser (line 38) | struct CFParser {
method cf_parser (line 42) | cf_parser *operator->() { return &cfp; }
function ParseThemeMeta (line 45) | static optional<OBSTheme> ParseThemeMeta(const QString &path)
function ParseVarName (line 136) | static bool ParseVarName(CFParser &cfp, QString &value)
function QColor (line 161) | static QColor ParseColor(CFParser &cfp)
function ParseMath (line 207) | static bool ParseMath(CFParser &cfp, QStringList &values, vector<OBSThem...
function ParseThemeVariables (line 259) | static vector<OBSThemeVariable> ParseThemeVariables(const char *themeData)
function ResolveVariable (line 498) | static bool ResolveVariable(const QHash<QString, OBSThemeVariable> &vars...
function OBSThemeVariable (line 522) | static OBSThemeVariable ParseMathVariable(const QHash<QString, OBSThemeV...
function QString (line 568) | static QString EvalMath(const QHash<QString, OBSThemeVariable> &vars, co...
function qsizetype (line 661) | static qsizetype FindEndOfOBSMetadata(const QString &content)
function QString (line 676) | static QString PrepareQSS(const QHash<QString, OBSThemeVariable> &vars, ...
function FillEnumMap (line 732) | static void FillEnumMap(QHash<QString, T> &map)
function QPalette (line 744) | static QPalette PreparePalette(const QHash<QString, OBSThemeVariable> &v...
function getPaddingForDensityId (line 799) | static double getPaddingForDensityId(int id)
function OBSTheme (line 816) | OBSTheme *OBSApp::GetTheme(const QString &name)
FILE: frontend/OBSStudioAPI.cpp
function GetCallbackIdx (line 16) | inline size_t GetCallbackIdx(std::vector<OBSStudioCallback<T>> &callback...
type obs_frontend_source_list (line 42) | struct obs_frontend_source_list
function obs_source_t (line 54) | obs_source_t *OBSStudioAPI::obs_frontend_get_current_scene()
type obs_frontend_source_list (line 75) | struct obs_frontend_source_list
function obs_source_t (line 85) | obs_source_t *OBSStudioAPI::obs_frontend_get_current_transition()
function obs_output_t (line 394) | obs_output_t *OBSStudioAPI::obs_frontend_get_streaming_output()
function obs_output_t (line 405) | obs_output_t *OBSStudioAPI::obs_frontend_get_recording_output()
function obs_output_t (line 411) | obs_output_t *OBSStudioAPI::obs_frontend_get_replay_buffer_output()
function config_t (line 417) | config_t *OBSStudioAPI::obs_frontend_get_profile_config()
function config_t (line 422) | config_t *OBSStudioAPI::obs_frontend_get_app_config()
function config_t (line 427) | config_t *OBSStudioAPI::obs_frontend_get_user_config()
function obs_service_t (line 515) | obs_service_t *OBSStudioAPI::obs_frontend_get_streaming_service()
function obs_source_t (line 551) | obs_source_t *OBSStudioAPI::obs_frontend_get_current_preview_scene()
function obs_output_t (line 579) | obs_output_t *OBSStudioAPI::obs_frontend_get_virtualcam_output()
function obs_canvas_t (line 674) | obs_canvas_t *OBSStudioAPI::obs_frontend_add_canvas(const char *name, ob...
type obs_frontend_event (line 709) | enum obs_frontend_event
function obs_frontend_callbacks (line 721) | obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main)
FILE: frontend/OBSStudioAPI.hpp
class OBSBasic (line 22) | class OBSBasic
type OBSStudioCallback (line 24) | struct OBSStudioCallback {
method OBSStudioCallback (line 28) | inline OBSStudioCallback(T cb, void *p) : callback(cb), private_data(p...
type OBSStudioAPI (line 31) | struct OBSStudioAPI : obs_frontend_callbacks {
method OBSStudioAPI (line 37) | inline OBSStudioAPI(OBSBasic *main_) : main(main_) {}
type obs_frontend_source_list (line 45) | struct obs_frontend_source_list
type obs_frontend_source_list (line 51) | struct obs_frontend_source_list
type obs_frontend_event (line 233) | enum obs_frontend_event
FILE: frontend/api/obs-frontend-api.cpp
function obs_frontend_set_callbacks_internal (line 8) | void obs_frontend_set_callbacks_internal(obs_frontend_callbacks *callbacks)
function callbacks_valid_ (line 13) | static inline bool callbacks_valid_(const char *func_name)
type obs_frontend_source_list (line 79) | struct obs_frontend_source_list
function obs_frontend_get_scenes (line 93) | void obs_frontend_get_scenes(struct obs_frontend_source_list *sources)
function obs_source_t (line 99) | obs_source_t *obs_frontend_get_current_scene(void)
function obs_frontend_set_current_scene (line 104) | void obs_frontend_set_current_scene(obs_source_t *scene)
function obs_frontend_get_transitions (line 110) | void obs_frontend_get_transitions(struct obs_frontend_source_list *sources)
function obs_source_t (line 116) | obs_source_t *obs_frontend_get_current_transition(void)
function obs_frontend_set_current_transition (line 121) | void obs_frontend_set_current_transition(obs_source_t *transition)
function obs_frontend_get_transition_duration (line 127) | int obs_frontend_get_transition_duration(void)
function obs_frontend_set_transition_duration (line 132) | void obs_frontend_set_transition_duration(int duration)
function obs_frontend_release_tbar (line 138) | void obs_frontend_release_tbar(void)
function obs_frontend_get_tbar_position (line 144) | int obs_frontend_get_tbar_position(void)
function obs_frontend_set_tbar_position (line 149) | void obs_frontend_set_tbar_position(int position)
function obs_frontend_set_current_scene_collection (line 170) | void obs_frontend_set_current_scene_collection(const char *collection)
function obs_frontend_add_scene_collection (line 176) | bool obs_frontend_add_scene_collection(const char *name)
function obs_frontend_set_current_profile (line 201) | void obs_frontend_set_current_profile(const char *profile)
function obs_frontend_create_profile (line 207) | void obs_frontend_create_profile(const char *name)
function obs_frontend_duplicate_profile (line 213) | void obs_frontend_duplicate_profile(const char *name)
function obs_frontend_delete_profile (line 219) | void obs_frontend_delete_profile(const char *profile)
function obs_frontend_streaming_start (line 225) | void obs_frontend_streaming_start(void)
function obs_frontend_streaming_stop (line 231) | void obs_frontend_streaming_stop(void)
function obs_frontend_streaming_active (line 237) | bool obs_frontend_streaming_active(void)
function obs_frontend_recording_start (line 242) | void obs_frontend_recording_start(void)
function obs_frontend_recording_stop (line 248) | void obs_frontend_recording_stop(void)
function obs_frontend_recording_active (line 254) | bool obs_frontend_recording_active(void)
function obs_frontend_recording_pause (line 259) | void obs_frontend_recording_pause(bool pause)
function obs_frontend_recording_paused (line 265) | bool obs_frontend_recording_paused(void)
function obs_frontend_recording_split_file (line 270) | bool obs_frontend_recording_split_file(void)
function obs_frontend_recording_add_chapter (line 275) | bool obs_frontend_recording_add_chapter(const char *name)
function obs_frontend_replay_buffer_start (line 280) | void obs_frontend_replay_buffer_start(void)
function obs_frontend_replay_buffer_save (line 286) | void obs_frontend_replay_buffer_save(void)
function obs_frontend_replay_buffer_stop (line 292) | void obs_frontend_replay_buffer_stop(void)
function obs_frontend_replay_buffer_active (line 298) | bool obs_frontend_replay_buffer_active(void)
function obs_frontend_add_tools_menu_item (line 308) | void obs_frontend_add_tools_menu_item(const char *name, obs_frontend_cb ...
function obs_frontend_add_dock_by_id (line 314) | bool obs_frontend_add_dock_by_id(const char *id, const char *title, void...
function obs_frontend_remove_dock (line 319) | void obs_frontend_remove_dock(const char *id)
function obs_frontend_add_custom_qdock (line 325) | bool obs_frontend_add_custom_qdock(const char *id, void *dock)
function obs_frontend_add_event_callback (line 330) | void obs_frontend_add_event_callback(obs_frontend_event_cb callback, voi...
function obs_frontend_remove_event_callback (line 336) | void obs_frontend_remove_event_callback(obs_frontend_event_cb callback, ...
function obs_output_t (line 342) | obs_output_t *obs_frontend_get_streaming_output(void)
function obs_output_t (line 347) | obs_output_t *obs_frontend_get_recording_output(void)
function obs_output_t (line 352) | obs_output_t *obs_frontend_get_replay_buffer_output(void)
function config_t (line 357) | config_t *obs_frontend_get_profile_config(void)
function config_t (line 362) | config_t *obs_frontend_get_app_config(void)
function config_t (line 367) | config_t *obs_frontend_get_user_config(void)
function config_t (line 372) | config_t *obs_frontend_get_global_config(void)
function obs_frontend_open_projector (line 379) | void obs_frontend_open_projector(const char *type, int monitor, const ch...
function obs_frontend_save (line 385) | void obs_frontend_save(void)
function obs_frontend_defer_save_begin (line 391) | void obs_frontend_defer_save_begin(void)
function obs_frontend_defer_save_end (line 397) | void obs_frontend_defer_save_end(void)
function obs_frontend_add_save_callback (line 403) | void obs_frontend_add_save_callback(obs_frontend_save_cb callback, void ...
function obs_frontend_remove_save_callback (line 409) | void obs_frontend_remove_save_callback(obs_frontend_save_cb callback, vo...
function obs_frontend_add_preload_callback (line 415) | void obs_frontend_add_preload_callback(obs_frontend_save_cb callback, vo...
function obs_frontend_remove_preload_callback (line 421) | void obs_frontend_remove_preload_callback(obs_frontend_save_cb callback,...
function obs_frontend_push_ui_translation (line 427) | void obs_frontend_push_ui_translation(obs_frontend_translate_ui_cb trans...
function obs_frontend_pop_ui_translation (line 433) | void obs_frontend_pop_ui_translation(void)
function obs_service_t (line 439) | obs_service_t *obs_frontend_get_streaming_service(void)
function obs_frontend_set_streaming_service (line 444) | void obs_frontend_set_streaming_service(obs_service_t *service)
function obs_frontend_save_streaming_service (line 450) | void obs_frontend_save_streaming_service(void)
function obs_frontend_preview_program_mode_active (line 456) | bool obs_frontend_preview_program_mode_active(void)
function obs_frontend_set_preview_program_mode (line 461) | void obs_frontend_set_preview_program_mode(bool enable)
function obs_frontend_preview_program_trigger_transition (line 467) | void obs_frontend_preview_program_trigger_transition(void)
function obs_frontend_preview_enabled (line 473) | bool obs_frontend_preview_enabled(void)
function obs_frontend_set_preview_enabled (line 478) | void obs_frontend_set_preview_enabled(bool enable)
function obs_source_t (line 484) | obs_source_t *obs_frontend_get_current_preview_scene(void)
function obs_frontend_set_current_preview_scene (line 489) | void obs_frontend_set_current_preview_scene(obs_source_t *scene)
function obs_frontend_take_screenshot (line 495) | void obs_frontend_take_screenshot(void)
function obs_frontend_take_source_screenshot (line 501) | void obs_frontend_take_source_screenshot(obs_source_t *source)
function obs_output_t (line 507) | obs_output_t *obs_frontend_get_virtualcam_output(void)
function obs_frontend_start_virtualcam (line 512) | void obs_frontend_start_virtualcam(void)
function obs_frontend_stop_virtualcam (line 518) | void obs_frontend_stop_virtualcam(void)
function obs_frontend_virtualcam_active (line 524) | bool obs_frontend_virtualcam_active(void)
function obs_frontend_reset_video (line 529) | void obs_frontend_reset_video(void)
function obs_frontend_open_source_properties (line 535) | void obs_frontend_open_source_properties(obs_source_t *source)
function obs_frontend_open_source_filters (line 541) | void obs_frontend_open_source_filters(obs_source_t *source)
function obs_frontend_open_source_interaction (line 547) | void obs_frontend_open_source_interaction(obs_source_t *source)
function obs_frontend_open_sceneitem_edit_transform (line 553) | void obs_frontend_open_sceneitem_edit_transform(obs_sceneitem_t *item)
function obs_frontend_is_theme_dark (line 569) | bool obs_frontend_is_theme_dark(void)
function obs_frontend_add_undo_redo_action (line 589) | void obs_frontend_add_undo_redo_action(const char *name, const undo_redo...
function obs_frontend_get_canvases (line 596) | void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list)
function obs_canvas_t (line 602) | obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *...
function obs_frontend_remove_canvas (line 607) | bool obs_frontend_remove_canvas(obs_canvas_t *canvas)
FILE: frontend/api/obs-frontend-api.h
type config_data (line 10) | struct config_data
type config_t (line 11) | typedef struct config_data config_t;
type obs_data (line 13) | struct obs_data
type obs_data_t (line 14) | typedef struct obs_data obs_data_t;
type obs_frontend_event (line 16) | enum obs_frontend_event {
type obs_frontend_source_list (line 74) | struct obs_frontend_source_list {
function obs_frontend_source_list_free (line 78) | static inline void obs_frontend_source_list_free(struct obs_frontend_sou...
type obs_frontend_canvas_list (line 86) | struct obs_frontend_canvas_list {
function obs_frontend_canvas_list_free (line 90) | static inline void obs_frontend_canvas_list_free(struct obs_frontend_can...
type obs_frontend_source_list (line 121) | struct obs_frontend_source_list
type obs_frontend_source_list (line 125) | struct obs_frontend_source_list
type obs_frontend_event (line 160) | enum obs_frontend_event
type obs_frontend_canvas_list (line 253) | struct obs_frontend_canvas_list
type obs_video_info (line 254) | struct obs_video_info
FILE: frontend/api/obs-frontend-internal.hpp
type obs_frontend_callbacks (line 8) | struct obs_frontend_callbacks {
type obs_frontend_source_list (line 14) | struct obs_frontend_source_list
type obs_frontend_source_list (line 18) | struct obs_frontend_source_list
type obs_frontend_event (line 108) | enum obs_frontend_event
FILE: frontend/components/AbsoluteSlider.cpp
function QColor (line 117) | QColor AbsoluteSlider::getTickColor() const
FILE: frontend/components/AbsoluteSlider.hpp
class AbsoluteSlider (line 5) | class AbsoluteSlider : public SliderIgnoreScroll {
FILE: frontend/components/AccessibleAlignmentCell.cpp
function QRect (line 37) | QRect AccessibleAlignmentCell::rect() const
function QString (line 42) | QString AccessibleAlignmentCell::text(QAccessible::Text text) const
FILE: frontend/components/AccessibleAlignmentCell.hpp
class AlignmentSelector (line 25) | class AlignmentSelector
class AccessibleAlignmentCell (line 27) | class AccessibleAlignmentCell : public QAccessibleInterface {
method index (line 35) | int index() const { return index_; }
method QObject (line 42) | QObject *object() const override { return nullptr; }
method QAccessibleInterface (line 43) | QAccessibleInterface *child(int) const override { return nullptr; }
method QAccessibleInterface (line 44) | QAccessibleInterface *childAt(int, int) const override { return nullpt...
method childCount (line 45) | int childCount() const override { return 0; }
method indexOfChild (line 46) | int indexOfChild(const QAccessibleInterface *) const override { return...
method QAccessibleInterface (line 47) | QAccessibleInterface *parent() const override { return parent_; }
method QAccessibleInterface (line 48) | QAccessibleInterface *focusChild() const override { return nullptr; }
method isValid (line 49) | bool isValid() const override { return widget != nullptr; }
method setText (line 50) | void setText(QAccessible::Text, const QString &) override {}
FILE: frontend/components/AccessibleAlignmentSelector.cpp
function QAccessibleInterface (line 44) | QAccessibleInterface *AccessibleAlignmentSelector::child(int index) const
function QAccessibleInterface (line 68) | QAccessibleInterface *AccessibleAlignmentSelector::focusChild() const
function QRect (line 78) | QRect AccessibleAlignmentSelector::rect() const
function QString (line 83) | QString AccessibleAlignmentSelector::text(QAccessible::Text textType) const
function QVariant (line 117) | QVariant AccessibleAlignmentSelector::value() const
FILE: frontend/components/AccessibleAlignmentSelector.hpp
class AlignmentSelector (line 26) | class AlignmentSelector
class AccessibleAlignmentSelector (line 28) | class AccessibleAlignmentSelector : public QAccessibleWidget {
FILE: frontend/components/AlignmentSelector.cpp
function QSize (line 34) | QSize AlignmentSelector::sizeHint() const
function QSize (line 40) | QSize AlignmentSelector::minimumSizeHint() const
function QRect (line 120) | QRect AlignmentSelector::cellRect(int index) const
function QRect (line 241) | QRect AlignmentSelector::gridRect() const
FILE: frontend/components/AlignmentSelector.hpp
class AlignmentSelector (line 26) | class AlignmentSelector : public QWidget {
class AccessibleAlignmentSelector (line 29) | class AccessibleAlignmentSelector
FILE: frontend/components/ApplicationAudioCaptureToolbar.hpp
class ApplicationAudioCaptureToolbar (line 5) | class ApplicationAudioCaptureToolbar : public ComboSelectToolbar {
FILE: frontend/components/AudioCaptureToolbar.hpp
class AudioCaptureToolbar (line 5) | class AudioCaptureToolbar : public ComboSelectToolbar {
FILE: frontend/components/BalanceSlider.hpp
class BalanceSlider (line 6) | class BalanceSlider : public QSlider {
method Q_OBJECT (line 7) | Q_OBJECT
method mouseDoubleClickEvent (line 16) | void mouseDoubleClickEvent(QMouseEvent *event)
FILE: frontend/components/BrowserToolbar.hpp
class Ui_BrowserSourceToolbar (line 5) | class Ui_BrowserSourceToolbar
class BrowserToolbar (line 7) | class BrowserToolbar : public SourceToolbar {
FILE: frontend/components/ClickableLabel.hpp
class ClickableLabel (line 6) | class ClickableLabel : public QLabel {
method Q_OBJECT (line 7) | Q_OBJECT
method mousePressEvent (line 16) | void mousePressEvent(QMouseEvent *event)
FILE: frontend/components/ColorSourceToolbar.cpp
function QColor (line 8) | QColor color_from_int(long long val)
function color_to_int (line 13) | long long color_to_int(QColor color)
FILE: frontend/components/ColorSourceToolbar.hpp
class Ui_ColorSourceToolbar (line 5) | class Ui_ColorSourceToolbar
class ColorSourceToolbar (line 7) | class ColorSourceToolbar : public SourceToolbar {
FILE: frontend/components/ComboSelectToolbar.cpp
function FillPropertyCombo (line 18) | int FillPropertyCombo(QComboBox *c, obs_property_t *p, const std::string...
function UpdateSourceComboToolbarProperties (line 43) | void UpdateSourceComboToolbarProperties(QComboBox *combo, OBSSource sour...
function UpdateSourceComboToolbarValue (line 83) | void UpdateSourceComboToolbarValue(QComboBox *combo, OBSSource source, i...
FILE: frontend/components/ComboSelectToolbar.hpp
class Ui_DeviceSelectToolbar (line 5) | class Ui_DeviceSelectToolbar
class ComboSelectToolbar (line 7) | class ComboSelectToolbar : public SourceToolbar {
FILE: frontend/components/DelButton.hpp
class DelButton (line 6) | class DelButton : public QPushButton {
FILE: frontend/components/DeviceCaptureToolbar.hpp
class Ui_DeviceSelectToolbar (line 7) | class Ui_DeviceSelectToolbar
class DeviceCaptureToolbar (line 9) | class DeviceCaptureToolbar : public QWidget {
FILE: frontend/components/DisplayCaptureToolbar.hpp
class DisplayCaptureToolbar (line 5) | class DisplayCaptureToolbar : public ComboSelectToolbar {
FILE: frontend/components/EditWidget.hpp
class QPersistentModelIndex (line 6) | class QPersistentModelIndex
class EditWidget (line 8) | class EditWidget : public QLineEdit {
FILE: frontend/components/FocusList.hpp
class FocusList (line 5) | class FocusList : public QListWidget {
FILE: frontend/components/GameCaptureToolbar.hpp
class Ui_GameCaptureToolbar (line 5) | class Ui_GameCaptureToolbar
class GameCaptureToolbar (line 7) | class GameCaptureToolbar : public SourceToolbar {
FILE: frontend/components/ImageSourceToolbar.hpp
class Ui_ImageSourceToolbar (line 5) | class Ui_ImageSourceToolbar
class ImageSourceToolbar (line 7) | class ImageSourceToolbar : public SourceToolbar {
FILE: frontend/components/MediaControls.cpp
function OBSSource (line 297) | OBSSource MediaControls::GetSource()
function QString (line 345) | QString MediaControls::FormatSeconds(int totalSeconds)
FILE: frontend/components/MediaControls.hpp
class Ui_MediaControls (line 8) | class Ui_MediaControls
class MediaControls (line 10) | class MediaControls : public QWidget {
FILE: frontend/components/MenuButton.hpp
class MenuButton (line 5) | class MenuButton : public QPushButton {
method MenuButton (line 13) | explicit inline MenuButton(QWidget *parent = nullptr) : QPushButton(pa...
method MenuButton (line 15) | explicit inline MenuButton(const QString &text, QWidget *parent = null...
FILE: frontend/components/MenuCheckBox.hpp
class QStyleOptionButton (line 23) | class QStyleOptionButton
class QStylePainter (line 24) | class QStylePainter
class QMouseEvent (line 25) | class QMouseEvent
class MenuCheckBox (line 27) | class MenuCheckBox : public QCheckBox {
FILE: frontend/components/Multiview.cpp
function OBSSource (line 31) | static OBSSource CreateLabel(const char *name, size_t h)
type obs_video_info (line 73) | struct obs_video_info
type obs_frontend_source_list (line 82) | struct obs_frontend_source_list
function labelOffset (line 185) | static inline uint32_t labelOffset(MultiviewLayout multiviewLayout, obs_...
function OBSSource (line 549) | OBSSource Multiview::GetSourceByPosition(int x, int y)
FILE: frontend/components/Multiview.hpp
type MultiviewLayout (line 7) | enum class MultiviewLayout : uint8_t {
class Multiview (line 20) | class Multiview {
function startRegion (line 56) | static inline void startRegion(int vX, int vY, int vCX, int vCY, float o...
function endRegion (line 64) | static inline void endRegion()
FILE: frontend/components/MuteCheckBox.hpp
class MuteCheckBox (line 5) | class MuteCheckBox : public QCheckBox {
method Q_OBJECT (line 6) | Q_OBJECT
method nextCheckState (line 18) | void nextCheckState() override
FILE: frontend/components/OBSAdvAudioCtrl.cpp
function setCheckboxState (line 318) | static inline void setCheckboxState(QCheckBox *checkbox, bool checked)
function set_mono (line 431) | static inline void set_mono(obs_source_t *source, bool mono)
function setMixer (line 557) | static inline void setMixer(obs_source_t *source, const int mixerIdx, co...
FILE: frontend/components/OBSAdvAudioCtrl.hpp
class BalanceSlider (line 8) | class BalanceSlider
class QCheckBox (line 9) | class QCheckBox
class QComboBox (line 10) | class QComboBox
class QDoubleSpinBox (line 11) | class QDoubleSpinBox
class QGridLayout (line 12) | class QGridLayout
class QLabel (line 13) | class QLabel
class QSpinBox (line 14) | class QSpinBox
class QStackedWidget (line 15) | class QStackedWidget
class QWidget (line 16) | class QWidget
type VolumeType (line 18) | enum class VolumeType {
class OBSAdvAudioCtrl (line 23) | class OBSAdvAudioCtrl : public QObject {
method obs_source_t (line 67) | inline obs_source_t *GetSource() const { return source; }
FILE: frontend/components/OBSPreviewScalingComboBox.hpp
class OBSPreviewScalingComboBox (line 22) | class OBSPreviewScalingComboBox : public QComboBox {
method Q_OBJECT (line 23) | Q_OBJECT
method SetCanvasSize (line 28) | inline void SetCanvasSize(uint32_t width, uint32_t height)
method SetOutputSize (line 33) | inline void SetOutputSize(uint32_t width, uint32_t height)
FILE: frontend/components/OBSPreviewScalingLabel.hpp
class OBSPreviewScalingLabel (line 22) | class OBSPreviewScalingLabel : public QLabel {
method Q_OBJECT (line 23) | Q_OBJECT
FILE: frontend/components/OBSSourceLabel.hpp
class OBSSourceLabel (line 24) | class OBSSourceLabel : public QLabel {
FILE: frontend/components/SceneTree.hpp
class SceneTree (line 8) | class SceneTree : public QListWidget {
FILE: frontend/components/SilentUpdateCheckBox.hpp
class SilentUpdateCheckBox (line 23) | class SilentUpdateCheckBox : public QCheckBox {
method Q_OBJECT (line 24) | Q_OBJECT
FILE: frontend/components/SilentUpdateSpinBox.hpp
class SilentUpdateSpinBox (line 23) | class SilentUpdateSpinBox : public QSpinBox {
method Q_OBJECT (line 24) | Q_OBJECT
FILE: frontend/components/SourceToolbar.hpp
class SourceToolbar (line 7) | class SourceToolbar : public QWidget {
method OBSSource (line 25) | OBSSource GetSource() { return OBSGetStrongRef(weakSource); }
method Update (line 28) | virtual void Update() {}
FILE: frontend/components/SourceTree.cpp
function OBSScene (line 10) | static inline OBSScene GetCurrentScene()
function MoveItem (line 17) | static inline void MoveItem(QVector<OBSSceneItem> &items, int oldIdx, in...
type obs_sceneitem_order_info (line 301) | struct obs_sceneitem_order_info
type obs_sceneitem_order_info (line 306) | struct obs_sceneitem_order_info
type obs_sceneitem_order_info (line 329) | struct obs_sceneitem_order_info
type obs_sceneitem_order_info (line 336) | struct obs_sceneitem_order_info
FILE: frontend/components/SourceTree.hpp
class SourceTree (line 10) | class SourceTree : public QListView {
method SourceTreeModel (line 32) | inline SourceTreeModel *GetStm() const { return reinterpret_cast<Sourc...
method SourceTreeItem (line 35) | inline SourceTreeItem *GetItemWidget(int idx)
method IgnoreReorder (line 43) | inline bool IgnoreReorder() const { return ignoreReorder; }
method Clear (line 44) | inline void Clear() { GetStm()->Clear(); }
method Add (line 46) | inline void Add(obs_sceneitem_t *item) { GetStm()->Add(item); }
method OBSSceneItem (line 47) | inline OBSSceneItem Get(int idx) { return GetStm()->Get(idx); }
method QString (line 48) | inline QString GetNewGroupName() { return GetStm()->GetNewGroupName(); }
method ReorderItems (line 60) | inline void ReorderItems() { GetStm()->ReorderItems(); }
method RefreshItems (line 61) | inline void RefreshItems() { GetStm()->SceneChanged(); }
FILE: frontend/components/SourceTreeDelegate.cpp
function QSize (line 7) | QSize SourceTreeDelegate::sizeHint(const QStyleOptionViewItem &option, c...
FILE: frontend/components/SourceTreeDelegate.hpp
class SourceTreeDelegate (line 9) | class SourceTreeDelegate : public QStyledItemDelegate {
FILE: frontend/components/SourceTreeItem.cpp
function OBSScene (line 21) | static inline OBSScene GetCurrentScene()
FILE: frontend/components/SourceTreeItem.hpp
class QSpacerItem (line 7) | class QSpacerItem
class QCheckBox (line 8) | class QCheckBox
class QLabel (line 9) | class QLabel
class QHBoxLayout (line 10) | class QHBoxLayout
class OBSSourceLabel (line 11) | class OBSSourceLabel
class QLineEdit (line 12) | class QLineEdit
class SourceTree (line 14) | class SourceTree
class SourceTreeItem (line 16) | class SourceTreeItem : public QFrame {
class SourceTree (line 19) | class SourceTree
type Type (line 30) | enum class Type {
FILE: frontend/components/SourceTreeModel.cpp
function OBSScene (line 9) | static inline OBSScene GetCurrentScene()
type obs_frontend_event (line 15) | enum obs_frontend_event
function enumItem (line 44) | static bool enumItem(obs_scene_t *, obs_sceneitem_t *item, void *ptr)
function MoveItem (line 90) | static inline void MoveItem(QVector<OBSSceneItem> &items, int oldIdx, in...
function OBSSceneItem (line 228) | OBSSceneItem SourceTreeModel::Get(int idx)
function QVariant (line 245) | QVariant SourceTreeModel::data(const QModelIndex &index, int role) const
function QString (line 273) | QString SourceTreeModel::GetNewGroupName()
FILE: frontend/components/SourceTreeModel.hpp
class SourceTree (line 8) | class SourceTree
class SourceTreeModel (line 10) | class SourceTreeModel : public QAbstractListModel {
class SourceTree (line 13) | class SourceTree
type obs_frontend_event (line 20) | enum obs_frontend_event
FILE: frontend/components/TextSourceToolbar.hpp
class Ui_TextSourceToolbar (line 5) | class Ui_TextSourceToolbar
class TextSourceToolbar (line 7) | class TextSourceToolbar : public SourceToolbar {
FILE: frontend/components/UIValidation.cpp
function CountVideoSources (line 10) | static int CountVideoSources()
function StreamSettingsAction (line 57) | StreamSettingsAction UIValidation::StreamSettingsConfirmation(QWidget *p...
FILE: frontend/components/UIValidation.hpp
type StreamSettingsAction (line 7) | enum class StreamSettingsAction {
class UIValidation (line 13) | class UIValidation : public QObject {
FILE: frontend/components/UrlPushButton.cpp
function QUrl (line 13) | QUrl UrlPushButton::targetUrl()
FILE: frontend/components/UrlPushButton.hpp
class UrlPushButton (line 8) | class UrlPushButton : public QPushButton {
method UrlPushButton (line 13) | inline UrlPushButton(QWidget *parent = nullptr) : QPushButton(parent) {}
FILE: frontend/components/VisibilityItemDelegate.hpp
class QObject (line 5) | class QObject
class VisibilityItemDelegate (line 7) | class VisibilityItemDelegate : public QStyledItemDelegate {
FILE: frontend/components/VisibilityItemWidget.cpp
function SetupVisibilityItem (line 64) | void SetupVisibilityItem(QListWidget *list, QListWidgetItem *item, obs_s...
FILE: frontend/components/VisibilityItemWidget.hpp
class OBSSourceLabel (line 8) | class OBSSourceLabel
class QCheckBox (line 9) | class QCheckBox
class VisibilityItemWidget (line 11) | class VisibilityItemWidget : public QWidget {
FILE: frontend/components/VolumeAccessibleInterface.cpp
function VolumeSlider (line 7) | VolumeSlider *VolumeAccessibleInterface::slider() const
function QString (line 12) | QString VolumeAccessibleInterface::text(QAccessible::Text t) const
function QVariant (line 25) | QVariant VolumeAccessibleInterface::currentValue() const
function QVariant (line 43) | QVariant VolumeAccessibleInterface::maximumValue() const
function QVariant (line 48) | QVariant VolumeAccessibleInterface::minimumValue() const
function QVariant (line 53) | QVariant VolumeAccessibleInterface::minimumStepSize() const
FILE: frontend/components/VolumeAccessibleInterface.hpp
class VolumeSlider (line 5) | class VolumeSlider
class VolumeAccessibleInterface (line 7) | class VolumeAccessibleInterface : public QAccessibleWidget {
FILE: frontend/components/VolumeControl.cpp
function isSourceUnassigned (line 16) | bool isSourceUnassigned(obs_source_t *source)
function showUnassignedWarning (line 24) | void showUnassignedWarning(const char *name)
type obs_peak_meter_type (line 617) | enum obs_peak_meter_type
type obs_peak_meter_type (line 916) | enum obs_peak_meter_type
FILE: frontend/components/VolumeControl.hpp
class MuteCheckBox (line 13) | class MuteCheckBox
class QBoxLayout (line 14) | class QBoxLayout
class QLabel (line 15) | class QLabel
class VolumeMeter (line 16) | class VolumeMeter
class VolumeControl (line 18) | class VolumeControl : public QFrame {
method MixerStatus (line 34) | MixerStatus() = default;
method MixerStatus (line 35) | MixerStatus(Value v) : bits(v) {}
method has (line 37) | bool has(Value v) const { return (bits & v) != 0; }
method set (line 38) | void set(Value v, bool enable)
method MixerStatus (line 47) | MixerStatus operator|(Value v) const { return MixerStatus(bits | v); }
method MixerStatus (line 48) | MixerStatus &operator|=(Value v)
method MixerStatus (line 54) | MixerStatus operator&(Value v) const { return MixerStatus(bits & v); }
method MixerStatus (line 55) | MixerStatus &operator&=(Value v)
method MixerStatus (line 61) | MixerStatus operator~() const { return MixerStatus(~bits); }
method MixerStatus (line 65) | explicit MixerStatus(uint32_t v) : bits(v) {}
function handleSourceDestroyed (line 125) | void handleSourceDestroyed() { deleteLater(); }
function VolumeControl (line 132) | explicit VolumeControl(obs_source_t *source, QWidget *parent) : VolumeCo...
method MixerStatus (line 34) | MixerStatus() = default;
method MixerStatus (line 35) | MixerStatus(Value v) : bits(v) {}
method has (line 37) | bool has(Value v) const { return (bits & v) != 0; }
method set (line 38) | void set(Value v, bool enable)
method MixerStatus (line 47) | MixerStatus operator|(Value v) const { return MixerStatus(bits | v); }
method MixerStatus (line 48) | MixerStatus &operator|=(Value v)
method MixerStatus (line 54) | MixerStatus operator&(Value v) const { return MixerStatus(bits & v); }
method MixerStatus (line 55) | MixerStatus &operator&=(Value v)
method MixerStatus (line 61) | MixerStatus operator~() const { return MixerStatus(~bits); }
method MixerStatus (line 65) | explicit MixerStatus(uint32_t v) : bits(v) {}
function OBSWeakSource (line 135) | inline OBSWeakSource weakSource() const { return weakSource_; }
function QString (line 136) | QString const &getCachedName() const { return sourceName; }
type obs_peak_meter_type (line 139) | enum obs_peak_meter_type
function MixerStatus (line 142) | MixerStatus &mixerStatus() { return mixerStatus_; }
function setContextMenu (line 146) | void setContextMenu(QMenu *cm) { contextMenu = cm; }
function isVertical (line 148) | bool isVertical() const { return vertical; }
function QWidget (line 152) | QWidget *firstWidget() const { return qobject_cast<QWidget *>(nameButton...
function QWidget (line 153) | QWidget *lastWidget() const
FILE: frontend/components/VolumeMeter.cpp
function QColor (line 21) | static inline QColor color_from_int(long long val)
function QColor (line 29) | QColor VolumeMeter::getBackgroundNominalColor() const
function QColor (line 34) | QColor VolumeMeter::getBackgroundNominalColorDisabled() const
function QColor (line 56) | QColor VolumeMeter::getBackgroundWarningColor() const
function QColor (line 61) | QColor VolumeMeter::getBackgroundWarningColorDisabled() const
function QColor (line 83) | QColor VolumeMeter::getBackgroundErrorColor() const
function QColor (line 88) | QColor VolumeMeter::getBackgroundErrorColorDisabled() const
function QColor (line 110) | QColor VolumeMeter::getForegroundNominalColor() const
function QColor (line 115) | QColor VolumeMeter::getForegroundNominalColorDisabled() const
function QColor (line 137) | QColor VolumeMeter::getForegroundWarningColor() const
function QColor (line 142) | QColor VolumeMeter::getForegroundWarningColorDisabled() const
function QColor (line 164) | QColor VolumeMeter::getForegroundErrorColor() const
function QColor (line 169) | QColor VolumeMeter::getForegroundErrorColorDisabled() const
function QColor (line 191) | QColor VolumeMeter::getMagnitudeColor() const
function QColor (line 201) | QColor VolumeMeter::getMajorTickColor() const
function QColor (line 211) | QColor VolumeMeter::getMinorTickColor() const
function qreal (line 221) | qreal VolumeMeter::getWarningLevel() const
function qreal (line 231) | qreal VolumeMeter::getErrorLevel() const
type obs_peak_meter_type (line 246) | enum obs_peak_meter_type
type obs_audio_info (line 411) | struct obs_audio_info
function QRect (line 468) | QRect VolumeMeter::getBarRect() const
function QColor (line 585) | QColor VolumeMeter::getPeakColor(float peakHold)
function QSize (line 879) | QSize VolumeMeter::minimumSizeHint() const
function QSize (line 884) | QSize VolumeMeter::sizeHint() const
FILE: frontend/components/VolumeMeter.hpp
class VolumeMeter (line 11) | class VolumeMeter : public QWidget {
type obs_peak_meter_type (line 192) | enum obs_peak_meter_type
method handleSourceDestroyed (line 205) | void handleSourceDestroyed() { deleteLater(); }
FILE: frontend/components/VolumeName.cpp
function QSize (line 60) | QSize VolumeName::sizeHint() const
FILE: frontend/components/VolumeName.hpp
class VolumeName (line 26) | class VolumeName : public QAbstractButton {
method alignment (line 38) | Qt::Alignment alignment() const { return textAlignment; }
FILE: frontend/components/VolumeSlider.hpp
class VolumeSlider (line 7) | class VolumeSlider : public AbsoluteSlider {
FILE: frontend/components/WindowCaptureToolbar.hpp
class WindowCaptureToolbar (line 5) | class WindowCaptureToolbar : public ComboSelectToolbar {
FILE: frontend/dialogs/LogUploadDialog.cpp
type DialogPage (line 29) | struct DialogPage {
type OBS (line 35) | namespace OBS {
FILE: frontend/dialogs/LogUploadDialog.hpp
class QTimer (line 26) | class QTimer
type OBS (line 28) | namespace OBS {
type LogFileType (line 30) | enum class LogFileType
class LogUploadDialog (line 32) | class LogUploadDialog : public QDialog {
FILE: frontend/dialogs/NameDialog.cpp
function IsWhitespace (line 64) | static bool IsWhitespace(char ch)
function CleanWhitespace (line 69) | static void CleanWhitespace(std::string &str)
FILE: frontend/dialogs/NameDialog.hpp
class QCheckBox (line 22) | class QCheckBox
class QLabel (line 23) | class QLabel
class QLineEdit (line 24) | class QLineEdit
class QString (line 25) | class QString
class NameDialog (line 27) | class NameDialog : public QDialog {
FILE: frontend/dialogs/OAuthLogin.hpp
class QCefWidget (line 5) | class QCefWidget
class OAuthLogin (line 7) | class OAuthLogin : public QDialog {
method QString (line 19) | inline QString GetCode() const { return code; }
method LoadFail (line 20) | inline bool LoadFail() const { return fail; }
FILE: frontend/dialogs/OBSAbout.hpp
class OBSAbout (line 7) | class OBSAbout : public QDialog {
FILE: frontend/dialogs/OBSBasicAdvAudio.hpp
class OBSAdvAudioCtrl (line 7) | class OBSAdvAudioCtrl
class Ui_OBSAdvAudio (line 8) | class Ui_OBSAdvAudio
class OBSBasicAdvAudio (line 12) | class OBSBasicAdvAudio : public QDialog {
FILE: frontend/dialogs/OBSBasicFilters.cpp
type obs_source_type (line 129) | enum obs_source_type
function OBSSource (line 163) | inline OBSSource OBSBasicFilters::GetFilter(int row, bool async)
function FilterChangeUndoRedo (line 177) | void FilterChangeUndoRedo(void *vp, obs_data_t *nd_old_settings, obs_dat...
type FilterOrderInfo (line 325) | struct FilterOrderInfo {
method FilterOrderInfo (line 330) | inline FilterOrderInfo(OBSBasicFilters *window_) : window(window_) {}
function filter_compatible (line 431) | static bool filter_compatible(bool async, uint32_t sourceFlags, uint32_t...
function QMenu (line 447) | QMenu *OBSBasicFilters::CreateAddFilterPopupMenu(bool async)
function QueryRemove (line 689) | static bool QueryRemove(QWidget *parent, obs_source_t *source)
function ConfirmReset (line 1001) | static bool ConfirmReset(QWidget *parent)
FILE: frontend/dialogs/OBSBasicFilters.hpp
class OBSBasic (line 24) | class OBSBasic
class OBSPropertiesView (line 25) | class OBSPropertiesView
class OBSBasicFilters (line 27) | class OBSBasicFilters : public QDialog {
method UpdateSource (line 121) | inline void UpdateSource(obs_source_t *target)
FILE: frontend/dialogs/OBSBasicInteraction.cpp
function OBSEventFilter (line 82) | OBSEventFilter *OBSBasicInteraction::BuildEventFilter()
function TranslateQtKeyboardEventModifiers (line 188) | static int TranslateQtKeyboardEventModifiers(QInputEvent *event, bool mo...
function TranslateQtMouseEventModifiers (line 216) | static int TranslateQtMouseEventModifiers(QMouseEvent *event)
type obs_mouse_event (line 270) | struct obs_mouse_event
type obs_mouse_event (line 306) | struct obs_mouse_event
type obs_mouse_event (line 323) | struct obs_mouse_event
type obs_key_event (line 365) | struct obs_key_event
FILE: frontend/dialogs/OBSBasicInteraction.hpp
class OBSBasic (line 26) | class OBSBasic
class OBSEventFilter (line 27) | class OBSEventFilter
class OBSBasicInteraction (line 29) | class OBSBasicInteraction : public QDialog {
FILE: frontend/dialogs/OBSBasicProperties.cpp
type obs_source_type (line 55) | enum obs_source_type
function obs_source_t (line 168) | static obs_source_t *CreateLabel(const char *name, size_t h)
function CreateTransitionScene (line 203) | static void CreateTransitionScene(OBSSource scene, const char *text, uin...
function ConfirmReset (line 229) | static bool ConfirmReset(QWidget *parent)
FILE: frontend/dialogs/OBSBasicProperties.hpp
class OBSBasic (line 24) | class OBSBasic
class OBSPropertiesView (line 25) | class OBSPropertiesView
class OBSBasicProperties (line 27) | class OBSBasicProperties : public QDialog {
FILE: frontend/dialogs/OBSBasicSourceSelect.cpp
type AddSourceData (line 24) | struct AddSourceData {
function AddSource (line 121) | static void AddSource(void *_data, obs_scene_t *scene)
type dstr (line 170) | struct dstr
function AddExisting (line 186) | static void AddExisting(OBSSource source, bool visible, bool duplicate, ...
function AddExisting (line 228) | static void AddExisting(const char *name, bool visible, bool duplicate)
function AddNew (line 236) | bool AddNew(QWidget *parent, const char *id, const char *name, const boo...
FILE: frontend/dialogs/OBSBasicSourceSelect.hpp
class OBSBasicSourceSelect (line 29) | class OBSBasicSourceSelect : public QDialog {
FILE: frontend/dialogs/OBSBasicTransform.cpp
function find_sel (line 8) | static bool find_sel(obs_scene_t *, obs_sceneitem_t *item, void *param)
function OBSSceneItem (line 26) | static OBSSceneItem FindASelectedItem(obs_scene_t *scene)
function vec2 (line 32) | static vec2 getAlignmentConversion(uint32_t alignment)
function alignToIndex (line 236) | static int alignToIndex(uint32_t align)
FILE: frontend/dialogs/OBSBasicTransform.hpp
class OBSBasic (line 11) | class OBSBasic
class QListWidgetItem (line 12) | class QListWidgetItem
class OBSBasicTransform (line 14) | class OBSBasicTransform : public QDialog {
method hookWidget (line 33) | void hookWidget(Widget *widget, void (WidgetParent::*signal)(SignalArg...
FILE: frontend/dialogs/OBSBasicVCamConfig.hpp
class OBSBasicVCamConfig (line 9) | class OBSBasicVCamConfig : public QDialog {
FILE: frontend/dialogs/OBSExtraBrowsers.hpp
class Ui_OBSExtraBrowsers (line 7) | class Ui_OBSExtraBrowsers
class OBSExtraBrowsers (line 9) | class OBSExtraBrowsers : public QDialog {
FILE: frontend/dialogs/OBSIdianPlayground.hpp
class OBSIdianPlayground (line 27) | class OBSIdianPlayground : public QDialog {
FILE: frontend/dialogs/OBSLogViewer.hpp
class OBSLogViewer (line 7) | class OBSLogViewer : public QDialog {
FILE: frontend/dialogs/OBSMissingFiles.cpp
function QIcon (line 135) | QIcon OBSMissingFiles::GetWarningIcon()
FILE: frontend/dialogs/OBSMissingFiles.hpp
class MissingFilesModel (line 27) | class MissingFilesModel
class OBSMissingFiles (line 29) | class OBSMissingFiles : public QDialog {
FILE: frontend/dialogs/OBSPermissions.hpp
class OBSPermissions (line 28) | class OBSPermissions : public QDialog {
FILE: frontend/dialogs/OBSRemux.hpp
class RemuxQueueModel (line 25) | class RemuxQueueModel
class RemuxWorker (line 26) | class RemuxWorker
class OBSRemux (line 28) | class OBSRemux : public QDialog {
type media_remux_job (line 49) | struct media_remux_job
FILE: frontend/dialogs/OBSUpdate.hpp
class Ui_OBSUpdate (line 5) | class Ui_OBSUpdate
class OBSUpdate (line 7) | class OBSUpdate : public QDialog {
FILE: frontend/dialogs/OBSWhatsNew.hpp
class QCefWidget (line 8) | class QCefWidget
class OBSWhatsNew (line 10) | class OBSWhatsNew : public QDialog {
FILE: frontend/dialogs/OBSYoutubeActions.hpp
class WorkerThread (line 9) | class WorkerThread : public QThread {
method stop (line 14) | void stop() { pending = false; }
class OBSYoutubeActions (line 29) | class OBSYoutubeActions : public QDialog {
method Valid (line 53) | bool Valid() { return valid; }
method QIcon (line 65) | QIcon GetPlaceholder() { return thumbPlaceholder; }
method SetPlaceholder (line 66) | void SetPlaceholder(const QIcon &icon) { thumbPlaceholder = icon; }
FILE: frontend/docks/BrowserDock.hpp
class BrowserDock (line 10) | class BrowserDock : public OBSDock {
method BrowserDock (line 17) | inline BrowserDock() : OBSDock() { setAttribute(Qt::WA_NativeWindow); }
method BrowserDock (line 18) | inline BrowserDock(const QString &title_) : OBSDock(title_)
method SetWidget (line 26) | inline void SetWidget(QCefWidget *widget_)
method setTitle (line 32) | inline void setTitle(const QString &title_) { title = title_; }
FILE: frontend/docks/OBSDock.hpp
class QCloseEvent (line 5) | class QCloseEvent
class QShowEvent (line 6) | class QShowEvent
class QString (line 7) | class QString
class OBSDock (line 9) | class OBSDock : public QDockWidget {
method Q_OBJECT (line 10) | Q_OBJECT
method OBSDock (line 14) | inline OBSDock(const QString &title, QWidget *parent = nullptr) : QDoc...
FILE: frontend/docks/YouTubeAppDock.cpp
function YoutubeApiWrappers (line 380) | YoutubeApiWrappers *YouTubeAppDock::GetYTApi()
FILE: frontend/docks/YouTubeAppDock.hpp
class QAction (line 7) | class QAction
class QCefWidget (line 8) | class QCefWidget
class YoutubeApiWrappers (line 9) | class YoutubeApiWrappers
class YouTubeAppDock (line 11) | class YouTubeAppDock : public BrowserDock {
type streaming_mode_t (line 17) | enum streaming_mode_t { YTSM_ACCOUNT, YTSM_STREAM_KEY }
FILE: frontend/docks/YouTubeChatDock.hpp
class YoutubeChatDock (line 6) | class YoutubeChatDock : public BrowserDock {
method YoutubeChatDock (line 13) | YoutubeChatDock(const QString &title) : BrowserDock(title) {}
method SetWidget (line 15) | inline void SetWidget(QCefWidget *widget_)
FILE: frontend/importer/ImporterEntryPathItemDelegate.cpp
function QWidget (line 33) | QWidget *ImporterEntryPathItemDelegate::createEditor(QWidget *parent, co...
FILE: frontend/importer/ImporterEntryPathItemDelegate.hpp
class ImporterEntryPathItemDelegate (line 22) | class ImporterEntryPathItemDelegate : public QStyledItemDelegate {
FILE: frontend/importer/ImporterModel.cpp
function QVariant (line 35) | QVariant ImporterModel::data(const QModelIndex &index, int role) const
function QVariant (line 190) | QVariant ImporterModel::headerData(int section, Qt::Orientation orientat...
FILE: frontend/importer/ImporterModel.hpp
type ImporterColumn (line 22) | enum ImporterColumn {
type ImporterEntryRole (line 31) | enum ImporterEntryRole { EntryStateRole = Qt::UserRole, NewPath, AutoPat...
class ImporterModel (line 33) | class ImporterModel : public QAbstractTableModel {
class OBSImporter (line 36) | class OBSImporter
method ImporterModel (line 39) | ImporterModel(QObject *parent = 0) : QAbstractTableModel(parent) {}
type ImporterEntry (line 49) | struct ImporterEntry {
FILE: frontend/importer/OBSImporter.cpp
function GetUnusedName (line 146) | bool GetUnusedName(std::string &name)
FILE: frontend/importer/OBSImporter.hpp
class ImporterModel (line 25) | class ImporterModel
class OBSImporter (line 27) | class OBSImporter : public QDialog {
FILE: frontend/importers/classic.cpp
function source_name_exists (line 25) | static bool source_name_exists(const Json::array &sources, const string ...
function translate_scene_item (line 40) | static Json::object translate_scene_item(const Json &in, const Json &sou...
function red_blue_swap (line 67) | static int red_blue_swap(int color)
function translate_source (line 77) | static Json::object translate_source(const Json &in, const Json &sources)
function translate_sc (line 258) | static void translate_sc(const Json &in, Json &out)
function create_string (line 315) | static void create_string(const string &name, Json::object &out, const s...
function create_string_obj (line 321) | static void create_string_obj(const string &data, Json::array &arr)
function create_double (line 328) | static void create_double(const string &name, Json::object &out, const s...
function create_int (line 334) | static void create_int(const string &name, Json::object &out, const stri...
function create_data_item (line 340) | static void create_data_item(Json::object &out, const string &line)
function create_sources (line 398) | static Json::array create_sources(Json::object &out, string &line, strin...
function create_object (line 432) | static Json::object create_object(Json::object &out, string &line, strin...
function string (line 473) | string ClassicImporter::Name(const string &path)
function OBSImporterFiles (line 528) | OBSImporterFiles ClassicImporter::FindFiles()
FILE: frontend/importers/importers.cpp
function ImportersInit (line 26) | void ImportersInit()
function ImportSCFromProg (line 35) | int ImportSCFromProg(const string &path, string &name, const string &pro...
function ImportSC (line 50) | int ImportSC(const string &path, std::string &name, Json &res)
function string (line 65) | string DetectProgram(const string &path)
function string (line 80) | string GetSCName(const string &path, const string &prog)
function OBSImporterFiles (line 91) | OBSImporterFiles ImportersFindFiles()
FILE: frontend/importers/importers.hpp
type obs_importer_responses (line 28) | enum obs_importer_responses {
class Importer (line 40) | class Importer {
method Prog (line 43) | virtual std::string Prog() { return "Null"; }
method OBSImporterFiles (line 47) | virtual OBSImporterFiles FindFiles()
class ClassicImporter (line 54) | class ClassicImporter : public Importer {
method Prog (line 56) | std::string Prog() { return "OBSClassic"; }
class StudioImporter (line 63) | class StudioImporter : public Importer {
method Prog (line 65) | std::string Prog() { return "OBSStudio"; }
class SLImporter (line 71) | class SLImporter : public Importer {
method Prog (line 73) | std::string Prog() { return "Streamlabs"; }
class XSplitImporter (line 80) | class XSplitImporter : public Importer {
method Prog (line 82) | std::string Prog() { return "XSplitBroadcaster"; }
method Name (line 85) | std::string Name(const std::string &) { return "XSplit Import"; }
function GetFilenameFromPath (line 102) | static inline std::string GetFilenameFromPath(const std::string &path)
function GetFolderFromPath (line 120) | static inline std::string GetFolderFromPath(const std::string &path)
function StringReplace (line 132) | static inline std::string StringReplace(const std::string &in, const std...
function ReadLine (line 144) | static inline std::string ReadLine(std::string &str)
FILE: frontend/importers/sl.cpp
function string (line 23) | static string translate_key(const string &sl_key)
function string (line 84) | static string translate_hotkey(const Json &hotkey, const string &source)
function source_name_exists (line 111) | static bool source_name_exists(const Json::array &sources, const string ...
function string (line 124) | static string get_source_name_from_id(const Json &root, const Json::arra...
function get_hotkey_bindings (line 156) | static void get_hotkey_bindings(Json::object &out_hotkeys, const Json &i...
function get_scene_items (line 186) | static void get_scene_items(const Json &root, const Json::array &out_sou...
function translate_screen_capture (line 221) | static void translate_screen_capture(Json::object &out_settings, string ...
function attempt_import (line 245) | static int attempt_import(const Json &root, const string &name, Json &res)
function string (line 390) | string SLImporter::Name(const string &path)
function OBSImporterFiles (line 484) | OBSImporterFiles SLImporter::FindFiles()
FILE: frontend/importers/studio.cpp
function TranslateOSStudio (line 26) | void TranslateOSStudio(Json &res)
function string (line 144) | static string CheckPath(const string &path, const string &rootDir)
function TranslatePaths (line 166) | void TranslatePaths(Json &res, const string &rootDir)
function string (line 231) | string StudioImporter::Name(const string &path)
FILE: frontend/importers/xsplit.cpp
function hex_string_to_int (line 26) | static int hex_string_to_int(string str)
function parse_text (line 47) | static Json::object parse_text(QString &config)
function parse_playlist (line 88) | static Json::array parse_playlist(QString &playlist)
function parse_media_types (line 108) | static void parse_media_types(QDomNamedNodeMap &attr, Json::object &sour...
function parse_slideshow (line 149) | static Json::object parse_slideshow(QString &config)
function source_name_exists (line 189) | static bool source_name_exists(const string &name, const Json::array &so...
function Json (line 199) | static Json get_source_with_id(const string &src_id, const Json::array &...
function parse_items (line 209) | static void parse_items(QDomNode &item, Json::array &items, Json::array ...
function parse_scenes (line 381) | static Json::object parse_scenes(QDomElement &scenes)
function OBSImporterFiles (line 484) | OBSImporterFiles XSplitImporter::FindFiles()
FILE: frontend/models/Rect.cpp
type OBS (line 20) | namespace OBS {
FILE: frontend/models/Rect.hpp
function safeConvertToDouble (line 24) | inline double safeConvertToDouble(numberType number)
type OBS (line 39) | namespace OBS {
type Rect (line 41) | struct Rect {
method Rect (line 45) | Rect() = default;
method Rect (line 47) | Rect(widthType width, heightType height)
method returnType (line 53) | returnType getWidth() const
method setWidth (line 61) | void setWidth(numberType width)
method returnType (line 73) | returnType getHeight() const
method setHeight (line 81) | void setHeight(numberType height)
FILE: frontend/models/SceneCollection.cpp
type OBS (line 22) | namespace OBS {
function SceneCoordinateMode (line 48) | SceneCoordinateMode SceneCollection::getCoordinateMode() const
function Rect (line 62) | Rect SceneCollection::getMigrationResolution() const
FILE: frontend/models/SceneCollection.hpp
type OBS (line 25) | namespace OBS {
type SceneCoordinateMode (line 27) | enum class SceneCoordinateMode { Invalid, Absolute, Relative }
class SceneCollection (line 29) | class SceneCollection {
method SceneCollection (line 38) | SceneCollection() = default;
method SceneCollection (line 39) | SceneCollection(const std::string &name, const std::filesystem::path...
method setMigrationResolution (line 55) | void setMigrationResolution(widthType width, heightType height)
method getVersion (line 60) | inline int getVersion() const { return (coordinateMode_ == SceneCoor...
method empty (line 62) | bool empty() const { return name_.empty() || filePath_.empty(); }
FILE: frontend/oauth/Auth.cpp
type AuthInfo (line 7) | struct AuthInfo {
FILE: frontend/oauth/Auth.hpp
class Auth (line 5) | class Auth : public QObject {
type ErrorInfo (line 14) | struct ErrorInfo {
method ErrorInfo (line 18) | ErrorInfo(std::string message_, std::string error_) : message(messag...
type Type (line 22) | enum class Type {
type Def (line 28) | struct Def {
method Auth (line 37) | inline Auth(const Def &d) : def(d) {}
method Type (line 40) | inline Type type() const { return def.type; }
method external (line 42) | inline bool external() const { return def.externalOAuth; }
method broadcastFlow (line 43) | inline bool broadcastFlow() const { return def.usesBroadcastFlow; }
method LoadUI (line 45) | virtual void LoadUI() {}
method OnStreamConfig (line 47) | virtual void OnStreamConfig() {}
FILE: frontend/oauth/AuthListener.cpp
function quint16 (line 41) | quint16 AuthListener::GetPort()
FILE: frontend/oauth/AuthListener.hpp
class QTcpServer (line 5) | class QTcpServer
class AuthListener (line 7) | class AuthListener : public QObject {
FILE: frontend/oauth/OAuth.cpp
type OAuthInfo (line 15) | struct OAuthInfo {
function get_config_str (line 58) | static inline std::string get_config_str(OBSBasic *main, const char *sec...
FILE: frontend/oauth/OAuth.hpp
class OAuth (line 5) | class OAuth : public Auth {
method Q_OBJECT (line 6) | Q_OBJECT
class OAuthStreamKey (line 41) | class OAuthStreamKey : public OAuth {
method OAuthStreamKey (line 48) | inline OAuthStreamKey(const Def &d) : OAuth(d) {}
FILE: frontend/oauth/RestreamAuth.cpp
function get_config_str (line 110) | static inline std::string get_config_str(OBSBasic *main, const char *sec...
function CreateRestreamAuth (line 254) | static std::shared_ptr<Auth> CreateRestreamAuth()
function DeleteCookies (line 259) | static void DeleteCookies()
function RegisterRestreamAuth (line 266) | void RegisterRestreamAuth()
FILE: frontend/oauth/RestreamAuth.hpp
class RestreamAuth (line 5) | class RestreamAuth : public OAuthStreamKey {
FILE: frontend/oauth/TwitchAuth.cpp
function get_config_str (line 162) | static inline std::string get_config_str(OBSBasic *main, const char *sec...
function CreateTwitchAuth (line 470) | static std::shared_ptr<Auth> CreateTwitchAuth()
function DeleteCookies (line 475) | static void DeleteCookies()
function RegisterTwitchAuth (line 481) | void RegisterTwitchAuth()
FILE: frontend/oauth/TwitchAuth.hpp
class TwitchAuth (line 9) | class TwitchAuth : public OAuthStreamKey {
FILE: frontend/oauth/YoutubeAuth.cpp
function OpenBrowser (line 34) | static inline void OpenBrowser(const QString auth_uri)
function DeleteCookies (line 40) | static void DeleteCookies()
function RegisterYoutubeAuth (line 48) | void RegisterYoutubeAuth()
function get_config_str (line 89) | static inline std::string get_config_str(OBSBasic *main, const char *sec...
function QString (line 188) | QString YoutubeAuth::GenerateState()
FILE: frontend/oauth/YoutubeAuth.hpp
class YoutubeChatDock (line 10) | class YoutubeChatDock
class YoutubeAuth (line 13) | class YoutubeAuth : public OAuthStreamKey {
FILE: frontend/obs-main.cpp
function string (line 85) | string CurrentTimeString()
function LogString (line 107) | static void LogString(fstream &logFile, const char *timeString, char *st...
function LogStringChunk (line 122) | static inline void LogStringChunk(fstream &logFile, char *str, int log_l...
function sum_chars (line 150) | static inline int sum_chars(const char *str)
function too_many_repeated_entries (line 159) | static inline bool too_many_repeated_entries(fstream &logFile, const cha...
function do_log (line 193) | static void do_log(int log_level, const char *msg, va_list args, void *p...
function get_token (line 245) | static bool get_token(lexer *lex, string &str, base_token_type type)
function expect_token (line 257) | static bool expect_token(lexer *lex, const char *str, base_token_type type)
function convert_log_name (line 268) | static uint64_t convert_log_name(bool has_prefix, const char *name)
function move_to_xdg (line 310) | static void move_to_xdg(void)
function delete_oldest_file (line 336) | static void delete_oldest_file(bool has_prefix, const char *location)
function get_last_log (line 376) | static void get_last_log(bool has_prefix, const char *subdir_to_use, std...
function create_log_file (line 400) | static void create_log_file(fstream &logFile)
function ProfilerNameStore (line 433) | ProfilerNameStore CreateNameStore()
function ProfilerSnapshot (line 444) | ProfilerSnapshot GetSnapshot()
function SaveProfilerData (line 449) | static void SaveProfilerData(const ProfilerSnapshot &snap)
function QAccessibleInterface (line 483) | QAccessibleInterface *accessibleFactory(const QString &classname, QObjec...
function run_program (line 492) | static int run_program(fstream &logFile, int argc, char *argv[])
function main_crash_handler (line 719) | static void main_crash_handler(const char *format, va_list args, void * ...
function load_debug_privilege (line 781) | static void load_debug_privilege(void)
function arg_is (line 815) | static inline bool arg_is(const char *arg, const char *long_form, const ...
function vc_runtime_outdated (line 826) | static bool vc_runtime_outdated()
function main (line 857) | int main(int argc, char *argv[])
FILE: frontend/plugin-manager/PluginManager.cpp
type OBS (line 34) | namespace OBS {
function addModuleToPluginManagerImpl (line 36) | void addModuleToPluginManagerImpl(void *param, obs_module_t *newModule)
FILE: frontend/plugin-manager/PluginManager.hpp
type OBS (line 26) | namespace OBS {
type ModuleInfo (line 28) | struct ModuleInfo {
class PluginManager (line 45) | class PluginManager {
function addModuleToPluginManager (line 74) | inline void addModuleToPluginManager(void *param, obs_module_t *newModule)
FILE: frontend/plugin-manager/PluginManagerWindow.cpp
type OBS (line 34) | namespace OBS {
FILE: frontend/plugin-manager/PluginManagerWindow.hpp
type OBS (line 26) | namespace OBS {
class PluginManagerWindow (line 28) | class PluginManagerWindow : public QDialog {
method result (line 34) | inline std::vector<ModuleInfo> const result() { return modules_; }
FILE: frontend/plugins/aja-output-ui/AJAOutputUI.cpp
function obs_properties_t (line 167) | static obs_properties_t *create_misc_props_ui(void *vp)
FILE: frontend/plugins/aja-output-ui/AJAOutputUI.h
function namespace (line 8) | namespace aja {
function class (line 12) | class AJAOutputUI : public QDialog {
FILE: frontend/plugins/aja-output-ui/aja-ui-main.cpp
type preview_output (line 28) | struct preview_output {
type preview_output (line 42) | struct preview_output
function OBSData (line 44) | OBSData load_settings(const char *filename)
function output_stop (line 59) | void output_stop()
function output_start (line 67) | void output_start()
function output_toggle (line 86) | void output_toggle()
type obs_frontend_event (line 94) | enum obs_frontend_event
function preview_output_stop (line 97) | void preview_output_stop()
function preview_output_start (line 118) | void preview_output_start()
function preview_output_toggle (line 171) | void preview_output_toggle()
function populate_misc_device_list (line 179) | void populate_misc_device_list(obs_property_t *list, aja::CardManager *c...
function populate_multi_view_audio_sources (line 191) | void populate_multi_view_audio_sources(obs_property_t *list, NTV2DeviceI...
function on_misc_device_selected (line 208) | bool on_misc_device_selected(void *data, obs_properties_t *props, obs_pr...
function toggle_multi_view (line 230) | static void toggle_multi_view(CNTV2Card *card, NTV2InputSource src, bool...
function on_multi_view_toggle (line 267) | bool on_multi_view_toggle(void *data, obs_properties_t *, obs_property_t...
function on_preview_scene_changed (line 290) | void on_preview_scene_changed(enum obs_frontend_event event, void *param)
function render_preview_source (line 314) | void render_preview_source(void *param, uint32_t, uint32_t)
function addOutputUI (line 363) | void addOutputUI(void)
function OBSEvent (line 380) | static void OBSEvent(enum obs_frontend_event event, void *)
function aja_loaded (line 403) | static void aja_loaded(void * /* data */, calldata_t *calldata)
function obs_module_load (line 411) | bool obs_module_load(void)
FILE: frontend/plugins/aja-output-ui/aja-ui-main.h
function namespace (line 6) | namespace aja {
FILE: frontend/plugins/decklink-captions/decklink-captions.cpp
type obs_captions (line 10) | struct obs_captions {
function caption_callback (line 65) | static void caption_callback(void * /* param */, obs_source_t * /* sourc...
function save_decklink_caption_data (line 93) | static void save_decklink_caption_data(obs_data_t *save_data, bool savin...
function addOutputUI (line 117) | void addOutputUI(void)
function obs_module_load (line 139) | bool obs_module_load(void)
function obs_module_post_load (line 144) | void obs_module_post_load(void)
FILE: frontend/plugins/decklink-captions/decklink-captions.h
function class (line 8) | class DecklinkCaptionsUI : public QDialog {
function OBSWeakSource (line 19) | static inline OBSWeakSource GetWeakSourceByName(const char *name)
FILE: frontend/plugins/decklink-output-ui/DecklinkOutputUI.h
function class (line 8) | class DecklinkOutputUI : public QDialog {
FILE: frontend/plugins/decklink-output-ui/decklink-ui-main.cpp
type decklink_ui_output (line 24) | struct decklink_ui_output {
type decklink_ui_output (line 41) | struct decklink_ui_output
type decklink_ui_output (line 42) | struct decklink_ui_output
function OBSData (line 44) | OBSData load_settings()
function output_stop (line 62) | void output_stop()
function output_start (line 87) | void output_start()
function output_toggle (line 147) | void output_toggle()
function OBSData (line 155) | OBSData load_preview_settings()
type obs_frontend_event (line 170) | enum obs_frontend_event
function decklink_ui_tick (line 172) | static void decklink_ui_tick(void *param, float /* sec */)
function preview_output_stop (line 182) | void preview_output_stop()
function preview_output_start (line 212) | void preview_output_start()
function preview_output_toggle (line 276) | void preview_output_toggle()
function on_preview_scene_changed (line 284) | void on_preview_scene_changed(enum obs_frontend_event event, void *param)
function decklink_ui_render (line 308) | static void decklink_ui_render(void *param)
function addOutputUI (line 416) | void addOutputUI(void)
function OBSEvent (line 433) | static void OBSEvent(enum obs_frontend_event event, void *)
function obs_module_load (line 456) | bool obs_module_load(void)
function obs_module_unload (line 461) | void obs_module_unload(void)
function obs_module_post_load (line 472) | void obs_module_post_load(void)
FILE: frontend/plugins/frontend-tools/auto-scene-switcher-nix.cpp
function Display (line 22) | Display *disp()
function CleanupSceneSwitcher (line 30) | void CleanupSceneSwitcher()
function ewmhIsSupported (line 39) | static bool ewmhIsSupported()
function getTopLevelWindows (line 82) | static std::vector<Window> getTopLevelWindows()
function GetWindowTitle (line 120) | static std::string GetWindowTitle(size_t i)
function GetWindowList (line 146) | void GetWindowList(vector<string> &windows)
function GetCurrentWindowTitle (line 156) | void GetCurrentWindowTitle(string &title)
FILE: frontend/plugins/frontend-tools/auto-scene-switcher-win.cpp
function GetWindowTitle (line 7) | static bool GetWindowTitle(HWND window, string &title)
function WindowValid (line 22) | static bool WindowValid(HWND window)
function GetWindowList (line 46) | void GetWindowList(vector<string> &windows)
function GetCurrentWindowTitle (line 58) | void GetCurrentWindowTitle(string &title)
function CleanupSceneSwitcher (line 71) | void CleanupSceneSwitcher() {}
FILE: frontend/plugins/frontend-tools/auto-scene-switcher.cpp
type SceneSwitch (line 23) | struct SceneSwitch {
method SceneSwitch (line 28) | inline SceneSwitch(OBSWeakSource scene_, const char *window_) : scene(...
function WeakSourceValid (line 31) | static inline bool WeakSourceValid(obs_weak_source_t *ws)
type SwitcherData (line 37) | struct SwitcherData {
method Prune (line 52) | void Prune()
function QString (line 71) | static inline QString MakeSwitchName(const QString &scene, const QString...
function SaveSceneSwitcher (line 315) | static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *)
function FreeSceneSwitcher (line 467) |
Copy disabled (too large)
Download .json
Condensed preview — 4796 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,747K chars).
[
{
"path": ".clang-format",
"chars": 5931,
"preview": "# please use clang-format version 16 or later\n\nStandard: c++17\nAccessModifierOffset: -8\nAlignAfterOpenBracket: Align\nAli"
},
{
"path": ".editorconfig",
"chars": 1238,
"preview": "# EditorConfig is awesome: http://EditorConfig.org\n# Since OBS follows the Linux kernel coding style I have started this"
},
{
"path": ".gersemirc",
"chars": 252,
"preview": "# yaml-language-server: $schema=https://raw.githubusercontent.com/BlankSpruce/gersemi/master/gersemi/configuration.schem"
},
{
"path": ".github/FUNDING.yml",
"chars": 48,
"preview": "open_collective: obsproject\npatreon: obsproject\n"
},
{
"path": ".github/actions/build-obs/action.yaml",
"chars": 3733,
"preview": "name: Set Up and Build obs-studio\ndescription: Builds obs-studio for specified architecture and build config\ninputs:\n t"
},
{
"path": ".github/actions/check-changes/action.yaml",
"chars": 2949,
"preview": "name: Check For Changed Files\ndescription: Checks for changed files compared to specific git reference and glob expressi"
},
{
"path": ".github/actions/compatibility-validator/action.yaml",
"chars": 2072,
"preview": "name: Compatibility Data Validator\ndescription: Checks Windows compatibility data files\ninputs:\n repositorySecret:\n "
},
{
"path": ".github/actions/flatpak-builder-lint/action.yaml",
"chars": 3002,
"preview": "name: Run flatpak-builder-lint\ndescription: Runs flatpak-builder-lint with exceptions\ninputs:\n artifact:\n descriptio"
},
{
"path": ".github/actions/flatpak-builder-lint/exceptions.json",
"chars": 206,
"preview": "{\n \"com.obsproject.Studio\": [\n \"finish-args-flatpak-spawn-access\",\n \"external-gitmodule-url-found\",\n \"finish-a"
},
{
"path": ".github/actions/flatpak-manifest-validator/action.yaml",
"chars": 1178,
"preview": "name: Flatpak Manifest Validator\ndescription: Checks order of Flatpak modules in manifest file\ninputs:\n manifestFile:\n "
},
{
"path": ".github/actions/generate-docs/action.yaml",
"chars": 2993,
"preview": "name: Generate Documentation\ndescription: Updates Sphinx-based documentation\ninputs:\n sourceDirectory:\n description:"
},
{
"path": ".github/actions/package-obs/action.yaml",
"chars": 3559,
"preview": "name: Package obs-studio\ndescription: Packages obs-studio for specified architecture and build config\ninputs:\n target:\n"
},
{
"path": ".github/actions/qt-xml-validator/action.yaml",
"chars": 1895,
"preview": "name: Validate UI XML\ndescription: Validates Qt UI XML files\ninputs:\n failCondition:\n description: Controls whether "
},
{
"path": ".github/actions/run-clang-format/action.yaml",
"chars": 2132,
"preview": "name: Run clang-format\ndescription: Runs clang-format and checks for any changes introduced by it\ninputs:\n failConditio"
},
{
"path": ".github/actions/run-gersemi/action.yaml",
"chars": 1975,
"preview": "name: Run gersemi\ndescription: Runs gersemi and checks for any changes introduced by it\ninputs:\n failCondition:\n des"
},
{
"path": ".github/actions/run-swift-format/action.yaml",
"chars": 1978,
"preview": "name: Run swift-format\ndescription: Runs swift-format and checks for any changes introduced by it\ninputs:\n failConditio"
},
{
"path": ".github/actions/services-validator/action.yaml",
"chars": 4457,
"preview": "name: Services Validation\ndescription: Checks services configuration file and checks for defunct services\ninputs:\n repo"
},
{
"path": ".github/actions/setup-macos-codesigning/action.yaml",
"chars": 6428,
"preview": "name: Set up macOS Code Signing\ndescription: Sets up code signing certificates, provisioning profiles, and notarization "
},
{
"path": ".github/actions/sparkle-appcast/action.yaml",
"chars": 8675,
"preview": "name: Generate Sparkle Appcast\ndescription: Creates Sparkle Appcast for a new release and generates delta patch files\nin"
},
{
"path": ".github/actions/sparkle-appcast/appcast_adjust.xslt",
"chars": 3802,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\"\nxmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\nxm"
},
{
"path": ".github/actions/sparkle-appcast/appcast_legacy.xslt",
"chars": 1488,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\"\nxmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\nxm"
},
{
"path": ".github/actions/steam-upload/action.yaml",
"chars": 10405,
"preview": "name: Steam Upload\ndescription: Creates and uploads stable and nightly builds of obs-studio and beta builds (if availabl"
},
{
"path": ".github/actions/windows-analysis/Invoke-External.ps1",
"chars": 997,
"preview": "function Invoke-External {\n <#\n .SYNOPSIS\n Invokes a non-PowerShell command.\n .DESCRIPTION\n "
},
{
"path": ".github/actions/windows-analysis/Logger.ps1",
"chars": 3327,
"preview": "function Log-Debug {\n [CmdletBinding()]\n param(\n [Parameter(Mandatory,ValueFromPipeline)]\n [Validate"
},
{
"path": ".github/actions/windows-analysis/action.yaml",
"chars": 2974,
"preview": "name: Run PVS-Studio Analysis\ninputs:\n pvsUsername:\n description: PVS-Studio License Username\n required: true\n p"
},
{
"path": ".github/actions/windows-analysis/obs.pvsconfig",
"chars": 361,
"preview": "//V_EXCLUDE_PATH */.deps/*\n//V_EXCLUDE_PATH */blake2/*\n//V_EXCLUDE_PATH */json11/*\n//V_EXCLUDE_PATH */simde/*\n//V_EXCLUD"
},
{
"path": ".github/actions/windows-patches/Ensure-Location.ps1",
"chars": 716,
"preview": "function Ensure-Location {\n <#\n .SYNOPSIS\n Ensures current location to be set to specified director"
},
{
"path": ".github/actions/windows-patches/Invoke-External.ps1",
"chars": 997,
"preview": "function Invoke-External {\n <#\n .SYNOPSIS\n Invokes a non-PowerShell command.\n .DESCRIPTION\n "
},
{
"path": ".github/actions/windows-patches/Logger.ps1",
"chars": 3327,
"preview": "function Log-Debug {\n [CmdletBinding()]\n param(\n [Parameter(Mandatory,ValueFromPipeline)]\n [Validate"
},
{
"path": ".github/actions/windows-patches/action.yaml",
"chars": 4613,
"preview": "name: Run bouf Patch Generation\ndescription: Generates OBS updater manifest and patches\ninputs:\n gcsAccessKeyId:\n de"
},
{
"path": ".github/actions/windows-patches/config.toml",
"chars": 558,
"preview": "[general]\nlog_level = \"trace\"\n\n[env]\n# On CI these should be in %PATH%\nsevenzip_path = \"7z\"\nmakensis_path = \"makensis\"\np"
},
{
"path": ".github/actions/windows-signing/Ensure-Location.ps1",
"chars": 716,
"preview": "function Ensure-Location {\n <#\n .SYNOPSIS\n Ensures current location to be set to specified director"
},
{
"path": ".github/actions/windows-signing/Invoke-External.ps1",
"chars": 997,
"preview": "function Invoke-External {\n <#\n .SYNOPSIS\n Invokes a non-PowerShell command.\n .DESCRIPTION\n "
},
{
"path": ".github/actions/windows-signing/Logger.ps1",
"chars": 3327,
"preview": "function Log-Debug {\n [CmdletBinding()]\n param(\n [Parameter(Mandatory,ValueFromPipeline)]\n [Validate"
},
{
"path": ".github/actions/windows-signing/action.yaml",
"chars": 5532,
"preview": "name: Run bouf Packaging\ndescription: Generates signed OBS install files\ninputs:\n gcpWorkloadIdentityProvider:\n desc"
},
{
"path": ".github/actions/windows-signing/cng-release-signing-key.pem",
"chars": 215,
"preview": "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtfLbXkHUVc9oUPTNyaEK3hIwmuGRoTtd\n6zDhwqjJuYaMwNd1aaFQLMawTwZg"
},
{
"path": ".github/actions/windows-signing/config_arm64.toml",
"chars": 1002,
"preview": "[general]\nlog_level = \"trace\"\n\n[env]\n# On CI these should be in %PATH%\nsevenzip_path = \"7z\"\nmakensis_path = \"makensis\"\np"
},
{
"path": ".github/actions/windows-signing/config_x64.toml",
"chars": 1025,
"preview": "[general]\nlog_level = \"trace\"\n\n[env]\n# On CI these should be in %PATH%\nsevenzip_path = \"7z\"\nmakensis_path = \"makensis\"\np"
},
{
"path": ".github/actions/windows-signing/prod-gc.crt",
"chars": 2618,
"preview": "-----BEGIN CERTIFICATE-----\nMIIHYDCCBUigAwIBAgIQCTRoMeK9NItAQamXbU8PnjANBgkqhkiG9w0BAQsFADBp\nMQswCQYDVQQGEwJVUzEXMBUGA1U"
},
{
"path": ".github/actions/windows-signing/prod.crt",
"chars": 1497,
"preview": "-----BEGIN CERTIFICATE-----\nMIIEIzCCA6mgAwIBAgIQA/1HO4x/Q51pGXj/sSt/ZzAKBggqhkjOPQQDAzBTMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChM"
},
{
"path": ".github/actions/windows-signing/test.crt",
"chars": 631,
"preview": "-----BEGIN CERTIFICATE-----\nMIIBpDCCAUmgAwIBAgIUXeKu2+AXK2yR8WyuTTRg8+t6p/kwCgYIKoZIzj0EAwIw\nJzElMCMGA1UEAwwcV2l6YXJkcyB"
},
{
"path": ".github/scripts/.Aptfile",
"chars": 155,
"preview": "package 'ccache'\npackage 'cmake', bin: '/usr/bin/cmake'\npackage 'curl'\npackage 'git'\npackage 'jq'\npackage 'ninja-build',"
},
{
"path": ".github/scripts/.Brewfile",
"chars": 52,
"preview": "brew \"cmake\"\nbrew \"git\"\nbrew \"jq\"\nbrew \"xcbeautify\"\n"
},
{
"path": ".github/scripts/.Wingetfile",
"chars": 95,
"preview": "package '7zip.7zip', path: '7-zip', bin: '7z'\npackage 'cmake', path: 'Cmake\\bin', bin: 'cmake'\n"
},
{
"path": ".github/scripts/.build.zsh",
"chars": 6263,
"preview": "#!/usr/bin/env zsh\n\nbuiltin emulate -L zsh\nsetopt EXTENDED_GLOB\nsetopt PUSHD_SILENT\nsetopt ERR_EXIT\nsetopt ERR_RETURN\nse"
},
{
"path": ".github/scripts/.package.zsh",
"chars": 7096,
"preview": "#!/usr/bin/env zsh\n\nbuiltin emulate -L zsh\nsetopt EXTENDED_GLOB\nsetopt PUSHD_SILENT\nsetopt ERR_EXIT\nsetopt ERR_RETURN\nse"
},
{
"path": ".github/scripts/Build-Windows.ps1",
"chars": 2361,
"preview": "[CmdletBinding()]\nparam(\n [ValidateSet('x64', 'arm64')]\n [string] $Target = 'x64',\n [ValidateSet('Debug', 'RelW"
},
{
"path": ".github/scripts/Package-Windows.ps1",
"chars": 2143,
"preview": "[CmdletBinding()]\nparam(\n [ValidateSet('x64', 'arm64')]\n [string] $Target = 'x64',\n [ValidateSet('Debug', 'RelW"
},
{
"path": ".github/scripts/utils.pwsh/Ensure-Location.ps1",
"chars": 716,
"preview": "function Ensure-Location {\n <#\n .SYNOPSIS\n Ensures current location to be set to specified director"
},
{
"path": ".github/scripts/utils.pwsh/Install-BuildDependencies.ps1",
"chars": 2310,
"preview": "function Install-BuildDependencies {\n <#\n .SYNOPSIS\n Installs required build dependencies.\n "
},
{
"path": ".github/scripts/utils.pwsh/Invoke-External.ps1",
"chars": 997,
"preview": "function Invoke-External {\n <#\n .SYNOPSIS\n Invokes a non-PowerShell command.\n .DESCRIPTION\n "
},
{
"path": ".github/scripts/utils.pwsh/Logger.ps1",
"chars": 3327,
"preview": "function Log-Debug {\n [CmdletBinding()]\n param(\n [Parameter(Mandatory,ValueFromPipeline)]\n [Validate"
},
{
"path": ".github/scripts/utils.py/check-jsonschema.py",
"chars": 3955,
"preview": "import argparse\nimport json\nimport logging\nimport os\nimport sys\nfrom typing import Any\n\nfrom json_source_map import calc"
},
{
"path": ".github/scripts/utils.py/check-services.py",
"chars": 13013,
"preview": "import asyncio\nimport json\nimport os\nimport time\nimport sys\nimport zipfile\n\nimport aiohttp\nimport requests\n\nfrom io impo"
},
{
"path": ".github/scripts/utils.zsh/check_macos",
"chars": 627,
"preview": "autoload -Uz is-at-least log_group log_info log_error log_status\n\nlocal macos_version=$(sw_vers -productVersion)\n\nlog_gr"
},
{
"path": ".github/scripts/utils.zsh/check_ubuntu",
"chars": 1359,
"preview": "autoload -Uz log_debug log_group\n\nlog_group 'Check Ubuntu build requirements'\nlog_debug 'Checking Ubuntu distribution na"
},
{
"path": ".github/scripts/utils.zsh/create_diskimage",
"chars": 1879,
"preview": "autoload -Uz log_debug log_error log_info log_status log_group log_output log_warning\n\nlocal -r _usage=\"Usage: %B${0}%b "
},
{
"path": ".github/scripts/utils.zsh/log_debug",
"chars": 60,
"preview": "if (( debug )) print -PR -e \"::debug::%F{220}DEBUG: ${@}%f\"\n"
},
{
"path": ".github/scripts/utils.zsh/log_error",
"chars": 45,
"preview": "print -u2 -PR \"::error::%F{1} ✖︎%f ${@}\"\n"
},
{
"path": ".github/scripts/utils.zsh/log_group",
"chars": 212,
"preview": "autoload -Uz log_info\n\nif (( ! ${+_log_group} )) typeset -g _log_group=0\n\nif (( _log_group )) {\n print \"::endgroup::\"\n "
},
{
"path": ".github/scripts/utils.zsh/log_info",
"chars": 35,
"preview": "print -PR \"%F{4} =>%f %B${@}%b\"\n"
},
{
"path": ".github/scripts/utils.zsh/log_output",
"chars": 25,
"preview": "print -PR \" ${@}\"\n"
},
{
"path": ".github/scripts/utils.zsh/log_status",
"chars": 31,
"preview": "print -PR \"%F{2} >%f ${@}\"\n"
},
{
"path": ".github/scripts/utils.zsh/log_warning",
"chars": 42,
"preview": "print -PR \"::warning::%F{3} => ${@}%f\"\n"
},
{
"path": ".github/scripts/utils.zsh/mkcd",
"chars": 50,
"preview": "[[ -n ${1} ]] && mkdir -p ${1} && builtin cd ${1}\n"
},
{
"path": ".github/scripts/utils.zsh/setup_ccache",
"chars": 929,
"preview": "autoload -Uz is-at-least log_debug log_warning\n\nif (( ${+commands[ccache]} )) {\n log_debug \"Found ccache at ${commands["
},
{
"path": ".github/scripts/utils.zsh/setup_ubuntu",
"chars": 3208,
"preview": "autoload -Uz log_group log_error log_status log_info log_debug\n\nif (( ! ${+commands[curl]} )) {\n log_error 'curl not av"
},
{
"path": ".github/workflows/analyze-project.yaml",
"chars": 4715,
"preview": "name: Analyze Project\non:\n workflow_call:\njobs:\n windows:\n name: Windows 🪟 (PVS-Studio)\n runs-on: windows-2022\n "
},
{
"path": ".github/workflows/build-project.yaml",
"chars": 16073,
"preview": "name: Build Project\non:\n workflow_call:\njobs:\n check-event:\n name: Event Data 🔎\n runs-on: ubuntu-24.04\n defau"
},
{
"path": ".github/workflows/check-format.yaml",
"chars": 1458,
"preview": "name: Check Code Formatting 🛠️\non:\n workflow_call:\njobs:\n clang-format:\n runs-on: ubuntu-24.04\n steps:\n - u"
},
{
"path": ".github/workflows/dispatch.yaml",
"chars": 5073,
"preview": "name: Dispatch\nrun-name: Dispatched Repository Actions - ${{ inputs.job }} ⌛️\non:\n workflow_dispatch:\n inputs:\n "
},
{
"path": ".github/workflows/pr-pull.yaml",
"chars": 2622,
"preview": "name: Pull\nrun-name: ${{ github.event.pull_request.title }} pull request run 🚀\non:\n workflow_dispatch:\n pull_request:\n"
},
{
"path": ".github/workflows/publish.yaml",
"chars": 9403,
"preview": "name: Publish\nrun-name: Publish Repository Actions 🛫\non:\n release:\n types:\n - published\n branches:\n - m"
},
{
"path": ".github/workflows/push.yaml",
"chars": 13286,
"preview": "name: Push\nrun-name: ${{ github.ref_name }} push run 🚀\non:\n push:\n paths-ignore:\n - '**.md'\n branches:\n "
},
{
"path": ".github/workflows/scheduled.yaml",
"chars": 7812,
"preview": "name: Scheduled\nrun-name: Scheduled Repository Actions ⏰\non:\n workflow_dispatch:\n schedule:\n - cron: 17 0 * * *\nper"
},
{
"path": ".github/workflows/sign-windows.yaml",
"chars": 3193,
"preview": "name: Sign Windows Project\non:\n workflow_call:\njobs:\n create-windows-update:\n name: Sign Windows Build 🥩\n strate"
},
{
"path": ".gitignore",
"chars": 752,
"preview": "# Exclude everything\n/*\n\n# Except for default project files\n!/.github\n!/build-aux\n!/cmake\n!/deps\n!/docs\n!/frontend\n!/lib"
},
{
"path": ".gitmodules",
"chars": 374,
"preview": "[submodule \"plugins/win-dshow/libdshowcapture\"]\n\tpath = deps/libdshowcapture/src\n\turl = https://github.com/obsproject/li"
},
{
"path": ".mailmap",
"chars": 4460,
"preview": "#\n# Manually defined\n#\nLain <lain@obsproject.com>\nLain <obs.jim@gmail.com>\nBenjamin Klettbach <b.klettbach@gmail.com>\nBt"
},
{
"path": ".swift-format",
"chars": 853,
"preview": "{\n \"version\": 1,\n \"lineLength\": 120,\n \"indentation\": {\n \"spaces\": 4\n },\n \"tabWidth\": 4,\n \"maxim"
},
{
"path": "AUTHORS",
"chars": 52839,
"preview": "Original Author: Lain Bailey\n\nContributors are sorted by their amount of commits / translated words.\n\nContributors:\n Lai"
},
{
"path": "CMakeLists.txt",
"chars": 938,
"preview": "cmake_minimum_required(VERSION 3.28...3.30)\n\ninclude(\"${CMAKE_CURRENT_SOURCE_DIR}/cmake/common/bootstrap.cmake\" NO_POLIC"
},
{
"path": "CMakePresets.json",
"chars": 9372,
"preview": "{\n \"version\": 8,\n \"cmakeMinimumRequired\": {\n \"major\": 3,\n \"minor\": 28,\n \"patch\": 0\n },\n \"configurePresets\":"
},
{
"path": "COC.rst",
"chars": 6618,
"preview": "Code of Conduct\n===============\n\nPreamble\n--------\n\nOBS is made up of many people from all over the world, with differen"
},
{
"path": "COMMITMENT",
"chars": 2092,
"preview": "GPL Cooperation Commitment\nVersion 1.0\n\nBefore filing or continuing to prosecute any legal proceeding or claim\n(other th"
},
{
"path": "CONTRIBUTING.rst",
"chars": 4529,
"preview": "Contributing\n============\n\nQuick Links for Contributing\n----------------------------\n\n- Compiling and building OBS Studi"
},
{
"path": "COPYING",
"chars": 18092,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
},
{
"path": "INSTALL",
"chars": 105,
"preview": "For install instructions please visit https://github.com/obsproject/obs-studio/wiki/Install-Instructions\n"
},
{
"path": "README.rst",
"chars": 2997,
"preview": "OBS Studio <https://obsproject.com>\n===================================\n\n.. image:: https://github.com/obsproject/obs-st"
},
{
"path": "build-aux/.functions/log_debug",
"chars": 127,
"preview": "if (( ! ${+_loglevel} )) typeset -g _loglevel=1\n\nif (( _loglevel > 2 )) print -PR -e -- \"${CI:+::debug::}%F{220}DEBUG: $"
},
{
"path": "build-aux/.functions/log_error",
"chars": 74,
"preview": "local icon=' ✖︎ '\n\nprint -u2 -PR \"${CI:+::error::}%F{1} ${icon} %f ${@}\"\n"
},
{
"path": "build-aux/.functions/log_group",
"chars": 284,
"preview": "autoload -Uz log_info\n\nif (( ! ${+_log_group} )) typeset -g _log_group=0\n\nif (( ${+CI} )) {\n if (( _log_group )) {\n "
},
{
"path": "build-aux/.functions/log_info",
"chars": 142,
"preview": "if (( ! ${+_loglevel} )) typeset -g _loglevel=1\n\nif (( _loglevel > 0 )) {\n local icon=' =>'\n\n print -PR \"%F{4} ${(r:5"
},
{
"path": "build-aux/.functions/log_output",
"chars": 128,
"preview": "if (( ! ${+_loglevel} )) typeset -g _loglevel=1\n\nif (( _loglevel > 0 )) {\n local icon=''\n\n print -PR \" ${(r:5:)icon} "
},
{
"path": "build-aux/.functions/log_status",
"chars": 138,
"preview": "if (( ! ${+_loglevel} )) typeset -g _loglevel=1\n\nif (( _loglevel > 0 )) {\n local icon=' >'\n\n print -PR \"%F{2} ${(r:5"
},
{
"path": "build-aux/.functions/log_warning",
"chars": 156,
"preview": "if (( ! ${+_loglevel} )) typeset -g _loglevel=1\n\nif (( _loglevel > 0 )) {\n local icon=' =>'\n\n print -PR \"${CI:+::warni"
},
{
"path": "build-aux/.functions/set_loglevel",
"chars": 429,
"preview": "autoload -Uz log_debug log_error\n\nlocal -r _usage=\"Usage: %B${0}%b <loglevel>\n\nSet log level, following levels are suppo"
},
{
"path": "build-aux/.run-format.zsh",
"chars": 8901,
"preview": "#!/usr/bin/env zsh\n\nbuiltin emulate -L zsh\nsetopt EXTENDED_GLOB\nsetopt PUSHD_SILENT\nsetopt ERR_EXIT\nsetopt ERR_RETURN\nse"
},
{
"path": "build-aux/README.md",
"chars": 1428,
"preview": "# `build-aux` folder\n\nThis folder contains:\n- Various formatting scripts:\n - `run-clang-format` which formats C/C++/Obj"
},
{
"path": "build-aux/com.obsproject.Studio.json",
"chars": 6040,
"preview": "{\n \"id\": \"com.obsproject.Studio\",\n \"runtime\": \"org.freedesktop.Platform\",\n \"runtime-version\": \"25.08\",\n \"sdk"
},
{
"path": "build-aux/format-manifest.py",
"chars": 1861,
"preview": "import argparse\nimport glob\nimport json\nimport logging\nimport os\nimport sys\nfrom typing import Any\n\n\ndef main() -> int:\n"
},
{
"path": "build-aux/steam/obs_build.vdf",
"chars": 499,
"preview": "\"AppBuild\"\n{\n\t\"AppID\" \"1905180\"\n\t\"Desc\" \"github_@@DESC@@\"\n\n\t\"ContentRoot\" \"./\"\n\t\"BuildOutput\" \"build/\"\n\t\n\t\"SetLive\" \"@@B"
},
{
"path": "build-aux/steam/obs_playtest_build.vdf",
"chars": 452,
"preview": "\"AppBuild\"\n{\n\t\"AppID\" \"1905640\"\n\t\"Desc\" \"github_@@DESC@@\"\n\n\t\"ContentRoot\" \"./\"\n\t\"BuildOutput\" \"build/\"\n\t\n\t\"SetLive\" \"@@B"
},
{
"path": "build-aux/steam/scripts_macos/launch.sh",
"chars": 429,
"preview": "#!/bin/zsh\n \narch_name=\"${CPUTYPE}\"\nis_translated=\"$(sysctl -in sysctl.proc_translated)\"\n\nif (( is_translated )) arch_na"
},
{
"path": "build-aux/steam/scripts_windows/install.bat",
"chars": 2216,
"preview": "@echo off\n@cd /d \"%~dp0\"\n\ngoto checkAdmin\n\n\n:checkAdmin\n\tnet session >nul 2>&1\n\tif %errorLevel% == 0 (\n\t\techo.\n\t) else ("
},
{
"path": "build-aux/steam/scripts_windows/installscript.vdf",
"chars": 354,
"preview": "\"InstallScript\"\n{\n \"Run Process\"\n {\n \"install\"\n {\n \"process 1\" \"scripts\\\\install.bat\"\n "
},
{
"path": "build-aux/steam/scripts_windows/uninstall.bat",
"chars": 961,
"preview": "@echo off\n@cd /d \"%~dp0\"\ngoto checkAdmin\n\n:checkAdmin\n\tnet session >nul 2>&1\n\tif %errorLevel% == 0 (\n\t\techo.\n\t) else (\n\t"
},
{
"path": "cmake/bundle/windows/ALL_BUILD.vcxproj.user.in",
"chars": 3164,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
},
{
"path": "cmake/bundle/windows/obs-module.rc.in",
"chars": 687,
"preview": "1 VERSIONINFO\nFILEVERSION ${UI_VERSION_MAJOR},${UI_VERSION_MINOR},${UI_VERSION_PATCH},0\nBEGIN\n BLOCK \"StringFileInfo\"\n "
},
{
"path": "cmake/common/bootstrap.cmake",
"chars": 2111,
"preview": "# OBS CMake bootstrap module\n\ninclude_guard(GLOBAL)\n\n# Map fallback configurations for optimized build configurations\n# "
},
{
"path": "cmake/common/buildnumber.cmake",
"chars": 701,
"preview": "# OBS CMake build number module\n\ninclude_guard(GLOBAL)\n\n# Define build number cache file\nset(\n _BUILD_NUMBER_CACHE\n \"$"
},
{
"path": "cmake/common/buildspec_common.cmake",
"chars": 7002,
"preview": "# OBS common build dependencies module\n\ninclude_guard(GLOBAL)\n\n# _check_deps_version: Checks for obs-deps VERSION file i"
},
{
"path": "cmake/common/ccache.cmake",
"chars": 824,
"preview": "# OBS CMake ccache module\n\ninclude_guard(GLOBAL)\n\nif(NOT DEFINED CCACHE_PROGRAM)\n message(DEBUG \"Trying to find ccache "
},
{
"path": "cmake/common/compiler_common.cmake",
"chars": 3586,
"preview": "# OBS CMake common compiler options module\n\ninclude_guard(GLOBAL)\n\noption(OBS_COMPILE_DEPRECATION_AS_WARNING \"Downgrade "
},
{
"path": "cmake/common/cpackconfig_common.cmake",
"chars": 475,
"preview": "# OBS CMake common CPack module\n\ninclude_guard(GLOBAL)\n\n# Set default global CPack variables\nset(CPACK_PACKAGE_NAME obs-"
},
{
"path": "cmake/common/helpers_common.cmake",
"chars": 18198,
"preview": "# OBS CMake common helper functions module\n\ninclude_guard(GLOBAL)\n\n# message_configuration: Function to print configurat"
},
{
"path": "cmake/common/osconfig.cmake",
"chars": 767,
"preview": "# OBS CMake operating system bootstrap module\n\ninclude_guard(GLOBAL)\n\nif(CMAKE_HOST_SYSTEM_NAME STREQUAL \"Windows\")\n se"
},
{
"path": "cmake/common/policies.cmake",
"chars": 51,
"preview": "# OBS CMake policies module\n\ninclude_guard(GLOBAL)\n"
},
{
"path": "cmake/common/versionconfig.cmake",
"chars": 2880,
"preview": "# OBS CMake common version helper module\n\ninclude_guard(GLOBAL)\n\nset(_obs_version ${_obs_default_version})\nset(_obs_vers"
},
{
"path": "cmake/finders/FindAMF.cmake",
"chars": 2783,
"preview": "#[=======================================================================[.rst\nFindAMF\n-------\n\nFindModule for AMF and a"
},
{
"path": "cmake/finders/FindAsio.cmake",
"chars": 2600,
"preview": "#[=======================================================================[.rst\nFindAsio\n--------\n\nFindModule for Asio an"
},
{
"path": "cmake/finders/FindCEF.cmake",
"chars": 7831,
"preview": "#[=======================================================================[.rst\nFindCEF\n----------\n\nFindModule for CEF an"
},
{
"path": "cmake/finders/FindDetours.cmake",
"chars": 3311,
"preview": "#[=======================================================================[.rst\nFindDetours\n-----------\n\nFindModule for D"
},
{
"path": "cmake/finders/FindFFmpeg.cmake",
"chars": 11645,
"preview": "#[=======================================================================[.rst\nFindFFmpeg\n----------\n\nFindModule for FFm"
},
{
"path": "cmake/finders/FindFFnvcodec.cmake",
"chars": 2883,
"preview": "#[=======================================================================[.rst\nFindFFnvcodec\n-------------\n\nFindModule f"
},
{
"path": "cmake/finders/FindGio.cmake",
"chars": 3099,
"preview": "#[=======================================================================[.rst\nFindGio\n-------\n\nFindModule for gio and a"
},
{
"path": "cmake/finders/FindJack.cmake",
"chars": 2636,
"preview": "#[=======================================================================[.rst\nFindJack\n--------\n\nFindModule for Jack an"
},
{
"path": "cmake/finders/FindLibAJANTV2.cmake",
"chars": 6997,
"preview": "#[=======================================================================[.rst\nFindLibAJANTV2\n----------\n\nFindModule for"
},
{
"path": "cmake/finders/FindLibUUID.cmake",
"chars": 2739,
"preview": "#[=======================================================================[.rst\nFindLibUUID\n-----------\n\nFindModule for L"
},
{
"path": "cmake/finders/FindLibVLC.cmake",
"chars": 3326,
"preview": "#[=======================================================================[.rst\nFindLibVLC\n----------\n\nFindModule for Lib"
},
{
"path": "cmake/finders/FindLibdrm.cmake",
"chars": 2725,
"preview": "#[=======================================================================[.rst\nFindLibdrm\n----------\n\nFindModule for Lib"
},
{
"path": "cmake/finders/FindLibfdk.cmake",
"chars": 2671,
"preview": "#[=======================================================================[.rst\nFindLibfdk\n----------\n\nFindModule for Lib"
},
{
"path": "cmake/finders/FindLibpci.cmake",
"chars": 2904,
"preview": "#[=======================================================================[.rst\nFindLibpci\n----------\n\nFindModule for Lib"
},
{
"path": "cmake/finders/FindLibrist.cmake",
"chars": 4526,
"preview": "#[=======================================================================[.rst\nFindLibrist\n----------\n\nFindModule for Li"
},
{
"path": "cmake/finders/FindLibrnnoise.cmake",
"chars": 4142,
"preview": "#[=======================================================================[.rst\nFindLibrnnoise\n----------\n\nFindModule for"
},
{
"path": "cmake/finders/FindLibspeexdsp.cmake",
"chars": 4169,
"preview": "#[=======================================================================[.rst\nFindLibspeexdsp\n----------\n\nFindModule fo"
},
{
"path": "cmake/finders/FindLibsrt.cmake",
"chars": 4238,
"preview": "#[=======================================================================[.rst\nFindLibsrt\n----------\n\nFindModule for Lib"
},
{
"path": "cmake/finders/FindLibudev.cmake",
"chars": 2683,
"preview": "#[=======================================================================[.rst\nFindLibudev\n-----------\n\nFindModule for L"
},
{
"path": "cmake/finders/FindLibv4l2.cmake",
"chars": 2699,
"preview": "#[=======================================================================[.rst\nFindLibv4l2\n-----------\n\nFindModule for L"
},
{
"path": "cmake/finders/FindLibva.cmake",
"chars": 4223,
"preview": "#[=======================================================================[.rst\nFindLibva\n---------\n\nFindModule for Libva"
},
{
"path": "cmake/finders/FindLibx264.cmake",
"chars": 5493,
"preview": "#[=======================================================================[.rst\nFindLibx264\n----------\n\nFindModule for Li"
},
{
"path": "cmake/finders/FindLuajit.cmake",
"chars": 4218,
"preview": "#[=======================================================================[.rst\nFindLuajit\n----------\n\nFindModule for Lua"
},
{
"path": "cmake/finders/FindMbedTLS.cmake",
"chars": 7251,
"preview": "#[=======================================================================[.rst\nFindMbedTLS\n-----------\n\nFindModule for M"
},
{
"path": "cmake/finders/FindOSS.cmake",
"chars": 1461,
"preview": "#[=======================================================================[.rst\nFindOSS\n-------\n\nFindModule for OSS and a"
},
{
"path": "cmake/finders/FindPipeWire.cmake",
"chars": 3653,
"preview": "#[=======================================================================[.rst\nFindPipeWire\n------------\n\nFindModule for"
},
{
"path": "cmake/finders/FindPulseAudio.cmake",
"chars": 3265,
"preview": "#[=======================================================================[.rst\nFindPulseAudio\n--------------\n\nFindModule"
},
{
"path": "cmake/finders/FindSIMDe.cmake",
"chars": 2774,
"preview": "#[=======================================================================[.rst\nFindSIMDe\n---------\n\nFindModule for SIMD "
},
{
"path": "cmake/finders/FindSndio.cmake",
"chars": 2579,
"preview": "#[=======================================================================[.rst\nFindSndio\n---------\n\nFindModule for Sndio"
},
{
"path": "cmake/finders/FindSysinfo.cmake",
"chars": 2491,
"preview": "#[=======================================================================[.rst\nFindSysinfo\n-----------\n\nFindModule for S"
},
{
"path": "cmake/finders/FindUthash.cmake",
"chars": 2244,
"preview": "#[=======================================================================[.rst\nFindUthash\n----------\n\nFindModule for uth"
},
{
"path": "cmake/finders/FindVPL.cmake",
"chars": 4374,
"preview": "#[=======================================================================[.rst\nFindVPL\n-------\n\nFindModule for VPL and a"
},
{
"path": "cmake/finders/FindWebsocketpp.cmake",
"chars": 2884,
"preview": "#[=======================================================================[.rst\nFindWebsocketpp\n---------------\n\nFindModu"
},
{
"path": "cmake/finders/FindXkbcommon.cmake",
"chars": 2887,
"preview": "#[=======================================================================[.rst\nFindXkbcommon\n-------------\n\nFindModule f"
},
{
"path": "cmake/finders/Findjansson.cmake",
"chars": 4235,
"preview": "#[=======================================================================[.rst\nFindjansson\n----------\n\nFindModule for ja"
},
{
"path": "cmake/finders/Findqrcodegencpp.cmake",
"chars": 5602,
"preview": "#[=======================================================================[.rst\nFindqrcodegencpp\n----------------\n\nFindMo"
},
{
"path": "cmake/linux/compilerconfig.cmake",
"chars": 2751,
"preview": "# OBS CMake Linux compiler configuration module\n\ninclude_guard(GLOBAL)\n\ninclude(ccache)\ninclude(compiler_common)\n\noption"
},
{
"path": "cmake/linux/cpackconfig.cmake",
"chars": 1660,
"preview": "# OBS CMake Linux CPack configuration module\n\ninclude_guard(GLOBAL)\n\ninclude(cpackconfig_common)\n\n# Add GPLv2 license fi"
},
{
"path": "cmake/linux/defaults.cmake",
"chars": 1693,
"preview": "# OBS CMake Linux defaults module\n\ninclude_guard(GLOBAL)\n\noption(ENABLE_PULSEAUDIO \"Enable PulseAudio support\" ON)\noptio"
},
{
"path": "cmake/linux/ecmconfig.cmake",
"chars": 170,
"preview": "# OBS CMake Linux Extra CMake Module configuration module\n\ninclude_guard(GLOBAL)\n\nfind_package(ECM REQUIRED NO_MODULE)\n\n"
},
{
"path": "cmake/linux/helpers.cmake",
"chars": 12438,
"preview": "# OBS CMake Linux helper functions module\n\ninclude_guard(GLOBAL)\n\ninclude(helpers_common)\n\n# set_target_properties_obs: "
},
{
"path": "cmake/linux/toolchain-aarch64-clang.cmake",
"chars": 301,
"preview": "set(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR arm64)\n\nset(CMAKE_C_COMPILER clang)\nset(CMAKE_C_COMPILER_TARGET "
},
{
"path": "cmake/linux/toolchain-aarch64-gcc.cmake",
"chars": 343,
"preview": "set(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR arm64)\n\nif(CROSS STREQUAL \"\")\n set(CROSS aarch64-linux-gnu-)\nen"
},
{
"path": "cmake/linux/toolchain-x86_64-gcc.cmake",
"chars": 343,
"preview": "set(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR x86_64)\n\nif(CROSS STREQUAL \"\")\n set(CROSS x86_64-linux-gnu-)\nen"
},
{
"path": "cmake/macos/buildspec.cmake",
"chars": 971,
"preview": "# OBS CMake macOS build dependencies module\n\ninclude_guard(GLOBAL)\n\ninclude(buildspec_common)\n\n# _check_dependencies_mac"
},
{
"path": "cmake/macos/compilerconfig.cmake",
"chars": 3408,
"preview": "# OBS CMake macOS compiler configuration module\n\ninclude_guard(GLOBAL)\n\noption(ENABLE_COMPILER_TRACE \"Enable clang time-"
},
{
"path": "cmake/macos/defaults.cmake",
"chars": 1877,
"preview": "# OBS CMake macOS defaults module\n\ninclude_guard(GLOBAL)\n\n# Set empty codesigning team if not specified as cache variabl"
},
{
"path": "cmake/macos/helpers.cmake",
"chars": 18860,
"preview": "# OBS CMake macOS helper functions module\n\ninclude_guard(GLOBAL)\n\ninclude(helpers_common)\n\n# set_target_xcode_properties"
},
{
"path": "cmake/macos/resources/package.applescript",
"chars": 2406,
"preview": "on run (volumeName)\n tell application \"Finder\"\n tell disk (volumeName as string)\n open\n\n "
},
{
"path": "cmake/macos/xcode.cmake",
"chars": 7848,
"preview": "# OBS CMake macOS Xcode module\n\ninclude_guard(GLOBAL)\n\nset(CMAKE_XCODE_GENERATE_SCHEME TRUE)\n\n# Set project variables\nse"
},
{
"path": "cmake/windows/FindPython.cmake",
"chars": 2875,
"preview": "#[=======================================================================[.rst\nFindPython\n----------\n\nFindModule for Pyt"
},
{
"path": "cmake/windows/architecture.cmake",
"chars": 4186,
"preview": "# OBS CMake Windows Architecture Helper\n\ninclude_guard(GLOBAL)\n\ninclude(compilerconfig)\n\nif(NOT DEFINED OBS_PARENT_ARCHI"
},
{
"path": "cmake/windows/buildspec.cmake",
"chars": 3975,
"preview": "# OBS CMake Windows build dependencies module\n\ninclude_guard(GLOBAL)\n\ninclude(buildspec_common)\n\n# _handle_qt_cross_comp"
},
{
"path": "cmake/windows/compilerconfig.cmake",
"chars": 3203,
"preview": "# OBS CMake Windows compiler configuration module\n\ninclude_guard(GLOBAL)\n\ninclude(ccache)\ninclude(compiler_common)\n\nif(E"
},
{
"path": "cmake/windows/cpackconfig.cmake",
"chars": 493,
"preview": "# OBS CMake Windows CPack configuration module\n\ninclude_guard(GLOBAL)\n\ninclude(cpackconfig_common)\n\n# Add GPLv2 license "
},
{
"path": "cmake/windows/defaults.cmake",
"chars": 879,
"preview": "# OBS CMake Windows defaults module\n\ninclude_guard(GLOBAL)\n\nset(OBS_SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\nset(OBS_OU"
},
{
"path": "cmake/windows/helpers.cmake",
"chars": 22351,
"preview": "# OBS CMake Windows helper functions module\n\ninclude_guard(GLOBAL)\n\ninclude(helpers_common)\n\n# set_target_properties_obs"
},
{
"path": "cmake/windows/idlfilehelper.cmake",
"chars": 1203,
"preview": "# target_add_idl_files: Compile IDL file and add generated source files to target\nfunction(target_add_idl_files target)\n"
},
{
"path": "deps/blake2/.clang-format",
"chars": 54,
"preview": "Language: Cpp\nSortIncludes: false\nDisableFormat: true\n"
},
{
"path": "deps/blake2/CMakeLists.txt",
"chars": 869,
"preview": "cmake_minimum_required(VERSION 3.28...3.30)\n\nadd_library(blake2 OBJECT)\nadd_library(OBS::blake2 ALIAS blake2)\n\ntarget_so"
},
{
"path": "deps/blake2/LICENSE.blake2",
"chars": 790,
"preview": "BLAKE2 is licensed to permit usage under the terms of the CC0, the OpenSSL License,\n or the Apache Public License 2.0 at"
},
{
"path": "deps/blake2/src/blake2-impl.h",
"chars": 4175,
"preview": "/*\n BLAKE2 reference source code package - reference C implementations\n\n Copyright 2012, Samuel Neves <sneves@dei.uc"
},
{
"path": "deps/blake2/src/blake2.h",
"chars": 6465,
"preview": "/*\n BLAKE2 reference source code package - reference C implementations\n\n Copyright 2012, Samuel Neves <sneves@dei.uc"
},
{
"path": "deps/blake2/src/blake2b-ref.c",
"chars": 10057,
"preview": "/*\n BLAKE2 reference source code package - reference C implementations\n\n Copyright 2012, Samuel Neves <sneves@dei.uc"
},
{
"path": "deps/glad/.clang-format",
"chars": 54,
"preview": "Language: Cpp\nSortIncludes: false\nDisableFormat: true\n"
},
{
"path": "deps/glad/CMakeLists.txt",
"chars": 1004,
"preview": "cmake_minimum_required(VERSION 3.28...3.30)\n\nfind_package(OpenGL REQUIRED)\n\nadd_library(obsglad OBJECT)\nadd_library(OBS:"
},
{
"path": "deps/glad/include/EGL/eglplatform.h",
"chars": 5239,
"preview": "#ifndef __eglplatform_h_\n#define __eglplatform_h_\n\n/*\n** Copyright 2007-2020 The Khronos Group Inc.\n** SPDX-License-Iden"
},
{
"path": "deps/glad/include/KHR/khrplatform.h",
"chars": 11131,
"preview": "#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2018 The Khronos Group Inc.\n**\n** Permission"
},
{
"path": "deps/glad/include/glad/glad.h",
"chars": 700164,
"preview": "\n#ifndef __glad_h_\n\n#ifdef __gl_h_\n#error OpenGL header already included, remove this include, glad already provides it\n"
},
{
"path": "deps/glad/include/glad/glad_egl.h",
"chars": 21675,
"preview": "/*\n\n EGL loader generated by glad 0.1.36 on Tue Oct 22 13:32:48 2024.\n\n Language/Generator: C/C++\n Specificatio"
},
{
"path": "deps/glad/include/glad/glad_wgl.h",
"chars": 42432,
"preview": "\n#ifndef WINAPI\n# ifndef WIN32_LEAN_AND_MEAN\n# define WIN32_LEAN_AND_MEAN 1\n# endif\n# include <windows.h>\n#endif\n\n#incl"
},
{
"path": "deps/glad/src/glad.c",
"chars": 474288,
"preview": "#include <string.h>\n#include <glad/glad.h>\n\nstatic void* get_proc(const char *namez);\n\n#ifdef _WIN32\n#include <windows.h"
},
{
"path": "deps/glad/src/glad_egl.c",
"chars": 5324,
"preview": "/*\n\n EGL loader generated by glad 0.1.36 on Tue Oct 22 13:32:48 2024.\n\n Language/Generator: C/C++\n Specificatio"
},
{
"path": "deps/glad/src/glad_wgl.c",
"chars": 32240,
"preview": "#include <string.h>\n#include <glad/glad_wgl.h>\n\nstatic void* get_proc(const char *namez);\n\n#ifdef _WIN32\n#include <windo"
},
{
"path": "deps/json11/.clang-format",
"chars": 54,
"preview": "Language: Cpp\nSortIncludes: false\nDisableFormat: true\n"
},
{
"path": "deps/json11/CMakeLists.txt",
"chars": 586,
"preview": "cmake_minimum_required(VERSION 3.28...3.30)\n\nadd_library(json11 OBJECT)\nadd_library(OBS::json11 ALIAS json11)\n\ntarget_so"
},
{
"path": "deps/json11/LICENSE.txt",
"chars": 1057,
"preview": "Copyright (c) 2013 Dropbox, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this s"
},
{
"path": "deps/json11/json11.cpp",
"chars": 25069,
"preview": "/* Copyright (c) 2013 Dropbox, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n "
},
{
"path": "deps/json11/json11.hpp",
"chars": 9268,
"preview": "/* json11\n *\n * json11 is a tiny JSON library for C++11, providing JSON parsing and serialization.\n *\n * The core object"
},
{
"path": "deps/libcaption/.clang-format",
"chars": 54,
"preview": "Language: Cpp\nSortIncludes: false\nDisableFormat: true\n"
},
{
"path": "deps/libcaption/.gitignore",
"chars": 455,
"preview": "# Object files\n*.o\n*.ko\n*.obj\n*.elf\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Libraries\n*.lib\n*.a\n*.la\n*.lo\n\n# Shared object"
}
]
// ... and 4596 more files (download for full content)
About this extraction
This page contains the full source code of the obsproject/obs-studio GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4796 files (26.0 MB), approximately 4.2M tokens, and a symbol index with 7378 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.