Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optional compilation without frontend per CMake switch (ENABLE_UI) #147

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 30 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ set(MACOS_BUNDLEID "com.scottxu.obs-rtspserver")
set(OBS_PLUGIN_OBS_SOURCE_DIR ${CMAKE_SOURCE_DIR})
set(OBS_FRONTEND_API_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/UI/obs-frontend-api")

add_library(${CMAKE_PROJECT_NAME} MODULE)
add_library(${PROJECT_NAME} MODULE)

if (NOT COMMAND setup_plugin_target)
include(external/BuildHelper.cmake)
Expand Down Expand Up @@ -61,48 +61,61 @@ set(OBS_RTSPSERVER_HEADERS
${OBS_RTSPSERVER_MAIN_HEADERS}
)

set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY C_STANDARD 17)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 17)

find_qt(COMPONENTS Widgets Core)
if(ENABLE_UI)
find_qt(COMPONENTS Widgets Core)
set_target_properties(${PROJECT_NAME} PROPERTIES AUTOMOC ON AUTOUIC ON AUTORCC ON)

set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES AUTOMOC ON AUTOUIC ON AUTORCC ON)
add_definitions(-DOBS_RTSPSERVER_ENABLE_UI)
endif()

target_sources(${CMAKE_PROJECT_NAME} PRIVATE
target_sources(${PROJECT_NAME} PRIVATE
${OBS_RTSPSERVER_SOURCES}
${OBS_RTSPSERVER_HEADERS})

if(WIN32)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rtspoutput.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/rtspoutput.rc)
target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/rtspoutput.rc)
target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/rtspoutput.rc)
endif()

target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${OBS_FRONTEND_API_INCLUDE_DIRS}
target_include_directories(${PROJECT_NAME} PRIVATE
${LIBOBS_INCLUDE_DIRS}
"rtsp-server")

target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
target_link_libraries(${PROJECT_NAME} PRIVATE
rtsp-server
obs-frontend-api
libobs
Qt::Core
Qt::Widgets)
libobs)

if(ENABLE_UI)
# include all header files that are only relevant for OBS Studio
target_include_directories(${PROJECT_NAME} PRIVATE
${OBS_FRONTEND_API_INCLUDE_DIRS}
)

# link all obs frontend libraries
target_link_libraries(${PROJECT_NAME} PRIVATE
obs-frontend-api
Qt::Core
Qt::Widgets
)
endif()

add_definitions(-DVERSION_STRING="${OBS_PLUGUIN_VERSION}")

