tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_