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