* Each module CMakeLists.txt adds itself to included_modules.h, so if a project is not built under for example linux included_modules.h will not try to include the flash module.
/version.h
+/shell/included_modules.h
/unit-test/bin
/unit-test/tmp
cmake_policy(SET CMP0045 OLD)
include(CMake/PrecompiledHeader.cmake)
+set(CASPARCG_MODULE_INCLUDE_STATEMENTS "" CACHE INTERNAL "")
+set(CASPARCG_MODULE_INIT_STATEMENTS "" CACHE INTERNAL "")
+set(CASPARCG_MODULE_UNINIT_STATEMENTS "" CACHE INTERNAL "")
+set(CASPARCG_MODULE_PROJECTS "" CACHE INTERNAL "")
+
+function(casparcg_add_include_statement HEADER_FILE_TO_INCLUDE)
+ set(CASPARCG_MODULE_INCLUDE_STATEMENTS "${CASPARCG_MODULE_INCLUDE_STATEMENTS}"
+ "#include <${HEADER_FILE_TO_INCLUDE}>"
+ CACHE INTERNAL "")
+endfunction()
+
+function(casparcg_add_init_statement INIT_FUNCTION_NAME NAME_TO_LOG)
+ set(CASPARCG_MODULE_INIT_STATEMENTS "${CASPARCG_MODULE_INIT_STATEMENTS}"
+ " ${INIT_FUNCTION_NAME}(dependencies)\;"
+ " CASPAR_LOG(info) << L\"Initialized ${NAME_TO_LOG} module.\"\;"
+ ""
+ CACHE INTERNAL "")
+endfunction()
+
+function(casparcg_add_uninit_statement UNINIT_FUNCTION_NAME)
+ set(CASPARCG_MODULE_UNINIT_STATEMENTS "${CASPARCG_MODULE_UNINIT_STATEMENTS}"
+ " ${UNINIT_FUNCTION_NAME}()\;"
+ CACHE INTERNAL "")
+endfunction()
+
+function(casparcg_add_module_project PROJECT)
+ set(CASPARCG_MODULE_PROJECTS "${CASPARCG_MODULE_PROJECTS}" "${PROJECT}" CACHE INTERNAL "")
+endfunction()
+
+# http://stackoverflow.com/questions/7172670/best-shortest-way-to-join-a-list-in-cmake
+function(join_list VALUES GLUE OUTPUT)
+ string (REGEX REPLACE "([^\\]|^);" "\\1${GLUE}" _TMP_STR "${VALUES}")
+ string (REGEX REPLACE "[\\](.)" "\\1" _TMP_STR "${_TMP_STR}") #fixes escaping
+ set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
+endfunction()
+
add_subdirectory(accelerator)
add_subdirectory(common)
add_subdirectory(core)
add_subdirectory(modules)
+
add_subdirectory(protocol)
add_subdirectory(shell)
-
producer/stage.h
producer/variable.h
+ module_dependencies.h
system_info_provider.h
StdAfx.h
thumbnail_generator.h
--- /dev/null
+/*
+* Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
+*
+* This file is part of CasparCG (www.casparcg.com).
+*
+* CasparCG is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* CasparCG is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
+*
+* Author: Helge Norberg, helge.norberg@svt.se
+*/
+
+#pragma once
+
+#include <common/memory.h>
+
+#include "system_info_provider.h"
+#include "producer/cg_proxy.h"
+#include "producer/media_info/media_info_repository.h"
+
+namespace caspar { namespace core {
+
+struct module_dependencies
+{
+ const spl::shared_ptr<system_info_provider_repository> system_info_provider_repo;
+ const spl::shared_ptr<cg_producer_registry> cg_registry;
+ const spl::shared_ptr<media_info_repository> media_info_repo;
+
+ module_dependencies(
+ spl::shared_ptr<system_info_provider_repository> system_info_provider_repo,
+ spl::shared_ptr<cg_producer_registry> cg_registry,
+ spl::shared_ptr<media_info_repository> media_info_repo)
+ : system_info_provider_repo(std::move(system_info_provider_repo))
+ , cg_registry(std::move(cg_registry))
+ , media_info_repo(std::move(media_info_repo))
+ {
+ }
+};
+
+}}
cmake_minimum_required (VERSION 2.6)
project ("modules")
+add_subdirectory(ffmpeg)
+
if (MSVC)
add_subdirectory(bluefish)
add_subdirectory(decklink)
+ add_subdirectory(oal)
+ add_subdirectory(screen)
endif ()
-add_subdirectory(ffmpeg)
+add_subdirectory(image)
if (MSVC)
add_subdirectory(flash)
- add_subdirectory(image)
- add_subdirectory(oal)
add_subdirectory(psd)
- add_subdirectory(reroute)
- add_subdirectory(screen)
endif ()
+add_subdirectory(reroute)
+
source_group(sources\\consumer consumer/*)
target_link_libraries(bluefish common core)
+
+casparcg_add_include_statement("modules/bluefish/bluefish.h")
+casparcg_add_init_statement("bluefish::init" "bluefish")
+casparcg_add_module_project("bluefish")
return devices;
}
-void init(const spl::shared_ptr<core::system_info_provider_repository>& repo)
+void init(core::module_dependencies dependencies)
{
try
{
core::register_consumer_factory(create_consumer);
core::register_preconfigured_consumer_factory(L"bluefish", create_preconfigured_consumer);
- repo->register_system_info_provider([](boost::property_tree::wptree& info)
+ dependencies.system_info_provider_repo->register_system_info_provider([](boost::property_tree::wptree& info)
{
info.add(L"system.bluefish.version", version());
#pragma once
-#include <string>
-#include <vector>
+#include <core/module_dependencies.h>
-#include <common/memory.h>
+namespace caspar { namespace bluefish {
-namespace caspar {
-namespace core {
+void init(core::module_dependencies dependencies);
-class system_info_provider_repository;
-
-}
-
-namespace bluefish {
-
-void init(const spl::shared_ptr<core::system_info_provider_repository>& repo);
-
-}}
\ No newline at end of file
+}}
source_group(sources\\producer producer/*)
target_link_libraries(decklink common core ffmpeg)
+
+casparcg_add_include_statement("modules/decklink/decklink.h")
+casparcg_add_init_statement("decklink::init" "decklink")
+casparcg_add_module_project("decklink")
return devices;
}
-void init(const spl::shared_ptr<core::system_info_provider_repository>& repo)
+void init(core::module_dependencies dependencies)
{
struct co_init
{
core::register_consumer_factory(create_consumer);
core::register_preconfigured_consumer_factory(L"decklink", create_preconfigured_consumer);
core::register_producer_factory(create_producer);
- repo->register_system_info_provider([](boost::property_tree::wptree& info)
+ dependencies.system_info_provider_repo->register_system_info_provider([](boost::property_tree::wptree& info)
{
info.add(L"system.decklink.version", version());
});
}
-}}
\ No newline at end of file
+}}
#pragma once
-#include <string>
-#include <vector>
+#include <core/module_dependencies.h>
-#include <common/memory.h>
+namespace caspar { namespace decklink {
-namespace caspar {
-namespace core {
+void init(core::module_dependencies dependencies);
-class system_info_provider_repository;
-
-}
-
-namespace decklink {
-
-void init(const spl::shared_ptr<core::system_info_provider_repository>& repo);
-
-}}
\ No newline at end of file
+}}
source_group(sources\\producer producer/*)
target_link_libraries(ffmpeg common core)
+
+casparcg_add_include_statement("modules/ffmpeg/ffmpeg.h")
+casparcg_add_init_statement("ffmpeg::init" "ffmpeg")
+casparcg_add_uninit_statement("ffmpeg::uninit")
+casparcg_add_module_project("ffmpeg")
return make_version(::swscale_version());
}
-void init(
- const spl::shared_ptr<core::media_info_repository>& media_info_repo,
- const spl::shared_ptr<core::system_info_provider_repository>& system_info_repo)
+void init(core::module_dependencies dependencies)
{
av_lockmgr_register(ffmpeg_lock_callback);
av_log_set_callback(log_callback);
core::register_preconfigured_consumer_factory(L"file", create_preconfigured_consumer);
core::register_producer_factory(create_producer);
- media_info_repo->register_extractor(
+ dependencies.media_info_repo->register_extractor(
[](const std::wstring& file, const std::wstring& extension, core::media_info& info) -> bool
{
// TODO: merge thumbnail generation from 2.0
return try_get_duration(file, info.duration, info.time_base);
});
- system_info_repo->register_system_info_provider([](boost::property_tree::wptree& info)
+ dependencies.system_info_provider_repo->register_system_info_provider([](boost::property_tree::wptree& info)
{
info.add(L"system.ffmpeg.avcodec", avcodec_version());
info.add(L"system.ffmpeg.avformat", avformat_version());
#pragma once
#include <string>
+#include <core/module_dependencies.h>
-#include <common/memory.h>
+namespace caspar { namespace ffmpeg {
-namespace caspar {
-namespace core {
-
-struct media_info_repository;
-class system_info_provider_repository;
-
-}
-
-namespace ffmpeg {
-
-void init(
- const spl::shared_ptr<core::media_info_repository>& media_info_repo,
- const spl::shared_ptr<core::system_info_provider_repository>& system_info_repo);
+void init(core::module_dependencies dependencies);
void uninit();
-}}
\ No newline at end of file
+}}
source_group(sources ./*)
target_link_libraries(flash common core)
+
+casparcg_add_include_statement("modules/flash/flash.h")
+casparcg_add_init_statement("flash::init" "flash")
+casparcg_add_module_project("flash")
std::wstring version();
std::wstring cg_version();
-std::wstring get_absolute(const std::wstring& filename)
+std::wstring get_absolute(const std::wstring& base_folder, const std::wstring& filename)
{
- return (boost::filesystem::path(env::template_folder()) / filename).wstring();
+ return (boost::filesystem::path(base_folder) / filename).wstring();
}
class flash_cg_proxy : public core::cg_proxy, boost::noncopyable
const core::video_format_desc& format_desc,
const std::vector<std::wstring>& params)
{
+ if (params.empty() || !boost::filesystem::exists(get_absolute(env::media_folder(), params.at(0)) + L".ct"))
+ return core::frame_producer::empty();
+
auto flash_producer = flash::create_producer(frame_factory, format_desc, {});
auto producer = flash_producer;
flash_cg_proxy(producer, env::media_folder()).add(0, params[0], true, L"", L"");
return producer;
}
-void init(
- const spl::shared_ptr<core::media_info_repository>& media_info_repo,
- const spl::shared_ptr<core::system_info_provider_repository>& info_provider_repo,
- const spl::shared_ptr<core::cg_producer_registry>& cg_registry)
+void init(core::module_dependencies dependencies)
{
core::register_producer_factory(create_ct_producer);
core::register_producer_factory(create_swf_producer);
- media_info_repo->register_extractor([](const std::wstring& file, const std::wstring& extension, core::media_info& info)
+ dependencies.media_info_repo->register_extractor([](const std::wstring& file, const std::wstring& extension, core::media_info& info)
{
if (extension != L".CT" && extension != L".SWF")
return false;
return true;
});
- info_provider_repo->register_system_info_provider([](boost::property_tree::wptree& info)
+ dependencies.system_info_provider_repo->register_system_info_provider([](boost::property_tree::wptree& info)
{
info.add(L"system.flash", version());
});
- info_provider_repo->register_version_provider(L"FLASH", &version);
- info_provider_repo->register_version_provider(L"TEMPLATEHOST", &cg_version);
- cg_registry->register_cg_producer(
+ dependencies.system_info_provider_repo->register_version_provider(L"FLASH", &version);
+ dependencies.system_info_provider_repo->register_version_provider(L"TEMPLATEHOST", &cg_version);
+ dependencies.cg_registry->register_cg_producer(
L"flash",
{ L".ft", L".ct" },
[](const std::wstring& filename)
{
- return read_template_meta_info(get_absolute(filename) + L".ft");
+ return read_template_meta_info(get_absolute(env::template_folder(), filename) + L".ft");
},
[](const spl::shared_ptr<core::frame_producer>& producer)
{
#pragma once
-#include <common/memory.h>
+#include <core/module_dependencies.h>
-namespace caspar {
+namespace caspar { namespace flash {
-namespace core {
+void init(core::module_dependencies dependencies);
-struct media_info_repository;
-class system_info_provider_repository;
-class cg_producer_registry;
-
-}
-
-namespace flash {
-
-void init(
- const spl::shared_ptr<core::media_info_repository>& media_info_repo,
- const spl::shared_ptr<core::system_info_provider_repository>& info_provider_repo,
- const spl::shared_ptr<core::cg_producer_registry>& cg_registry);
-
-}}
\ No newline at end of file
+}}
source_group(sources ./*)
target_link_libraries(image common core)
+
+casparcg_add_include_statement("modules/image/image.h")
+casparcg_add_init_statement("image::init" "image")
+casparcg_add_uninit_statement("image::uninit")
+casparcg_add_module_project("image")
return u16(FreeImage_GetVersion());
}
-void init(
- const spl::shared_ptr<core::media_info_repository>& repo,
- const spl::shared_ptr<core::system_info_provider_repository>& system_info_repo)
+void init(core::module_dependencies dependencies)
{
FreeImage_Initialise();
core::register_producer_factory(create_scroll_producer);
core::register_producer_factory(create_producer);
core::register_thumbnail_producer_factory(create_thumbnail_producer);
core::register_consumer_factory(create_consumer);
- repo->register_extractor([](const std::wstring& file, const std::wstring& extension, core::media_info& info)
+ dependencies.media_info_repo->register_extractor([](const std::wstring& file, const std::wstring& extension, core::media_info& info)
{
if (extension == L".TGA"
|| extension == L".COL"
return false;
});
- system_info_repo->register_system_info_provider([](boost::property_tree::wptree& info)
+ dependencies.system_info_provider_repo->register_system_info_provider([](boost::property_tree::wptree& info)
{
info.add(L"system.freeimage", version());
});
#pragma once
-#include <string>
+#include <core/module_dependencies.h>
-#include <common/memory.h>
+namespace caspar { namespace image {
-namespace caspar {
-
-namespace core {
-
-struct media_info_repository;
-class system_info_provider_repository;
-
-}
-
-namespace image {
-
-void init(
- const spl::shared_ptr<core::media_info_repository>& repo,
- const spl::shared_ptr<core::system_info_provider_repository>& system_info_repo);
+void init(core::module_dependencies dependencies);
void uninit();
}}
source_group(sources ./*)
target_link_libraries(oal common core)
+
+casparcg_add_include_statement("modules/oal/oal.h")
+casparcg_add_init_statement("oal::init" "oal")
+casparcg_add_module_project("oal")
namespace caspar { namespace oal {
-void init()
+void init(core::module_dependencies dependencies)
{
core::register_consumer_factory(create_consumer);
core::register_preconfigured_consumer_factory(L"system-audio", create_preconfigured_consumer);
}
-}}
\ No newline at end of file
+}}
#pragma once
+#include <core/module_dependencies.h>
+
namespace caspar { namespace oal {
-void init();
+void init(core::module_dependencies dependencies);
-}}
\ No newline at end of file
+}}
source_group(sources ./*)
target_link_libraries(psd common core)
+
+casparcg_add_include_statement("modules/psd/psd_scene_producer.h")
+casparcg_add_init_statement("psd::init" "psd")
+casparcg_add_module_project("psd")
namespace caspar { namespace psd {
-void init()
-{
- core::register_producer_factory(create_psd_scene_producer);
-}
-
core::text::text_info get_text_info(const boost::property_tree::wptree& ptree)
{
core::text::text_info result;
return root;
}
+void init(core::module_dependencies dependencies)
+{
+ core::register_producer_factory(create_psd_scene_producer);
+}
+
}}
\ No newline at end of file
#pragma once
-#include <core/producer/frame_producer.h>
-
-#include <string>
-#include <vector>
-#include <common/memory.h>
+#include <core/module_dependencies.h>
namespace caspar { namespace psd {
-void init();
-
-spl::shared_ptr<core::frame_producer> create_psd_scene_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, const core::video_format_desc& format_desc, const std::vector<std::wstring>& params);
+void init(core::module_dependencies dependencies);
-}}
\ No newline at end of file
+}}
source_group(sources ./*)
target_link_libraries(screen common core ffmpeg)
+
+casparcg_add_include_statement("modules/screen/screen.h")
+casparcg_add_init_statement("screen::init" "screen")
+casparcg_add_module_project("screen")
namespace caspar { namespace screen {
-void init()
+void init(core::module_dependencies dependencies)
{
core::register_consumer_factory(create_consumer);
core::register_preconfigured_consumer_factory(L"screen", create_preconfigured_consumer);
}
-}}
\ No newline at end of file
+}}
#pragma once
+#include <core/module_dependencies.h>
+
namespace caspar { namespace screen {
-void init();
+void init(core::module_dependencies dependencies);
-}}
\ No newline at end of file
+}}
cmake_minimum_required (VERSION 2.6)
project (shell)
+join_list("${CASPARCG_MODULE_INCLUDE_STATEMENTS}" "\n" CASPARCG_MODULE_INCLUDE_STATEMENTS)
+join_list("${CASPARCG_MODULE_INIT_STATEMENTS}" "\n" CASPARCG_MODULE_INIT_STATEMENTS)
+join_list("${CASPARCG_MODULE_UNINIT_STATEMENTS}" "\n" CASPARCG_MODULE_UNINIT_STATEMENTS)
+configure_file("${PROJECT_SOURCE_DIR}/included_modules.tmpl" "${PROJECT_SOURCE_DIR}/included_modules.h")
+
if (MSVC)
set(OS_SPECIFIC_SOURCES
resource.h
stdafx.cpp
)
set(HEADERS
+ included_modules.h
server.h
stdafx.h
)
core
protocol
- bluefish
- decklink
- ffmpeg
- flash
- image
- oal
- psd
+ "${CASPARCG_MODULE_PROJECTS}"
reroute
- screen
alibcof64.lib
jpeg.lib
--- /dev/null
+/*
+ * Generated file.
+ */
+
+#pragma once
+
+#include <common/log.h>
+
+#include <core/module_dependencies.h>
+${CASPARCG_MODULE_INCLUDE_STATEMENTS}
+
+namespace caspar {
+
+void initialize_modules(const core::module_dependencies& dependencies)
+{${CASPARCG_MODULE_INIT_STATEMENTS}}
+
+void uninitialize_modules()
+{${CASPARCG_MODULE_UNINIT_STATEMENTS}
+}
+
+}
#include "stdafx.h"
#include "server.h"
+#include "included_modules.h"
#include <accelerator/accelerator.h>
#include <core/diagnostics/osd_graph.h>
#include <core/system_info_provider.h>
-#include <modules/bluefish/bluefish.h>
-#include <modules/decklink/decklink.h>
-#include <modules/ffmpeg/ffmpeg.h>
-#include <modules/flash/flash.h>
-#include <modules/oal/oal.h>
-#include <modules/screen/screen.h>
-#include <modules/image/image.h>
#include <modules/image/consumer/image_consumer.h>
-#include <modules/psd/psd_scene_producer.h>
#include <protocol/asio/io_service_manager.h>
#include <protocol/amcp/AMCPProtocolStrategy.h>
core::diagnostics::osd::register_sink();
diag_subject_->attach_parent(monitor_subject_);
- ffmpeg::init(media_info_repo_, system_info_provider_repo_);
- CASPAR_LOG(info) << L"Initialized ffmpeg module.";
-
- bluefish::init(system_info_provider_repo_);
- CASPAR_LOG(info) << L"Initialized bluefish module.";
-
- decklink::init(system_info_provider_repo_);
- CASPAR_LOG(info) << L"Initialized decklink module.";
-
- oal::init();
- CASPAR_LOG(info) << L"Initialized oal module.";
-
- screen::init();
- CASPAR_LOG(info) << L"Initialized ogl module.";
-
- image::init(media_info_repo_, system_info_provider_repo_);
- CASPAR_LOG(info) << L"Initialized image module.";
-
- flash::init(media_info_repo_, system_info_provider_repo_, cg_registry_);
- CASPAR_LOG(info) << L"Initialized flash module.";
-
- psd::init();
- CASPAR_LOG(info) << L"Initialized psd module.";
+ initialize_modules(module_dependencies(
+ system_info_provider_repo_,
+ cg_registry_,
+ media_info_repo_));
core::text::init();
boost::this_thread::sleep(boost::posix_time::milliseconds(500));
//Sleep(500); // HACK: Wait for asynchronous destruction of producers and consumers.
- image::uninit();
- ffmpeg::uninit();
+ uninitialize_modules();
core::diagnostics::osd::shutdown();
}