/* ******************************************************************************* * INCLUDE ******************************************************************************* */ #include "Logger.h" #include "VideoSubsystem.h" #include "core/Demuxer.h" #include "core/AudioDecoder.h" #include "core/AudioMixer.h" #include "v4l2/Input.h" #include "alsa/Output.h" #include "libopus/AudioEncoder.h" #include "libopus/AudioDecodeHandler.h" #include "shine/AudioEncoder.h" #include "hisi/mpp5/System.h" #include "hisi/mpp5/VideoInput.h" #include "hisi/mpp5/VideoEncoder.h" #include "hisi/mpp5/VideoDecoder.h" #include "hisi/mpp5/VideoProcessor.h" #include "hisi/mpp5/VideoMixer.h" #include "hisi/mpp5/VideoOverlay.h" #include "hisi/mpp5/AudioEncoder.h" #include "hisi/mpp5/HDMIAudioOutput.h" #include "hisi/mpp5/HDMIVideoOutput.h" #if defined(USING_FFMPEG) #include "ffmpeg/Muxer.h" #include "ffmpeg/DemuxHandler.h" #include "ffmpeg/AudioEncoder.h" #include "ffmpeg/AudioDecodeHandler.h" #include "ffmpeg/AudioResample.h" extern "C" { #include } #endif #include "mediaserver/RTMPMuxer.h" #include "mediaserver/MPEGMuxer.h" #include "mediaserver/RTMPDemuxHandler.h" #include namespace Video { /* ******************************************************************************* * CLASS DEFINE ******************************************************************************* */ VideoSubsystem::VideoSubsystem() { } VideoSubsystem::~VideoSubsystem() { } const char* VideoSubsystem::name() const { return "Video"; } void VideoSubsystem::initialize(Poco::Util::Application& app) { socket_init(); Core::System::registerClass(); Core::VideoEncoder::registerClass(Core::CodecID::H264); Core::VideoEncoder::registerClass(Core::CodecID::H265); Core::VideoDecoder::registerClass(0); Core::VideoProcessor::registerClass(0); Core::VideoMixer::registerClass(0); Core::VideoOverlay::registerClass(Core::VideoOverlayType::CANVAS); Core::VideoOverlay::registerClass(Core::VideoOverlayType::MOSAIC); Core::VideoOutput::registerClass("HDMI"); Core::AudioEncoder::registerClass(Core::CodecID::AAC); Core::AudioDecoder::registerClass(0); Core::AudioMixer::registerClass(0); Core::AudioOutput::registerClass("ALSA"); Core::AudioOutput::registerClass("HDMI"); Core::AudioEncoder::registerClass(Core::CodecID::OPUS); Core::AudioDecodeHandler::registerClass(Core::CodecID::OPUS); Core::AudioEncoder::registerClass(Core::CodecID::MP3); #if defined(USING_FFMPEG) Core::Muxer::registerClass("rtsp"); Core::DemuxHandler::registerClass("rtmp"); Core::DemuxHandler::registerClass("rtsp"); Core::DemuxHandler::registerClass("file"); Core::AudioEncoder::registerClass(Core::CodecID::G711A); Core::AudioEncoder::registerClass(Core::CodecID::G711U); Core::AudioResample::registerClass(0); Core::AudioDecodeHandler::registerClass(Core::CodecID::AAC); Core::AudioDecodeHandler::registerClass(Core::CodecID::G711A); Core::AudioDecodeHandler::registerClass(Core::CodecID::G711U); #endif Core::Muxer::registerClass("rtmp"); Core::Muxer::registerClass("udp"); Core::DemuxHandler::registerClass("rtmp"); MPP5::VideoInput::initModule(); MPP5::VideoEncoder::initModule(); MPP5::VideoDecoder::initModule(); MPP5::AudioEncoder::initModule(); } void VideoSubsystem::uninitialize() { stopAll(); #ifdef USING_ONVIF ONVIF::ONVIFService::getIns()->stop(); #endif MPP5::AudioEncoder::deinitModule(); MPP5::VideoInput::deinitModule(); MPP5::VideoEncoder::deinitModule(); socket_cleanup(); } #if defined(USING_FFMPEG) void VideoSubsystem::ffmpegLogCallback(void* ptr, int level, const char* fmt, va_list args) { if (level > av_log_get_level()) return; char str[4096]; int len = sizeof(str); int n = vsnprintf(str, len, fmt, args); if (n >= len) n = len - 1; switch (level) { case AV_LOG_TRACE: logger().trace("FFMPEG: " + std::string(str, n)); break; case AV_LOG_VERBOSE: case AV_LOG_DEBUG: logger().debug("FFMPEG: " + std::string(str, n)); break; case AV_LOG_INFO: logger().information("FFMPEG: " + std::string(str, n)); break; case AV_LOG_WARNING: logger().warning("FFMPEG: " + std::string(str, n)); break; case AV_LOG_ERROR: logger().error("FFMPEG: " + std::string(str, n)); break; case AV_LOG_FATAL: logger().fatal("FFMPEG: " + std::string(str, n)); break; default: break; } } #endif }