diff --git a/plugins/coreaudio-encoder/encoder.cpp b/plugins/coreaudio-encoder/encoder.cpp
index 972376daf..0b9d6092f 100644
--- a/plugins/coreaudio-encoder/encoder.cpp
+++ b/plugins/coreaudio-encoder/encoder.cpp
@@ -1374,6 +1374,10 @@ static obs_properties_t *aac_properties(void *data)
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("coreaudio-encoder", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Apple CoreAudio based encoder";
+}
bool obs_module_load(void)
{
diff --git a/plugins/decklink/plugin-main.cpp b/plugins/decklink/plugin-main.cpp
index 78c9b252d..2d8b3badc 100644
--- a/plugins/decklink/plugin-main.cpp
+++ b/plugins/decklink/plugin-main.cpp
@@ -6,6 +6,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Blackmagic DeckLink source";
+}
#define DEVICE_HASH "device_hash"
#define DEVICE_NAME "device_name"
diff --git a/plugins/image-source/image-source.c b/plugins/image-source/image-source.c
index b4643252f..f35d373ef 100644
--- a/plugins/image-source/image-source.c
+++ b/plugins/image-source/image-source.c
@@ -268,6 +268,10 @@ static struct obs_source_info image_source_info = {
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("image-source", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Image/color/slideshow sources";
+}
extern struct obs_source_info slideshow_info;
extern struct obs_source_info color_source_info;
diff --git a/plugins/linux-alsa/linux-alsa.c b/plugins/linux-alsa/linux-alsa.c
index b0cad0cf1..73635b126 100644
--- a/plugins/linux-alsa/linux-alsa.c
+++ b/plugins/linux-alsa/linux-alsa.c
@@ -18,6 +18,10 @@ along with this program. If not, see .
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("linux-alsa", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Linux ALSA audio input capture";
+}
extern struct obs_source_info alsa_input_capture;
diff --git a/plugins/linux-capture/linux-capture.c b/plugins/linux-capture/linux-capture.c
index ad95463ce..ce49ee72e 100644
--- a/plugins/linux-capture/linux-capture.c
+++ b/plugins/linux-capture/linux-capture.c
@@ -18,6 +18,10 @@ along with this program. If not, see .
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("linux-xshm", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "xcomposite/xshm based window/screen capture for X11";
+}
extern struct obs_source_info xshm_input;
diff --git a/plugins/linux-jack/linux-jack.c b/plugins/linux-jack/linux-jack.c
index 349a20584..be6721da4 100644
--- a/plugins/linux-jack/linux-jack.c
+++ b/plugins/linux-jack/linux-jack.c
@@ -18,6 +18,10 @@ along with this program. If not, see .
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("linux-jack", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "JACK Audio Connection Kit output capture";
+}
extern struct obs_source_info jack_output_capture;
diff --git a/plugins/linux-pulseaudio/linux-pulseaudio.c b/plugins/linux-pulseaudio/linux-pulseaudio.c
index acfd10ea0..78f066e0e 100644
--- a/plugins/linux-pulseaudio/linux-pulseaudio.c
+++ b/plugins/linux-pulseaudio/linux-pulseaudio.c
@@ -18,6 +18,10 @@ along with this program. If not, see .
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("linux-pulseaudio", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Linux PulseAudio input/output capture";
+}
extern struct obs_source_info pulse_input_capture;
extern struct obs_source_info pulse_output_capture;
diff --git a/plugins/linux-v4l2/linux-v4l2.c b/plugins/linux-v4l2/linux-v4l2.c
index 287e10ccf..b57deaa34 100644
--- a/plugins/linux-v4l2/linux-v4l2.c
+++ b/plugins/linux-v4l2/linux-v4l2.c
@@ -18,6 +18,10 @@ along with this program. If not, see .
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("linux-v4l2", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Video4Linux2(V4L2) sources";
+}
extern struct obs_source_info v4l2_input;
diff --git a/plugins/mac-avcapture/av-capture.mm b/plugins/mac-avcapture/av-capture.mm
index 2e2a59148..446ba910d 100644
--- a/plugins/mac-avcapture/av-capture.mm
+++ b/plugins/mac-avcapture/av-capture.mm
@@ -2175,6 +2175,10 @@ static void av_capture_update(void *data, obs_data_t *settings)
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("mac-avcapture", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "MacOS AVFoundation Capture source";
+}
bool obs_module_load(void)
{
diff --git a/plugins/mac-capture/plugin-main.c b/plugins/mac-capture/plugin-main.c
index 4f6698dcb..2efa3a074 100644
--- a/plugins/mac-capture/plugin-main.c
+++ b/plugins/mac-capture/plugin-main.c
@@ -2,6 +2,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("mac-capture", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "macOS audio input/output and window/display capture";
+}
extern struct obs_source_info coreaudio_input_capture_info;
extern struct obs_source_info coreaudio_output_capture_info;
diff --git a/plugins/mac-syphon/plugin-main.c b/plugins/mac-syphon/plugin-main.c
index 011e711f8..a8cde9995 100644
--- a/plugins/mac-syphon/plugin-main.c
+++ b/plugins/mac-syphon/plugin-main.c
@@ -2,6 +2,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("syphon", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Syphon based game capture for macOS";
+}
extern struct obs_source_info syphon_info;
diff --git a/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c
index 3ccef9baa..f60a8fb76 100644
--- a/plugins/obs-ffmpeg/obs-ffmpeg.c
+++ b/plugins/obs-ffmpeg/obs-ffmpeg.c
@@ -8,6 +8,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("obs-ffmpeg", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "FFmpeg based sources/outputs/encoders";
+}
extern struct obs_source_info ffmpeg_source;
extern struct obs_output_info ffmpeg_output;
diff --git a/plugins/obs-filters/obs-filters.c b/plugins/obs-filters/obs-filters.c
index 02ac63d63..6393da660 100644
--- a/plugins/obs-filters/obs-filters.c
+++ b/plugins/obs-filters/obs-filters.c
@@ -2,8 +2,11 @@
#include "obs-filters-config.h"
OBS_DECLARE_MODULE()
-
OBS_MODULE_USE_DEFAULT_LOCALE("obs-filters", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "OBS core filters";
+}
extern struct obs_source_info mask_filter;
extern struct obs_source_info crop_filter;
diff --git a/plugins/obs-outputs/obs-outputs.c b/plugins/obs-outputs/obs-outputs.c
index 43e0e8963..e8fbe4875 100644
--- a/plugins/obs-outputs/obs-outputs.c
+++ b/plugins/obs-outputs/obs-outputs.c
@@ -9,6 +9,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("obs-outputs", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "OBS core RTMP/FLV/null/FTL outputs";
+}
extern struct obs_output_info rtmp_output_info;
extern struct obs_output_info null_output_info;
diff --git a/plugins/obs-qsv11/obs-qsv11-plugin-main.c b/plugins/obs-qsv11/obs-qsv11-plugin-main.c
index b7abbd0bd..fd9208316 100644
--- a/plugins/obs-qsv11/obs-qsv11-plugin-main.c
+++ b/plugins/obs-qsv11/obs-qsv11-plugin-main.c
@@ -58,6 +58,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("obs-qsv11", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Intel Quick Sync Video H.264 encoder support for Windows";
+}
extern struct obs_encoder_info obs_qsv_encoder;
diff --git a/plugins/obs-text/gdiplus/obs-text.cpp b/plugins/obs-text/gdiplus/obs-text.cpp
index 2efc10814..031e97907 100644
--- a/plugins/obs-text/gdiplus/obs-text.cpp
+++ b/plugins/obs-text/gdiplus/obs-text.cpp
@@ -804,6 +804,10 @@ static ULONG_PTR gdip_token = 0;
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("obs-text", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Windows GDI+ text source";
+}
#define set_vis(var, val, show) \
do { \
diff --git a/plugins/obs-transitions/obs-transitions.c b/plugins/obs-transitions/obs-transitions.c
index 22276d319..36469938b 100644
--- a/plugins/obs-transitions/obs-transitions.c
+++ b/plugins/obs-transitions/obs-transitions.c
@@ -1,8 +1,11 @@
#include
OBS_DECLARE_MODULE()
-
OBS_MODULE_USE_DEFAULT_LOCALE("obs-transitions", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "OBS core transitions";
+}
extern struct obs_source_info cut_transition;
extern struct obs_source_info fade_transition;
diff --git a/plugins/obs-x264/obs-x264-plugin-main.c b/plugins/obs-x264/obs-x264-plugin-main.c
index fbb4c2cc4..71d7d0260 100644
--- a/plugins/obs-x264/obs-x264-plugin-main.c
+++ b/plugins/obs-x264/obs-x264-plugin-main.c
@@ -2,6 +2,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("obs-x264", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "x264 based encoder";
+}
extern struct obs_encoder_info obs_x264_encoder;
diff --git a/plugins/rtmp-services/rtmp-services-main.c b/plugins/rtmp-services/rtmp-services-main.c
index 145d5b194..0eeaa7352 100644
--- a/plugins/rtmp-services/rtmp-services-main.c
+++ b/plugins/rtmp-services/rtmp-services-main.c
@@ -10,6 +10,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("rtmp-services", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "OBS core RTMP services";
+}
#define RTMP_SERVICES_LOG_STR "[rtmp-services plugin] "
#define RTMP_SERVICES_VER_STR "rtmp-services plugin (libobs " OBS_VERSION ")"
diff --git a/plugins/text-freetype2/text-freetype2.c b/plugins/text-freetype2/text-freetype2.c
index 6fd85716c..dbfab2d3b 100644
--- a/plugins/text-freetype2/text-freetype2.c
+++ b/plugins/text-freetype2/text-freetype2.c
@@ -28,6 +28,10 @@ FT_Library ft2_lib;
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("text-freetype2", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "FreeType2 text source";
+}
uint32_t texbuf_w = 2048, texbuf_h = 2048;
diff --git a/plugins/vlc-video/vlc-video-plugin.c b/plugins/vlc-video/vlc-video-plugin.c
index 4160f9107..25362c978 100644
--- a/plugins/vlc-video/vlc-video-plugin.c
+++ b/plugins/vlc-video/vlc-video-plugin.c
@@ -7,6 +7,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("vlc-video", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "VLC playlist source";
+}
/* libvlc core */
LIBVLC_NEW libvlc_new_;
diff --git a/plugins/win-capture/plugin-main.c b/plugins/win-capture/plugin-main.c
index 92ee8da7e..e4c5fb341 100644
--- a/plugins/win-capture/plugin-main.c
+++ b/plugins/win-capture/plugin-main.c
@@ -5,6 +5,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("win-capture", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Windows game/screen/window capture";
+}
extern struct obs_source_info duplicator_capture_info;
extern struct obs_source_info monitor_capture_info;
diff --git a/plugins/win-dshow/dshow-plugin.cpp b/plugins/win-dshow/dshow-plugin.cpp
index a306ce0f4..e438b7005 100644
--- a/plugins/win-dshow/dshow-plugin.cpp
+++ b/plugins/win-dshow/dshow-plugin.cpp
@@ -2,6 +2,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("win-dshow", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Windows DirectShow source/encoder";
+}
extern void RegisterDShowSource();
extern void RegisterDShowEncoders();
diff --git a/plugins/win-mf/mf-plugin.cpp b/plugins/win-mf/mf-plugin.cpp
index a1bd5b9c3..10baa2b95 100644
--- a/plugins/win-mf/mf-plugin.cpp
+++ b/plugins/win-mf/mf-plugin.cpp
@@ -30,6 +30,10 @@ extern "C" void obs_module_unload(void)
}
OBS_DECLARE_MODULE()
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Windows Media Foundations H.264/AAC encoder";
+}
#if ENABLE_WINMF
OBS_MODULE_USE_DEFAULT_LOCALE("win-mf", "en-US")
diff --git a/plugins/win-wasapi/plugin-main.cpp b/plugins/win-wasapi/plugin-main.cpp
index 3f3a0f34f..422c45075 100644
--- a/plugins/win-wasapi/plugin-main.cpp
+++ b/plugins/win-wasapi/plugin-main.cpp
@@ -2,6 +2,10 @@
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("win-wasapi", "en-US")
+MODULE_EXPORT const char *obs_module_description(void)
+{
+ return "Windows WASAPI audio input/ouput sources";
+}
void RegisterWASAPIInput();
void RegisterWASAPIOutput();