mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-24 11:40:37 +08:00
Dynamic load codec ext library
This commit is contained in:
parent
25c99470ee
commit
3646f7f21c
@ -33,6 +33,9 @@ project(ZLMediaKit LANGUAGES C CXX)
|
|||||||
# Enable C++11
|
# Enable C++11
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
|
||||||
|
# 主程序链接符号可以给外部动态库调用
|
||||||
|
add_link_options("LINKER:-export_dynamic")
|
||||||
|
|
||||||
option(ENABLE_API "Enable C API SDK" ON)
|
option(ENABLE_API "Enable C API SDK" ON)
|
||||||
option(ENABLE_API_STATIC_LIB "Enable mk_api static lib" OFF)
|
option(ENABLE_API_STATIC_LIB "Enable mk_api static lib" OFF)
|
||||||
option(ENABLE_ASAN "Enable Address Sanitize" OFF)
|
option(ENABLE_ASAN "Enable Address Sanitize" OFF)
|
||||||
|
@ -30,8 +30,9 @@ file(GLOB EXT_SRC_LIST
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/*.h
|
${CMAKE_CURRENT_SOURCE_DIR}/*.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
|
${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
|
||||||
|
|
||||||
add_library(ext-codec STATIC ${EXT_SRC_LIST})
|
add_library(ext-codec SHARED ${EXT_SRC_LIST})
|
||||||
add_library(ZLMediaKit::ext-codec ALIAS ext-codec)
|
# add_library(ZLMediaKit::ext-codec ALIAS ext-codec)
|
||||||
|
target_link_options(ext-codec PRIVATE -Wl,-undefined -Wl,dynamic_lookup)
|
||||||
|
|
||||||
target_compile_options(ext-codec PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
target_compile_options(ext-codec PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||||
target_compile_definitions(ext-codec PUBLIC ${COMPILE_DEFINITIONS})
|
target_compile_definitions(ext-codec PUBLIC ${COMPILE_DEFINITIONS})
|
||||||
@ -45,4 +46,4 @@ target_include_directories(ext-codec
|
|||||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>"
|
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>"
|
||||||
${INCLUDE_DIRECTORIES})
|
${INCLUDE_DIRECTORIES})
|
||||||
|
|
||||||
update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::ext-codec ${LINK_LIBRARIES})
|
# update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::ext-codec ${LINK_LIBRARIES})
|
||||||
|
34
ext-codec/auto_register.cpp
Normal file
34
ext-codec/auto_register.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by MIT-like license that can be found in the
|
||||||
|
* LICENSE file in the root of the source tree. All contributing project authors
|
||||||
|
* may be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Extension/Factory.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace mediakit {
|
||||||
|
|
||||||
|
extern CodecPlugin h264_plugin;
|
||||||
|
extern CodecPlugin h265_plugin;
|
||||||
|
extern CodecPlugin jpeg_plugin;
|
||||||
|
extern CodecPlugin aac_plugin;
|
||||||
|
extern CodecPlugin opus_plugin;
|
||||||
|
extern CodecPlugin g711a_plugin;
|
||||||
|
extern CodecPlugin g711u_plugin;
|
||||||
|
extern CodecPlugin l16_plugin;
|
||||||
|
|
||||||
|
REGISTER_CODEC(h264_plugin);
|
||||||
|
REGISTER_CODEC(h265_plugin);
|
||||||
|
REGISTER_CODEC(jpeg_plugin);
|
||||||
|
REGISTER_CODEC(aac_plugin);
|
||||||
|
REGISTER_CODEC(opus_plugin);
|
||||||
|
REGISTER_CODEC(g711a_plugin)
|
||||||
|
REGISTER_CODEC(g711u_plugin);
|
||||||
|
REGISTER_CODEC(l16_plugin);
|
||||||
|
|
||||||
|
}//namespace mediakit
|
@ -8,6 +8,7 @@
|
|||||||
* may be found in the AUTHORS file in the root of the source tree.
|
* may be found in the AUTHORS file in the root of the source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "Util/File.h"
|
#include "Util/File.h"
|
||||||
@ -272,6 +273,8 @@ int start_main(int argc,char *argv[]) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dlopen("libext-codec.dylib", RTLD_LAZY);
|
||||||
|
|
||||||
uint16_t shellPort = mINI::Instance()[Shell::kPort];
|
uint16_t shellPort = mINI::Instance()[Shell::kPort];
|
||||||
uint16_t rtspPort = mINI::Instance()[Rtsp::kPort];
|
uint16_t rtspPort = mINI::Instance()[Rtsp::kPort];
|
||||||
uint16_t rtspsPort = mINI::Instance()[Rtsp::kSSLPort];
|
uint16_t rtspsPort = mINI::Instance()[Rtsp::kSSLPort];
|
||||||
|
@ -17,29 +17,14 @@ using namespace toolkit;
|
|||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
static std::unordered_map<int, const CodecPlugin *> s_plugins;
|
static std::unordered_map<int, const CodecPlugin *> &getPluginRegister() {
|
||||||
|
static std::unordered_map<int, const CodecPlugin *> *s_plugins = new std::unordered_map<int, const CodecPlugin *>;
|
||||||
extern CodecPlugin h264_plugin;
|
return *s_plugins;
|
||||||
extern CodecPlugin h265_plugin;
|
}
|
||||||
extern CodecPlugin jpeg_plugin;
|
|
||||||
extern CodecPlugin aac_plugin;
|
|
||||||
extern CodecPlugin opus_plugin;
|
|
||||||
extern CodecPlugin g711a_plugin;
|
|
||||||
extern CodecPlugin g711u_plugin;
|
|
||||||
extern CodecPlugin l16_plugin;
|
|
||||||
|
|
||||||
REGISTER_CODEC(h264_plugin);
|
|
||||||
REGISTER_CODEC(h265_plugin);
|
|
||||||
REGISTER_CODEC(jpeg_plugin);
|
|
||||||
REGISTER_CODEC(aac_plugin);
|
|
||||||
REGISTER_CODEC(opus_plugin);
|
|
||||||
REGISTER_CODEC(g711a_plugin)
|
|
||||||
REGISTER_CODEC(g711u_plugin);
|
|
||||||
REGISTER_CODEC(l16_plugin);
|
|
||||||
|
|
||||||
void Factory::registerPlugin(const CodecPlugin &plugin) {
|
void Factory::registerPlugin(const CodecPlugin &plugin) {
|
||||||
InfoL << "Load codec: " << getCodecName(plugin.getCodec());
|
InfoL << "Load codec: " << getCodecName(plugin.getCodec());
|
||||||
s_plugins[(int)(plugin.getCodec())] = &plugin;
|
getPluginRegister()[(int)(plugin.getCodec())] = &plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
|
Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
|
||||||
@ -48,8 +33,8 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
|
|||||||
// 根据传统的payload type 获取编码类型以及采样率等信息
|
// 根据传统的payload type 获取编码类型以及采样率等信息
|
||||||
codec = RtpPayload::getCodecId(track->_pt);
|
codec = RtpPayload::getCodecId(track->_pt);
|
||||||
}
|
}
|
||||||
auto it = s_plugins.find(codec);
|
auto it = getPluginRegister().find(codec);
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << track->getName();
|
WarnL << "Unsupported codec: " << track->getName();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -66,8 +51,8 @@ Track::Ptr Factory::getTrackByAbstractTrack(const Track::Ptr &track) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec, uint8_t pt) {
|
RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec, uint8_t pt) {
|
||||||
auto it = s_plugins.find(codec);
|
auto it = getPluginRegister().find(codec);
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -75,8 +60,8 @@ RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec, uint8_t pt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtpCodec::Ptr Factory::getRtpDecoderByCodecId(CodecId codec) {
|
RtpCodec::Ptr Factory::getRtpDecoderByCodecId(CodecId codec) {
|
||||||
auto it = s_plugins.find(codec);
|
auto it = getPluginRegister().find(codec);
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -113,8 +98,8 @@ static CodecId getVideoCodecIdByAmf(const AMFValue &val){
|
|||||||
}
|
}
|
||||||
|
|
||||||
Track::Ptr Factory::getTrackByCodecId(CodecId codec, int sample_rate, int channels, int sample_bit) {
|
Track::Ptr Factory::getTrackByCodecId(CodecId codec, int sample_rate, int channels, int sample_bit) {
|
||||||
auto it = s_plugins.find(codec);
|
auto it = getPluginRegister().find(codec);
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -162,8 +147,8 @@ Track::Ptr Factory::getAudioTrackByAmf(const AMFValue& amf, int sample_rate, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtmpCodec::Ptr Factory::getRtmpDecoderByTrack(const Track::Ptr &track) {
|
RtmpCodec::Ptr Factory::getRtmpDecoderByTrack(const Track::Ptr &track) {
|
||||||
auto it = s_plugins.find(track->getCodecId());
|
auto it = getPluginRegister().find(track->getCodecId());
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << track->getCodecName();
|
WarnL << "Unsupported codec: " << track->getCodecName();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -171,8 +156,8 @@ RtmpCodec::Ptr Factory::getRtmpDecoderByTrack(const Track::Ptr &track) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtmpCodec::Ptr Factory::getRtmpEncoderByTrack(const Track::Ptr &track) {
|
RtmpCodec::Ptr Factory::getRtmpEncoderByTrack(const Track::Ptr &track) {
|
||||||
auto it = s_plugins.find(track->getCodecId());
|
auto it = getPluginRegister().find(track->getCodecId());
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << track->getCodecName();
|
WarnL << "Unsupported codec: " << track->getCodecName();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -195,8 +180,8 @@ AMFValue Factory::getAmfByCodecId(CodecId codecId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Frame::Ptr Factory::getFrameFromPtr(CodecId codec, const char *data, size_t bytes, uint64_t dts, uint64_t pts) {
|
Frame::Ptr Factory::getFrameFromPtr(CodecId codec, const char *data, size_t bytes, uint64_t dts, uint64_t pts) {
|
||||||
auto it = s_plugins.find(codec);
|
auto it = getPluginRegister().find(codec);
|
||||||
if (it == s_plugins.end()) {
|
if (it == getPluginRegister().end()) {
|
||||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user