Distinguish between missing packet and send failure.
This CL introduces three-value enum, in order to be able to distinguish between send success, send failure, and invalid states such as missing packet or invalid ssrc. The behavior is unchanged in this CL, a follow-up will change the pacer to not consume media budget on invalid states. Bug: webrtc:8052,webrtc:8975 Change-Id: I1c9e2226f995356daa538d3d3cf44945f35e0133 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/135165 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27923}
This commit is contained in:
@ -407,11 +407,12 @@ bool ModuleRtpRtcpImpl::OnSendingRtpFrame(uint32_t timestamp,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ModuleRtpRtcpImpl::TimeToSendPacket(uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info) {
|
||||
RtpPacketSendResult ModuleRtpRtcpImpl::TimeToSendPacket(
|
||||
uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info) {
|
||||
return rtp_sender_->TimeToSendPacket(ssrc, sequence_number, capture_time_ms,
|
||||
retransmission, pacing_info);
|
||||
}
|
||||
|
||||
@ -133,11 +133,12 @@ class ModuleRtpRtcpImpl : public RtpRtcp, public RTCPReceiver::ModuleRtpRtcp {
|
||||
int payload_type,
|
||||
bool force_sender_report) override;
|
||||
|
||||
bool TimeToSendPacket(uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info) override;
|
||||
RtpPacketSendResult TimeToSendPacket(
|
||||
uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info) override;
|
||||
|
||||
// Returns the number of padding bytes actually sent, which can be more or
|
||||
// less than |bytes|.
|
||||
|
||||
@ -538,13 +538,15 @@ void RTPSender::OnReceivedNack(
|
||||
}
|
||||
|
||||
// Called from pacer when we can send the packet.
|
||||
bool RTPSender::TimeToSendPacket(uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info) {
|
||||
if (!SendingMedia())
|
||||
return true;
|
||||
RtpPacketSendResult RTPSender::TimeToSendPacket(
|
||||
uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info) {
|
||||
if (!SendingMedia()) {
|
||||
return RtpPacketSendResult::kPacketNotFound;
|
||||
}
|
||||
|
||||
std::unique_ptr<RtpPacketToSend> packet;
|
||||
if (ssrc == SSRC()) {
|
||||
@ -554,14 +556,16 @@ bool RTPSender::TimeToSendPacket(uint32_t ssrc,
|
||||
}
|
||||
|
||||
if (!packet) {
|
||||
// Packet cannot be found or was resend too recently.
|
||||
return true;
|
||||
// Packet cannot be found or was resent too recently.
|
||||
return RtpPacketSendResult::kPacketNotFound;
|
||||
}
|
||||
|
||||
return PrepareAndSendPacket(
|
||||
std::move(packet),
|
||||
retransmission && (RtxStatus() & kRtxRetransmitted) > 0, retransmission,
|
||||
pacing_info);
|
||||
std::move(packet),
|
||||
retransmission && (RtxStatus() & kRtxRetransmitted) > 0,
|
||||
retransmission, pacing_info)
|
||||
? RtpPacketSendResult::kSuccess
|
||||
: RtpPacketSendResult::kTransportUnavailable;
|
||||
}
|
||||
|
||||
bool RTPSender::PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet,
|
||||
|
||||
@ -103,11 +103,13 @@ class RTPSender : public AcknowledgedPacketsObserver {
|
||||
bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) const;
|
||||
int32_t DeregisterRtpHeaderExtension(RTPExtensionType type);
|
||||
|
||||
bool TimeToSendPacket(uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info);
|
||||
// Returns an RtpPacketSendResult indicating succes, failure or invalid
|
||||
// status such as on incorrect sequence number.
|
||||
RtpPacketSendResult TimeToSendPacket(uint32_t ssrc,
|
||||
uint16_t sequence_number,
|
||||
int64_t capture_time_ms,
|
||||
bool retransmission,
|
||||
const PacedPacketInfo& pacing_info);
|
||||
size_t TimeToSendPadding(size_t bytes, const PacedPacketInfo& pacing_info);
|
||||
|
||||
// NACK.
|
||||
|
||||
@ -1180,12 +1180,14 @@ TEST_P(RtpSenderTest, SendFlexfecPackets) {
|
||||
EXPECT_CALL(mock_rtc_event_log_,
|
||||
LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
|
||||
.Times(2);
|
||||
EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_EQ(RtpPacketSendResult::kSuccess,
|
||||
rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_EQ(RtpPacketSendResult::kSuccess,
|
||||
rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
ASSERT_EQ(2, transport_.packets_sent());
|
||||
const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
|
||||
EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
|
||||
@ -1258,9 +1260,10 @@ TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) {
|
||||
EXPECT_CALL(mock_rtc_event_log_,
|
||||
LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
|
||||
.Times(1);
|
||||
EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_EQ(RtpPacketSendResult::kSuccess,
|
||||
rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
ASSERT_EQ(1, transport_.packets_sent());
|
||||
const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
|
||||
EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
|
||||
@ -1284,12 +1287,14 @@ TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) {
|
||||
EXPECT_CALL(mock_rtc_event_log_,
|
||||
LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
|
||||
.Times(2);
|
||||
EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum + 1,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_EQ(RtpPacketSendResult::kSuccess,
|
||||
rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum + 1,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
EXPECT_EQ(RtpPacketSendResult::kSuccess,
|
||||
rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
|
||||
fake_clock_.TimeInMilliseconds(),
|
||||
false, PacedPacketInfo()));
|
||||
ASSERT_EQ(3, transport_.packets_sent());
|
||||
const RtpPacketReceived& media_packet2 = transport_.sent_packets_[1];
|
||||
EXPECT_EQ(kMediaPayloadType, media_packet2.PayloadType());
|
||||
|
||||
Reference in New Issue
Block a user