Allows FEC generation after pacer step.
Split out from https://webrtc-review.googlesource.com/c/src/+/173708 This CL enables FEC packets to be generated as media packets are sent, rather than generated, i.e. media packets are inserted into the fec generator after the pacing stage rather than at packetization time. This may have some small impact of performance. FEC packets are typically only generated when a new packet with a marker bit is added, which means FEC packets protecting a frame will now be sent after all of the media packets, rather than (potentially) interleaved with them. Therefore this feature is currently behind a flag so we can examine the impact. Once we are comfortable with the behavior we'll make it default and remove the old code. Note that this change does not include the "protect all header extensions" part of the original CL - that will be a follow-up. Bug: webrtc:11340 Change-Id: I3fe139c5d53968579b75b91e2612075451ff0f5d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/177760 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31558}
This commit is contained in:
@ -97,6 +97,10 @@ class MockPacingControllerCallback : public PacingController::PacketSender {
|
||||
int64_t capture_timestamp,
|
||||
bool retransmission,
|
||||
bool padding));
|
||||
MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
|
||||
FetchFec,
|
||||
(),
|
||||
(override));
|
||||
MOCK_METHOD(size_t, SendPadding, (size_t target_size));
|
||||
};
|
||||
|
||||
@ -108,6 +112,11 @@ class MockPacketSender : public PacingController::PacketSender {
|
||||
(std::unique_ptr<RtpPacketToSend> packet,
|
||||
const PacedPacketInfo& cluster_info),
|
||||
(override));
|
||||
MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
|
||||
FetchFec,
|
||||
(),
|
||||
(override));
|
||||
|
||||
MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
|
||||
GeneratePadding,
|
||||
(DataSize target_size),
|
||||
@ -125,6 +134,10 @@ class PacingControllerPadding : public PacingController::PacketSender {
|
||||
total_bytes_sent_ += packet->payload_size();
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
|
||||
DataSize target_size) override {
|
||||
size_t num_packets =
|
||||
@ -158,6 +171,10 @@ class PacingControllerProbing : public PacingController::PacketSender {
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
|
||||
DataSize target_size) override {
|
||||
// From RTPSender:
|
||||
@ -299,7 +316,7 @@ class PacingControllerTest
|
||||
}
|
||||
|
||||
SimulatedClock clock_;
|
||||
MockPacingControllerCallback callback_;
|
||||
::testing::NiceMock<MockPacingControllerCallback> callback_;
|
||||
std::unique_ptr<PacingController> pacer_;
|
||||
};
|
||||
|
||||
@ -2029,6 +2046,38 @@ TEST_P(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
|
||||
AdvanceTimeAndProcess();
|
||||
}
|
||||
|
||||
TEST_P(PacingControllerTest, SendsDeferredFecPackets) {
|
||||
ScopedFieldTrials trial("WebRTC-DeferredFecGeneration/Enabled/");
|
||||
SetUp();
|
||||
|
||||
const uint32_t kSsrc = 12345;
|
||||
const uint32_t kFlexSsrc = 54321;
|
||||
uint16_t sequence_number = 1234;
|
||||
uint16_t flexfec_sequence_number = 4321;
|
||||
const size_t kPacketSize = 123;
|
||||
|
||||
// Set pacing rate to 1000 packet/s, no padding.
|
||||
pacer_->SetPacingRates(
|
||||
DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
|
||||
DataRate::Zero());
|
||||
|
||||
int64_t now = clock_.TimeInMilliseconds();
|
||||
Send(RtpPacketMediaType::kVideo, kSsrc, sequence_number, now, kPacketSize);
|
||||
EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
|
||||
EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
|
||||
EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
|
||||
false, false));
|
||||
EXPECT_CALL(callback_, FetchFec);
|
||||
std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
|
||||
fec_packets.push_back(
|
||||
BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
|
||||
flexfec_sequence_number, now, kPacketSize));
|
||||
return fec_packets;
|
||||
});
|
||||
AdvanceTimeAndProcess();
|
||||
AdvanceTimeAndProcess();
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
WithAndWithoutIntervalBudget,
|
||||
PacingControllerTest,
|
||||
|
||||
Reference in New Issue
Block a user