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