DefaultCodecPreferences.h (7491B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ 6 7 #ifndef DOM_MEDIA_WEBRTC_JSAPI_DEFAULTCODECPREFERENCES_H_ 8 #define DOM_MEDIA_WEBRTC_JSAPI_DEFAULTCODECPREFERENCES_H_ 9 10 #include "jsep/JsepCodecDescription.h" 11 #include "mozilla/Preferences.h" 12 13 namespace mozilla { 14 15 enum class OverrideRtxPreference { 16 NoOverride, 17 OverrideWithEnabled, 18 OverrideWithDisabled, 19 }; 20 21 class DefaultCodecPreferences final : public JsepCodecPreferences { 22 public: 23 explicit DefaultCodecPreferences( 24 const OverrideRtxPreference aOverrideRtxPreference) 25 : mOverrideRtxEnabled(aOverrideRtxPreference) {} 26 27 bool AV1Enabled() const override { return mAV1Enabled; } 28 bool AV1Preferred() const override { return mAV1Preferred; } 29 bool H264Enabled() const override { return mH264Enabled; } 30 31 bool SoftwareH264Enabled() const override { return mSoftwareH264Enabled; } 32 bool HardwareH264Enabled() const { return mHardwareH264Enabled; } 33 34 bool SendingH264PacketizationModeZeroSupported() const override { 35 return mSendingH264PacketizationModeZeroSupported; 36 } 37 38 bool H264BaselineDisabled() const override { return mH264BaselineDisabled; } 39 40 int32_t H264Level() const override { return mH264Level; } 41 42 int32_t H264MaxBr() const override { return mH264MaxBr; } 43 44 int32_t H264MaxMbps() const override { return mH264MaxMbps; } 45 46 bool VP9Enabled() const override { return mVP9Enabled; } 47 48 bool VP9Preferred() const override { return mVP9Preferred; } 49 50 int32_t VP8MaxFs() const override { return mVP8MaxFs; } 51 52 int32_t VP8MaxFr() const override { return mVP8MaxFr; } 53 54 bool UseTmmbr() const override { return mUseTmmbr; } 55 56 bool UseRemb() const override { return mUseRemb; } 57 58 bool UseRtx() const override { 59 if (mOverrideRtxEnabled == OverrideRtxPreference::NoOverride) { 60 return mUseRtx; 61 } 62 return mOverrideRtxEnabled == OverrideRtxPreference::OverrideWithEnabled; 63 } 64 65 bool UseTransportCC() const override { return mUseTransportCC; } 66 67 bool UseAudioFec() const override { return mUseAudioFec; } 68 69 bool RedUlpfecEnabled() const override { return mRedUlpfecEnabled; } 70 71 static bool AV1EnabledStatic(); 72 73 static bool AV1PreferredStatic(); 74 75 static bool H264EnabledStatic(); 76 77 static bool SoftwareH264EnabledStatic(); 78 79 static bool HardwareH264EnabledStatic(); 80 81 static bool SendingH264PacketizationModeZeroSupportedStatic(); 82 83 static constexpr bool kDefaultH264BaselineDisabled = false; 84 static bool H264BaselineDisabledStatic() { 85 return Preferences::GetBool("media.navigator.video.disable_h264_baseline", 86 kDefaultH264BaselineDisabled); 87 } 88 89 // minimum suggested for WebRTC spec 90 static constexpr int32_t kDefaultH264Level = 31; 91 static int32_t H264LevelStatic() { 92 auto value = Preferences::GetInt("media.navigator.video.h264.level", 93 kDefaultH264Level); 94 if (value < 0) { 95 return kDefaultH264Level; 96 } 97 return value & 0xFF; 98 } 99 100 static constexpr int32_t kDefaultH264MaxBr = 0; // Unlimited 101 static int32_t H264MaxBrStatic() { 102 const auto maxBr = Preferences::GetInt("media.navigator.video.h264.max_br", 103 kDefaultH264MaxBr); 104 if (maxBr < 0) { 105 return kDefaultH264MaxBr; 106 } 107 return maxBr; 108 } 109 110 static constexpr int32_t kDefaultH264MaxMbps = 0; // Unlimited 111 static int32_t H264MaxMbpsStatic() { 112 const auto maxMbps = Preferences::GetInt( 113 "media.navigator.video.h264.max_mbps", kDefaultH264MaxMbps); 114 if (maxMbps < 0) { 115 return kDefaultH264MaxMbps; 116 } 117 return maxMbps; 118 } 119 120 static constexpr bool kDefaultVP9Enabled = true; 121 static bool VP9EnabledStatic() { 122 return Preferences::GetBool("media.peerconnection.video.vp9_enabled", 123 kDefaultVP9Enabled); 124 } 125 126 static constexpr bool kDefaultVP9Preferred = false; 127 static bool VP9PreferredStatic() { 128 return Preferences::GetBool("media.peerconnection.video.vp9_preferred", 129 kDefaultVP9Preferred); 130 } 131 132 static constexpr int32_t kDefaultVP8MaxFs = 12288; // Enough for 2048x1536 133 static int32_t VP8MaxFsStatic() { 134 auto value = 135 Preferences::GetInt("media.navigator.video.max_fs", kDefaultVP8MaxFs); 136 if (value <= 0) { 137 return kDefaultVP8MaxFs; 138 } 139 return value; 140 } 141 142 static constexpr int32_t kDefaultVP8MaxFr = 60; 143 static int32_t VP8MaxFrStatic() { 144 auto value = 145 Preferences::GetInt("media.navigator.video.max_fr", kDefaultVP8MaxFr); 146 if (value <= kDefaultVP8MaxFr) { 147 return 60; 148 } 149 return value; 150 } 151 152 static constexpr bool kDefaultUseTmmbr = false; 153 static bool UseTmmbrStatic() { 154 return Preferences::GetBool("media.navigator.video.use_tmmbr", 155 kDefaultUseTmmbr); 156 } 157 158 static constexpr bool kDefaultUseRemb = true; 159 static bool UseRembStatic() { 160 return Preferences::GetBool("media.navigator.video.use_remb", 161 kDefaultUseRemb); 162 } 163 164 static constexpr bool kDefaultUseRtx = true; 165 static bool UseRtxStatic() { 166 return Preferences::GetBool("media.peerconnection.video.use_rtx", 167 kDefaultUseRtx); 168 } 169 170 static constexpr bool kDefaultUseTransportCC = true; 171 static bool UseTransportCCStatic() { 172 return Preferences::GetBool("media.navigator.video.use_transport_cc", 173 kDefaultUseTransportCC); 174 } 175 176 static constexpr bool kDefaultUseAudioFec = true; 177 static bool UseAudioFecStatic() { 178 return Preferences::GetBool("media.navigator.audio.use_fec", 179 kDefaultUseAudioFec); 180 } 181 182 static constexpr bool kDefaultRedUlpfecEnabled = true; 183 static bool RedUlpfecEnabledStatic() { 184 return Preferences::GetBool("media.navigator.video.red_ulpfec_enabled", 185 kDefaultRedUlpfecEnabled); 186 } 187 188 // This is to accommodate the behavior of 189 // RTCRtpTransceiver::SetCodecPreferences 190 const OverrideRtxPreference mOverrideRtxEnabled = 191 OverrideRtxPreference::NoOverride; 192 193 const bool mAV1Enabled = AV1EnabledStatic(); 194 const bool mAV1Preferred = AV1PreferredStatic(); 195 const bool mH264Enabled = H264EnabledStatic(); 196 const bool mSoftwareH264Enabled = SoftwareH264EnabledStatic(); 197 const bool mHardwareH264Enabled = HardwareH264EnabledStatic(); 198 const bool mSendingH264PacketizationModeZeroSupported = 199 SendingH264PacketizationModeZeroSupportedStatic(); 200 const bool mH264BaselineDisabled = H264BaselineDisabledStatic(); 201 const int32_t mH264Level = H264LevelStatic(); 202 const int32_t mH264MaxBr = H264MaxBrStatic(); 203 const int32_t mH264MaxMbps = H264MaxMbpsStatic(); 204 const bool mVP9Enabled = VP9EnabledStatic(); 205 const bool mVP9Preferred = VP9PreferredStatic(); 206 const int32_t mVP8MaxFs = VP8MaxFsStatic(); 207 const int32_t mVP8MaxFr = VP8MaxFrStatic(); 208 const bool mUseTmmbr = UseTmmbrStatic(); 209 const bool mUseRemb = UseRembStatic(); 210 const bool mUseRtx = UseRtxStatic(); 211 const bool mUseTransportCC = UseTransportCCStatic(); 212 const bool mUseAudioFec = UseAudioFecStatic(); 213 const bool mRedUlpfecEnabled = RedUlpfecEnabledStatic(); 214 }; 215 } // namespace mozilla 216 #endif // DOM_MEDIA_WEBRTC_JSAPI_DEFAULTCODECPREFERENCES_H_