Simplify public interface of ProducerFec.

- Change some member functions to be private. These were only
  called by other private member functions.
- Replace DeleteMediaPackets() with direct calls to
  media_packets_.clear()
- Rename GetFecPacketsAsRed to GetUlpfecPacketsAsRed.

No functional changes are intended by this CL.

BUG=webrtc:5654
R=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/2305793003 .

Cr-Commit-Position: refs/heads/master@{#14491}
This commit is contained in:
Rasmus Brandt 2016-10-04 10:57:36 +02:00
parent cf33d9c9d3
commit c07ebb30c5
5 changed files with 45 additions and 40 deletions

View File

@ -21,6 +21,8 @@
namespace webrtc {
namespace {
constexpr size_t kRedForFecHeaderLength = 1;
// This controls the maximum amount of excess overhead (actual - target)
@ -47,6 +49,8 @@ constexpr uint8_t kHighProtectionThreshold = 80;
// |kMinMediaPackets| + 1 packets are sent to the FEC code.
constexpr float kMinMediaPacketsAdaptationThreshold = 2.0f;
} // namespace
RedPacket::RedPacket(size_t length)
: data_(new uint8_t[length]),
length_(length),
@ -101,9 +105,7 @@ ProducerFec::ProducerFec()
memset(&new_params_, 0, sizeof(new_params_));
}
ProducerFec::~ProducerFec() {
DeleteMediaPackets();
}
ProducerFec::~ProducerFec() = default;
std::unique_ptr<RedPacket> ProducerFec::BuildRedPacket(
const uint8_t* data_buffer,
@ -179,8 +181,7 @@ int ProducerFec::AddRtpPacketAndGenerateFec(const uint8_t* data_buffer,
num_important_packets_, kUseUnequalProtection,
params_.fec_mask_type, &generated_fec_packets_);
if (generated_fec_packets_.empty()) {
num_protected_frames_ = 0;
DeleteMediaPackets();
ResetState();
}
return ret;
}
@ -216,7 +217,7 @@ size_t ProducerFec::MaxPacketOverhead() const {
return fec_->MaxPacketOverhead();
}
std::vector<std::unique_ptr<RedPacket>> ProducerFec::GetFecPacketsAsRed(
std::vector<std::unique_ptr<RedPacket>> ProducerFec::GetUlpfecPacketsAsRed(
int red_payload_type,
int ulpfec_payload_type,
uint16_t first_seq_num,
@ -240,18 +241,13 @@ std::vector<std::unique_ptr<RedPacket>> ProducerFec::GetFecPacketsAsRed(
red_packet->AssignPayload(fec_packet->data, fec_packet->length);
red_packets.push_back(std::move(red_packet));
}
// Reset state.
DeleteMediaPackets();
generated_fec_packets_.clear();
num_protected_frames_ = 0;
ResetState();
return red_packets;
}
int ProducerFec::Overhead() const {
// Overhead is defined as relative to the number of media packets, and not
// relative to total number of packets. This definition is inherited from the
// protection factor produced by video_coding module and how the FEC
// generation is implemented.
RTC_DCHECK(!media_packets_.empty());
int num_fec_packets =
fec_->NumFecPackets(media_packets_.size(), params_.fec_rate);
@ -259,8 +255,10 @@ int ProducerFec::Overhead() const {
return (num_fec_packets << 8) / media_packets_.size();
}
void ProducerFec::DeleteMediaPackets() {
void ProducerFec::ResetState() {
media_packets_.clear();
generated_fec_packets_.clear();
num_protected_frames_ = 0;
}
} // namespace webrtc

View File

@ -59,6 +59,28 @@ class ProducerFec {
size_t payload_length,
size_t rtp_header_length);
// Returns true if there are generated FEC packets available.
bool FecAvailable() const;
size_t NumAvailableFecPackets() const;
// Returns the overhead, per packet, for FEC (and possibly RED).
size_t MaxPacketOverhead() const;
// Returns generated FEC packets with RED headers added.
std::vector<std::unique_ptr<RedPacket>> GetUlpfecPacketsAsRed(
int red_payload_type,
int ulpfec_payload_type,
uint16_t first_seq_num,
size_t rtp_header_length);
private:
// Overhead is defined as relative to the number of media packets, and not
// relative to total number of packets. This definition is inherited from the
// protection factor produced by video_coding module and how the FEC
// generation is implemented.
int Overhead() const;
// Returns true if the excess overhead (actual - target) for the FEC is below
// the amount |kMaxExcessOverhead|. This effects the lower protection level
// cases and low number of media packets/frame. The target overhead is given
@ -72,23 +94,8 @@ class ProducerFec {
// (e.g. (2k,2m) vs (k,m)) are generally more effective at recovering losses.
bool MinimumMediaPacketsReached() const;
// Returns true if there are generated FEC packets available.
bool FecAvailable() const;
void ResetState();
size_t NumAvailableFecPackets() const;
size_t MaxPacketOverhead() const;
// Returns generated FEC packets with RED headers added.
std::vector<std::unique_ptr<RedPacket>> GetFecPacketsAsRed(
int red_payload_type,
int ulpfec_payload_type,
uint16_t first_seq_num,
size_t rtp_header_length);
private:
void DeleteMediaPackets();
int Overhead() const;
std::unique_ptr<ForwardErrorCorrection> fec_;
ForwardErrorCorrection::PacketList media_packets_;
std::list<ForwardErrorCorrection::Packet*> generated_fec_packets_;

View File

@ -94,8 +94,8 @@ TEST_F(ProducerFecTest, NoEmptyFecWithSeqNumGaps) {
size_t num_fec_packets = producer_.NumAvailableFecPackets();
if (num_fec_packets > 0) {
std::vector<std::unique_ptr<RedPacket>> fec_packets =
producer_.GetFecPacketsAsRed(kRedPayloadType, kFecPayloadType, 100,
p.header_size);
producer_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType, 100,
p.header_size);
EXPECT_EQ(num_fec_packets, fec_packets.size());
}
}
@ -123,8 +123,8 @@ TEST_F(ProducerFecTest, OneFrameFec) {
EXPECT_TRUE(producer_.FecAvailable());
uint16_t seq_num = packet_generator_.NextPacketSeqNum();
std::vector<std::unique_ptr<RedPacket>> red_packets =
producer_.GetFecPacketsAsRed(kRedPayloadType, kFecPayloadType, seq_num,
kRtpHeaderSize);
producer_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType, seq_num,
kRtpHeaderSize);
EXPECT_FALSE(producer_.FecAvailable());
ASSERT_EQ(1u, red_packets.size());
VerifyHeader(seq_num, last_timestamp, kRedPayloadType, kFecPayloadType,
@ -158,8 +158,8 @@ TEST_F(ProducerFecTest, TwoFrameFec) {
EXPECT_TRUE(producer_.FecAvailable());
uint16_t seq_num = packet_generator_.NextPacketSeqNum();
std::vector<std::unique_ptr<RedPacket>> red_packets =
producer_.GetFecPacketsAsRed(kRedPayloadType, kFecPayloadType, seq_num,
kRtpHeaderSize);
producer_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType, seq_num,
kRtpHeaderSize);
EXPECT_FALSE(producer_.FecAvailable());
ASSERT_EQ(1u, red_packets.size());
VerifyHeader(seq_num, last_timestamp, kRedPayloadType, kFecPayloadType,

View File

@ -129,7 +129,7 @@ void RTPSenderVideo::SendVideoPacketAsRed(
if (num_fec_packets > 0) {
uint16_t first_fec_sequence_number =
rtp_sender_->AllocateSequenceNumber(num_fec_packets);
fec_packets = producer_fec_.GetFecPacketsAsRed(
fec_packets = producer_fec_.GetUlpfecPacketsAsRed(
red_payload_type_, fec_payload_type_, first_fec_sequence_number,
media_packet->headers_size());
RTC_DCHECK_EQ(num_fec_packets, fec_packets.size());

View File

@ -53,8 +53,8 @@ void FuzzOneInput(const uint8_t* data, size_t size) {
const size_t num_fec_packets = producer.NumAvailableFecPackets();
if (num_fec_packets > 0) {
std::vector<std::unique_ptr<RedPacket>> fec_packets =
producer.GetFecPacketsAsRed(kRedPayloadType, kFecPayloadType, 100,
rtp_header_length);
producer.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType, 100,
rtp_header_length);
RTC_CHECK_EQ(num_fec_packets, fec_packets.size());
}
}