Full Code of obsproject/obs-studio for AI

master 5533a277e440 cached
4796 files
26.0 MB
4.2M tokens
7378 symbols
2 requests
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
Download .txt
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
Download .txt
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.

Copied to clipboard!