SrtTransportImp.hpp 2.98 KB
Newer Older
1 2
#ifndef ZLMEDIAKIT_SRT_TRANSPORT_IMP_H
#define ZLMEDIAKIT_SRT_TRANSPORT_IMP_H
ziyue committed
3

4
#include "Common/MultiMediaSourceMuxer.h"
5 6
#include "Rtp/Decoder.h"
#include "SrtTransport.hpp"
ziyue committed
7
#include "TS/TSMediaSource.h"
8
#include <mutex>
9

10
namespace SRT {
ziyue committed
11 12 13 14

using namespace std;
using namespace toolkit;
using namespace mediakit;
15 16 17 18 19 20 21 22
class SrtTransportImp
    : public SrtTransport
    , public toolkit::SockInfo
    , public MediaSinkInterface
    , public mediakit::MediaSourceEvent {
public:
    SrtTransportImp(const EventPoller::Ptr &poller);
    ~SrtTransportImp();
ziyue committed
23 24 25

    void inputSockData(uint8_t *buf, int len, struct sockaddr_storage *addr) override {
        SrtTransport::inputSockData(buf, len, addr);
26 27
        _total_bytes += len;
    }
ziyue committed
28
    void onSendTSData(const Buffer::Ptr &buffer, bool flush) override { SrtTransport::onSendTSData(buffer, flush); }
29 30 31 32 33 34 35 36 37
    /// SockInfo override
    std::string get_local_ip() override;
    uint16_t get_local_port() override;
    std::string get_peer_ip() override;
    uint16_t get_peer_port() override;
    std::string getIdentifier() const override;

protected:
    ///////SrtTransport override///////
ziyue committed
38
    int getLatencyMul() override;
39
    int getPktBufSize() override;
40
    float getTimeOutSec() override;
41
    void onSRTData(DataPacket::Ptr pkt) override;
42
    void onShutdown(const SockException &ex) override;
ziyue committed
43
    void onHandShakeFinished(std::string &streamid, struct sockaddr_storage *addr) override;
44

ziyue committed
45
    void sendPacket(Buffer::Ptr pkt, bool flush = true) override {
xiongguangjie committed
46
        _total_bytes += pkt->size();
ziyue committed
47
        SrtTransport::sendPacket(pkt, flush);
48 49
    }

ziyue committed
50 51
    bool isPusher() override { return _is_pusher; }

52 53
    ///////MediaSourceEvent override///////
    // 关闭
54
    bool close(mediakit::MediaSource &sender) override;
55 56 57 58 59 60 61
    // 获取媒体源类型
    mediakit::MediaOriginType getOriginType(mediakit::MediaSource &sender) const override;
    // 获取媒体源url或者文件路径
    std::string getOriginUrl(mediakit::MediaSource &sender) const override;
    // 获取媒体源客户端相关信息
    std::shared_ptr<SockInfo> getOriginSock(mediakit::MediaSource &sender) const override;

ziyue committed
62
    ///////MediaSinkInterface override///////
63
    void resetTracks() override {};
ziyue committed
64 65 66
    void addTrackCompleted() override;
    bool addTrack(const Track::Ptr &track) override;
    bool inputFrame(const Frame::Ptr &frame) override;
67 68

private:
69
    bool parseStreamid(std::string &streamid);
70 71 72 73 74 75 76 77 78
    void emitOnPublish();
    void emitOnPlay();

    void doPlay();
    void doCachedFunc();

private:
    bool _is_pusher = true;
    MediaInfo _media_info;
ziyue committed
79
    uint64_t _total_bytes = 0;
80
    Ticker _alive_ticker;
81
    std::unique_ptr<sockaddr_storage> _addr;
ziyue committed
82
    // for player
83
    TSMediaSource::RingType::RingReader::Ptr _ts_reader;
ziyue committed
84
    // for pusher
85 86 87
    MultiMediaSourceMuxer::Ptr _muxer;
    DecoderImp::Ptr _decoder;
    std::recursive_mutex _func_mtx;
88
    std::deque<std::function<void()>> _cached_func;
89 90

    std::unordered_map<int, Stamp> _type_to_stamp;
91 92 93 94 95
};

} // namespace SRT

#endif // ZLMEDIAKIT_SRT_TRANSPORT_IMP_H