| /* |
| * 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 <cstdint> |
| |
| #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<DataRate, kMaxTemporalIds> |
| 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<SpatialLayer, kMaxSpatialIds> active_spatial_layers; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // API_VIDEO_VIDEO_LAYERS_ALLOCATION_H_ |