if(APPLE)
set_target_properties(${CMAKE_PROJECT_NAME}
set_target_properties(${PROJECT_NAME}
PROPERTIES
FOLDER "plugins"
PRODUCTNAME "OBS RTSP Server Plugin")
else()
set_target_properties(${CMAKE_PROJECT_NAME}
set_target_properties(${PROJECT_NAME}
PROPERTIES
FOLDER "plugins"
VERSION "${OBS_PLUGUIN_VERSION}"
PRODUCTNAME "OBS RTSP Server Plugin")
endif()

setup_plugin_target(${CMAKE_PROJECT_NAME})
setup_plugin_target(${PROJECT_NAME})

22 changes: 12 additions & 10 deletions external/BuildHelper.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/external
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/release")
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${QTDIR};${DepsPath}")

set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${OBS_PLUGUN_GIT_TAG}-linux")
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${OBS_PLUGUN_GIT_TAG}-linux")
set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")
#set(CPACK_SOURCE_PACKAGE_FILE_NAME "${OBS_PLUGIN_PACKAGE_FILE_NAME}")
set(MACOSX_PLUGIN_GUI_IDENTIFIER "${MACOS_BUNDLEID}")
Expand Down Expand Up @@ -33,25 +33,27 @@ else()
endif()
add_library(libobs ALIAS OBS::libobs)

find_package(obs-frontend-api REQUIRED)
add_library(OBS::obs-frontend-api STATIC IMPORTED GLOBAL)
set_target_properties(OBS::obs-frontend-api PROPERTIES
IMPORTED_LOCATION "${OBS_FRONTEND_API_LIB}"
)
add_library(obs-frontend-api ALIAS OBS::obs-frontend-api)
if(ENABLE_UI)
find_package(obs-frontend-api REQUIRED)
add_library(OBS::obs-frontend-api STATIC IMPORTED GLOBAL)
set_target_properties(OBS::obs-frontend-api PROPERTIES
IMPORTED_LOCATION "${OBS_FRONTEND_API_LIB}"
)
add_library(obs-frontend-api ALIAS OBS::obs-frontend-api)
endif()

include("${CMAKE_CURRENT_SOURCE_DIR}/external/ObsPluginHelpers.cmake")

if(OS_WINDOWS)
if(MSVC)
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE /W3)
target_compile_options(${PROJECT_NAME} PRIVATE /W3)
endif()
elseif(OS_MACOS)
configure_file(
${CMAKE_SOURCE_DIR}/bundle/installer-macos.pkgproj.in
${CMAKE_SOURCE_DIR}/bundle/installer-macos.generated.pkgproj)

target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall)
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
else()
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall)
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
endif()
5 changes: 3 additions & 2 deletions rtsp-server/xop/CngMd5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,19 @@ void CngMd5::GetMd5Hash(const unsigned char *data, const size_t dataSize,
unsigned char *outHash)
{
#if defined(WIN32) || defined(_WIN32)
BCRYPT_HASH_HANDLE hHash = nullptr;
PBYTE pbHashObject;
if (cbHash_ > MD5_HASH_LENGTH) {
LOG_ERROR("**** The generated hash value is too long");
goto Cleanup;
}
const auto pbHashObject = static_cast<PBYTE>(
pbHashObject = static_cast<PBYTE>(
HeapAlloc(GetProcessHeap(), 0, cbHashObject_));
if (nullptr == pbHashObject) {
LOG_ERROR("**** memory allocation failed");
goto Cleanup;
}
//create a hash
BCRYPT_HASH_HANDLE hHash = nullptr;
NTSTATUS status;
if (!NT_SUCCESS(status = BCryptCreateHash(hAlgorithm_, &hHash,
pbHashObject, cbHashObject_,
Expand Down
111 changes: 111 additions & 0 deletions rtsp_frontend.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#ifdef OBS_RTSPSERVER_ENABLE_UI
#include "rtsp_frontend.h"

#include <util/config-file.h>
#include <mutex>
#include "helper.h"
#include "rtsp_output_helper.h"
#include "ui/rtsp_properties.hpp"
#include <obs-frontend-api.h>
#include <QMainWindow>
#include <QAction>

void obs_frontend_event(enum obs_frontend_event event, void *ptr);
void rtsp_output_auto_start(RtspOutputHelper *rtspOutputHelper);
void rtsp_output_stop(RtspOutputHelper *rtspOutputHelper);
void rtsp_output_save_settings(RtspOutputHelper *rtspOutputHelper);
void rtsp_output_save_hotkey_settings(RtspOutputHelper *rtspOutputHelper);

void rtsp_frontend_load()
{
RtspOutputHelper *rtspOutputHelper;
{
auto *settings = rtsp_output_read_data();
auto *config = rtsp_properties_open_config();
const char *str = nullptr;
str = config_get_string(config, HOTKEY_CONFIG_SECTIION,
"RtspOutput");
obs_data_t *hotkey = nullptr;
if (str)
hotkey = obs_data_create_from_json(str);
rtspOutputHelper =
RtspOutputHelper::CreateRtspOutput(settings, hotkey);
obs_data_release(hotkey);
config_close(config);
obs_data_release(settings);
}

const auto mainWindow =
static_cast<QMainWindow *>(obs_frontend_get_main_window());
const auto action =
static_cast<QAction *>(obs_frontend_add_tools_menu_qaction(
obs_module_text("RtspServer")));

obs_frontend_push_ui_translation(obs_module_get_string);
const auto rtspProperties = new RtspProperties(
rtspOutputHelper->GetOutputName(), mainWindow);
obs_frontend_pop_ui_translation();

QAction::connect(action, &QAction::triggered, rtspProperties,
&QDialog::exec);

obs_frontend_add_event_callback(obs_frontend_event, rtspOutputHelper);
}

void rtsp_frontend_unload()
{
obs_frontend_remove_event_callback(obs_frontend_event, nullptr);
}

void obs_frontend_event(enum obs_frontend_event event, void* ptr)
{
const auto rtspOutputHelper = static_cast<RtspOutputHelper *>(ptr);
switch (event) {
case OBS_FRONTEND_EVENT_FINISHED_LOADING:
rtsp_output_auto_start(rtspOutputHelper);
break;
case OBS_FRONTEND_EVENT_EXIT:
rtsp_output_stop(rtspOutputHelper);
rtsp_output_save_settings(rtspOutputHelper);
rtsp_output_save_hotkey_settings(rtspOutputHelper);
delete rtspOutputHelper;
break;
default:;
}
}

void rtsp_output_auto_start(RtspOutputHelper *rtspOutputHelper)
{
auto *config = rtsp_properties_open_config();
auto autoStart = false;
if (config) {
autoStart =
config_get_bool(config, CONFIG_SECTIION, "AutoStart");
config_close(config);
}
if (autoStart)
rtspOutputHelper->Start();
}

void rtsp_output_stop(RtspOutputHelper *rtspOutputHelper)
{
rtspOutputHelper->Stop();
}

void rtsp_output_save_hotkey_settings(RtspOutputHelper *rtspOutputHelper)
{
auto *data = rtspOutputHelper->HotkeysSave();
auto *str = obs_data_get_json(data);
auto *config = rtsp_properties_open_config();
config_set_string(config, HOTKEY_CONFIG_SECTIION, "RtspOutput", str);
config_save(config);
config_close(config);
}

void rtsp_output_save_settings(RtspOutputHelper *rtspOutputHelper)
{
auto *data = rtspOutputHelper->GetSettings();
rtsp_output_save_data(data);
}

#endif // OBS_RTSPSERVER_ENABLE_UI
9 changes: 9 additions & 0 deletions rtsp_frontend.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#ifdef OBS_RTSPSERVER_ENABLE_UI
#ifndef RTSP_FRONTEND_H
#define RTSP_FRONTEND_H

void rtsp_frontend_load();
void rtsp_frontend_unload();

#endif // RTSP_FRONTEND_H
#endif // OBS_RTSPSERVER_ENABLE_UI
99 changes: 7 additions & 92 deletions rtsp_main.cpp
Original file line number Diff line number Diff line change
@@ -1,23 +1,11 @@
#include <obs-module.h>
#include <obs-frontend-api.h>
#include <util/config-file.h>
#include <QMainWindow>
#include <QAction>
#include <mutex>
#include <net/Logger.h>
#include "helper.h"
#include "rtsp_output_helper.h"
#include "rtsp_output.h"
#include "ui/rtsp_properties.hpp"
#include "rtsp_frontend.h"

OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE("obs-rtspserver", "en-US")

void obs_frontend_event(enum obs_frontend_event event, void *ptr);
void rtsp_output_auto_start(RtspOutputHelper *rtspOutputHelper);
void rtsp_output_stop(RtspOutputHelper *rtspOutputHelper);
void rtsp_output_save_settings(RtspOutputHelper *rtspOutputHelper);
void rtsp_output_save_hotkey_settings(RtspOutputHelper *rtspOutputHelper);
void server_log_write_callback(xop::Priority priority, std::string info);

const char *obs_module_name(void)
Expand All @@ -35,91 +23,18 @@ bool obs_module_load(void)
xop::Logger::Instance().SetWriteCallback(server_log_write_callback);
rtsp_output_register();

RtspOutputHelper *rtspOutputHelper;
{
auto *settings = rtsp_output_read_data();
auto *config = rtsp_properties_open_config();
const char *str = nullptr;
str = config_get_string(config, HOTKEY_CONFIG_SECTIION,
"RtspOutput");
obs_data_t *hotkey = nullptr;
if (str) hotkey = obs_data_create_from_json(str);
rtspOutputHelper =
RtspOutputHelper::CreateRtspOutput(settings, hotkey);
obs_data_release(hotkey);
config_close(config);
obs_data_release(settings);
}

const auto mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
const auto action = static_cast<QAction *>(obs_frontend_add_tools_menu_qaction(
obs_module_text("RtspServer")));

obs_frontend_push_ui_translation(obs_module_get_string);
const auto rtspProperties = new RtspProperties(rtspOutputHelper->GetOutputName(), mainWindow);
obs_frontend_pop_ui_translation();

QAction::connect(action, &QAction::triggered, rtspProperties, &QDialog::exec);

obs_frontend_add_event_callback(obs_frontend_event, rtspOutputHelper);
#ifdef OBS_RTSPSERVER_ENABLE_UI
rtsp_frontend_load();
#endif

return true;
}

void obs_module_unload(void)
{
obs_frontend_remove_event_callback(obs_frontend_event, nullptr);
}

void obs_frontend_event(enum obs_frontend_event event, void *ptr)
{
const auto rtspOutputHelper = static_cast<RtspOutputHelper *>(ptr);
switch (event) {
case OBS_FRONTEND_EVENT_FINISHED_LOADING:
rtsp_output_auto_start(rtspOutputHelper);
break;
case OBS_FRONTEND_EVENT_EXIT:
rtsp_output_stop(rtspOutputHelper);
rtsp_output_save_settings(rtspOutputHelper);
rtsp_output_save_hotkey_settings(rtspOutputHelper);
delete rtspOutputHelper;
break;
default: ;
}
}

void rtsp_output_auto_start(RtspOutputHelper *rtspOutputHelper)
{
auto *config = rtsp_properties_open_config();
auto autoStart = false;
if (config) {
autoStart =
config_get_bool(config, CONFIG_SECTIION, "AutoStart");
config_close(config);
}
if (autoStart)
rtspOutputHelper->Start();
}

void rtsp_output_stop(RtspOutputHelper *rtspOutputHelper)
{
rtspOutputHelper->Stop();
}

void rtsp_output_save_hotkey_settings(RtspOutputHelper *rtspOutputHelper)
{
auto *data = rtspOutputHelper->HotkeysSave();
auto *str = obs_data_get_json(data);
auto *config = rtsp_properties_open_config();
config_set_string(config, HOTKEY_CONFIG_SECTIION, "RtspOutput", str);
config_save(config);
config_close(config);
}

void rtsp_output_save_settings(RtspOutputHelper *rtspOutputHelper)
{
auto *data = rtspOutputHelper->GetSettings();
rtsp_output_save_data(data);
#ifdef OBS_RTSPSERVER_ENABLE_UI
rtsp_frontend_unload();
#endif
}

void server_log_write_callback(xop::Priority priority, std::string info)
Expand Down
Loading