From cd97ce2a1786ce69bd2a269fc5591d5e5ae6f7d4 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 12 Jan 2016 16:25:47 -0800 Subject: [PATCH] libobs: Add source output flag OBS_SOURCE_DO_NOT_DUPLICATE Certain types of sources (display captures, game captures, audio device captures, video device captures) should not be duplicated. This capability flag hints that the source prefers references over full duplication. --- libobs/obs-source.h | 9 +++++++++ plugins/decklink/plugin-main.cpp | 3 ++- plugins/linux-capture/xshm-input.c | 3 ++- plugins/linux-pulseaudio/pulse-input.c | 6 ++++-- plugins/linux-v4l2/v4l2-input.c | 3 ++- plugins/mac-avcapture/av-capture.mm | 3 ++- plugins/mac-capture/mac-audio.c | 6 ++++-- plugins/mac-capture/mac-display-capture.m | 3 ++- plugins/mac-syphon/syphon.m | 3 ++- plugins/obs-ffmpeg/obs-ffmpeg-source.c | 3 ++- plugins/win-capture/duplicator-monitor-capture.c | 3 ++- plugins/win-capture/game-capture.c | 3 ++- plugins/win-capture/monitor-capture.c | 3 ++- plugins/win-dshow/win-dshow.cpp | 3 ++- plugins/win-wasapi/win-wasapi.cpp | 6 ++++-- 15 files changed, 43 insertions(+), 17 deletions(-) diff --git a/libobs/obs-source.h b/libobs/obs-source.h index c5656d2fe..c852cebfb 100644 --- a/libobs/obs-source.h +++ b/libobs/obs-source.h @@ -115,6 +115,15 @@ enum obs_source_type { */ #define OBS_SOURCE_COMPOSITE (1<<6) +/** + * Source should not be fully duplicated + * + * When this is used, specifies that the source should not be fully duplicated, + * and should prefer to duplicate via holding references rather than full + * duplication. + */ +#define OBS_SOURCE_DO_NOT_DUPLICATE (1<<7) + /** @} */ typedef void (*obs_source_enum_proc_t)(obs_source_t *parent, diff --git a/plugins/decklink/plugin-main.cpp b/plugins/decklink/plugin-main.cpp index b999f7ca1..13523f8f6 100644 --- a/plugins/decklink/plugin-main.cpp +++ b/plugins/decklink/plugin-main.cpp @@ -166,7 +166,8 @@ bool obs_module_load(void) struct obs_source_info info = {}; info.id = "decklink-input"; info.type = OBS_SOURCE_TYPE_INPUT; - info.output_flags = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO; + info.output_flags = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE; info.create = decklink_create; info.destroy = decklink_destroy; info.get_defaults = decklink_get_defaults; diff --git a/plugins/linux-capture/xshm-input.c b/plugins/linux-capture/xshm-input.c index 9379c5076..b5fa3a307 100644 --- a/plugins/linux-capture/xshm-input.c +++ b/plugins/linux-capture/xshm-input.c @@ -475,7 +475,8 @@ struct obs_source_info xshm_input = { .id = "xshm_input", .type = OBS_SOURCE_TYPE_INPUT, .output_flags = OBS_SOURCE_VIDEO | - OBS_SOURCE_CUSTOM_DRAW, + OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = xshm_getname, .create = xshm_create, .destroy = xshm_destroy, diff --git a/plugins/linux-pulseaudio/pulse-input.c b/plugins/linux-pulseaudio/pulse-input.c index 5c11d2145..563773e55 100644 --- a/plugins/linux-pulseaudio/pulse-input.c +++ b/plugins/linux-pulseaudio/pulse-input.c @@ -517,7 +517,8 @@ static void *pulse_create(obs_data_t *settings, obs_source_t *source) struct obs_source_info pulse_input_capture = { .id = "pulse_input_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_AUDIO, + .output_flags = OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = pulse_input_getname, .create = pulse_create, .destroy = pulse_destroy, @@ -529,7 +530,8 @@ struct obs_source_info pulse_input_capture = { struct obs_source_info pulse_output_capture = { .id = "pulse_output_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_AUDIO, + .output_flags = OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = pulse_output_getname, .create = pulse_create, .destroy = pulse_destroy, diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c index e946f8e17..bc33f4928 100644 --- a/plugins/linux-v4l2/v4l2-input.c +++ b/plugins/linux-v4l2/v4l2-input.c @@ -979,7 +979,8 @@ static void *v4l2_create(obs_data_t *settings, obs_source_t *source) struct obs_source_info v4l2_input = { .id = "v4l2_input", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_ASYNC_VIDEO, + .output_flags = OBS_SOURCE_ASYNC_VIDEO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = v4l2_getname, .create = v4l2_create, .destroy = v4l2_destroy, diff --git a/plugins/mac-avcapture/av-capture.mm b/plugins/mac-avcapture/av-capture.mm index f7693233e..3048316b9 100644 --- a/plugins/mac-avcapture/av-capture.mm +++ b/plugins/mac-avcapture/av-capture.mm @@ -2181,7 +2181,8 @@ bool obs_module_load(void) obs_source_info av_capture_info = { .id = "av_capture_input", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_ASYNC_VIDEO, + .output_flags = OBS_SOURCE_ASYNC_VIDEO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = av_capture_getname, .create = av_capture_create, .destroy = av_capture_destroy, diff --git a/plugins/mac-capture/mac-audio.c b/plugins/mac-capture/mac-audio.c index 410416780..6eba6fdcd 100644 --- a/plugins/mac-capture/mac-audio.c +++ b/plugins/mac-capture/mac-audio.c @@ -783,7 +783,8 @@ static obs_properties_t *coreaudio_output_properties(void *unused) struct obs_source_info coreaudio_input_capture_info = { .id = "coreaudio_input_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_AUDIO, + .output_flags = OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = coreaudio_input_getname, .create = coreaudio_create_input_capture, .destroy = coreaudio_destroy, @@ -795,7 +796,8 @@ struct obs_source_info coreaudio_input_capture_info = { struct obs_source_info coreaudio_output_capture_info = { .id = "coreaudio_output_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_AUDIO, + .output_flags = OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = coreaudio_output_getname, .create = coreaudio_create_output_capture, .destroy = coreaudio_destroy, diff --git a/plugins/mac-capture/mac-display-capture.m b/plugins/mac-capture/mac-display-capture.m index 1a606f48f..67fd56ea5 100644 --- a/plugins/mac-capture/mac-display-capture.m +++ b/plugins/mac-capture/mac-display-capture.m @@ -657,7 +657,8 @@ struct obs_source_info display_capture_info = { .create = display_capture_create, .destroy = display_capture_destroy, - .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW, + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_DO_NOT_DUPLICATE, .video_tick = display_capture_video_tick, .video_render = display_capture_video_render, diff --git a/plugins/mac-syphon/syphon.m b/plugins/mac-syphon/syphon.m index 195432f61..6f53264cd 100644 --- a/plugins/mac-syphon/syphon.m +++ b/plugins/mac-syphon/syphon.m @@ -1275,7 +1275,8 @@ static void syphon_update(void *data, obs_data_t *settings) struct obs_source_info syphon_info = { .id = "syphon-input", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW, + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = syphon_get_name, .create = syphon_create, .destroy = syphon_destroy, diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-source.c b/plugins/obs-ffmpeg/obs-ffmpeg-source.c index 410005c2a..b0468d3cd 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-source.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-source.c @@ -639,7 +639,8 @@ static void ffmpeg_source_deactivate(void *data) struct obs_source_info ffmpeg_source = { .id = "ffmpeg_source", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO, + .output_flags = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = ffmpeg_source_getname, .create = ffmpeg_source_create, .destroy = ffmpeg_source_destroy, diff --git a/plugins/win-capture/duplicator-monitor-capture.c b/plugins/win-capture/duplicator-monitor-capture.c index 86530c392..d80b4f821 100644 --- a/plugins/win-capture/duplicator-monitor-capture.c +++ b/plugins/win-capture/duplicator-monitor-capture.c @@ -283,7 +283,8 @@ static obs_properties_t *duplicator_capture_properties(void *unused) struct obs_source_info duplicator_capture_info = { .id = "monitor_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW, + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = duplicator_capture_getname, .create = duplicator_capture_create, .destroy = duplicator_capture_destroy, diff --git a/plugins/win-capture/game-capture.c b/plugins/win-capture/game-capture.c index 9afa18da9..11c967087 100644 --- a/plugins/win-capture/game-capture.c +++ b/plugins/win-capture/game-capture.c @@ -1589,7 +1589,8 @@ static obs_properties_t *game_capture_properties(void *data) struct obs_source_info game_capture_info = { .id = "game_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW, + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = game_capture_name, .create = game_capture_create, .destroy = game_capture_destroy, diff --git a/plugins/win-capture/monitor-capture.c b/plugins/win-capture/monitor-capture.c index 50fc1ff98..945afb4ba 100644 --- a/plugins/win-capture/monitor-capture.c +++ b/plugins/win-capture/monitor-capture.c @@ -232,7 +232,8 @@ static obs_properties_t *monitor_capture_properties(void *unused) struct obs_source_info monitor_capture_info = { .id = "monitor_capture", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW, + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_DO_NOT_DUPLICATE, .get_name = monitor_capture_getname, .create = monitor_capture_create, .destroy = monitor_capture_destroy, diff --git a/plugins/win-dshow/win-dshow.cpp b/plugins/win-dshow/win-dshow.cpp index 2607d3606..6ead461d3 100644 --- a/plugins/win-dshow/win-dshow.cpp +++ b/plugins/win-dshow/win-dshow.cpp @@ -1820,7 +1820,8 @@ void RegisterDShowSource() info.type = OBS_SOURCE_TYPE_INPUT; info.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_AUDIO | - OBS_SOURCE_ASYNC; + OBS_SOURCE_ASYNC | + OBS_SOURCE_DO_NOT_DUPLICATE; info.get_name = GetDShowInputName; info.create = CreateDShowInput; info.destroy = DestroyDShowInput; diff --git a/plugins/win-wasapi/win-wasapi.cpp b/plugins/win-wasapi/win-wasapi.cpp index 2e2be2fc3..8ba722efa 100644 --- a/plugins/win-wasapi/win-wasapi.cpp +++ b/plugins/win-wasapi/win-wasapi.cpp @@ -572,7 +572,8 @@ void RegisterWASAPIInput() obs_source_info info = {}; info.id = "wasapi_input_capture"; info.type = OBS_SOURCE_TYPE_INPUT; - info.output_flags = OBS_SOURCE_AUDIO; + info.output_flags = OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE; info.get_name = GetWASAPIInputName; info.create = CreateWASAPIInput; info.destroy = DestroyWASAPISource; @@ -587,7 +588,8 @@ void RegisterWASAPIOutput() obs_source_info info = {}; info.id = "wasapi_output_capture"; info.type = OBS_SOURCE_TYPE_INPUT; - info.output_flags = OBS_SOURCE_AUDIO; + info.output_flags = OBS_SOURCE_AUDIO | + OBS_SOURCE_DO_NOT_DUPLICATE; info.get_name = GetWASAPIOutputName; info.create = CreateWASAPIOutput; info.destroy = DestroyWASAPISource;