#pragma once #include <regex> #include "VcmCapturer.h" #include "rtspvideocapturer.h" #include "rtspaudiocapturer.h" #include "pc/video_track_source.h" template<class T> class TrackSource : public webrtc::VideoTrackSource { public: static rtc::scoped_refptr<TrackSource> Create(const std::string & videourl, std::unique_ptr<webrtc::VideoDecoderFactory>& videoDecoderFactory) { std::unique_ptr<T> capturer = absl::WrapUnique(T::Create(videourl, videoDecoderFactory)); if (!capturer) { return nullptr; } return new rtc::RefCountedObject<TrackSource>(std::move(capturer)); } protected: explicit TrackSource(std::unique_ptr<T> capturer) : webrtc::VideoTrackSource(/*remote=*/false), capturer_(std::move(capturer)) {} private: rtc::VideoSourceInterface<webrtc::VideoFrame>* source() override { return capturer_.get(); } std::unique_ptr<T> capturer_; }; class CapturerFactory { public: static rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> CreateVideoSource(const std::string & videourl, std::unique_ptr<webrtc::VideoDecoderFactory>& videoDecoderFactory) { rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> videoSource; videoSource = TrackSource<RTSPVideoCapturer>::Create(videourl, videoDecoderFactory); return videoSource; } static rtc::scoped_refptr<webrtc::AudioSourceInterface> CreateAudioSource(const std::string & audiourl, const std::map<std::string,std::string> & opts, rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> peer_connection_factory, rtc::scoped_refptr<webrtc::AudioDecoderFactory> audioDecoderfactory, rtc::scoped_refptr<webrtc::AudioDeviceModule> audioDeviceModule) { rtc::scoped_refptr<webrtc::AudioSourceInterface> audioSource; audioDeviceModule->Terminate(); audioSource = RTSPAudioSource::Create(audioDecoderfactory, audiourl); return audioSource; } };