xref: /aosp_15_r20/external/webrtc/pc/simulcast_description.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2018 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 PC_SIMULCAST_DESCRIPTION_H_
12*d9f75844SAndroid Build Coastguard Worker #define PC_SIMULCAST_DESCRIPTION_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace cricket {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker // Describes a Simulcast Layer.
24*d9f75844SAndroid Build Coastguard Worker // Each simulcast layer has a rid as the identifier and a paused flag.
25*d9f75844SAndroid Build Coastguard Worker // See also: https://tools.ietf.org/html/draft-ietf-mmusic-rid-15 for
26*d9f75844SAndroid Build Coastguard Worker // an explanation about rids.
27*d9f75844SAndroid Build Coastguard Worker struct SimulcastLayer final {
28*d9f75844SAndroid Build Coastguard Worker   SimulcastLayer(absl::string_view rid, bool is_paused);
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker   SimulcastLayer(const SimulcastLayer& other) = default;
31*d9f75844SAndroid Build Coastguard Worker   SimulcastLayer& operator=(const SimulcastLayer& other) = default;
32*d9f75844SAndroid Build Coastguard Worker   bool operator==(const SimulcastLayer& other) const;
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker   std::string rid;
35*d9f75844SAndroid Build Coastguard Worker   bool is_paused;
36*d9f75844SAndroid Build Coastguard Worker };
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker // Describes a list of Simulcast layers.
39*d9f75844SAndroid Build Coastguard Worker // Simulcast layers are specified in order of preference.
40*d9f75844SAndroid Build Coastguard Worker // Each layer can have a list of alternatives (in order of preference).
41*d9f75844SAndroid Build Coastguard Worker // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-13#section-5.1
42*d9f75844SAndroid Build Coastguard Worker // Example Usage:
43*d9f75844SAndroid Build Coastguard Worker //   To populate a list that specifies the following:
44*d9f75844SAndroid Build Coastguard Worker //     1. Layer 1 or Layer 2
45*d9f75844SAndroid Build Coastguard Worker //     2. Layer 3
46*d9f75844SAndroid Build Coastguard Worker //     3. Layer 4 or Layer 5
47*d9f75844SAndroid Build Coastguard Worker //   Use the following code:
48*d9f75844SAndroid Build Coastguard Worker //     SimulcastLayerList list;
49*d9f75844SAndroid Build Coastguard Worker //     list.AddLayerWithAlternatives(
50*d9f75844SAndroid Build Coastguard Worker //            {SimulcastLayer("1", false), SimulcastLayer("2", false});
51*d9f75844SAndroid Build Coastguard Worker //     list.AddLayer("3");
52*d9f75844SAndroid Build Coastguard Worker //     list.AddLayerWithAlternatives(
53*d9f75844SAndroid Build Coastguard Worker //            {SimulcastLayer("4", false), SimulcastLayer("5", false});
54*d9f75844SAndroid Build Coastguard Worker class SimulcastLayerList final {
55*d9f75844SAndroid Build Coastguard Worker  public:
56*d9f75844SAndroid Build Coastguard Worker   // Type definitions required by a container.
57*d9f75844SAndroid Build Coastguard Worker   typedef size_t size_type;
58*d9f75844SAndroid Build Coastguard Worker   typedef std::vector<SimulcastLayer> value_type;
59*d9f75844SAndroid Build Coastguard Worker   typedef std::vector<std::vector<SimulcastLayer>>::const_iterator
60*d9f75844SAndroid Build Coastguard Worker       const_iterator;
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker   // Use to add a layer when there will be no alternatives.
63*d9f75844SAndroid Build Coastguard Worker   void AddLayer(const SimulcastLayer& layer);
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker   // Use to add a list of alternatives.
66*d9f75844SAndroid Build Coastguard Worker   // The alternatives should be specified in order of preference.
67*d9f75844SAndroid Build Coastguard Worker   void AddLayerWithAlternatives(const std::vector<SimulcastLayer>& layers);
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker   // Read-only access to the contents.
70*d9f75844SAndroid Build Coastguard Worker   // Note: This object does not allow removal of layers.
begin()71*d9f75844SAndroid Build Coastguard Worker   const_iterator begin() const { return list_.begin(); }
72*d9f75844SAndroid Build Coastguard Worker 
end()73*d9f75844SAndroid Build Coastguard Worker   const_iterator end() const { return list_.end(); }
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker   const std::vector<SimulcastLayer>& operator[](size_t index) const;
76*d9f75844SAndroid Build Coastguard Worker 
size()77*d9f75844SAndroid Build Coastguard Worker   size_t size() const { return list_.size(); }
empty()78*d9f75844SAndroid Build Coastguard Worker   bool empty() const { return list_.empty(); }
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker   // Provides access to all the layers in the simulcast without their
81*d9f75844SAndroid Build Coastguard Worker   // association into groups of alternatives.
82*d9f75844SAndroid Build Coastguard Worker   std::vector<SimulcastLayer> GetAllLayers() const;
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker  private:
85*d9f75844SAndroid Build Coastguard Worker   // TODO(amithi, bugs.webrtc.org/10075):
86*d9f75844SAndroid Build Coastguard Worker   // Validate that rids do not repeat in the list.
87*d9f75844SAndroid Build Coastguard Worker   std::vector<std::vector<SimulcastLayer>> list_;
88*d9f75844SAndroid Build Coastguard Worker };
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker // Describes the simulcast options of a video media section.
91*d9f75844SAndroid Build Coastguard Worker // This will list the send and receive layers (along with their alternatives).
92*d9f75844SAndroid Build Coastguard Worker // Each simulcast layer has an identifier (rid) and can optionally be paused.
93*d9f75844SAndroid Build Coastguard Worker // The order of the layers (as well as alternates) indicates user preference
94*d9f75844SAndroid Build Coastguard Worker // from first to last (most preferred to least preferred).
95*d9f75844SAndroid Build Coastguard Worker // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-13#section-5.1
96*d9f75844SAndroid Build Coastguard Worker class SimulcastDescription final {
97*d9f75844SAndroid Build Coastguard Worker  public:
send_layers()98*d9f75844SAndroid Build Coastguard Worker   const SimulcastLayerList& send_layers() const { return send_layers_; }
send_layers()99*d9f75844SAndroid Build Coastguard Worker   SimulcastLayerList& send_layers() { return send_layers_; }
100*d9f75844SAndroid Build Coastguard Worker 
receive_layers()101*d9f75844SAndroid Build Coastguard Worker   const SimulcastLayerList& receive_layers() const { return receive_layers_; }
receive_layers()102*d9f75844SAndroid Build Coastguard Worker   SimulcastLayerList& receive_layers() { return receive_layers_; }
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker   bool empty() const;
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker  private:
107*d9f75844SAndroid Build Coastguard Worker   // TODO(amithi, bugs.webrtc.org/10075):
108*d9f75844SAndroid Build Coastguard Worker   // Validate that rids do not repeat in send and receive layers.
109*d9f75844SAndroid Build Coastguard Worker   SimulcastLayerList send_layers_;
110*d9f75844SAndroid Build Coastguard Worker   SimulcastLayerList receive_layers_;
111*d9f75844SAndroid Build Coastguard Worker };
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
114*d9f75844SAndroid Build Coastguard Worker 
115*d9f75844SAndroid Build Coastguard Worker #endif  // PC_SIMULCAST_DESCRIPTION_H_
116