tor-browser

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

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_