The packetization parts of this class are accessed from the encoder thread, which might change under different occasions. The use of a sequenced task checker here is thus incorrect, since that requires the access to always be on the same thread, whenever a task queue is not used. The access to the instantiated object of this class, at least when it comes to the RTP packetization parts, is however synchronized using the lock in PayloadRouter::OnEncodedImage. We can therefore safely remove the sequenced task checker. BUG=webrtc:5654 Review-Url: https://codereview.webrtc.org/2562983002 Cr-Commit-Position: refs/heads/master@{#15549}
87 lines
2.8 KiB
C++
87 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;
|
|
|
|
// Note that this class is not thread safe, and thus requires external
|
|
// synchronization.
|
|
|
|
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();
|
|
|
|
uint32_t ssrc() const { return ssrc_; }
|
|
|
|
// 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_;
|
|
int64_t last_generated_packet_ms_;
|
|
|
|
// 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_;
|
|
|
|
// Implementation.
|
|
UlpfecGenerator ulpfec_generator_;
|
|
const RtpHeaderExtensionMap rtp_header_extension_map_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
|