Skip to content

Implementation of data channels on top of webrtc data channels #77

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 91 commits into from
Jul 8, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
4b5f5e9
implementation
Mar 30, 2020
c21fb2a
removed comment
Mar 31, 2020
0be1c49
bug fixes
Apr 14, 2020
d918fe4
Update include/DataProducer.hpp
tdrz May 1, 2020
69bceb7
Update include/Transport.hpp
tdrz May 1, 2020
3f99aa7
Update include/Transport.hpp
tdrz May 1, 2020
5ca2912
Update include/Transport.hpp
tdrz May 1, 2020
a5f19a1
Update include/Transport.hpp
tdrz May 1, 2020
ce973bb
Update src/DataConsumer.cpp
tdrz May 1, 2020
34ca1b0
Update src/DataConsumer.cpp
tdrz May 1, 2020
065d88f
Update src/DataConsumer.cpp
tdrz May 1, 2020
6e2e1f6
Update src/DataConsumer.cpp
tdrz May 1, 2020
28c1a88
Update src/DataConsumer.cpp
tdrz May 1, 2020
b11b3ac
Update src/DataConsumer.cpp
tdrz May 1, 2020
78ef6be
Update src/DataConsumer.cpp
tdrz May 1, 2020
22397bc
Update src/Transport.cpp
tdrz May 1, 2020
f3eca4a
Update src/Transport.cpp
tdrz May 1, 2020
377828e
Update src/sdp/RemoteSdp.cpp
tdrz May 1, 2020
f17e0e8
Update test/include/FakeTransportListener.hpp
tdrz May 1, 2020
c857327
Update src/DataConsumer.cpp
tdrz May 1, 2020
dabb3c9
Update src/Transport.cpp
tdrz May 1, 2020
f686d17
Update src/DataConsumer.cpp
tdrz May 1, 2020
0e637ef
Update src/DataConsumer.cpp
tdrz May 1, 2020
bfcc39c
Update src/DataConsumer.cpp
tdrz May 1, 2020
403ce0c
Update src/DataConsumer.cpp
tdrz May 1, 2020
81cfccf
Update src/DataConsumer.cpp
tdrz May 1, 2020
a9d3812
Update src/DataConsumer.cpp
tdrz May 1, 2020
e17b53e
Update src/DataProducer.cpp
tdrz May 1, 2020
ef2c1e2
Update src/DataProducer.cpp
tdrz May 1, 2020
5923d2d
Update src/DataProducer.cpp
tdrz May 1, 2020
01de49f
Update src/DataProducer.cpp
tdrz May 1, 2020
37caf76
Update src/DataProducer.cpp
tdrz May 1, 2020
73e4978
Update src/DataProducer.cpp
tdrz May 1, 2020
4339a4d
Update src/DataProducer.cpp
tdrz May 1, 2020
2d274e9
Update src/DataProducer.cpp
tdrz May 1, 2020
77412cd
Update src/DataProducer.cpp
tdrz May 1, 2020
23e1818
Update src/DataProducer.cpp
tdrz May 1, 2020
ec9b144
Update src/DataProducer.cpp
tdrz May 1, 2020
9776829
Update src/DataProducer.cpp
tdrz May 1, 2020
b347fdc
Update src/DataProducer.cpp
tdrz May 1, 2020
10d88a6
Update src/Handler.cpp
tdrz May 1, 2020
ac312f5
Update src/PeerConnection.cpp
tdrz May 1, 2020
a7ddce4
Update src/PeerConnection.cpp
tdrz May 1, 2020
9d66f6e
Update src/Transport.cpp
tdrz May 1, 2020
2f5285a
Update src/Transport.cpp
tdrz May 1, 2020
05e5ae5
applied code changes suggestions
May 1, 2020
11ac109
indentation fix
May 2, 2020
c3af35c
Update src/DataConsumer.cpp
tdrz May 4, 2020
0f475e2
Update src/DataConsumer.cpp
tdrz May 4, 2020
2225491
Update src/DataProducer.cpp
tdrz May 4, 2020
0a6b3e4
partial changes
May 4, 2020
83367b4
more changes
May 4, 2020
515d2ce
test adapted to new methods
May 4, 2020
d8164f0
Merge branch 'ChangesAfterCodeReview2' into v3-DataChannelsImpl
May 4, 2020
c78098f
gulp format
jmillan May 8, 2020
dba8822
Merge pull request #1 from versatica/v3
tdrz May 23, 2020
0a6ed09
rename createsend/recvdatachannel
May 31, 2020
c766d60
Merge pull request #2 from copiltembel/v3-DataChannelsImpl-Refactorings
tdrz May 31, 2020
581d5dd
Revert previous commit; make it build
May 31, 2020
2b45ac9
leftovers
May 31, 2020
c9e0860
validate sctp stream parameters before creating the data channel
Jun 2, 2020
f164bf4
removed data channel priority as it is not supported by newer version…
Jun 2, 2020
fb0ccbe
refactorings
Jun 2, 2020
fda2363
Merge pull request #3 from copiltembel/v3-DataChannelsImpl-Retake
tdrz Jun 2, 2020
348af1b
Merge remote-tracking branch 'origin/v3' into v3-DataChannelsImpl
jmillan Jun 16, 2020
4ce835a
Data[Consumer|Producer]: Add missing MSC_CLASS definition
jmillan Jun 16, 2020
f49795b
test: fix DataChannel tests
jmillan Jun 16, 2020
4cf262c
update .clang-tidy
jmillan Jun 16, 2020
6e65c8b
cosmetic
jmillan Jun 16, 2020
29f4540
remove commented line
jmillan Jun 16, 2020
62e2c5f
format
jmillan Jun 16, 2020
6a73d77
Make Data[Producer|Consumer] constructors private
jmillan Jun 16, 2020
2458eac
remove commented lines
jmillan Jun 16, 2020
fb2fa5e
cosmetic
jmillan Jun 16, 2020
a27d950
Handler: unify recv and send DataChannel struct and cleanup
jmillan Jun 16, 2020
cfa84d0
DataConsumer: add log for unknown data channel state
jmillan Jun 16, 2020
7dc53cd
remove comment
jmillan Jun 16, 2020
9ae8e5d
DataChannel naming
jmillan Jun 16, 2020
f1487dd
more DataChannel naming
jmillan Jun 16, 2020
36a80c0
more on DataChannel naming
jmillan Jun 16, 2020
30583c2
format
jmillan Jun 16, 2020
44f8509
DataConsumer: remove unnecessary include statements
jmillan Jun 16, 2020
24d8f47
DataProducer: remove unnecessary include statements
jmillan Jun 16, 2020
16805b5
cosmetic
jmillan Jun 16, 2020
9854276
cosmetic
jmillan Jun 16, 2020
b881e66
data channel code cleanup
jmillan Jun 16, 2020
e4d4f43
Handler: consistency with media and data send|recv
jmillan Jun 16, 2020
1b0d06c
cosmetic
jmillan Jun 16, 2020
92cb89e
Data[Consumer|Producer] reorder methods
jmillan Jun 17, 2020
7d17aa7
make 'protocol' optional in RecvTransport::ConsumeData
jmillan Jun 17, 2020
3fe943d
Merge branch 'v3' into HEAD
jmillan Jul 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ set(HEADER_FILES
set(
SOURCE_FILES
src/Consumer.cpp
src/DataConsumer.cpp
src/DataProducer.cpp
src/Device.cpp
src/Handler.cpp
src/Logger.cpp
Expand Down
76 changes: 76 additions & 0 deletions include/DataConsumer.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#ifndef MSC_DATACONSUMER_HPP
#define MSC_DATACONSUMER_HPP

#include <json.hpp>
#include <api/media_stream_interface.h> // webrtc::MediaStreamTrackInterface
#include <api/rtp_receiver_interface.h> // webrtc::RtpReceiverInterface
#include <api/data_channel_interface.h>
#include <string>

namespace mediasoupclient
{
class DataConsumer : public webrtc::DataChannelObserver {
public:
class PrivateListener
{
public:
virtual void OnClose(DataConsumer* dataConsumer) = 0;
};

class Listener {
public:
// The data channel state have changed.
virtual void OnStateChange(DataConsumer* dataConsumer) { };
// A data buffer was successfully received.
virtual void OnMessage(DataConsumer* dataConsumer, const webrtc::DataBuffer& buffer) = 0;
// The data channel's buffered_amount has changed.
// virtual void OnBufferedAmountChange(uint64_t sent_data_size) {}
//
virtual void OnTransportClosed(DataConsumer* dataConsumer) { };
};

public:
DataConsumer(
Listener* listener,
PrivateListener* privateListener,
const std::string& id,
const std::string& dataProducerId,
rtc::scoped_refptr<webrtc::DataChannelInterface> webrtcDataChannel,
const nlohmann::json& sctpStreamParameters,
const nlohmann::json& appData);

const std::string& GetId();
std::string GetLocalId() const;
const std::string& GetDataProducerId();
const bool IsClosed();
const nlohmann::json& GetSctpStreamParameters();
webrtc::DataChannelInterface::DataState GetReadyState();
std::string GetLabel();
std::string GetProtocol();
const nlohmann::json& GetAppData();
void Close();
void TransportClosed();

private:
Listener* listener;
PrivateListener* privateListener;
std::string id;
std::string dataProducerId;
rtc::scoped_refptr<webrtc::DataChannelInterface> webrtcDataChannel;
bool closed;
nlohmann::json sctpParameters;
nlohmann::json appData;


public:
// From webrtc::DataChannelObsever
// The data channel state have changed.
void OnStateChange() override;
// A data buffer was successfully received.
void OnMessage(const webrtc::DataBuffer& buffer) override;
// The data channel's buffered_amount has changed.
void OnBufferedAmountChange(uint64_t sent_data_size) override;
};
} // namespace mediasoupclient

#endif
82 changes: 82 additions & 0 deletions include/DataProducer.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#ifndef MSC_DATAPRODUCER_HPP
#define MSC_DATAPRODUCER_HPP

#include <json.hpp>
#include <string>
#include <api/data_channel_interface.h>
#include <api/stats/rtcstats_objects.h>
#include <third_party/abseil-cpp/absl/types/optional.h>
#include "Handler.hpp"

namespace mediasoupclient
{
// class Transport;
class SendTransport;

class DataProducer : public webrtc::DataChannelObserver {
public:
class PrivateListener
{
public:
virtual void OnClose(DataProducer* dataProducer) = 0;
};

/* Public Listener API */
class Listener
{
public:
virtual void OnTransportClose(DataProducer* dataProducer) {};
virtual void OnBufferedAmountChange(DataProducer* dataProducer, uint64_t sent_data_size) {};
// virtual void OnOpen(DataProducer* dataProducer) = 0;
// virtual void OnError(DataProducer* dataProducer) = 0;
// virtual void OnClose(DataProducer* dataProducer) = 0;
};


private:
PrivateListener* privateListener;
Listener* listener;
std::string id;
// std::string _localId;
rtc::scoped_refptr<webrtc::DataChannelInterface> webrtcDataChannel;
bool closed;
nlohmann::json sctpStreamParameters;
nlohmann::json appData;
void TransportClosed();

friend SendTransport;

public:
DataProducer(
DataProducer::PrivateListener* privateListener,
DataProducer::Listener* listener,
const std::string& id,
// const std::string& localId,
rtc::scoped_refptr<webrtc::DataChannelInterface> webrtcDataChannel,
const nlohmann::json& sctpStreamParameters,
const nlohmann::json& appData);
const std::string& GetId() const;
std::string GetLocalId() const;
// const std::string& GetLocalId() const;
bool IsClosed() const;
const nlohmann::json& GetSctpStreamParameters() const;
webrtc::DataChannelInterface::DataState GetReadyState(); // I would call this GetDataState()
std::string GetLabel();
std::string GetProtocol();
uint64_t GetBufferedAmount() const;
uint64_t BufferedAmountLowThreshold;
const nlohmann::json& GetAppData() const;
void Close();
void Send(const webrtc::DataBuffer& buffer);

// from DataChannelObserver
public:
void OnStateChange() override;
// A data buffer was successfully received.
void OnMessage(const webrtc::DataBuffer& buffer) override;
// The data channel's buffered_amount has changed.
void OnBufferedAmountChange(uint64_t sent_data_size) override;
};
} // namespace mediasoupclient

#endif
27 changes: 27 additions & 0 deletions include/Handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#include <api/rtp_receiver_interface.h> // webrtc::RtpReceiverInterface
#include <api/rtp_sender_interface.h> // webrtc::RtpSenderInterface
#include <api/rtp_transceiver_interface.h> // webrtc::RtpTransceiverInterface
#include <third_party/abseil-cpp/absl/types/optional.h>

#include <string>
#include <unordered_map>

Expand Down Expand Up @@ -65,6 +67,8 @@ namespace mediasoupclient
std::unordered_map<std::string, webrtc::RtpTransceiverInterface*> mapMidTransceiver;
// PeerConnection instance.
std::unique_ptr<PeerConnection> pc;
bool hasDataChannelMediaSection = false;
uint32_t nextSendSctpStreamId = 0;
};

class SendHandler : public Handler
Expand All @@ -77,6 +81,15 @@ namespace mediasoupclient
nlohmann::json rtpParameters;
};

