RtspPlayer.h 4.94 KB
Newer Older
xiongziliang committed
1
/*
xiongziliang committed
2
 * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
xiongziliang committed
3
 *
4
 * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
xiongziliang committed
5
 *
xiongziliang committed
6 7 8
 * Use of this source code is governed by MIT 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.
xzl committed
9 10 11 12
 */

#ifndef SRC_RTSPPLAYER_RTSPPLAYER_H_TXT_
#define SRC_RTSPPLAYER_RTSPPLAYER_H_TXT_
xiongzilaing committed
13

xzl committed
14
#include <string>
xiongzilaing committed
15
#include <memory>
xzl committed
16
#include "Util/TimeTicker.h"
xiongzilaing committed
17 18
#include "Poller/Timer.h"
#include "Network/Socket.h"
mtdxc committed
19
#include "Player/PlayerBase.h"
xiongzilaing committed
20
#include "Network/TcpClient.h"
21
#include "RtspSplitter.h"
xiongziliang committed
22
#include "RtpReceiver.h"
23
#include "Rtcp/RtcpContext.h"
xzl committed
24

xiongziliang committed
25
namespace mediakit {
26

3503207480@qq.com committed
27
//实现了rtsp播放器协议部分的功能,及数据接收功能
夏楚 committed
28
class RtspPlayer : public PlayerBase, public toolkit::TcpClient, public RtspSplitter, public RtpReceiver {
xzl committed
29
public:
夏楚 committed
30
    using Ptr = std::shared_ptr<RtspPlayer>;
31

夏楚 committed
32
    RtspPlayer(const toolkit::EventPoller::Ptr &poller);
33 34
    ~RtspPlayer() override;

夏楚 committed
35
    void play(const std::string &strUrl) override;
ziyue committed
36 37
    void pause(bool pause) override;
    void speed(float speed) override;
38 39
    void teardown() override;
    float getPacketLossRate(TrackType type) const override;
40

xzl committed
41
protected:
42
    //派生类回调函数
夏楚 committed
43
    virtual bool onCheckSDP(const std::string &sdp) = 0;
xia-chu committed
44
    virtual void onRecvRTP(RtpPacket::Ptr rtp, const SdpTrack::Ptr &track) = 0;
45 46
    uint32_t getProgressMilliSecond() const;
    void seekToMilliSecond(uint32_t ms);
47 48 49 50 51 52 53 54 55 56 57 58

    /**
     * 收到完整的rtsp包回调,包括sdp等content数据
     * @param parser rtsp包
     */
    void onWholeRtspPacket(Parser &parser) override ;

    /**
     * 收到rtp包回调
     * @param data
     * @param len
     */
59
    void onRtpPacket(const char *data,size_t len) override ;
xiongziliang committed
60 61 62

    /**
     * rtp数据包排序后输出
63 64
     * @param rtp rtp数据包
     * @param track_idx track索引
xiongziliang committed
65
     */
xia-chu committed
66
    void onRtpSorted(RtpPacket::Ptr rtp, int track_idx) override;
67 68

    /**
xiongziliang committed
69 70 71 72 73 74 75
     * 解析出rtp但还未排序
     * @param rtp rtp数据包
     * @param track_index track索引
     */
    void onBeforeRtpSorted(const RtpPacket::Ptr &rtp, int track_index) override;

    /**
76
     * 收到RTCP包回调
77 78 79 80
     * @param track_idx track索引
     * @param track sdp相关信息
     * @param data rtcp内容
     * @param len rtcp内容长度
81
     */
xiongziliang committed
82
    virtual void onRtcpPacket(int track_idx, SdpTrack::Ptr &track, uint8_t *data, size_t len);
83

84
    /////////////TcpClient override/////////////
夏楚 committed
85 86 87
    void onConnect(const toolkit::SockException &err) override;
    void onRecv(const toolkit::Buffer::Ptr &buf) override;
    void onErr(const toolkit::SockException &ex) override;
88

xzl committed
89
private:
夏楚 committed
90
    void onPlayResult_l(const toolkit::SockException &ex , bool handshake_done);
91

xiongziliang committed
92
    int getTrackIndexByInterleaved(int interleaved) const;
93
    int getTrackIndexByTrackType(TrackType track_type) const;
xzl committed
94

95
    void handleResSETUP(const Parser &parser, unsigned int track_idx);
96
    void handleResDESCRIBE(const Parser &parser);
夏楚 committed
97
    bool handleAuthenticationFailure(const std::string &wwwAuthenticateParamsStr);
98
    void handleResPAUSE(const Parser &parser, int type);
夏楚 committed
99
    bool handleResponse(const std::string &cmd, const Parser &parser);
100

101
    void sendOptions();
102
    void sendSetup(unsigned int track_idx);
103 104
    void sendPause(int type , uint32_t ms);
    void sendDescribe();
105
    void sendTeardown();
106
    void sendKeepAlive();
夏楚 committed
107 108
    void sendRtspRequest(const std::string &cmd, const std::string &url ,const StrCaseMap &header = StrCaseMap());
    void sendRtspRequest(const std::string &cmd, const std::string &url ,const std::initializer_list<std::string> &header);
109
    void createUdpSockIfNecessary(int track_idx);
110

111
private:
112 113 114
    //是否为性能测试模式
    bool _benchmark_mode = false;
    //轮流发送rtcp与GET_PARAMETER保活
xiongziliang committed
115
    bool _send_rtcp[2] = {true, true};
116

夏楚 committed
117 118 119
    std::string _play_url;
    std::vector<SdpTrack::Ptr> _sdp_track;
    std::function<void(const Parser&)> _on_response;
120
    //RTP端口,trackid idx 为数组下标
夏楚 committed
121
    toolkit::Socket::Ptr _rtp_sock[2];
122
    //RTCP端口,trackid idx 为数组下标
夏楚 committed
123
    toolkit::Socket::Ptr _rtcp_sock[2];
124 125

    //rtsp鉴权相关
夏楚 committed
126 127
    std::string _md5_nonce;
    std::string _realm;
128
    //rtsp info
夏楚 committed
129
    std::string _session_id;
130
    uint32_t _cseq_send = 1;
夏楚 committed
131
    std::string _content_base;
132
    Rtsp::eRtpType _rtp_type = Rtsp::RTP_TCP;
133

134 135
    //当前rtp时间戳
    uint32_t _stamp[2] = {0, 0};
136 137

    //超时功能实现
夏楚 committed
138 139 140
    toolkit::Ticker _rtp_recv_ticker;
    std::shared_ptr<toolkit::Timer> _play_check_timer;
    std::shared_ptr<toolkit::Timer> _rtp_check_timer;
141
    //服务器支持的命令
夏楚 committed
142
    std::set<std::string> _supported_cmd;
xiongziliang committed
143 144
    ////////// rtcp ////////////////
    //rtcp发送时间,trackid idx 为数组下标
夏楚 committed
145
    toolkit::Ticker _rtcp_send_ticker[2];
xiongziliang committed
146
    //统计rtp并发送rtcp
147
    std::vector<RtcpContext::Ptr> _rtcp_context;
xzl committed
148 149
};

xiongziliang committed
150
} /* namespace mediakit */
xzl committed
151
#endif /* SRC_RTSPPLAYER_RTSPPLAYER_H_TXT_ */