// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CAST_STREAMING_PUBLIC_SENDER_H_ #define CAST_STREAMING_PUBLIC_SENDER_H_ #include <stdint.h> #include <array> #include <chrono> #include <optional> #include <vector> #include "cast/streaming/impl/compound_rtcp_parser.h" #include "cast/streaming/impl/frame_crypto.h" #include "cast/streaming/impl/rtcp_common.h" #include "cast/streaming/impl/rtp_defines.h" #include "cast/streaming/impl/rtp_packetizer.h" #include "cast/streaming/impl/sender_report_builder.h" #include "cast/streaming/impl/session_config.h" #include "cast/streaming/public/constants.h" #include "cast/streaming/public/frame_id.h" #include "cast/streaming/rtp_time.h" #include "cast/streaming/sender_packet_router.h" #include "platform/api/time.h" #include "platform/base/span.h" #include "util/yet_another_bit_vector.h" namespace openscreen::cast { class Environment; // The Cast Streaming Sender, a peer corresponding to some Cast Streaming // Receiver at the other end of a network link. See class level comments for // Receiver for a high-level overview. // // The Sender is the peer responsible for enqueuing EncodedFrames for streaming, // guaranteeing their delivery to a Receiver, and handling feedback events from // a Receiver. Some feedback events are used for managing the Sender's internal // queue of in-flight frames, requesting network packet re-transmits, etc.; // while others are exposed via the Sender's public interface. For example, // sometimes the Receiver signals that it needs a a key frame to resolve a // picture loss condition, and the modules upstream of the Sender (e.g., where // encoding happens) should call NeedsKeyFrame() to check for, and handle that. // // There are usually one or two Senders in a streaming session, one for audio // and one for video. Both senders work with the same SenderPacketRouter // instance to schedule their transmission of packets, and provide the necessary // metrics for estimating bandwidth utilization and availability. // // It is the responsibility of upstream code modules to handle congestion // control. With respect to this Sender, that means the media encoding bit rate // should be throttled based on network bandwidth availability. This Sender does // not do any throttling, only flow-control. In other words, this Sender can // only manage its in-flight queue of frames, and if that queue grows too large, // it will eventually reject further enqueuing. // // General usage: A client should check the in-flight media duration frequently // to decide when to pause encoding, to avoid wasting system resources on // encoding frames that will likely be rejected by the Sender. The client should // also frequently call NeedsKeyFrame() and, when this returns true, direct its // encoder to produce a key frame soon. Finally, when using EnqueueFrame(), an // EncodedFrame struct should be prepared with its frame_id field set to // whatever GetNextFrameId() returns. Please see method comments for // more-detailed usage info. class Sender final : public SenderPacketRouter::Sender, public CompoundRtcpParser::Client { … }; } // namespace openscreen::cast #endif // CAST_STREAMING_PUBLIC_SENDER_H_