112 lines
4.0 KiB
C
112 lines
4.0 KiB
C
|
/*
|
||
|
* 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 <string>
|
||
|
#include <vector>
|
||
|
|
||
|
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(const std::string& 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<SimulcastLayer> value_type;
|
||
|
typedef std::vector<std::vector<SimulcastLayer>>::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<SimulcastLayer>& 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<SimulcastLayer>& 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<SimulcastLayer> GetAllLayers() const;
|
||
|
|
||
|
private:
|
||
|
// TODO(amithi, bugs.webrtc.org/10075):
|
||
|
// Validate that rids do not repeat in the list.
|
||
|
std::vector<std::vector<SimulcastLayer>> 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_
|