mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00

This CL adds a single class to manage the use case of having a task that repeats itself by a fixed or variable interval. It replaces the repeating task previously locally defined for rtp transport controller send as well as the cancelable periodic task. Furthermore, it is introduced where one off repeating tasks were created before. It provides the currently used functionality of the cancelable periodic task, but not some of the unused features, such as allowing cancellation of tasks before they are started and cancellation of a task after the owning task queue has been destroyed. Bug: webrtc:9883 Change-Id: Ifa7edee836c2a64fce16a7d0f682eb09c879eaca Reviewed-on: https://webrtc-review.googlesource.com/c/116182 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26313}
104 lines
3.9 KiB
C++
104 lines
3.9 KiB
C++
/*
|
|
* Copyright (c) 2017 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 MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_IMPL_H_
|
|
#define MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_IMPL_H_
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "api/array_view.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_transceiver_config.h"
|
|
#include "rtc_base/task_utils/repeating_task.h"
|
|
#include "system_wrappers/include/ntp_time.h"
|
|
|
|
namespace webrtc {
|
|
//
|
|
// Manage incoming and outgoing rtcp messages for multiple BUNDLED streams.
|
|
//
|
|
// This class is not thread-safe.
|
|
class RtcpTransceiverImpl {
|
|
public:
|
|
explicit RtcpTransceiverImpl(const RtcpTransceiverConfig& config);
|
|
RtcpTransceiverImpl(const RtcpTransceiverImpl&) = delete;
|
|
RtcpTransceiverImpl& operator=(const RtcpTransceiverImpl&) = delete;
|
|
~RtcpTransceiverImpl();
|
|
|
|
void AddMediaReceiverRtcpObserver(uint32_t remote_ssrc,
|
|
MediaReceiverRtcpObserver* observer);
|
|
void RemoveMediaReceiverRtcpObserver(uint32_t remote_ssrc,
|
|
MediaReceiverRtcpObserver* observer);
|
|
|
|
void SetReadyToSend(bool ready);
|
|
|
|
void ReceivePacket(rtc::ArrayView<const uint8_t> packet, int64_t now_us);
|
|
|
|
void SendCompoundPacket();
|
|
|
|
void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs);
|
|
void UnsetRemb();
|
|
// Temporary helpers to send pre-built TransportFeedback rtcp packet.
|
|
uint32_t sender_ssrc() const { return config_.feedback_ssrc; }
|
|
void SendRawPacket(rtc::ArrayView<const uint8_t> packet);
|
|
|
|
void SendNack(uint32_t ssrc, std::vector<uint16_t> sequence_numbers);
|
|
|
|
void SendPictureLossIndication(uint32_t ssrc);
|
|
void SendFullIntraRequest(rtc::ArrayView<const uint32_t> ssrcs);
|
|
|
|
private:
|
|
class PacketSender;
|
|
struct RemoteSenderState;
|
|
|
|
void HandleReceivedPacket(const rtcp::CommonHeader& rtcp_packet_header,
|
|
int64_t now_us);
|
|
// Individual rtcp packet handlers.
|
|
void HandleBye(const rtcp::CommonHeader& rtcp_packet_header);
|
|
void HandleSenderReport(const rtcp::CommonHeader& rtcp_packet_header,
|
|
int64_t now_us);
|
|
void HandleExtendedReports(const rtcp::CommonHeader& rtcp_packet_header,
|
|
int64_t now_us);
|
|
// Extended Reports blocks handlers.
|
|
void HandleDlrr(const rtcp::Dlrr& dlrr, int64_t now_us);
|
|
void HandleTargetBitrate(const rtcp::TargetBitrate& target_bitrate,
|
|
uint32_t remote_ssrc);
|
|
|
|
void ReschedulePeriodicCompoundPackets();
|
|
void SchedulePeriodicCompoundPackets(int64_t delay_ms);
|
|
// Creates compound RTCP packet, as defined in
|
|
// https://tools.ietf.org/html/rfc5506#section-2
|
|
void CreateCompoundPacket(PacketSender* sender);
|
|
// Sends RTCP packets.
|
|
void SendPeriodicCompoundPacket();
|
|
void SendImmediateFeedback(const rtcp::RtcpPacket& rtcp_packet);
|
|
// Generate Report Blocks to be send in Sender or Receiver Report.
|
|
std::vector<rtcp::ReportBlock> CreateReportBlocks(int64_t now_us);
|
|
|
|
const RtcpTransceiverConfig config_;
|
|
|
|
bool ready_to_send_;
|
|
absl::optional<rtcp::Remb> remb_;
|
|
// TODO(danilchap): Remove entries from remote_senders_ that are no longer
|
|
// needed.
|
|
std::map<uint32_t, RemoteSenderState> remote_senders_;
|
|
RepeatingTaskHandle periodic_task_handle_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_IMPL_H_
|