scalability_structure_simulcast.h (5076B)
1 /* 2 * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #ifndef MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_SIMULCAST_H_ 11 #define MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_SIMULCAST_H_ 12 13 #include <bitset> 14 #include <vector> 15 16 #include "api/transport/rtp/dependency_descriptor.h" 17 #include "api/video/video_bitrate_allocation.h" 18 #include "common_video/generic_frame_descriptor/generic_frame_info.h" 19 #include "modules/video_coding/svc/scalable_video_controller.h" 20 21 namespace webrtc { 22 23 // Scalability structure with multiple independent spatial layers each with the 24 // same temporal layering. 25 class ScalabilityStructureSimulcast : public ScalableVideoController { 26 public: 27 struct ScalingFactor { 28 int num = 1; 29 int den = 2; 30 }; 31 ScalabilityStructureSimulcast(int num_spatial_layers, 32 int num_temporal_layers, 33 ScalingFactor resolution_factor); 34 ~ScalabilityStructureSimulcast() override; 35 36 StreamLayersConfig StreamConfig() const override; 37 std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override; 38 GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override; 39 void OnRatesUpdated(const VideoBitrateAllocation& bitrates) override; 40 41 private: 42 enum FramePattern { 43 kNone, 44 kDeltaT2A, 45 kDeltaT1, 46 kDeltaT2B, 47 kDeltaT0, 48 }; 49 static constexpr int kMaxNumSpatialLayers = 3; 50 static constexpr int kMaxNumTemporalLayers = 3; 51 52 // Index of the buffer to store last frame for layer (`sid`, `tid`) 53 int BufferIndex(int sid, int tid) const { 54 return tid * num_spatial_layers_ + sid; 55 } 56 bool DecodeTargetIsActive(int sid, int tid) const { 57 return active_decode_targets_[sid * num_temporal_layers_ + tid]; 58 } 59 void SetDecodeTargetIsActive(int sid, int tid, bool value) { 60 active_decode_targets_.set(sid * num_temporal_layers_ + tid, value); 61 } 62 FramePattern NextPattern() const; 63 bool TemporalLayerIsActive(int tid) const; 64 65 const int num_spatial_layers_; 66 const int num_temporal_layers_; 67 const ScalingFactor resolution_factor_; 68 69 FramePattern last_pattern_ = kNone; 70 std::bitset<kMaxNumSpatialLayers> can_reference_t0_frame_for_spatial_id_ = 0; 71 std::bitset<kMaxNumSpatialLayers> can_reference_t1_frame_for_spatial_id_ = 0; 72 std::bitset<32> active_decode_targets_; 73 }; 74 75 // S1 0--0--0- 76 // ... 77 // S0 0--0--0- 78 class ScalabilityStructureS2T1 : public ScalabilityStructureSimulcast { 79 public: 80 explicit ScalabilityStructureS2T1(ScalingFactor resolution_factor = {}) 81 : ScalabilityStructureSimulcast(2, 1, resolution_factor) {} 82 ~ScalabilityStructureS2T1() override = default; 83 84 FrameDependencyStructure DependencyStructure() const override; 85 }; 86 87 class ScalabilityStructureS2T2 : public ScalabilityStructureSimulcast { 88 public: 89 explicit ScalabilityStructureS2T2(ScalingFactor resolution_factor = {}) 90 : ScalabilityStructureSimulcast(2, 2, resolution_factor) {} 91 ~ScalabilityStructureS2T2() override = default; 92 93 FrameDependencyStructure DependencyStructure() const override; 94 }; 95 96 // S1T2 3 7 97 // | / 98 // S1T1 / 5 99 // |_/ 100 // S1T0 1-------9... 101 // 102 // S0T2 2 6 103 // | / 104 // S0T1 / 4 105 // |_/ 106 // S0T0 0-------8... 107 // Time-> 0 1 2 3 4 108 class ScalabilityStructureS2T3 : public ScalabilityStructureSimulcast { 109 public: 110 explicit ScalabilityStructureS2T3(ScalingFactor resolution_factor = {}) 111 : ScalabilityStructureSimulcast(2, 3, resolution_factor) {} 112 ~ScalabilityStructureS2T3() override = default; 113 114 FrameDependencyStructure DependencyStructure() const override; 115 }; 116 117 class ScalabilityStructureS3T1 : public ScalabilityStructureSimulcast { 118 public: 119 explicit ScalabilityStructureS3T1(ScalingFactor resolution_factor = {}) 120 : ScalabilityStructureSimulcast(3, 1, resolution_factor) {} 121 ~ScalabilityStructureS3T1() override = default; 122 123 FrameDependencyStructure DependencyStructure() const override; 124 }; 125 126 class ScalabilityStructureS3T2 : public ScalabilityStructureSimulcast { 127 public: 128 explicit ScalabilityStructureS3T2(ScalingFactor resolution_factor = {}) 129 : ScalabilityStructureSimulcast(3, 2, resolution_factor) {} 130 ~ScalabilityStructureS3T2() override = default; 131 132 FrameDependencyStructure DependencyStructure() const override; 133 }; 134 135 class ScalabilityStructureS3T3 : public ScalabilityStructureSimulcast { 136 public: 137 explicit ScalabilityStructureS3T3(ScalingFactor resolution_factor = {}) 138 : ScalabilityStructureSimulcast(3, 3, resolution_factor) {} 139 ~ScalabilityStructureS3T3() override = default; 140 141 FrameDependencyStructure DependencyStructure() const override; 142 }; 143 144 } // namespace webrtc 145 146 #endif // MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_SIMULCAST_H_