/* * Copyright 2018 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 PC_SIMULCAST_DESCRIPTION_H_ #define PC_SIMULCAST_DESCRIPTION_H_ #include #include #include #include "absl/strings/string_view.h" namespace cricket { // Describes a Simulcast Layer. // Each simulcast layer has a rid as the identifier and a paused flag. // See also: https://tools.ietf.org/html/draft-ietf-mmusic-rid-15 for // an explanation about rids. struct SimulcastLayer final { SimulcastLayer(absl::string_view rid, bool is_paused); SimulcastLayer(const SimulcastLayer& other) = default; SimulcastLayer& operator=(const SimulcastLayer& other) = default; bool operator==(const SimulcastLayer& other) const; std::string rid; bool is_paused; }; // Describes a list of Simulcast layers. // Simulcast layers are specified in order of preference. // Each layer can have a list of alternatives (in order of preference). // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-13#section-5.1 // Example Usage: // To populate a list that specifies the following: // 1. Layer 1 or Layer 2 // 2. Layer 3 // 3. Layer 4 or Layer 5 // Use the following code: // SimulcastLayerList list; // list.AddLayerWithAlternatives( // {SimulcastLayer("1", false), SimulcastLayer("2", false}); // list.AddLayer("3"); // list.AddLayerWithAlternatives( // {SimulcastLayer("4", false), SimulcastLayer("5", false}); class SimulcastLayerList final { public: // Type definitions required by a container. typedef size_t size_type; typedef std::vector value_type; typedef std::vector>::const_iterator const_iterator; // Use to add a layer when there will be no alternatives. void AddLayer(const SimulcastLayer& layer); // Use to add a list of alternatives. // The alternatives should be specified in order of preference. void AddLayerWithAlternatives(const std::vector& layers); // Read-only access to the contents. // Note: This object does not allow removal of layers. const_iterator begin() const { return list_.begin(); } const_iterator end() const { return list_.end(); } const std::vector& operator[](size_t index) const; size_t size() const { return list_.size(); } bool empty() const { return list_.empty(); } // Provides access to all the layers in the simulcast without their // association into groups of alternatives. std::vector GetAllLayers() const; private: // TODO(amithi, bugs.webrtc.org/10075): // Validate that rids do not repeat in the list. std::vector> list_; }; // Describes the simulcast options of a video media section. // This will list the send and receive layers (along with their alternatives). // Each simulcast layer has an identifier (rid) and can optionally be paused. // The order of the layers (as well as alternates) indicates user preference // from first to last (most preferred to least preferred). // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-13#section-5.1 class SimulcastDescription final { public: const SimulcastLayerList& send_layers() const { return send_layers_; } SimulcastLayerList& send_layers() { return send_layers_; } const SimulcastLayerList& receive_layers() const { return receive_layers_; } SimulcastLayerList& receive_layers() { return receive_layers_; } bool empty() const; private: // TODO(amithi, bugs.webrtc.org/10075): // Validate that rids do not repeat in send and receive layers. SimulcastLayerList send_layers_; SimulcastLayerList receive_layers_; }; } // namespace cricket #endif // PC_SIMULCAST_DESCRIPTION_H_