struct SendDataChannel
{
const std::string localId;
const rtc::scoped_refptr<webrtc::DataChannelInterface> dataChannel;
const nlohmann::json sctpStreamParameters;
SendDataChannel(std::string localId, rtc::scoped_refptr<webrtc::DataChannelInterface> dataChannel, nlohmann::json sctpStreamParameters):
localId(localId), dataChannel(dataChannel), sctpStreamParameters(sctpStreamParameters){}
};

public:
SendHandler(
Handler::PrivateListener* privateListener,
Expand All @@ -94,10 +107,12 @@ namespace mediasoupclient
std::vector<webrtc::RtpEncodingParameters>* encodings,
const nlohmann::json* codecOptions);
void StopSending(const std::string& localId);
void StopSendingData(const std::string& localId);
void ReplaceTrack(const std::string& localId, webrtc::MediaStreamTrackInterface* track);
void SetMaxSpatialLayer(const std::string& localId, uint8_t spatialLayer);
nlohmann::json GetSenderStats(const std::string& localId);
void RestartIce(const nlohmann::json& iceParameters) override;
SendDataChannel CreateSendDataChannel(const std::string& label, webrtc::DataChannelInit dataChannelInit);

private:
// Generic sending RTP parameters for audio and video.
Expand All @@ -117,6 +132,16 @@ namespace mediasoupclient
webrtc::MediaStreamTrackInterface* track{ nullptr };
};

