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