mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
[fix] audio and data rtp packets do not be sent by pacer module
This commit is contained in:
@@ -49,7 +49,8 @@ int AudioChannelSend::SendAudio(char *data, size_t size) {
|
|||||||
if (rtp_audio_sender_ && rtp_packetizer_) {
|
if (rtp_audio_sender_ && rtp_packetizer_) {
|
||||||
std::vector<std::unique_ptr<RtpPacket>> rtp_packets =
|
std::vector<std::unique_ptr<RtpPacket>> rtp_packets =
|
||||||
rtp_packetizer_->Build((uint8_t *)data, (uint32_t)size, 0, true);
|
rtp_packetizer_->Build((uint8_t *)data, (uint32_t)size, 0, true);
|
||||||
packet_sender_->EnqueueRtpPacket(rtp_packets, 0);
|
// packet_sender_->EnqueueRtpPacket(rtp_packets, 0);
|
||||||
|
rtp_audio_sender_->Enqueue(rtp_packets);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ int DataChannelSend::SendData(const char *data, size_t size) {
|
|||||||
if (rtp_data_sender_ && rtp_packetizer_) {
|
if (rtp_data_sender_ && rtp_packetizer_) {
|
||||||
std::vector<std::unique_ptr<RtpPacket>> rtp_packets =
|
std::vector<std::unique_ptr<RtpPacket>> rtp_packets =
|
||||||
rtp_packetizer_->Build((uint8_t *)data, (uint32_t)size, 0, true);
|
rtp_packetizer_->Build((uint8_t *)data, (uint32_t)size, 0, true);
|
||||||
packet_sender_->EnqueueRtpPacket(rtp_packets, 0);
|
// packet_sender_->EnqueueRtpPacket(rtp_packets, 0);
|
||||||
|
rtp_data_sender_->Enqueue(rtp_packets);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ RtpAudioSender::~RtpAudioSender() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RtpAudioSender::Enqueue(
|
void RtpAudioSender::Enqueue(
|
||||||
std::vector<std::unique_ptr<RtpPacket>> rtp_packets) {
|
std::vector<std::unique_ptr<RtpPacket>>& rtp_packets) {
|
||||||
if (!rtp_statistics_) {
|
if (!rtp_statistics_) {
|
||||||
rtp_statistics_ = std::make_unique<RtpStatistics>();
|
rtp_statistics_ = std::make_unique<RtpStatistics>();
|
||||||
rtp_statistics_->Start();
|
rtp_statistics_->Start();
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class RtpAudioSender : public ThreadBase {
|
|||||||
virtual ~RtpAudioSender();
|
virtual ~RtpAudioSender();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Enqueue(std::vector<std::unique_ptr<RtpPacket>> rtp_packets);
|
void Enqueue(std::vector<std::unique_ptr<RtpPacket>> &rtp_packets);
|
||||||
void SetSendDataFunc(std::function<int(const char *, size_t)> data_send_func);
|
void SetSendDataFunc(std::function<int(const char *, size_t)> data_send_func);
|
||||||
uint32_t GetSsrc() { return ssrc_; }
|
uint32_t GetSsrc() { return ssrc_; }
|
||||||
void OnReceiverReport(const ReceiverReport &receiver_report) {}
|
void OnReceiverReport(const ReceiverReport &receiver_report) {}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ RtpDataSender::~RtpDataSender() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RtpDataSender::Enqueue(
|
void RtpDataSender::Enqueue(
|
||||||
std::vector<std::unique_ptr<RtpPacket>> rtp_packets) {
|
std::vector<std::unique_ptr<RtpPacket>>& rtp_packets) {
|
||||||
if (!rtp_statistics_) {
|
if (!rtp_statistics_) {
|
||||||
rtp_statistics_ = std::make_unique<RtpStatistics>();
|
rtp_statistics_ = std::make_unique<RtpStatistics>();
|
||||||
rtp_statistics_->Start();
|
rtp_statistics_->Start();
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class RtpDataSender : public ThreadBase {
|
|||||||
virtual ~RtpDataSender();
|
virtual ~RtpDataSender();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Enqueue(std::vector<std::unique_ptr<RtpPacket>> rtp_packets);
|
void Enqueue(std::vector<std::unique_ptr<RtpPacket>> &rtp_packets);
|
||||||
void SetSendDataFunc(std::function<int(const char *, size_t)> data_send_func);
|
void SetSendDataFunc(std::function<int(const char *, size_t)> data_send_func);
|
||||||
uint32_t GetSsrc() { return ssrc_; }
|
uint32_t GetSsrc() { return ssrc_; }
|
||||||
void OnReceiverReport(const ReceiverReport &receiver_report) {}
|
void OnReceiverReport(const ReceiverReport &receiver_report) {}
|
||||||
|
|||||||
@@ -398,7 +398,6 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedFuaEndReceived(
|
|||||||
if (padding_sequence_numbers_.find(seq) ==
|
if (padding_sequence_numbers_.find(seq) ==
|
||||||
padding_sequence_numbers_.end()) {
|
padding_sequence_numbers_.end()) {
|
||||||
missing_sequence_numbers_[timestamp].insert(seq);
|
missing_sequence_numbers_[timestamp].insert(seq);
|
||||||
LOG_WARN("missing {}", seq);
|
|
||||||
}
|
}
|
||||||
} else if (it->second.FuAStart()) {
|
} else if (it->second.FuAStart()) {
|
||||||
start_seq = seq;
|
start_seq = seq;
|
||||||
@@ -418,53 +417,7 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedFuaEndReceived(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t complete_frame_size = 0;
|
return PopCompleteFrame(start_seq, end_seq, timestamp);
|
||||||
int frame_fragment_count = 0;
|
|
||||||
|
|
||||||
for (uint16_t seq = start_seq; seq <= end_seq; ++seq) {
|
|
||||||
if (padding_sequence_numbers_.find(seq) !=
|
|
||||||
padding_sequence_numbers_.end()) {
|
|
||||||
padding_sequence_numbers_.erase(seq);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (incomplete_h264_frame_list_.find(seq) !=
|
|
||||||
incomplete_h264_frame_list_.end()) {
|
|
||||||
complete_frame_size += incomplete_h264_frame_list_[seq].PayloadSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nv12_data_) {
|
|
||||||
nv12_data_ = new uint8_t[NV12_BUFFER_SIZE];
|
|
||||||
} else if (complete_frame_size > NV12_BUFFER_SIZE) {
|
|
||||||
delete[] nv12_data_;
|
|
||||||
nv12_data_ = new uint8_t[complete_frame_size];
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t* dest = nv12_data_;
|
|
||||||
for (uint16_t seq = start_seq; seq <= end_seq; ++seq) {
|
|
||||||
if (incomplete_h264_frame_list_.find(seq) !=
|
|
||||||
incomplete_h264_frame_list_.end()) {
|
|
||||||
size_t payload_size = incomplete_h264_frame_list_[seq].PayloadSize();
|
|
||||||
memcpy(dest, incomplete_h264_frame_list_[seq].Payload(), payload_size);
|
|
||||||
dest += payload_size;
|
|
||||||
incomplete_h264_frame_list_.erase(seq);
|
|
||||||
frame_fragment_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ReceivedFrame received_frame(nv12_data_, complete_frame_size);
|
|
||||||
received_frame.SetReceivedTimestamp(clock_->CurrentTime().us());
|
|
||||||
received_frame.SetCapturedTimestamp(
|
|
||||||
(static_cast<int64_t>(timestamp) / rtp::kMsToRtpTimestamp -
|
|
||||||
delta_ntp_internal_ms_) *
|
|
||||||
1000);
|
|
||||||
|
|
||||||
fua_end_sequence_numbers_.erase(timestamp);
|
|
||||||
missing_sequence_numbers_wait_time_.erase(timestamp);
|
|
||||||
missing_sequence_numbers_.erase(timestamp);
|
|
||||||
compelete_video_frame_queue_.push(received_frame);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived(
|
bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived(
|
||||||
@@ -511,6 +464,11 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return PopCompleteFrame(start_seq, end_seq, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RtpVideoReceiver::PopCompleteFrame(uint16_t start_seq, uint16_t end_seq,
|
||||||
|
uint64_t timestamp) {
|
||||||
size_t complete_frame_size = 0;
|
size_t complete_frame_size = 0;
|
||||||
int frame_fragment_count = 0;
|
int frame_fragment_count = 0;
|
||||||
|
|
||||||
@@ -552,8 +510,9 @@ bool RtpVideoReceiver::CheckIsH264FrameCompletedMissSeqReceived(
|
|||||||
delta_ntp_internal_ms_) *
|
delta_ntp_internal_ms_) *
|
||||||
1000);
|
1000);
|
||||||
|
|
||||||
missing_sequence_numbers_.erase(timestamp);
|
fua_end_sequence_numbers_.erase(timestamp);
|
||||||
missing_sequence_numbers_wait_time_.erase(timestamp);
|
missing_sequence_numbers_wait_time_.erase(timestamp);
|
||||||
|
missing_sequence_numbers_.erase(timestamp);
|
||||||
compelete_video_frame_queue_.push(received_frame);
|
compelete_video_frame_queue_.push(received_frame);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ class RtpVideoReceiver : public ThreadBase,
|
|||||||
void ProcessH264RtpPacket(RtpPacketH264& rtp_packet_h264);
|
void ProcessH264RtpPacket(RtpPacketH264& rtp_packet_h264);
|
||||||
bool CheckIsH264FrameCompletedFuaEndReceived(RtpPacketH264& rtp_packet_h264);
|
bool CheckIsH264FrameCompletedFuaEndReceived(RtpPacketH264& rtp_packet_h264);
|
||||||
bool CheckIsH264FrameCompletedMissSeqReceived(RtpPacketH264& rtp_packet_h264);
|
bool CheckIsH264FrameCompletedMissSeqReceived(RtpPacketH264& rtp_packet_h264);
|
||||||
|
bool PopCompleteFrame(uint16_t start_seq, uint16_t end_seq,
|
||||||
|
uint64_t timestamp);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool CheckIsTimeSendRR();
|
bool CheckIsTimeSendRR();
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class PacketSenderImp : public PacketSender,
|
|||||||
ssrc_seq_[packet->Ssrc()] = 1;
|
ssrc_seq_[packet->Ssrc()] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->packet_type() !=
|
if (packet->packet_type().value() !=
|
||||||
webrtc::RtpPacketMediaType::kRetransmission) {
|
webrtc::RtpPacketMediaType::kRetransmission) {
|
||||||
packet->UpdateSequenceNumber(ssrc_seq_[packet->Ssrc()]++);
|
packet->UpdateSequenceNumber(ssrc_seq_[packet->Ssrc()]++);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user