mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
WebRTC: Support TCP network.
This commit is contained in:
parent
625069af7f
commit
07339e1417
5 changed files with 565 additions and 4 deletions
|
|
@ -29,6 +29,8 @@ class SrsEphemeralDelta;
|
|||
class ISrsKbpsDelta;
|
||||
class SrsRtcUdpNetwork;
|
||||
class ISrsRtcNetwork;
|
||||
class SrsRtcTcpNetwork;
|
||||
class SrsRtcDummyNetwork;
|
||||
|
||||
// The network stat.
|
||||
enum SrsRtcNetworkState
|
||||
|
|
@ -47,6 +49,10 @@ class SrsRtcNetworks
|
|||
private:
|
||||
// Network over UDP.
|
||||
SrsRtcUdpNetwork* udp_;
|
||||
// Network over TCP
|
||||
SrsRtcTcpNetwork* tcp_;
|
||||
// Network over dummy
|
||||
SrsRtcDummyNetwork* dummy_;
|
||||
private:
|
||||
// WebRTC session object.
|
||||
SrsRtcConnection* conn_;
|
||||
|
|
@ -63,6 +69,7 @@ public:
|
|||
void set_state(SrsRtcNetworkState state);
|
||||
// Get the UDP network object.
|
||||
SrsRtcUdpNetwork* udp();
|
||||
SrsRtcTcpNetwork* tcp();
|
||||
// Get an available network.
|
||||
ISrsRtcNetwork* available();
|
||||
public:
|
||||
|
|
@ -73,6 +80,9 @@ public:
|
|||
// For DTLS or Session to call network service.
|
||||
class ISrsRtcNetwork : public ISrsStreamWriter
|
||||
{
|
||||
protected:
|
||||
bool establelished_;
|
||||
|
||||
public:
|
||||
ISrsRtcNetwork();
|
||||
virtual ~ISrsRtcNetwork();
|
||||
|
|
@ -86,6 +96,27 @@ public:
|
|||
virtual srs_error_t protect_rtp(void* packet, int* nb_cipher) = 0;
|
||||
// Protect RTCP packet by SRTP context.
|
||||
virtual srs_error_t protect_rtcp(void* packet, int* nb_cipher) = 0;
|
||||
public:
|
||||
bool is_establelished();
|
||||
};
|
||||
|
||||
// Dummy networks
|
||||
class SrsRtcDummyNetwork : public ISrsRtcNetwork
|
||||
{
|
||||
public:
|
||||
SrsRtcDummyNetwork();
|
||||
virtual ~SrsRtcDummyNetwork();
|
||||
|
||||
// The interface of ISrsRtcNetwork
|
||||
public:
|
||||
virtual srs_error_t on_connection_established();
|
||||
virtual srs_error_t on_dtls_alert(std::string type, std::string desc);
|
||||
public:
|
||||
virtual srs_error_t protect_rtp(void* packet, int* nb_cipher);
|
||||
virtual srs_error_t protect_rtcp(void* packet, int* nb_cipher);
|
||||
// Interface ISrsStreamWriter.
|
||||
public:
|
||||
virtual srs_error_t write(void* buf, size_t size, ssize_t* nwrite);
|
||||
};
|
||||
|
||||
// The WebRTC over UDP network.
|
||||
|
|
@ -141,8 +172,64 @@ public:
|
|||
virtual srs_error_t write(void* buf, size_t size, ssize_t* nwrite);
|
||||
};
|
||||
|
||||
class SrsRtcTcpNetwork: public ISrsRtcNetwork
|
||||
{
|
||||
private:
|
||||
SrsRtcConnection* conn_;
|
||||
SrsEphemeralDelta* delta_;
|
||||
ISrsProtocolReadWriter* sendonly_skt_;
|
||||
|
||||
// The DTLS transport over this network.
|
||||
ISrsRtcTransport* transport_;
|
||||
|
||||
std::string peer_ip_;
|
||||
int peer_port_;
|
||||
SrsRtcNetworkState state_;
|
||||
public:
|
||||
SrsRtcTcpNetwork(SrsRtcConnection* conn, SrsEphemeralDelta* delta);
|
||||
virtual ~SrsRtcTcpNetwork();
|
||||
|
||||
void update_sendonly_socket(ISrsProtocolReadWriter* skt);
|
||||
//ISrsRtcNetwork
|
||||
public:
|
||||
// Callback when DTLS connected.
|
||||
virtual srs_error_t on_connection_established();
|
||||
// Callback when DTLS disconnected.
|
||||
virtual srs_error_t on_dtls_alert(std::string type, std::string desc);
|
||||
// Protect RTP packet by SRTP context.
|
||||
virtual srs_error_t protect_rtp(void* packet, int* nb_cipher);
|
||||
// Protect RTCP packet by SRTP context.
|
||||
virtual srs_error_t protect_rtcp(void* packet, int* nb_cipher);
|
||||
|
||||
// When got STUN ping message. The peer address may change, we can identify that by STUN messages.
|
||||
srs_error_t on_stun(SrsStunPacket* r, char* data, int nb_data);
|
||||
private:
|
||||
srs_error_t on_binding_request(SrsStunPacket* r, std::string ice_pwd);
|
||||
// DTLS transport functions.
|
||||
public:
|
||||
srs_error_t initialize(SrsSessionConfig* cfg, bool dtls, bool srtp);
|
||||
virtual srs_error_t start_active_handshake();
|
||||
virtual srs_error_t on_dtls(char* data, int nb_data);
|
||||
// When got data from socket.
|
||||
public:
|
||||
srs_error_t on_rtcp(char* data, int nb_data);
|
||||
srs_error_t on_rtp(char* data, int nb_data);
|
||||
// Other functions.
|
||||
public:
|
||||
// Connection level state machine, for ARQ of UDP packets.
|
||||
void set_state(SrsRtcNetworkState state);
|
||||
// ICE reflexive address functions.
|
||||
std::string get_peer_ip();
|
||||
int get_peer_port();
|
||||
// Interface ISrsStreamWriter.
|
||||
public:
|
||||
virtual srs_error_t write(void* buf, size_t size, ssize_t* nwrite);
|
||||
public:
|
||||
void set_peer_id(const std::string& ip, int port);
|
||||
};
|
||||
|
||||
// For WebRTC over TCP.
|
||||
class SrsRtcTcpConn : public ISrsConnection, public ISrsStartable, public ISrsCoroutineHandler
|
||||
class SrsRtcTcpConn : public ISrsConnection, public ISrsStartable, public ISrsCoroutineHandler, public ISrsDisposingHandler
|
||||
{
|
||||
private:
|
||||
// The manager object to manage the connection.
|
||||
|
|
@ -154,7 +241,10 @@ private:
|
|||
int port_;
|
||||
// The delta for statistic.
|
||||
SrsNetworkDelta* delta_;
|
||||
// TCP Transport object.
|
||||
|
||||
// WebRTC session object.
|
||||
SrsRtcConnection* session_;
|
||||
bool disposing_;
|
||||
ISrsProtocolReadWriter* skt_;
|
||||
public:
|
||||
SrsRtcTcpConn(ISrsProtocolReadWriter* skt, std::string cip, int port, ISrsResourceManager* cm);
|
||||
|
|
@ -176,6 +266,11 @@ public:
|
|||
virtual srs_error_t cycle();
|
||||
private:
|
||||
virtual srs_error_t do_cycle();
|
||||
srs_error_t on_tcp_pkt(char* pkt, int nb_pkt);
|
||||
// Interface of ISrsDisposingHandler
|
||||
public:
|
||||
virtual void on_before_dispose(ISrsResource* c);
|
||||
virtual void on_disposing(ISrsResource* c);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue