scalability_structure_full_svc.h (6488B)
1 /* 2 * Copyright (c) 2020 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_FULL_SVC_H_ 11 #define MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_FULL_SVC_H_ 12 13 #include <bitset> 14 #include <vector> 15 16 #include "absl/strings/string_view.h" 17 #include "api/transport/rtp/dependency_descriptor.h" 18 #include "api/video/video_bitrate_allocation.h" 19 #include "common_video/generic_frame_descriptor/generic_frame_info.h" 20 #include "modules/video_coding/svc/scalable_video_controller.h" 21 22 namespace webrtc { 23 24 class ScalabilityStructureFullSvc : public ScalableVideoController { 25 public: 26 struct ScalingFactor { 27 int num = 1; 28 int den = 2; 29 }; 30 ScalabilityStructureFullSvc(int num_spatial_layers, 31 int num_temporal_layers, 32 ScalingFactor resolution_factor); 33 ~ScalabilityStructureFullSvc() override; 34 35 StreamLayersConfig StreamConfig() const override; 36 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 kKey, 45 kDeltaT2A, 46 kDeltaT1, 47 kDeltaT2B, 48 kDeltaT0, 49 }; 50 static constexpr absl::string_view kFramePatternNames[] = { 51 "None", "Key", "DeltaT2A", "DeltaT1", "DeltaT2B", "DeltaT0"}; 52 static constexpr int kMaxNumSpatialLayers = 3; 53 static constexpr int kMaxNumTemporalLayers = 3; 54 55 // Index of the buffer to store last frame for layer (`sid`, `tid`) 56 int BufferIndex(int sid, int tid) const { 57 return tid * num_spatial_layers_ + sid; 58 } 59 bool DecodeTargetIsActive(int sid, int tid) const { 60 return active_decode_targets_[sid * num_temporal_layers_ + tid]; 61 } 62 void SetDecodeTargetIsActive(int sid, int tid, bool value) { 63 active_decode_targets_.set(sid * num_temporal_layers_ + tid, value); 64 } 65 FramePattern NextPattern() const; 66 bool TemporalLayerIsActive(int tid) const; 67 static DecodeTargetIndication Dti(int sid, 68 int tid, 69 const LayerFrameConfig& frame); 70 71 const int num_spatial_layers_; 72 const int num_temporal_layers_; 73 const ScalingFactor resolution_factor_; 74 75 FramePattern last_pattern_ = kNone; 76 std::bitset<kMaxNumSpatialLayers> can_reference_t0_frame_for_spatial_id_ = 0; 77 std::bitset<kMaxNumSpatialLayers> can_reference_t1_frame_for_spatial_id_ = 0; 78 std::bitset<32> active_decode_targets_; 79 }; 80 81 // T1 0 0 82 // / / / ... 83 // T0 0---0---0-- 84 // Time-> 0 1 2 3 4 85 class ScalabilityStructureL1T2 : public ScalabilityStructureFullSvc { 86 public: 87 explicit ScalabilityStructureL1T2(ScalingFactor resolution_factor = {}) 88 : ScalabilityStructureFullSvc(1, 2, resolution_factor) {} 89 ~ScalabilityStructureL1T2() override = default; 90 91 FrameDependencyStructure DependencyStructure() const override; 92 }; 93 94 // T2 0 0 0 0 95 // | / | / 96 // T1 / 0 / 0 ... 97 // |_/ |_/ 98 // T0 0-------0------ 99 // Time-> 0 1 2 3 4 5 6 7 100 class ScalabilityStructureL1T3 : public ScalabilityStructureFullSvc { 101 public: 102 explicit ScalabilityStructureL1T3(ScalingFactor resolution_factor = {}) 103 : ScalabilityStructureFullSvc(1, 3, resolution_factor) {} 104 ~ScalabilityStructureL1T3() override = default; 105 106 FrameDependencyStructure DependencyStructure() const override; 107 }; 108 109 // S1 0--0--0- 110 // | | | ... 111 // S0 0--0--0- 112 class ScalabilityStructureL2T1 : public ScalabilityStructureFullSvc { 113 public: 114 explicit ScalabilityStructureL2T1(ScalingFactor resolution_factor = {}) 115 : ScalabilityStructureFullSvc(2, 1, resolution_factor) {} 116 ~ScalabilityStructureL2T1() override = default; 117 118 FrameDependencyStructure DependencyStructure() const override; 119 }; 120 121 // S1T1 0 0 122 // /| /| / 123 // S1T0 0-+-0-+-0 124 // | | | | | ... 125 // S0T1 | 0 | 0 | 126 // |/ |/ |/ 127 // S0T0 0---0---0-- 128 // Time-> 0 1 2 3 4 129 class ScalabilityStructureL2T2 : public ScalabilityStructureFullSvc { 130 public: 131 explicit ScalabilityStructureL2T2(ScalingFactor resolution_factor = {}) 132 : ScalabilityStructureFullSvc(2, 2, resolution_factor) {} 133 ~ScalabilityStructureL2T2() override = default; 134 135 FrameDependencyStructure DependencyStructure() const override; 136 }; 137 138 // S1T2 4 ,8 139 // S1T1 / | 6' | 140 // S1T0 2--+-'+--+-... 141 // | | | | 142 // S0T2 | 3 | ,7 143 // S0T1 | / 5' 144 // S0T0 1----'-----... 145 // Time-> 0 1 2 3 146 class ScalabilityStructureL2T3 : public ScalabilityStructureFullSvc { 147 public: 148 explicit ScalabilityStructureL2T3(ScalingFactor resolution_factor = {}) 149 : ScalabilityStructureFullSvc(2, 3, resolution_factor) {} 150 ~ScalabilityStructureL2T3() override = default; 151 152 FrameDependencyStructure DependencyStructure() const override; 153 }; 154 155 // S2 0-0-0- 156 // | | | 157 // S1 0-0-0-... 158 // | | | 159 // S0 0-0-0- 160 // Time-> 0 1 2 161 class ScalabilityStructureL3T1 : public ScalabilityStructureFullSvc { 162 public: 163 explicit ScalabilityStructureL3T1(ScalingFactor resolution_factor = {}) 164 : ScalabilityStructureFullSvc(3, 1, resolution_factor) {} 165 ~ScalabilityStructureL3T1() override = default; 166 167 FrameDependencyStructure DependencyStructure() const override; 168 }; 169 170 // https://www.w3.org/TR/webrtc-svc/#L3T2* 171 class ScalabilityStructureL3T2 : public ScalabilityStructureFullSvc { 172 public: 173 explicit ScalabilityStructureL3T2(ScalingFactor resolution_factor = {}) 174 : ScalabilityStructureFullSvc(3, 2, resolution_factor) {} 175 ~ScalabilityStructureL3T2() override = default; 176 177 FrameDependencyStructure DependencyStructure() const override; 178 }; 179 180 // https://www.w3.org/TR/webrtc-svc/#L3T3* 181 class ScalabilityStructureL3T3 : public ScalabilityStructureFullSvc { 182 public: 183 explicit ScalabilityStructureL3T3(ScalingFactor resolution_factor = {}) 184 : ScalabilityStructureFullSvc(3, 3, resolution_factor) {} 185 ~ScalabilityStructureL3T3() override = default; 186 187 FrameDependencyStructure DependencyStructure() const override; 188 }; 189 190 } // namespace webrtc 191 192 #endif // MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_FULL_SVC_H_