• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2018 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 
11 #ifndef API_VIDEO_CODECS_VIDEO_CODEC_H_
12 #define API_VIDEO_CODECS_VIDEO_CODEC_H_
13 
14 #include <stddef.h>
15 #include <stdint.h>
16 
17 #include <string>
18 
19 #include "absl/strings/string_view.h"
20 #include "api/video/video_bitrate_allocation.h"
21 #include "api/video/video_codec_type.h"
22 #include "api/video_codecs/scalability_mode.h"
23 #include "api/video_codecs/simulcast_stream.h"
24 #include "api/video_codecs/spatial_layer.h"
25 #include "rtc_base/system/rtc_export.h"
26 
27 namespace webrtc {
28 
29 // The VideoCodec class represents an old defacto-apis, which we're migrating
30 // away from slowly.
31 
32 // Video codec
33 enum class VideoCodecComplexity {
34   kComplexityLow = -1,
35   kComplexityNormal = 0,
36   kComplexityHigh = 1,
37   kComplexityHigher = 2,
38   kComplexityMax = 3
39 };
40 
41 // VP8 specific
42 struct VideoCodecVP8 {
43   bool operator==(const VideoCodecVP8& other) const;
44   bool operator!=(const VideoCodecVP8& other) const {
45     return !(*this == other);
46   }
47   // Temporary utility method for transition deleting numberOfTemporalLayers
48   // setting (replaced by ScalabilityMode).
SetNumberOfTemporalLayersVideoCodecVP849   void SetNumberOfTemporalLayers(unsigned char n) {
50     numberOfTemporalLayers = n;
51   }
52   unsigned char numberOfTemporalLayers;
53   bool denoisingOn;
54   bool automaticResizeOn;
55   int keyFrameInterval;
56 };
57 
58 enum class InterLayerPredMode : int {
59   kOff = 0,      // Inter-layer prediction is disabled.
60   kOn = 1,       // Inter-layer prediction is enabled.
61   kOnKeyPic = 2  // Inter-layer prediction is enabled but limited to key frames.
62 };
63 
64 // VP9 specific.
65 struct VideoCodecVP9 {
66   bool operator==(const VideoCodecVP9& other) const;
67   bool operator!=(const VideoCodecVP9& other) const {
68     return !(*this == other);
69   }
70   // Temporary utility method for transition deleting numberOfTemporalLayers
71   // setting (replaced by ScalabilityMode).
SetNumberOfTemporalLayersVideoCodecVP972   void SetNumberOfTemporalLayers(unsigned char n) {
73     numberOfTemporalLayers = n;
74   }
75   unsigned char numberOfTemporalLayers;
76   bool denoisingOn;
77   int keyFrameInterval;
78   bool adaptiveQpMode;
79   bool automaticResizeOn;
80   unsigned char numberOfSpatialLayers;
81   bool flexibleMode;
82   InterLayerPredMode interLayerPred;
83 };
84 
85 // H264 specific.
86 struct VideoCodecH264 {
87   bool operator==(const VideoCodecH264& other) const;
88   bool operator!=(const VideoCodecH264& other) const {
89     return !(*this == other);
90   }
91   // Temporary utility method for transition deleting numberOfTemporalLayers
92   // setting (replaced by ScalabilityMode).
SetNumberOfTemporalLayersVideoCodecH26493   void SetNumberOfTemporalLayers(unsigned char n) {
94     numberOfTemporalLayers = n;
95   }
96   int keyFrameInterval;
97   uint8_t numberOfTemporalLayers;
98 };
99 
100 // Translates from name of codec to codec type and vice versa.
101 RTC_EXPORT const char* CodecTypeToPayloadString(VideoCodecType type);
102 RTC_EXPORT VideoCodecType PayloadStringToCodecType(const std::string& name);
103 
104 union VideoCodecUnion {
105   VideoCodecVP8 VP8;
106   VideoCodecVP9 VP9;
107   VideoCodecH264 H264;
108 };
109 
110 enum class VideoCodecMode { kRealtimeVideo, kScreensharing };
111 
112 // Common video codec properties
113 class RTC_EXPORT VideoCodec {
114  public:
115   VideoCodec();
116 
117   // Scalability mode as described in
118   // https://www.w3.org/TR/webrtc-svc/#scalabilitymodes*
GetScalabilityMode()119   absl::optional<ScalabilityMode> GetScalabilityMode() const {
120     return scalability_mode_;
121   }
SetScalabilityMode(ScalabilityMode scalability_mode)122   void SetScalabilityMode(ScalabilityMode scalability_mode) {
123     scalability_mode_ = scalability_mode;
124   }
UnsetScalabilityMode()125   void UnsetScalabilityMode() { scalability_mode_ = absl::nullopt; }
126 
127   VideoCodecComplexity GetVideoEncoderComplexity() const;
128   void SetVideoEncoderComplexity(VideoCodecComplexity complexity_setting);
129 
130   bool GetFrameDropEnabled() const;
131   void SetFrameDropEnabled(bool enabled);
132 
133   // Public variables. TODO(hta): Make them private with accessors.
134   VideoCodecType codecType;
135 
136   // TODO(nisse): Change to int, for consistency.
137   uint16_t width;
138   uint16_t height;
139 
140   unsigned int startBitrate;  // kilobits/sec.
141   unsigned int maxBitrate;    // kilobits/sec.
142   unsigned int minBitrate;    // kilobits/sec.
143 
144   uint32_t maxFramerate;
145 
146   // This enables/disables encoding and sending when there aren't multiple
147   // simulcast streams,by allocating 0 bitrate if inactive.
148   bool active;
149 
150   unsigned int qpMax;
151   unsigned char numberOfSimulcastStreams;
152   SimulcastStream simulcastStream[kMaxSimulcastStreams];
153   SpatialLayer spatialLayers[kMaxSpatialLayers];
154 
155   VideoCodecMode mode;
156   bool expect_encode_from_texture;
157 
158   // Timing frames configuration. There is delay of delay_ms between two
159   // consequent timing frames, excluding outliers. Frame is always made a
160   // timing frame if it's at least outlier_ratio in percent of "ideal" average
161   // frame given bitrate and framerate, i.e. if it's bigger than
162   // |outlier_ratio / 100.0 * bitrate_bps / fps| in bits. This way, timing
163   // frames will not be sent too often usually. Yet large frames will always
164   // have timing information for debug purposes because they are more likely to
165   // cause extra delays.
166   struct TimingFrameTriggerThresholds {
167     int64_t delay_ms;
168     uint16_t outlier_ratio_percent;
169   } timing_frame_thresholds;
170 
171   // Legacy Google conference mode flag for simulcast screenshare
172   bool legacy_conference_mode;
173 
174   bool operator==(const VideoCodec& other) const = delete;
175   bool operator!=(const VideoCodec& other) const = delete;
176 
177   // Accessors for codec specific information.
178   // There is a const version of each that returns a reference,
179   // and a non-const version that returns a pointer, in order
180   // to allow modification of the parameters.
181   VideoCodecVP8* VP8();
182   const VideoCodecVP8& VP8() const;
183   VideoCodecVP9* VP9();
184   const VideoCodecVP9& VP9() const;
185   VideoCodecH264* H264();
186   const VideoCodecH264& H264() const;
187 
188  private:
189   // TODO(hta): Consider replacing the union with a pointer type.
190   // This will allow removing the VideoCodec* types from this file.
191   VideoCodecUnion codec_specific_;
192   absl::optional<ScalabilityMode> scalability_mode_;
193   // 'complexity_' indicates the CPU capability of the client. It's used to
194   // determine encoder CPU complexity (e.g., cpu_used for VP8, VP9. and AV1).
195   VideoCodecComplexity complexity_;
196   bool frame_drop_enabled_ = false;
197 };
198 
199 }  // namespace webrtc
200 #endif  // API_VIDEO_CODECS_VIDEO_CODEC_H_
201