将MediaSinkDelegate和Demux移到MediaSink中
This commit is contained in:
parent
a0946b26e1
commit
09fb5346c5
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include "MediaSink.h"
|
||||
#include "Extension/AAC.h"
|
||||
#include "Common/config.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
|
@ -271,4 +272,86 @@ void MediaSink::enableMuteAudio(bool flag) {
|
|||
_add_mute_audio = flag;
|
||||
}
|
||||
|
||||
///////////////////////////DemuxerSink//////////////////////////////
|
||||
|
||||
void MediaSinkDelegate::setTrackListener(TrackListener *listener) {
|
||||
_listener = listener;
|
||||
}
|
||||
|
||||
bool MediaSinkDelegate::onTrackReady(const Track::Ptr &track) {
|
||||
if (_listener) {
|
||||
_listener->addTrack(track);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void MediaSinkDelegate::onAllTrackReady() {
|
||||
if (_listener) {
|
||||
_listener->addTrackCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
void MediaSinkDelegate::resetTracks() {
|
||||
MediaSink::resetTracks();
|
||||
if (_listener) {
|
||||
_listener->resetTracks();
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////Demuxer//////////////////////////////
|
||||
|
||||
void Demuxer::setTrackListener(TrackListener *listener, bool wait_track_ready) {
|
||||
if (wait_track_ready) {
|
||||
auto sink = std::make_shared<MediaSinkDelegate>();
|
||||
sink->setTrackListener(listener);
|
||||
_sink = std::move(sink);
|
||||
}
|
||||
_listener = listener;
|
||||
}
|
||||
|
||||
bool Demuxer::addTrack(const Track::Ptr &track) {
|
||||
if (!_sink) {
|
||||
_origin_track.emplace_back(track);
|
||||
return _listener ? _listener->addTrack(track) : false;
|
||||
}
|
||||
|
||||
if (_sink->addTrack(track)) {
|
||||
track->addDelegate([this](const Frame::Ptr &frame) {
|
||||
return _sink->inputFrame(frame);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Demuxer::addTrackCompleted() {
|
||||
if (_sink) {
|
||||
_sink->addTrackCompleted();
|
||||
} else if (_listener) {
|
||||
_listener->addTrackCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
void Demuxer::resetTracks() {
|
||||
if (_sink) {
|
||||
_sink->resetTracks();
|
||||
} else if (_listener) {
|
||||
_listener->resetTracks();
|
||||
}
|
||||
}
|
||||
|
||||
vector<Track::Ptr> Demuxer::getTracks(bool ready) const {
|
||||
if (_sink) {
|
||||
return _sink->getTracks(ready);
|
||||
}
|
||||
|
||||
vector<Track::Ptr> ret;
|
||||
for (auto &track : _origin_track) {
|
||||
if (ready && !track->ready()) {
|
||||
continue;
|
||||
}
|
||||
ret.emplace_back(track);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}//namespace mediakit
|
||||
|
|
|
|||
|
|
@ -168,6 +168,44 @@ private:
|
|||
};
|
||||
|
||||
|
||||
class MediaSinkDelegate : public MediaSink {
|
||||
public:
|
||||
MediaSinkDelegate() = default;
|
||||
~MediaSinkDelegate() override = default;
|
||||
|
||||
/**
|
||||
* 设置track监听器
|
||||
*/
|
||||
void setTrackListener(TrackListener *listener);
|
||||
|
||||
protected:
|
||||
void resetTracks() override;
|
||||
bool onTrackReady(const Track::Ptr & track) override;
|
||||
void onAllTrackReady() override;
|
||||
|
||||
private:
|
||||
TrackListener *_listener = nullptr;
|
||||
};
|
||||
|
||||
class Demuxer : protected TrackListener, public TrackSource {
|
||||
public:
|
||||
Demuxer() = default;
|
||||
~Demuxer() override = default;
|
||||
|
||||
void setTrackListener(TrackListener *listener, bool wait_track_ready = false);
|
||||
std::vector<Track::Ptr> getTracks(bool trackReady = true) const override;
|
||||
|
||||
protected:
|
||||
bool addTrack(const Track::Ptr &track) override;
|
||||
void addTrackCompleted() override;
|
||||
void resetTracks() override;
|
||||
|
||||
private:
|
||||
MediaSink::Ptr _sink;
|
||||
TrackListener *_listener = nullptr;
|
||||
std::vector<Track::Ptr> _origin_track;
|
||||
};
|
||||
|
||||
}//namespace mediakit
|
||||
|
||||
#endif //ZLMEDIAKIT_MEDIASINK_H
|
||||
|
|
|
|||
|
|
@ -68,87 +68,4 @@ PlayerBase::PlayerBase() {
|
|||
this->mINI::operator[](Client::kWaitTrackReady) = true;
|
||||
}
|
||||
|
||||
///////////////////////////DemuxerSink//////////////////////////////
|
||||
|
||||
void MediaSinkDelegate::setTrackListener(TrackListener *listener) {
|
||||
_listener = listener;
|
||||
}
|
||||
|
||||
bool MediaSinkDelegate::onTrackReady(const Track::Ptr &track) {
|
||||
if (_listener) {
|
||||
_listener->addTrack(track);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void MediaSinkDelegate::onAllTrackReady() {
|
||||
if (_listener) {
|
||||
_listener->addTrackCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
void MediaSinkDelegate::resetTracks() {
|
||||
MediaSink::resetTracks();
|
||||
if (_listener) {
|
||||
_listener->resetTracks();
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////Demuxer//////////////////////////////
|
||||
|
||||
void Demuxer::setTrackListener(TrackListener *listener, bool wait_track_ready) {
|
||||
if (wait_track_ready) {
|
||||
auto sink = std::make_shared<MediaSinkDelegate>();
|
||||
sink->setTrackListener(listener);
|
||||
_sink = std::move(sink);
|
||||
}
|
||||
_listener = listener;
|
||||
}
|
||||
|
||||
bool Demuxer::addTrack(const Track::Ptr &track) {
|
||||
if (!_sink) {
|
||||
_origin_track.emplace_back(track);
|
||||
return _listener ? _listener->addTrack(track) : false;
|
||||
}
|
||||
|
||||
if (_sink->addTrack(track)) {
|
||||
track->addDelegate([this](const Frame::Ptr &frame) {
|
||||
return _sink->inputFrame(frame);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Demuxer::addTrackCompleted() {
|
||||
if (_sink) {
|
||||
_sink->addTrackCompleted();
|
||||
} else if (_listener) {
|
||||
_listener->addTrackCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
void Demuxer::resetTracks() {
|
||||
if (_sink) {
|
||||
_sink->resetTracks();
|
||||
} else if (_listener) {
|
||||
_listener->resetTracks();
|
||||
}
|
||||
}
|
||||
|
||||
vector<Track::Ptr> Demuxer::getTracks(bool ready) const {
|
||||
if (_sink) {
|
||||
return _sink->getTracks(ready);
|
||||
}
|
||||
|
||||
vector<Track::Ptr> ret;
|
||||
for (auto &track : _origin_track) {
|
||||
if (ready && !track->ready()) {
|
||||
continue;
|
||||
}
|
||||
ret.emplace_back(track);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
} /* namespace mediakit */
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
#include <functional>
|
||||
#include "Network/Socket.h"
|
||||
#include "Util/mini.h"
|
||||
#include "Util/RingBuffer.h"
|
||||
#include "Common/MediaSource.h"
|
||||
#include "Common/MediaSink.h"
|
||||
#include "Extension/Frame.h"
|
||||
|
|
@ -236,44 +235,6 @@ protected:
|
|||
std::shared_ptr<Delegate> _delegate;
|
||||
};
|
||||
|
||||
class MediaSinkDelegate : public MediaSink {
|
||||
public:
|
||||
MediaSinkDelegate() = default;
|
||||
~MediaSinkDelegate() override = default;
|
||||
|
||||
/**
|
||||
* 设置track监听器
|
||||
*/
|
||||
void setTrackListener(TrackListener *listener);
|
||||
|
||||
protected:
|
||||
void resetTracks() override;
|
||||
bool onTrackReady(const Track::Ptr & track) override;
|
||||
void onAllTrackReady() override;
|
||||
|
||||
private:
|
||||
TrackListener *_listener = nullptr;
|
||||
};
|
||||
|
||||
class Demuxer : protected TrackListener, public TrackSource {
|
||||
public:
|
||||
Demuxer() = default;
|
||||
~Demuxer() override = default;
|
||||
|
||||
void setTrackListener(TrackListener *listener, bool wait_track_ready = false);
|
||||
std::vector<Track::Ptr> getTracks(bool trackReady = true) const override;
|
||||
|
||||
protected:
|
||||
bool addTrack(const Track::Ptr &track) override;
|
||||
void addTrackCompleted() override;
|
||||
void resetTracks() override;
|
||||
|
||||
private:
|
||||
MediaSink::Ptr _sink;
|
||||
TrackListener *_listener = nullptr;
|
||||
std::vector<Track::Ptr> _origin_track;
|
||||
};
|
||||
|
||||
} /* namespace mediakit */
|
||||
|
||||
#endif /* SRC_PLAYER_PLAYERBASE_H_ */
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include "Common/config.h"
|
||||
#include "MP4Recorder.h"
|
||||
#include "Thread/WorkThreadPool.h"
|
||||
#include "MP4Muxer.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace toolkit;
|
||||
|
|
|
|||
|
|
@ -13,17 +13,14 @@
|
|||
|
||||
#include <mutex>
|
||||
#include <memory>
|
||||
#include "Player/PlayerBase.h"
|
||||
#include "Util/util.h"
|
||||
#include "Util/logger.h"
|
||||
#include "Util/TimeTicker.h"
|
||||
#include "Util/TimeTicker.h"
|
||||
#include "Common/MediaSink.h"
|
||||
#include "MP4Muxer.h"
|
||||
#include "Record/Recorder.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
#ifdef ENABLE_MP4
|
||||
class MP4Muxer;
|
||||
|
||||
class MP4Recorder final : public MediaSinkInterface {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<MP4Recorder>;
|
||||
|
|
@ -63,7 +60,7 @@ private:
|
|||
std::string _full_path;
|
||||
std::string _full_path_tmp;
|
||||
RecordInfo _info;
|
||||
MP4Muxer::Ptr _muxer;
|
||||
std::shared_ptr<MP4Muxer> _muxer;
|
||||
std::list<Track::Ptr> _tracks;
|
||||
uint64_t _last_dts = 0;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
* 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 "RtmpCodec.h"
|
||||
#include "RtmpDemuxer.h"
|
||||
#include "Extension/Factory.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -15,12 +15,10 @@
|
|||
#include <unordered_map>
|
||||
#include "Rtmp/amf.h"
|
||||
#include "Rtmp/Rtmp.h"
|
||||
#include "Player/PlayerBase.h"
|
||||
#include "Util/TimeTicker.h"
|
||||
#include "RtmpCodec.h"
|
||||
#include "Common/MediaSink.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
class RtmpCodec;
|
||||
class RtmpDemuxer : public Demuxer {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<RtmpDemuxer>;
|
||||
|
|
@ -54,8 +52,8 @@ private:
|
|||
float _duration = 0;
|
||||
AudioTrack::Ptr _audio_track;
|
||||
VideoTrack::Ptr _video_track;
|
||||
RtmpCodec::Ptr _audio_rtmp_decoder;
|
||||
RtmpCodec::Ptr _video_rtmp_decoder;
|
||||
std::shared_ptr<RtmpCodec> _audio_rtmp_decoder;
|
||||
std::shared_ptr<RtmpCodec> _video_rtmp_decoder;
|
||||
};
|
||||
|
||||
} /* namespace mediakit */
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
#include "PSEncoder.h"
|
||||
#include "RawEncoder.h"
|
||||
#include "Extension/CommonRtp.h"
|
||||
|
||||
#include "Common/MediaSource.h"
|
||||
namespace mediakit{
|
||||
|
||||
class RtpCache : protected PacketCache<toolkit::Buffer> {
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
#include "PSEncoder.h"
|
||||
#include "Extension/CommonRtp.h"
|
||||
#include "Rtcp/RtcpContext.h"
|
||||
|
||||
#include "Common/MediaSource.h"
|
||||
namespace mediakit{
|
||||
|
||||
//rtp发送客户端,支持发送GB28181协议
|
||||
|
|
|
|||
|
|
@ -12,8 +12,9 @@
|
|||
#define ZLMEDIAKIT_RTPCODEC_H
|
||||
|
||||
#include <memory>
|
||||
#include "Extension/Frame.h"
|
||||
#include "Util/RingBuffer.h"
|
||||
#include "Player/PlayerBase.h"
|
||||
#include "Rtsp/Rtsp.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <cctype>
|
||||
#include <algorithm>
|
||||
#include "RtpCodec.h"
|
||||
#include "RtspDemuxer.h"
|
||||
#include "Util/base64.h"
|
||||
#include "Extension/Factory.h"
|
||||
|
|
|
|||
|
|
@ -12,12 +12,10 @@
|
|||
#define SRC_RTP_RTSPDEMUXER_H_
|
||||
|
||||
#include <unordered_map>
|
||||
#include "Player/PlayerBase.h"
|
||||
#include "Util/TimeTicker.h"
|
||||
#include "RtpCodec.h"
|
||||
#include "Common/MediaSink.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
class RtpCodec;
|
||||
class RtspDemuxer : public Demuxer {
|
||||
public:
|
||||
typedef std::shared_ptr<RtspDemuxer> Ptr;
|
||||
|
|
@ -51,8 +49,8 @@ private:
|
|||
float _duration = 0;
|
||||
AudioTrack::Ptr _audio_track;
|
||||
VideoTrack::Ptr _video_track;
|
||||
RtpCodec::Ptr _audio_rtp_decoder;
|
||||
RtpCodec::Ptr _video_rtp_decoder;
|
||||
std::shared_ptr<RtpCodec> _audio_rtp_decoder;
|
||||
std::shared_ptr<RtpCodec> _video_rtp_decoder;
|
||||
};
|
||||
|
||||
} /* namespace mediakit */
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include "RtspSession.h"
|
||||
#include "Util/MD5.h"
|
||||
#include "Util/base64.h"
|
||||
#include "RtpMultiCaster.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace toolkit;
|
||||
|
|
|
|||
|
|
@ -15,42 +15,18 @@
|
|||
#include <vector>
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
#include "Util/util.h"
|
||||
#include "Util/logger.h"
|
||||
#include "Common/config.h"
|
||||
#include "Network/Session.h"
|
||||
#include "Player/PlayerBase.h"
|
||||
#include "RtpMultiCaster.h"
|
||||
#include "RtspMediaSource.h"
|
||||
#include "RtspSplitter.h"
|
||||
#include "RtpReceiver.h"
|
||||
#include "RtspMediaSourceImp.h"
|
||||
#include "Common/Stamp.h"
|
||||
#include "Rtcp/RtcpContext.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
class RtpMultiCaster;
|
||||
class RtspSession;
|
||||
|
||||
class BufferRtp : public toolkit::Buffer{
|
||||
public:
|
||||
using Ptr = std::shared_ptr<BufferRtp>;
|
||||
|
||||
BufferRtp(Buffer::Ptr pkt, size_t offset = 0) : _offset(offset), _rtp(std::move(pkt)) {}
|
||||
~BufferRtp() override = default;
|
||||
|
||||
char *data() const override {
|
||||
return (char *)_rtp->data() + _offset;
|
||||
}
|
||||
|
||||
size_t size() const override {
|
||||
return _rtp->size() - _offset;
|
||||
}
|
||||
|
||||
private:
|
||||
size_t _offset;
|
||||
Buffer::Ptr _rtp;
|
||||
};
|
||||
using BufferRtp = toolkit::BufferOffset<toolkit::Buffer::Ptr>;
|
||||
|
||||
class RtspSession : public toolkit::Session, public RtspSplitter, public RtpReceiver, public MediaSourceEvent {
|
||||
public:
|
||||
|
|
@ -209,7 +185,7 @@ private:
|
|||
std::unordered_set<int> _udp_connected_flags;
|
||||
////////RTP over udp_multicast////////
|
||||
//共享的rtp组播对象
|
||||
RtpMultiCaster::Ptr _multicaster;
|
||||
std::shared_ptr<RtpMultiCaster> _multicaster;
|
||||
////////RTSP over HTTP ////////
|
||||
//quicktime 请求rtsp会产生两次tcp连接,
|
||||
//一次发送 get 一次发送post,需要通过x-sessioncookie关联起来
|
||||
|
|
|
|||
Loading…
Reference in New Issue