123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- /*
- * 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_H_
- #define MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_H_
- #include <functional>
- #include <memory>
- #include <string>
- #include <vector>
- #include "api/task_queue/task_queue_base.h"
- #include "modules/rtp_rtcp/source/rtcp_transceiver_config.h"
- #include "modules/rtp_rtcp/source/rtcp_transceiver_impl.h"
- #include "rtc_base/copy_on_write_buffer.h"
- namespace webrtc {
- //
- // Manage incoming and outgoing rtcp messages for multiple BUNDLED streams.
- //
- // This class is thread-safe wrapper of RtcpTransceiverImpl
- class RtcpTransceiver : public RtcpFeedbackSenderInterface {
- public:
- explicit RtcpTransceiver(const RtcpTransceiverConfig& config);
- RtcpTransceiver(const RtcpTransceiver&) = delete;
- RtcpTransceiver& operator=(const RtcpTransceiver&) = delete;
- // Note that interfaces provided in constructor still might be used after the
- // destructor. However they can only be used on the confic.task_queue.
- // Use Stop function to get notified when they are no longer used or
- // ensure those objects outlive the task queue.
- ~RtcpTransceiver() override;
- // Start asynchronious destruction of the RtcpTransceiver.
- // It is safe to call destructor right after Stop exits.
- // No other methods can be called.
- // Note that interfaces provided in constructor or registered with AddObserver
- // still might be used by the transceiver on the task queue
- // until |on_destroyed| runs.
- void Stop(std::function<void()> on_destroyed);
- // Registers observer to be notified about incoming rtcp packets.
- // Calls to observer will be done on the |config.task_queue|.
- void AddMediaReceiverRtcpObserver(uint32_t remote_ssrc,
- MediaReceiverRtcpObserver* observer);
- // Deregisters the observer. Might return before observer is deregistered.
- // Runs |on_removed| when observer is deregistered.
- void RemoveMediaReceiverRtcpObserver(uint32_t remote_ssrc,
- MediaReceiverRtcpObserver* observer,
- std::function<void()> on_removed);
- // Enables/disables sending rtcp packets eventually.
- // Packets may be sent after the SetReadyToSend(false) returns, but no new
- // packets will be scheduled.
- void SetReadyToSend(bool ready);
- // Handles incoming rtcp packets.
- void ReceivePacket(rtc::CopyOnWriteBuffer packet);
- // Sends RTCP packets starting with a sender or receiver report.
- void SendCompoundPacket();
- // (REMB) Receiver Estimated Max Bitrate.
- // Includes REMB in following compound packets and sends a REMB message
- // immediately if 'RtcpTransceiverConfig::send_remb_on_change' is set.
- void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) override;
- // Stops sending REMB in following compound packets.
- void UnsetRemb() override;
- // TODO(bugs.webrtc.org/8239): Remove SendCombinedRtcpPacket
- // and move generating of the TransportFeedback message inside
- // RtcpTransceiverImpl when there is one RtcpTransceiver per rtp transport.
- void SendCombinedRtcpPacket(
- std::vector<std::unique_ptr<rtcp::RtcpPacket>> rtcp_packets) override;
- // Reports missing packets, https://tools.ietf.org/html/rfc4585#section-6.2.1
- void SendNack(uint32_t ssrc, std::vector<uint16_t> sequence_numbers);
- // Requests new key frame.
- // using PLI, https://tools.ietf.org/html/rfc4585#section-6.3.1.1
- void SendPictureLossIndication(uint32_t ssrc);
- // using FIR, https://tools.ietf.org/html/rfc5104#section-4.3.1.2
- // Use the SendFullIntraRequest(ssrcs, true) instead.
- void SendFullIntraRequest(std::vector<uint32_t> ssrcs);
- // If new_request is true then requested sequence no. will increase for each
- // requested ssrc.
- void SendFullIntraRequest(std::vector<uint32_t> ssrcs, bool new_request);
- private:
- TaskQueueBase* const task_queue_;
- std::unique_ptr<RtcpTransceiverImpl> rtcp_transceiver_;
- };
- } // namespace webrtc
- #endif // MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_H_
|