This class will interface RTPSenderVideo with the underlying erasure code. It is functionally similar to ProducerFec (to be renamed UlpfecGenerator). In fact, the FlexfecSender is a friend of ProducerFec, and reuses most of its implementation. Besides the fact that FlexfecSender outputs FlexFEC packets, the main difference with ProducerFec is that FlexfecSender allocates RTP sequence numbers, whereas ProducerFec does not do this for the RED-encapsulated ULPFEC packets. This class is split as interface/implementation, since it will be owned by VideoSendStream initially. Further along, it may be owned by PacedSender. BUG=webrtc:5654 Review-Url: https://codereview.webrtc.org/2441613002 Cr-Commit-Position: refs/heads/master@{#14922}
83 lines
2.8 KiB
C++
83 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
|
|
#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "webrtc/base/basictypes.h"
|
|
#include "webrtc/base/random.h"
|
|
#include "webrtc/base/sequenced_task_checker.h"
|
|
#include "webrtc/config.h"
|
|
#include "webrtc/modules/include/module_common_types.h"
|
|
#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h"
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
|
|
#include "webrtc/modules/rtp_rtcp/source/ulpfec_generator.h"
|
|
#include "webrtc/system_wrappers/include/clock.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class RtpPacketToSend;
|
|
|
|
class FlexfecSender {
|
|
public:
|
|
FlexfecSender(int payload_type,
|
|
uint32_t ssrc,
|
|
uint32_t protected_media_ssrc,
|
|
const std::vector<RtpExtension>& rtp_header_extensions,
|
|
Clock* clock);
|
|
~FlexfecSender();
|
|
|
|
// Sets the FEC rate, max frames sent before FEC packets are sent,
|
|
// and what type of generator matrices are used.
|
|
void SetFecParameters(const FecProtectionParams& params);
|
|
|
|
// Adds a media packet to the internal buffer. When enough media packets
|
|
// have been added, the FEC packets are generated and stored internally.
|
|
// These FEC packets are then obtained by calling GetFecPackets().
|
|
// Returns true if the media packet was successfully added.
|
|
bool AddRtpPacketAndGenerateFec(const RtpPacketToSend& packet);
|
|
|
|
// Returns true if there are generated FEC packets available.
|
|
bool FecAvailable() const;
|
|
|
|
// Returns generated FlexFEC packets.
|
|
std::vector<std::unique_ptr<RtpPacketToSend>> GetFecPackets();
|
|
|
|
// Returns the overhead, per packet, for FlexFEC.
|
|
size_t MaxPacketOverhead() const;
|
|
|
|
private:
|
|
// Utility.
|
|
Clock* const clock_;
|
|
Random random_ GUARDED_BY(sequence_checker_);
|
|
int64_t last_generated_packet_ms_ GUARDED_BY(sequence_checker_);
|
|
rtc::SequencedTaskChecker sequence_checker_;
|
|
|
|
// Config.
|
|
const int payload_type_;
|
|
const uint32_t timestamp_offset_;
|
|
const uint32_t ssrc_;
|
|
const uint32_t protected_media_ssrc_;
|
|
// Sequence number of next packet to generate.
|
|
uint16_t seq_num_ GUARDED_BY(sequence_checker_);
|
|
|
|
// Implementation.
|
|
UlpfecGenerator ulpfec_generator_ GUARDED_BY(sequence_checker_);
|
|
RtpHeaderExtensionMap rtp_header_extension_map_ GUARDED_BY(sequence_checker_);
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
|