/* * Copyright (c) 2020 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 API_VIDEO_VIDEO_LAYERS_ALLOCATION_H_ #define API_VIDEO_VIDEO_LAYERS_ALLOCATION_H_ #include #include "absl/container/inlined_vector.h" #include "api/units/data_rate.h" namespace webrtc { // This struct contains additional stream-level information needed by a // Selective Forwarding Middlebox to make relay decisions of RTP streams. struct VideoLayersAllocation { static constexpr int kMaxSpatialIds = 4; static constexpr int kMaxTemporalIds = 4; friend bool operator==(const VideoLayersAllocation& lhs, const VideoLayersAllocation& rhs) { return lhs.rtp_stream_index == rhs.rtp_stream_index && lhs.resolution_and_frame_rate_is_valid == rhs.resolution_and_frame_rate_is_valid && lhs.active_spatial_layers == rhs.active_spatial_layers; } friend bool operator!=(const VideoLayersAllocation& lhs, const VideoLayersAllocation& rhs) { return !(lhs == rhs); } struct SpatialLayer { friend bool operator==(const SpatialLayer& lhs, const SpatialLayer& rhs) { return lhs.rtp_stream_index == rhs.rtp_stream_index && lhs.spatial_id == rhs.spatial_id && lhs.target_bitrate_per_temporal_layer == rhs.target_bitrate_per_temporal_layer && lhs.width == rhs.width && lhs.height == rhs.height && lhs.frame_rate_fps == rhs.frame_rate_fps; } friend bool operator!=(const SpatialLayer& lhs, const SpatialLayer& rhs) { return !(lhs == rhs); } int rtp_stream_index = 0; // Index of the spatial layer per `rtp_stream_index`. int spatial_id = 0; // Target bitrate per decode target. absl::InlinedVector target_bitrate_per_temporal_layer; // These fields are only valid if `resolution_and_frame_rate_is_valid` is // true uint16_t width = 0; uint16_t height = 0; // Max frame rate used in any temporal layer of this spatial layer. uint8_t frame_rate_fps = 0; }; // Index of the rtp stream this allocation is sent on. Used for mapping // a SpatialLayer to a rtp stream. int rtp_stream_index = 0; bool resolution_and_frame_rate_is_valid = false; absl::InlinedVector active_spatial_layers; }; } // namespace webrtc #endif // API_VIDEO_VIDEO_LAYERS_ALLOCATION_H_