Implementation for user data sending

This commit is contained in:
dijunkun
2023-09-13 17:31:02 +08:00
parent e2533d18e4
commit a0abb7455c
27 changed files with 513 additions and 233 deletions

View File

@@ -40,6 +40,10 @@ IceTransmission::~IceTransmission() {
rtp_video_receiver_->Stop();
}
if (rtp_data_sender_) {
rtp_data_sender_->Stop();
}
if (rtp_payload_) {
delete rtp_payload_;
rtp_payload_ = nullptr;
@@ -47,9 +51,11 @@ IceTransmission::~IceTransmission() {
}
int IceTransmission::InitIceTransmission(std::string &ip, int port) {
rtp_codec_ = std::make_unique<RtpCodec>(RtpPacket::PAYLOAD_TYPE::H264);
video_rtp_codec_ = std::make_unique<RtpCodec>(RtpPacket::PAYLOAD_TYPE::H264);
data_rtp_codec_ = std::make_unique<RtpCodec>(RtpPacket::PAYLOAD_TYPE::DATA);
rtp_video_receiver_ = std::make_unique<RtpVideoReceiver>();
rtp_video_receiver_->SetUdpSender(
rtp_video_receiver_->SetSendDataFunc(
[this](const char *data, size_t size) -> int {
if (!ice_agent_) {
LOG_ERROR("ice_agent_ is nullptr");
@@ -69,17 +75,31 @@ int IceTransmission::InitIceTransmission(std::string &ip, int port) {
rtp_video_receiver_->Start();
rtp_video_sender_ = std::make_unique<RtpVideoSender>();
rtp_video_sender_->SetUdpSender([this](const char *data, size_t size) -> int {
if (!ice_agent_) {
LOG_ERROR("ice_agent_ is nullptr");
return -1;
}
rtp_video_sender_->SetSendDataFunc(
[this](const char *data, size_t size) -> int {
if (!ice_agent_) {
LOG_ERROR("ice_agent_ is nullptr");
return -1;
}
return ice_agent_->Send(data, size);
});
return ice_agent_->Send(data, size);
});
rtp_video_sender_->Start();
rtp_data_sender_ = std::make_unique<RtpDataSender>();
rtp_data_sender_->SetSendDataFunc(
[this](const char *data, size_t size) -> int {
if (!ice_agent_) {
LOG_ERROR("ice_agent_ is nullptr");
return -1;
}
return ice_agent_->Send(data, size);
});
rtp_data_sender_->Start();
ice_agent_ = std::make_unique<IceAgent>(ip, port);
ice_agent_->CreateIceAgent(
@@ -220,15 +240,25 @@ int IceTransmission::SendAnswer() {
return 0;
}
int IceTransmission::SendData(const char *data, size_t size) {
int IceTransmission::SendData(DATA_TYPE type, const char *data, size_t size) {
if (JUICE_STATE_COMPLETED == state_) {
std::vector<RtpPacket> packets;
if (rtp_codec_) {
rtp_codec_->Encode((uint8_t *)data, size, packets);
}
if (rtp_video_sender_) {
rtp_video_sender_->Enqueue(packets);
if (DATA_TYPE::VIDEO == type) {
if (rtp_video_sender_) {
if (video_rtp_codec_) {
video_rtp_codec_->Encode((uint8_t *)data, size, packets);
}
rtp_video_sender_->Enqueue(packets);
}
} else if (DATA_TYPE::AUDIO == type) {
} else if (DATA_TYPE::DATA == type) {
if (rtp_data_sender_) {
if (data_rtp_codec_) {
data_rtp_codec_->Encode((uint8_t *)data, size, packets);
}
rtp_data_sender_->Enqueue(packets);
}
}
}
return 0;

View File

@@ -7,12 +7,17 @@
#include "ice_agent.h"
#include "ringbuffer.h"
#include "rtp_codec.h"
#include "rtp_data_receiver.h"
#include "rtp_data_sender.h"
#include "rtp_packet.h"
#include "rtp_video_receiver.h"
#include "rtp_video_sender.h"
#include "ws_transmission.h"
class IceTransmission {
public:
typedef enum { VIDEO = 96, AUDIO = 97, DATA = 127 } DATA_TYPE;
public:
IceTransmission(
bool offer_peer, std::string &transmission_id, std::string &user_id,
@@ -21,7 +26,6 @@ class IceTransmission {
std::function<void(const char *, size_t, const char *, size_t)>
on_receive_ice_msg,
std::function<void(std::string)> on_ice_status_change);
~IceTransmission();
public:
@@ -33,7 +37,7 @@ class IceTransmission {
int SetTransmissionId(const std::string &transmission_id);
int SendData(const char *data, size_t size);
int SendData(DATA_TYPE type, const char *data, size_t size);
public:
int GatherCandidates();
@@ -77,9 +81,13 @@ class IceTransmission {
juice_state_t state_ = JUICE_STATE_DISCONNECTED;
private:
std::unique_ptr<RtpCodec> rtp_codec_ = nullptr;
std::unique_ptr<RtpCodec> video_rtp_codec_ = nullptr;
std::unique_ptr<RtpCodec> audio_rtp_codec_ = nullptr;
std::unique_ptr<RtpCodec> data_rtp_codec_ = nullptr;
std::unique_ptr<RtpVideoReceiver> rtp_video_receiver_ = nullptr;
std::unique_ptr<RtpVideoSender> rtp_video_sender_ = nullptr;
std::unique_ptr<RtpDataReceiver> rtp_data_receiver_ = nullptr;
std::unique_ptr<RtpDataSender> rtp_data_sender_ = nullptr;
uint8_t *rtp_payload_ = nullptr;
RtpPacket pop_packet_;
bool start_send_packet_ = false;