xref: /aosp_15_r20/external/webrtc/modules/video_coding/svc/scalability_structure_key_svc.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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_KEY_SVC_H_
11 #define MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_KEY_SVC_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 class ScalabilityStructureKeySvc : public ScalableVideoController {
24  public:
25   ScalabilityStructureKeySvc(int num_spatial_layers, int num_temporal_layers);
26   ~ScalabilityStructureKeySvc() override;
27 
28   StreamLayersConfig StreamConfig() const override;
29 
30   std::vector<LayerFrameConfig> NextFrameConfig(bool restart) override;
31   GenericFrameInfo OnEncodeDone(const LayerFrameConfig& config) override;
32   void OnRatesUpdated(const VideoBitrateAllocation& bitrates) override;
33 
34  private:
35   enum FramePattern : int {
36     kNone,
37     kKey,
38     kDeltaT0,
39     kDeltaT2A,
40     kDeltaT1,
41     kDeltaT2B,
42   };
43   static constexpr int kMaxNumSpatialLayers = 3;
44   static constexpr int kMaxNumTemporalLayers = 3;
45 
46   // Index of the buffer to store last frame for layer (`sid`, `tid`)
BufferIndex(int sid,int tid)47   int BufferIndex(int sid, int tid) const {
48     return tid * num_spatial_layers_ + sid;
49   }
DecodeTargetIsActive(int sid,int tid)50   bool DecodeTargetIsActive(int sid, int tid) const {
51     return active_decode_targets_[sid * num_temporal_layers_ + tid];
52   }
SetDecodeTargetIsActive(int sid,int tid,bool value)53   void SetDecodeTargetIsActive(int sid, int tid, bool value) {
54     active_decode_targets_.set(sid * num_temporal_layers_ + tid, value);
55   }
56   bool TemporalLayerIsActive(int tid) const;
57   static DecodeTargetIndication Dti(int sid,
58                                     int tid,
59                                     const LayerFrameConfig& config);
60 
61   std::vector<LayerFrameConfig> KeyframeConfig();
62   std::vector<LayerFrameConfig> T0Config();
63   std::vector<LayerFrameConfig> T1Config();
64   std::vector<LayerFrameConfig> T2Config(FramePattern pattern);
65 
66   FramePattern NextPattern(FramePattern last_pattern) const;
67 
68   const int num_spatial_layers_;
69   const int num_temporal_layers_;
70 
71   FramePattern last_pattern_ = kNone;
72   std::bitset<kMaxNumSpatialLayers> spatial_id_is_enabled_;
73   std::bitset<kMaxNumSpatialLayers> can_reference_t1_frame_for_spatial_id_;
74   std::bitset<32> active_decode_targets_;
75 };
76 
77 // S1  0--0--0-
78 //     |       ...
79 // S0  0--0--0-
80 class ScalabilityStructureL2T1Key : public ScalabilityStructureKeySvc {
81  public:
ScalabilityStructureL2T1Key()82   ScalabilityStructureL2T1Key() : ScalabilityStructureKeySvc(2, 1) {}
83   ~ScalabilityStructureL2T1Key() override;
84 
85   FrameDependencyStructure DependencyStructure() const override;
86 };
87 
88 // S1T1     0   0
89 //         /   /   /
90 // S1T0   0---0---0
91 //        |         ...
92 // S0T1   | 0   0
93 //        |/   /   /
94 // S0T0   0---0---0
95 // Time-> 0 1 2 3 4
96 class ScalabilityStructureL2T2Key : public ScalabilityStructureKeySvc {
97  public:
ScalabilityStructureL2T2Key()98   ScalabilityStructureL2T2Key() : ScalabilityStructureKeySvc(2, 2) {}
99   ~ScalabilityStructureL2T2Key() override;
100 
101   FrameDependencyStructure DependencyStructure() const override;
102 };
103 
104 class ScalabilityStructureL2T3Key : public ScalabilityStructureKeySvc {
105  public:
ScalabilityStructureL2T3Key()106   ScalabilityStructureL2T3Key() : ScalabilityStructureKeySvc(2, 3) {}
107   ~ScalabilityStructureL2T3Key() override;
108 
109   FrameDependencyStructure DependencyStructure() const override;
110 };
111 
112 class ScalabilityStructureL3T1Key : public ScalabilityStructureKeySvc {
113  public:
ScalabilityStructureL3T1Key()114   ScalabilityStructureL3T1Key() : ScalabilityStructureKeySvc(3, 1) {}
115   ~ScalabilityStructureL3T1Key() override;
116 
117   FrameDependencyStructure DependencyStructure() const override;
118 };
119 
120 class ScalabilityStructureL3T2Key : public ScalabilityStructureKeySvc {
121  public:
ScalabilityStructureL3T2Key()122   ScalabilityStructureL3T2Key() : ScalabilityStructureKeySvc(3, 2) {}
123   ~ScalabilityStructureL3T2Key() override;
124 
125   FrameDependencyStructure DependencyStructure() const override;
126 };
127 
128 class ScalabilityStructureL3T3Key : public ScalabilityStructureKeySvc {
129  public:
ScalabilityStructureL3T3Key()130   ScalabilityStructureL3T3Key() : ScalabilityStructureKeySvc(3, 3) {}
131   ~ScalabilityStructureL3T3Key() override;
132 
133   FrameDependencyStructure DependencyStructure() const override;
134 };
135 
136 }  // namespace webrtc
137 
138 #endif  // MODULES_VIDEO_CODING_SVC_SCALABILITY_STRUCTURE_KEY_SVC_H_
139