1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef CALL_RTP_CONFIG_H_ 12*d9f75844SAndroid Build Coastguard Worker #define CALL_RTP_CONFIG_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h> 15*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include <string> 18*d9f75844SAndroid Build Coastguard Worker #include <vector> 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_headers.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h" 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 25*d9f75844SAndroid Build Coastguard Worker // Currently only VP8/VP9 specific. 26*d9f75844SAndroid Build Coastguard Worker struct RtpPayloadState { 27*d9f75844SAndroid Build Coastguard Worker int16_t picture_id = -1; 28*d9f75844SAndroid Build Coastguard Worker uint8_t tl0_pic_idx = 0; 29*d9f75844SAndroid Build Coastguard Worker int64_t shared_frame_id = 0; 30*d9f75844SAndroid Build Coastguard Worker }; 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard Worker // Settings for LNTF (LossNotification). Still highly experimental. 33*d9f75844SAndroid Build Coastguard Worker struct LntfConfig { 34*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker bool enabled{false}; 37*d9f75844SAndroid Build Coastguard Worker }; 38*d9f75844SAndroid Build Coastguard Worker 39*d9f75844SAndroid Build Coastguard Worker // Settings for NACK, see RFC 4585 for details. 40*d9f75844SAndroid Build Coastguard Worker struct NackConfig { NackConfigNackConfig41*d9f75844SAndroid Build Coastguard Worker NackConfig() : rtp_history_ms(0) {} 42*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 43*d9f75844SAndroid Build Coastguard Worker // Send side: the time RTP packets are stored for retransmissions. 44*d9f75844SAndroid Build Coastguard Worker // Receive side: the time the receiver is prepared to wait for 45*d9f75844SAndroid Build Coastguard Worker // retransmissions. 46*d9f75844SAndroid Build Coastguard Worker // Set to '0' to disable. 47*d9f75844SAndroid Build Coastguard Worker int rtp_history_ms; 48*d9f75844SAndroid Build Coastguard Worker }; 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker // Settings for ULPFEC forward error correction. 51*d9f75844SAndroid Build Coastguard Worker // Set the payload types to '-1' to disable. 52*d9f75844SAndroid Build Coastguard Worker struct UlpfecConfig { UlpfecConfigUlpfecConfig53*d9f75844SAndroid Build Coastguard Worker UlpfecConfig() 54*d9f75844SAndroid Build Coastguard Worker : ulpfec_payload_type(-1), 55*d9f75844SAndroid Build Coastguard Worker red_payload_type(-1), 56*d9f75844SAndroid Build Coastguard Worker red_rtx_payload_type(-1) {} 57*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 58*d9f75844SAndroid Build Coastguard Worker bool operator==(const UlpfecConfig& other) const; 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Worker // Payload type used for ULPFEC packets. 61*d9f75844SAndroid Build Coastguard Worker int ulpfec_payload_type; 62*d9f75844SAndroid Build Coastguard Worker 63*d9f75844SAndroid Build Coastguard Worker // Payload type used for RED packets. 64*d9f75844SAndroid Build Coastguard Worker int red_payload_type; 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker // RTX payload type for RED payload. 67*d9f75844SAndroid Build Coastguard Worker int red_rtx_payload_type; 68*d9f75844SAndroid Build Coastguard Worker }; 69*d9f75844SAndroid Build Coastguard Worker 70*d9f75844SAndroid Build Coastguard Worker static const size_t kDefaultMaxPacketSize = 1500 - 40; // TCP over IPv4. 71*d9f75844SAndroid Build Coastguard Worker struct RtpConfig { 72*d9f75844SAndroid Build Coastguard Worker RtpConfig(); 73*d9f75844SAndroid Build Coastguard Worker RtpConfig(const RtpConfig&); 74*d9f75844SAndroid Build Coastguard Worker ~RtpConfig(); 75*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker std::vector<uint32_t> ssrcs; 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker // The Rtp Stream Ids (aka RIDs) to send in the RID RTP header extension 80*d9f75844SAndroid Build Coastguard Worker // if the extension is included in the list of extensions. 81*d9f75844SAndroid Build Coastguard Worker // If rids are specified, they should correspond to the `ssrcs` vector. 82*d9f75844SAndroid Build Coastguard Worker // This means that: 83*d9f75844SAndroid Build Coastguard Worker // 1. rids.size() == 0 || rids.size() == ssrcs.size(). 84*d9f75844SAndroid Build Coastguard Worker // 2. If rids is not empty, then `rids[i]` should use `ssrcs[i]`. 85*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> rids; 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker // The value to send in the MID RTP header extension if the extension is 88*d9f75844SAndroid Build Coastguard Worker // included in the list of extensions. 89*d9f75844SAndroid Build Coastguard Worker std::string mid; 90*d9f75844SAndroid Build Coastguard Worker 91*d9f75844SAndroid Build Coastguard Worker // See RtcpMode for description. 92*d9f75844SAndroid Build Coastguard Worker RtcpMode rtcp_mode = RtcpMode::kCompound; 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker // Max RTP packet size delivered to send transport from VideoEngine. 95*d9f75844SAndroid Build Coastguard Worker size_t max_packet_size = kDefaultMaxPacketSize; 96*d9f75844SAndroid Build Coastguard Worker 97*d9f75844SAndroid Build Coastguard Worker // Corresponds to the SDP attribute extmap-allow-mixed. 98*d9f75844SAndroid Build Coastguard Worker bool extmap_allow_mixed = false; 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Worker // RTP header extensions to use for this send stream. 101*d9f75844SAndroid Build Coastguard Worker std::vector<RtpExtension> extensions; 102*d9f75844SAndroid Build Coastguard Worker 103*d9f75844SAndroid Build Coastguard Worker // TODO(nisse): For now, these are fixed, but we'd like to support 104*d9f75844SAndroid Build Coastguard Worker // changing codec without recreating the VideoSendStream. Then these 105*d9f75844SAndroid Build Coastguard Worker // fields must be removed, and association between payload type and codec 106*d9f75844SAndroid Build Coastguard Worker // must move above the per-stream level. Ownership could be with 107*d9f75844SAndroid Build Coastguard Worker // RtpTransportControllerSend, with a reference from RtpVideoSender, where 108*d9f75844SAndroid Build Coastguard Worker // the latter would be responsible for mapping the codec type of encoded 109*d9f75844SAndroid Build Coastguard Worker // images to the right payload type. 110*d9f75844SAndroid Build Coastguard Worker std::string payload_name; 111*d9f75844SAndroid Build Coastguard Worker int payload_type = -1; 112*d9f75844SAndroid Build Coastguard Worker // Payload should be packetized using raw packetizer (payload header will 113*d9f75844SAndroid Build Coastguard Worker // not be added, additional meta data is expected to be present in generic 114*d9f75844SAndroid Build Coastguard Worker // frame descriptor RTP header extension). 115*d9f75844SAndroid Build Coastguard Worker bool raw_payload = false; 116*d9f75844SAndroid Build Coastguard Worker 117*d9f75844SAndroid Build Coastguard Worker // See LntfConfig for description. 118*d9f75844SAndroid Build Coastguard Worker LntfConfig lntf; 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker // See NackConfig for description. 121*d9f75844SAndroid Build Coastguard Worker NackConfig nack; 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Worker // See UlpfecConfig for description. 124*d9f75844SAndroid Build Coastguard Worker UlpfecConfig ulpfec; 125*d9f75844SAndroid Build Coastguard Worker 126*d9f75844SAndroid Build Coastguard Worker struct Flexfec { 127*d9f75844SAndroid Build Coastguard Worker Flexfec(); 128*d9f75844SAndroid Build Coastguard Worker Flexfec(const Flexfec&); 129*d9f75844SAndroid Build Coastguard Worker ~Flexfec(); 130*d9f75844SAndroid Build Coastguard Worker // Payload type of FlexFEC. Set to -1 to disable sending FlexFEC. 131*d9f75844SAndroid Build Coastguard Worker int payload_type = -1; 132*d9f75844SAndroid Build Coastguard Worker 133*d9f75844SAndroid Build Coastguard Worker // SSRC of FlexFEC stream. 134*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc = 0; 135*d9f75844SAndroid Build Coastguard Worker 136*d9f75844SAndroid Build Coastguard Worker // Vector containing a single element, corresponding to the SSRC of the 137*d9f75844SAndroid Build Coastguard Worker // media stream being protected by this FlexFEC stream. 138*d9f75844SAndroid Build Coastguard Worker // The vector MUST have size 1. 139*d9f75844SAndroid Build Coastguard Worker // 140*d9f75844SAndroid Build Coastguard Worker // TODO(brandtr): Update comment above when we support 141*d9f75844SAndroid Build Coastguard Worker // multistream protection. 142*d9f75844SAndroid Build Coastguard Worker std::vector<uint32_t> protected_media_ssrcs; 143*d9f75844SAndroid Build Coastguard Worker } flexfec; 144*d9f75844SAndroid Build Coastguard Worker 145*d9f75844SAndroid Build Coastguard Worker // Settings for RTP retransmission payload format, see RFC 4588 for 146*d9f75844SAndroid Build Coastguard Worker // details. 147*d9f75844SAndroid Build Coastguard Worker struct Rtx { 148*d9f75844SAndroid Build Coastguard Worker Rtx(); 149*d9f75844SAndroid Build Coastguard Worker Rtx(const Rtx&); 150*d9f75844SAndroid Build Coastguard Worker ~Rtx(); 151*d9f75844SAndroid Build Coastguard Worker std::string ToString() const; 152*d9f75844SAndroid Build Coastguard Worker // SSRCs to use for the RTX streams. 153*d9f75844SAndroid Build Coastguard Worker std::vector<uint32_t> ssrcs; 154*d9f75844SAndroid Build Coastguard Worker 155*d9f75844SAndroid Build Coastguard Worker // Payload type to use for the RTX stream. 156*d9f75844SAndroid Build Coastguard Worker int payload_type = -1; 157*d9f75844SAndroid Build Coastguard Worker } rtx; 158*d9f75844SAndroid Build Coastguard Worker 159*d9f75844SAndroid Build Coastguard Worker // RTCP CNAME, see RFC 3550. 160*d9f75844SAndroid Build Coastguard Worker std::string c_name; 161*d9f75844SAndroid Build Coastguard Worker 162*d9f75844SAndroid Build Coastguard Worker bool IsMediaSsrc(uint32_t ssrc) const; 163*d9f75844SAndroid Build Coastguard Worker bool IsRtxSsrc(uint32_t ssrc) const; 164*d9f75844SAndroid Build Coastguard Worker bool IsFlexfecSsrc(uint32_t ssrc) const; 165*d9f75844SAndroid Build Coastguard Worker absl::optional<uint32_t> GetRtxSsrcAssociatedWithMediaSsrc( 166*d9f75844SAndroid Build Coastguard Worker uint32_t media_ssrc) const; 167*d9f75844SAndroid Build Coastguard Worker uint32_t GetMediaSsrcAssociatedWithRtxSsrc(uint32_t rtx_ssrc) const; 168*d9f75844SAndroid Build Coastguard Worker uint32_t GetMediaSsrcAssociatedWithFlexfecSsrc(uint32_t flexfec_ssrc) const; 169*d9f75844SAndroid Build Coastguard Worker absl::optional<std::string> GetRidForSsrc(uint32_t ssrc) const; 170*d9f75844SAndroid Build Coastguard Worker }; 171*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 172*d9f75844SAndroid Build Coastguard Worker #endif // CALL_RTP_CONFIG_H_ 173