| /* | |
| * 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 CALL_RTP_CONFIG_H_ | |
| #define CALL_RTP_CONFIG_H_ | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include <optional> | |
| #include <string> | |
| #include <vector> | |
| #include "api/rtp_headers.h" | |
| #include "api/rtp_parameters.h" | |
| namespace webrtc { | |
| // Currently only VP8/VP9 specific. | |
| struct RtpPayloadState { | |
| int16_t picture_id = -1; | |
| uint8_t tl0_pic_idx = 0; | |
| int64_t shared_frame_id = 0; | |
| int64_t frame_id = 0; | |
| }; | |
| // Settings for LNTF (LossNotification). Still highly experimental. | |
| struct LntfConfig { | |
| std::string ToString() const; | |
| bool enabled{false}; | |
| }; | |
| // Settings for NACK, see RFC 4585 for details. | |
| struct NackConfig { | |
| NackConfig() : rtp_history_ms(0) {} | |
| std::string ToString() const; | |
| // Send side: the time RTP packets are stored for retransmissions. | |
| // Receive side: the time the receiver is prepared to wait for | |
| // retransmissions. | |
| // Set to '0' to disable. | |
| int rtp_history_ms; | |
| }; | |
| // Settings for ULPFEC forward error correction. | |
| // Set the payload types to '-1' to disable. | |
| struct UlpfecConfig { | |
| UlpfecConfig() | |
| : ulpfec_payload_type(-1), | |
| red_payload_type(-1), | |
| red_rtx_payload_type(-1) {} | |
| std::string ToString() const; | |
| bool operator==(const UlpfecConfig& other) const; | |
| // Payload type used for ULPFEC packets. | |
| int ulpfec_payload_type; | |
| // Payload type used for RED packets. | |
| int red_payload_type; | |
| // RTX payload type for RED payload. | |
| int red_rtx_payload_type; | |
| }; | |
| struct RtpStreamConfig { | |
| std::string ToString() const; | |
| uint32_t ssrc = 0; | |
| std::string rid; | |
| std::string payload_name; | |
| int payload_type = -1; | |
| bool raw_payload = false; | |
| struct Rtx { | |
| std::string ToString() const; | |
| // SSRC to use for the RTX stream. | |
| uint32_t ssrc = 0; | |
| // Payload type to use for the RTX stream. | |
| int payload_type = -1; | |
| }; | |
| std::optional<Rtx> rtx; | |
| }; | |
| static const size_t kDefaultMaxPacketSize = 1500 - 40; // TCP over IPv4. | |
| struct RtpConfig { | |
| RtpConfig(); | |
| RtpConfig(const RtpConfig&); | |
| ~RtpConfig(); | |
| std::string ToString() const; | |
| std::vector<uint32_t> ssrcs; | |
| // The Rtp Stream Ids (aka RIDs) to send in the RID RTP header extension | |
| // if the extension is included in the list of extensions. | |
| // If rids are specified, they should correspond to the `ssrcs` vector. | |
| // This means that: | |
| // 1. rids.size() == 0 || rids.size() == ssrcs.size(). | |
| // 2. If rids is not empty, then `rids[i]` should use `ssrcs[i]`. | |
| std::vector<std::string> rids; | |
| // The value to send in the MID RTP header extension if the extension is | |
| // included in the list of extensions. | |
| std::string mid; | |
| // See RtcpMode for description. | |
| RtcpMode rtcp_mode = RtcpMode::kCompound; | |
| // Max RTP packet size delivered to send transport from VideoEngine. | |
| size_t max_packet_size = kDefaultMaxPacketSize; | |
| // Corresponds to the SDP attribute extmap-allow-mixed. | |
| bool extmap_allow_mixed = false; | |
| // RTP header extensions to use for this send stream. | |
| std::vector<RtpExtension> extensions; | |
| // TODO(nisse): For now, these are fixed, but we'd like to support | |
| // changing codec without recreating the VideoSendStream. Then these | |
| // fields must be removed, and association between payload type and codec | |
| // must move above the per-stream level. Ownership could be with | |
| // RtpTransportControllerSend, with a reference from RtpVideoSender, where | |
| // the latter would be responsible for mapping the codec type of encoded | |
| // images to the right payload type. | |
| std::string payload_name; | |
| int payload_type = -1; | |
| // Payload should be packetized using raw packetizer (payload header will | |
| // not be added, additional meta data is expected to be present in generic | |
| // frame descriptor RTP header extension). | |
| bool raw_payload = false; | |
| // Configurations for each RTP stream | |
| std::vector<RtpStreamConfig> stream_configs; | |
| // See LntfConfig for description. | |
| LntfConfig lntf; | |
| // See NackConfig for description. | |
| NackConfig nack; | |
| // See UlpfecConfig for description. | |
| UlpfecConfig ulpfec; | |
| struct Flexfec { | |
| Flexfec(); | |
| Flexfec(const Flexfec&); | |
| ~Flexfec(); | |
| // Payload type of FlexFEC. Set to -1 to disable sending FlexFEC. | |
| int payload_type = -1; | |
| // SSRC of FlexFEC stream. | |
| uint32_t ssrc = 0; | |
| // Vector containing a single element, corresponding to the SSRC of the | |
| // media stream being protected by this FlexFEC stream. | |
| // The vector MUST have size 1. | |
| // | |
| // TODO(brandtr): Update comment above when we support | |
| // multistream protection. | |
| std::vector<uint32_t> protected_media_ssrcs; | |
| } flexfec; | |
| // Settings for RTP retransmission payload format, see RFC 4588 for | |
| // details. | |
| struct Rtx { | |
| Rtx(); | |
| Rtx(const Rtx&); | |
| ~Rtx(); | |
| std::string ToString() const; | |
| // SSRCs to use for the RTX streams. | |
| std::vector<uint32_t> ssrcs; | |
| // Payload type to use for the RTX stream. | |
| int payload_type = -1; | |
| } rtx; | |
| // RTCP CNAME, see RFC 3550. | |
| std::string c_name; | |
| // Enables send packet batching from the egress RTP sender. | |
| bool enable_send_packet_batching = false; | |
| bool IsMediaSsrc(uint32_t ssrc) const; | |
| bool IsRtxSsrc(uint32_t ssrc) const; | |
| bool IsFlexfecSsrc(uint32_t ssrc) const; | |
| std::optional<uint32_t> GetRtxSsrcAssociatedWithMediaSsrc( | |
| uint32_t media_ssrc) const; | |
| uint32_t GetMediaSsrcAssociatedWithRtxSsrc(uint32_t rtx_ssrc) const; | |
| uint32_t GetMediaSsrcAssociatedWithFlexfecSsrc(uint32_t flexfec_ssrc) const; | |
| std::optional<std::string> GetRidForSsrc(uint32_t ssrc) const; | |
| // Returns send config for RTP stream by provided simulcast `index`. | |
| RtpStreamConfig GetStreamConfig(size_t index) const; | |
| }; | |
| } // namespace webrtc | |
| #endif // CALL_RTP_CONFIG_H_ |