struct RecvDataChannel
{
const std::string localId;
const rtc::scoped_refptr<webrtc::DataChannelInterface> webrtcDataChannel;
const nlohmann::json sctpStreamParameters;
RecvDataChannel(std::string localId,
rtc::scoped_refptr<webrtc::DataChannelInterface> webrtcDataChannel,
nlohmann::json sctpStreamParameters): localId(localId), webrtcDataChannel(webrtcDataChannel), sctpStreamParameters(sctpStreamParameters){}
};

public:
RecvHandler(
Handler::PrivateListener* privateListener,
Expand All @@ -128,8 +153,10 @@ namespace mediasoupclient

RecvData Receive(const std::string& id, const std::string& kind, const nlohmann::json* rtpParameters);
void StopReceiving(const std::string& localId);
void StopReceivingData(const std::string& localId);
nlohmann::json GetReceiverStats(const std::string& localId);
void RestartIce(const nlohmann::json& iceParameters) override;
RecvDataChannel CreateRecvDataChannel(const std::string& label, webrtc::DataChannelInit dataChannelInit);
};
} // namespace mediasoupclient

Expand Down
1 change: 1 addition & 0 deletions include/PeerConnection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ namespace mediasoupclient
nlohmann::json GetStats();
nlohmann::json GetStats(rtc::scoped_refptr<webrtc::RtpSenderInterface> selector);
nlohmann::json GetStats(rtc::scoped_refptr<webrtc::RtpReceiverInterface> selector);
rtc::scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(const std::string& label, const webrtc::DataChannelInit* config);

private:
// Signaling and worker threads.
Expand Down
2 changes: 1 addition & 1 deletion include/Producer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ namespace mediasoupclient
private:
void TransportClosed();

/* SendTransport will create instances and call private member TransporClosed */
/* SendTransport will create instances and call private member TransportClosed */
friend SendTransport;

private:
Expand Down
Loading