78 lines
2.7 KiB
C
78 lines
2.7 KiB
C
|
/*
|
||
|
* 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_
|