xref: /aosp_15_r20/external/webrtc/call/rtp_config.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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