xref: /aosp_15_r20/external/webrtc/api/video_codecs/video_encoder.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2017 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 #include "api/video_codecs/video_encoder.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <string.h>
14*d9f75844SAndroid Build Coastguard Worker #include <algorithm>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/strings/string_builder.h"
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker // TODO(mflodman): Add default complexity for VP9 and VP9.
GetDefaultVp8Settings()22*d9f75844SAndroid Build Coastguard Worker VideoCodecVP8 VideoEncoder::GetDefaultVp8Settings() {
23*d9f75844SAndroid Build Coastguard Worker   VideoCodecVP8 vp8_settings;
24*d9f75844SAndroid Build Coastguard Worker   memset(&vp8_settings, 0, sizeof(vp8_settings));
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker   vp8_settings.numberOfTemporalLayers = 1;
27*d9f75844SAndroid Build Coastguard Worker   vp8_settings.denoisingOn = true;
28*d9f75844SAndroid Build Coastguard Worker   vp8_settings.automaticResizeOn = false;
29*d9f75844SAndroid Build Coastguard Worker   vp8_settings.keyFrameInterval = 3000;
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker   return vp8_settings;
32*d9f75844SAndroid Build Coastguard Worker }
33*d9f75844SAndroid Build Coastguard Worker 
GetDefaultVp9Settings()34*d9f75844SAndroid Build Coastguard Worker VideoCodecVP9 VideoEncoder::GetDefaultVp9Settings() {
35*d9f75844SAndroid Build Coastguard Worker   VideoCodecVP9 vp9_settings;
36*d9f75844SAndroid Build Coastguard Worker   memset(&vp9_settings, 0, sizeof(vp9_settings));
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker   vp9_settings.numberOfTemporalLayers = 1;
39*d9f75844SAndroid Build Coastguard Worker   vp9_settings.denoisingOn = true;
40*d9f75844SAndroid Build Coastguard Worker   vp9_settings.keyFrameInterval = 3000;
41*d9f75844SAndroid Build Coastguard Worker   vp9_settings.adaptiveQpMode = true;
42*d9f75844SAndroid Build Coastguard Worker   vp9_settings.automaticResizeOn = true;
43*d9f75844SAndroid Build Coastguard Worker   vp9_settings.numberOfSpatialLayers = 1;
44*d9f75844SAndroid Build Coastguard Worker   vp9_settings.flexibleMode = false;
45*d9f75844SAndroid Build Coastguard Worker   vp9_settings.interLayerPred = InterLayerPredMode::kOn;
46*d9f75844SAndroid Build Coastguard Worker 
47*d9f75844SAndroid Build Coastguard Worker   return vp9_settings;
48*d9f75844SAndroid Build Coastguard Worker }
49*d9f75844SAndroid Build Coastguard Worker 
GetDefaultH264Settings()50*d9f75844SAndroid Build Coastguard Worker VideoCodecH264 VideoEncoder::GetDefaultH264Settings() {
51*d9f75844SAndroid Build Coastguard Worker   VideoCodecH264 h264_settings;
52*d9f75844SAndroid Build Coastguard Worker   memset(&h264_settings, 0, sizeof(h264_settings));
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker   h264_settings.keyFrameInterval = 3000;
55*d9f75844SAndroid Build Coastguard Worker   h264_settings.numberOfTemporalLayers = 1;
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker   return h264_settings;
58*d9f75844SAndroid Build Coastguard Worker }
59*d9f75844SAndroid Build Coastguard Worker 
60*d9f75844SAndroid Build Coastguard Worker VideoEncoder::ScalingSettings::ScalingSettings() = default;
61*d9f75844SAndroid Build Coastguard Worker 
ScalingSettings(KOff)62*d9f75844SAndroid Build Coastguard Worker VideoEncoder::ScalingSettings::ScalingSettings(KOff) : ScalingSettings() {}
63*d9f75844SAndroid Build Coastguard Worker 
ScalingSettings(int low,int high)64*d9f75844SAndroid Build Coastguard Worker VideoEncoder::ScalingSettings::ScalingSettings(int low, int high)
65*d9f75844SAndroid Build Coastguard Worker     : thresholds(QpThresholds(low, high)) {}
66*d9f75844SAndroid Build Coastguard Worker 
ScalingSettings(int low,int high,int min_pixels)67*d9f75844SAndroid Build Coastguard Worker VideoEncoder::ScalingSettings::ScalingSettings(int low,
68*d9f75844SAndroid Build Coastguard Worker                                                int high,
69*d9f75844SAndroid Build Coastguard Worker                                                int min_pixels)
70*d9f75844SAndroid Build Coastguard Worker     : thresholds(QpThresholds(low, high)), min_pixels_per_frame(min_pixels) {}
71*d9f75844SAndroid Build Coastguard Worker 
72*d9f75844SAndroid Build Coastguard Worker VideoEncoder::ScalingSettings::ScalingSettings(const ScalingSettings&) =
73*d9f75844SAndroid Build Coastguard Worker     default;
74*d9f75844SAndroid Build Coastguard Worker 
~ScalingSettings()75*d9f75844SAndroid Build Coastguard Worker VideoEncoder::ScalingSettings::~ScalingSettings() {}
76*d9f75844SAndroid Build Coastguard Worker 
77*d9f75844SAndroid Build Coastguard Worker // static
78*d9f75844SAndroid Build Coastguard Worker constexpr VideoEncoder::ScalingSettings::KOff
79*d9f75844SAndroid Build Coastguard Worker     VideoEncoder::ScalingSettings::kOff;
80*d9f75844SAndroid Build Coastguard Worker // static
81*d9f75844SAndroid Build Coastguard Worker constexpr uint8_t VideoEncoder::EncoderInfo::kMaxFramerateFraction;
82*d9f75844SAndroid Build Coastguard Worker 
operator ==(const ResolutionBitrateLimits & rhs) const83*d9f75844SAndroid Build Coastguard Worker bool VideoEncoder::ResolutionBitrateLimits::operator==(
84*d9f75844SAndroid Build Coastguard Worker     const ResolutionBitrateLimits& rhs) const {
85*d9f75844SAndroid Build Coastguard Worker   return frame_size_pixels == rhs.frame_size_pixels &&
86*d9f75844SAndroid Build Coastguard Worker          min_start_bitrate_bps == rhs.min_start_bitrate_bps &&
87*d9f75844SAndroid Build Coastguard Worker          min_bitrate_bps == rhs.min_bitrate_bps &&
88*d9f75844SAndroid Build Coastguard Worker          max_bitrate_bps == rhs.max_bitrate_bps;
89*d9f75844SAndroid Build Coastguard Worker }
90*d9f75844SAndroid Build Coastguard Worker 
EncoderInfo()91*d9f75844SAndroid Build Coastguard Worker VideoEncoder::EncoderInfo::EncoderInfo()
92*d9f75844SAndroid Build Coastguard Worker     : scaling_settings(VideoEncoder::ScalingSettings::kOff),
93*d9f75844SAndroid Build Coastguard Worker       requested_resolution_alignment(1),
94*d9f75844SAndroid Build Coastguard Worker       apply_alignment_to_all_simulcast_layers(false),
95*d9f75844SAndroid Build Coastguard Worker       supports_native_handle(false),
96*d9f75844SAndroid Build Coastguard Worker       implementation_name("unknown"),
97*d9f75844SAndroid Build Coastguard Worker       has_trusted_rate_controller(false),
98*d9f75844SAndroid Build Coastguard Worker       is_hardware_accelerated(true),
99*d9f75844SAndroid Build Coastguard Worker       fps_allocation{absl::InlinedVector<uint8_t, kMaxTemporalStreams>(
100*d9f75844SAndroid Build Coastguard Worker           1,
101*d9f75844SAndroid Build Coastguard Worker           kMaxFramerateFraction)},
102*d9f75844SAndroid Build Coastguard Worker       supports_simulcast(false),
103*d9f75844SAndroid Build Coastguard Worker       preferred_pixel_formats{VideoFrameBuffer::Type::kI420} {}
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker VideoEncoder::EncoderInfo::EncoderInfo(const EncoderInfo&) = default;
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker VideoEncoder::EncoderInfo::~EncoderInfo() = default;
108*d9f75844SAndroid Build Coastguard Worker 
ToString() const109*d9f75844SAndroid Build Coastguard Worker std::string VideoEncoder::EncoderInfo::ToString() const {
110*d9f75844SAndroid Build Coastguard Worker   char string_buf[2048];
111*d9f75844SAndroid Build Coastguard Worker   rtc::SimpleStringBuilder oss(string_buf);
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker   oss << "EncoderInfo { "
114*d9f75844SAndroid Build Coastguard Worker          "ScalingSettings { ";
115*d9f75844SAndroid Build Coastguard Worker   if (scaling_settings.thresholds) {
116*d9f75844SAndroid Build Coastguard Worker     oss << "Thresholds { "
117*d9f75844SAndroid Build Coastguard Worker            "low = "
118*d9f75844SAndroid Build Coastguard Worker         << scaling_settings.thresholds->low
119*d9f75844SAndroid Build Coastguard Worker         << ", high = " << scaling_settings.thresholds->high << "}, ";
120*d9f75844SAndroid Build Coastguard Worker   }
121*d9f75844SAndroid Build Coastguard Worker   oss << "min_pixels_per_frame = " << scaling_settings.min_pixels_per_frame
122*d9f75844SAndroid Build Coastguard Worker       << " }";
123*d9f75844SAndroid Build Coastguard Worker   oss << ", requested_resolution_alignment = " << requested_resolution_alignment
124*d9f75844SAndroid Build Coastguard Worker       << ", apply_alignment_to_all_simulcast_layers = "
125*d9f75844SAndroid Build Coastguard Worker       << apply_alignment_to_all_simulcast_layers
126*d9f75844SAndroid Build Coastguard Worker       << ", supports_native_handle = " << supports_native_handle
127*d9f75844SAndroid Build Coastguard Worker       << ", implementation_name = '" << implementation_name
128*d9f75844SAndroid Build Coastguard Worker       << "'"
129*d9f75844SAndroid Build Coastguard Worker          ", has_trusted_rate_controller = "
130*d9f75844SAndroid Build Coastguard Worker       << has_trusted_rate_controller
131*d9f75844SAndroid Build Coastguard Worker       << ", is_hardware_accelerated = " << is_hardware_accelerated
132*d9f75844SAndroid Build Coastguard Worker       << ", fps_allocation = [";
133*d9f75844SAndroid Build Coastguard Worker   size_t num_spatial_layer_with_fps_allocation = 0;
134*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < kMaxSpatialLayers; ++i) {
135*d9f75844SAndroid Build Coastguard Worker     if (!fps_allocation[i].empty()) {
136*d9f75844SAndroid Build Coastguard Worker       num_spatial_layer_with_fps_allocation = i + 1;
137*d9f75844SAndroid Build Coastguard Worker     }
138*d9f75844SAndroid Build Coastguard Worker   }
139*d9f75844SAndroid Build Coastguard Worker   bool first = true;
140*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < num_spatial_layer_with_fps_allocation; ++i) {
141*d9f75844SAndroid Build Coastguard Worker     if (fps_allocation[i].empty()) {
142*d9f75844SAndroid Build Coastguard Worker       break;
143*d9f75844SAndroid Build Coastguard Worker     }
144*d9f75844SAndroid Build Coastguard Worker     if (!first) {
145*d9f75844SAndroid Build Coastguard Worker       oss << ", ";
146*d9f75844SAndroid Build Coastguard Worker     }
147*d9f75844SAndroid Build Coastguard Worker     const absl::InlinedVector<uint8_t, kMaxTemporalStreams>& fractions =
148*d9f75844SAndroid Build Coastguard Worker         fps_allocation[i];
149*d9f75844SAndroid Build Coastguard Worker     if (!fractions.empty()) {
150*d9f75844SAndroid Build Coastguard Worker       first = false;
151*d9f75844SAndroid Build Coastguard Worker       oss << "[ ";
152*d9f75844SAndroid Build Coastguard Worker       for (size_t i = 0; i < fractions.size(); ++i) {
153*d9f75844SAndroid Build Coastguard Worker         if (i > 0) {
154*d9f75844SAndroid Build Coastguard Worker           oss << ", ";
155*d9f75844SAndroid Build Coastguard Worker         }
156*d9f75844SAndroid Build Coastguard Worker         oss << (static_cast<double>(fractions[i]) / kMaxFramerateFraction);
157*d9f75844SAndroid Build Coastguard Worker       }
158*d9f75844SAndroid Build Coastguard Worker       oss << "] ";
159*d9f75844SAndroid Build Coastguard Worker     }
160*d9f75844SAndroid Build Coastguard Worker   }
161*d9f75844SAndroid Build Coastguard Worker   oss << "]";
162*d9f75844SAndroid Build Coastguard Worker   oss << ", resolution_bitrate_limits = [";
163*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < resolution_bitrate_limits.size(); ++i) {
164*d9f75844SAndroid Build Coastguard Worker     if (i > 0) {
165*d9f75844SAndroid Build Coastguard Worker       oss << ", ";
166*d9f75844SAndroid Build Coastguard Worker     }
167*d9f75844SAndroid Build Coastguard Worker     ResolutionBitrateLimits l = resolution_bitrate_limits[i];
168*d9f75844SAndroid Build Coastguard Worker     oss << "Limits { "
169*d9f75844SAndroid Build Coastguard Worker            "frame_size_pixels = "
170*d9f75844SAndroid Build Coastguard Worker         << l.frame_size_pixels
171*d9f75844SAndroid Build Coastguard Worker         << ", min_start_bitrate_bps = " << l.min_start_bitrate_bps
172*d9f75844SAndroid Build Coastguard Worker         << ", min_bitrate_bps = " << l.min_bitrate_bps
173*d9f75844SAndroid Build Coastguard Worker         << ", max_bitrate_bps = " << l.max_bitrate_bps << "} ";
174*d9f75844SAndroid Build Coastguard Worker   }
175*d9f75844SAndroid Build Coastguard Worker   oss << "] "
176*d9f75844SAndroid Build Coastguard Worker          ", supports_simulcast = "
177*d9f75844SAndroid Build Coastguard Worker       << supports_simulcast;
178*d9f75844SAndroid Build Coastguard Worker   oss << ", preferred_pixel_formats = [";
179*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < preferred_pixel_formats.size(); ++i) {
180*d9f75844SAndroid Build Coastguard Worker     if (i > 0)
181*d9f75844SAndroid Build Coastguard Worker       oss << ", ";
182*d9f75844SAndroid Build Coastguard Worker     oss << VideoFrameBufferTypeToString(preferred_pixel_formats.at(i));
183*d9f75844SAndroid Build Coastguard Worker   }
184*d9f75844SAndroid Build Coastguard Worker   oss << "]";
185*d9f75844SAndroid Build Coastguard Worker   if (is_qp_trusted.has_value()) {
186*d9f75844SAndroid Build Coastguard Worker     oss << ", is_qp_trusted = " << is_qp_trusted.value();
187*d9f75844SAndroid Build Coastguard Worker   }
188*d9f75844SAndroid Build Coastguard Worker   oss << "}";
189*d9f75844SAndroid Build Coastguard Worker   return oss.str();
190*d9f75844SAndroid Build Coastguard Worker }
191*d9f75844SAndroid Build Coastguard Worker 
operator ==(const EncoderInfo & rhs) const192*d9f75844SAndroid Build Coastguard Worker bool VideoEncoder::EncoderInfo::operator==(const EncoderInfo& rhs) const {
193*d9f75844SAndroid Build Coastguard Worker   if (scaling_settings.thresholds.has_value() !=
194*d9f75844SAndroid Build Coastguard Worker       rhs.scaling_settings.thresholds.has_value()) {
195*d9f75844SAndroid Build Coastguard Worker     return false;
196*d9f75844SAndroid Build Coastguard Worker   }
197*d9f75844SAndroid Build Coastguard Worker   if (scaling_settings.thresholds.has_value()) {
198*d9f75844SAndroid Build Coastguard Worker     QpThresholds l = *scaling_settings.thresholds;
199*d9f75844SAndroid Build Coastguard Worker     QpThresholds r = *rhs.scaling_settings.thresholds;
200*d9f75844SAndroid Build Coastguard Worker     if (l.low != r.low || l.high != r.high) {
201*d9f75844SAndroid Build Coastguard Worker       return false;
202*d9f75844SAndroid Build Coastguard Worker     }
203*d9f75844SAndroid Build Coastguard Worker   }
204*d9f75844SAndroid Build Coastguard Worker   if (scaling_settings.min_pixels_per_frame !=
205*d9f75844SAndroid Build Coastguard Worker       rhs.scaling_settings.min_pixels_per_frame) {
206*d9f75844SAndroid Build Coastguard Worker     return false;
207*d9f75844SAndroid Build Coastguard Worker   }
208*d9f75844SAndroid Build Coastguard Worker 
209*d9f75844SAndroid Build Coastguard Worker   if (supports_native_handle != rhs.supports_native_handle ||
210*d9f75844SAndroid Build Coastguard Worker       implementation_name != rhs.implementation_name ||
211*d9f75844SAndroid Build Coastguard Worker       has_trusted_rate_controller != rhs.has_trusted_rate_controller ||
212*d9f75844SAndroid Build Coastguard Worker       is_hardware_accelerated != rhs.is_hardware_accelerated) {
213*d9f75844SAndroid Build Coastguard Worker     return false;
214*d9f75844SAndroid Build Coastguard Worker   }
215*d9f75844SAndroid Build Coastguard Worker 
216*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < kMaxSpatialLayers; ++i) {
217*d9f75844SAndroid Build Coastguard Worker     if (fps_allocation[i] != rhs.fps_allocation[i]) {
218*d9f75844SAndroid Build Coastguard Worker       return false;
219*d9f75844SAndroid Build Coastguard Worker     }
220*d9f75844SAndroid Build Coastguard Worker   }
221*d9f75844SAndroid Build Coastguard Worker 
222*d9f75844SAndroid Build Coastguard Worker   if (resolution_bitrate_limits != rhs.resolution_bitrate_limits ||
223*d9f75844SAndroid Build Coastguard Worker       supports_simulcast != rhs.supports_simulcast) {
224*d9f75844SAndroid Build Coastguard Worker     return false;
225*d9f75844SAndroid Build Coastguard Worker   }
226*d9f75844SAndroid Build Coastguard Worker 
227*d9f75844SAndroid Build Coastguard Worker   return true;
228*d9f75844SAndroid Build Coastguard Worker }
229*d9f75844SAndroid Build Coastguard Worker 
230*d9f75844SAndroid Build Coastguard Worker absl::optional<VideoEncoder::ResolutionBitrateLimits>
GetEncoderBitrateLimitsForResolution(int frame_size_pixels) const231*d9f75844SAndroid Build Coastguard Worker VideoEncoder::EncoderInfo::GetEncoderBitrateLimitsForResolution(
232*d9f75844SAndroid Build Coastguard Worker     int frame_size_pixels) const {
233*d9f75844SAndroid Build Coastguard Worker   std::vector<ResolutionBitrateLimits> bitrate_limits =
234*d9f75844SAndroid Build Coastguard Worker       resolution_bitrate_limits;
235*d9f75844SAndroid Build Coastguard Worker 
236*d9f75844SAndroid Build Coastguard Worker   // Sort the list of bitrate limits by resolution.
237*d9f75844SAndroid Build Coastguard Worker   sort(bitrate_limits.begin(), bitrate_limits.end(),
238*d9f75844SAndroid Build Coastguard Worker        [](const ResolutionBitrateLimits& lhs,
239*d9f75844SAndroid Build Coastguard Worker           const ResolutionBitrateLimits& rhs) {
240*d9f75844SAndroid Build Coastguard Worker          return lhs.frame_size_pixels < rhs.frame_size_pixels;
241*d9f75844SAndroid Build Coastguard Worker        });
242*d9f75844SAndroid Build Coastguard Worker 
243*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < bitrate_limits.size(); ++i) {
244*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_GE(bitrate_limits[i].min_bitrate_bps, 0);
245*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_GE(bitrate_limits[i].min_start_bitrate_bps, 0);
246*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_GE(bitrate_limits[i].max_bitrate_bps,
247*d9f75844SAndroid Build Coastguard Worker                   bitrate_limits[i].min_bitrate_bps);
248*d9f75844SAndroid Build Coastguard Worker     if (i > 0) {
249*d9f75844SAndroid Build Coastguard Worker       // The bitrate limits aren't expected to decrease with resolution.
250*d9f75844SAndroid Build Coastguard Worker       RTC_DCHECK_GE(bitrate_limits[i].min_bitrate_bps,
251*d9f75844SAndroid Build Coastguard Worker                     bitrate_limits[i - 1].min_bitrate_bps);
252*d9f75844SAndroid Build Coastguard Worker       RTC_DCHECK_GE(bitrate_limits[i].min_start_bitrate_bps,
253*d9f75844SAndroid Build Coastguard Worker                     bitrate_limits[i - 1].min_start_bitrate_bps);
254*d9f75844SAndroid Build Coastguard Worker       RTC_DCHECK_GE(bitrate_limits[i].max_bitrate_bps,
255*d9f75844SAndroid Build Coastguard Worker                     bitrate_limits[i - 1].max_bitrate_bps);
256*d9f75844SAndroid Build Coastguard Worker     }
257*d9f75844SAndroid Build Coastguard Worker 
258*d9f75844SAndroid Build Coastguard Worker     if (bitrate_limits[i].frame_size_pixels >= frame_size_pixels) {
259*d9f75844SAndroid Build Coastguard Worker       return absl::optional<ResolutionBitrateLimits>(bitrate_limits[i]);
260*d9f75844SAndroid Build Coastguard Worker     }
261*d9f75844SAndroid Build Coastguard Worker   }
262*d9f75844SAndroid Build Coastguard Worker 
263*d9f75844SAndroid Build Coastguard Worker   return absl::nullopt;
264*d9f75844SAndroid Build Coastguard Worker }
265*d9f75844SAndroid Build Coastguard Worker 
RateControlParameters()266*d9f75844SAndroid Build Coastguard Worker VideoEncoder::RateControlParameters::RateControlParameters()
267*d9f75844SAndroid Build Coastguard Worker     : bitrate(VideoBitrateAllocation()),
268*d9f75844SAndroid Build Coastguard Worker       framerate_fps(0.0),
269*d9f75844SAndroid Build Coastguard Worker       bandwidth_allocation(DataRate::Zero()) {}
270*d9f75844SAndroid Build Coastguard Worker 
RateControlParameters(const VideoBitrateAllocation & bitrate,double framerate_fps)271*d9f75844SAndroid Build Coastguard Worker VideoEncoder::RateControlParameters::RateControlParameters(
272*d9f75844SAndroid Build Coastguard Worker     const VideoBitrateAllocation& bitrate,
273*d9f75844SAndroid Build Coastguard Worker     double framerate_fps)
274*d9f75844SAndroid Build Coastguard Worker     : bitrate(bitrate),
275*d9f75844SAndroid Build Coastguard Worker       framerate_fps(framerate_fps),
276*d9f75844SAndroid Build Coastguard Worker       bandwidth_allocation(DataRate::BitsPerSec(bitrate.get_sum_bps())) {}
277*d9f75844SAndroid Build Coastguard Worker 
RateControlParameters(const VideoBitrateAllocation & bitrate,double framerate_fps,DataRate bandwidth_allocation)278*d9f75844SAndroid Build Coastguard Worker VideoEncoder::RateControlParameters::RateControlParameters(
279*d9f75844SAndroid Build Coastguard Worker     const VideoBitrateAllocation& bitrate,
280*d9f75844SAndroid Build Coastguard Worker     double framerate_fps,
281*d9f75844SAndroid Build Coastguard Worker     DataRate bandwidth_allocation)
282*d9f75844SAndroid Build Coastguard Worker     : bitrate(bitrate),
283*d9f75844SAndroid Build Coastguard Worker       framerate_fps(framerate_fps),
284*d9f75844SAndroid Build Coastguard Worker       bandwidth_allocation(bandwidth_allocation) {}
285*d9f75844SAndroid Build Coastguard Worker 
operator ==(const VideoEncoder::RateControlParameters & rhs) const286*d9f75844SAndroid Build Coastguard Worker bool VideoEncoder::RateControlParameters::operator==(
287*d9f75844SAndroid Build Coastguard Worker     const VideoEncoder::RateControlParameters& rhs) const {
288*d9f75844SAndroid Build Coastguard Worker   return std::tie(bitrate, framerate_fps, bandwidth_allocation) ==
289*d9f75844SAndroid Build Coastguard Worker          std::tie(rhs.bitrate, rhs.framerate_fps, rhs.bandwidth_allocation);
290*d9f75844SAndroid Build Coastguard Worker }
291*d9f75844SAndroid Build Coastguard Worker 
operator !=(const VideoEncoder::RateControlParameters & rhs) const292*d9f75844SAndroid Build Coastguard Worker bool VideoEncoder::RateControlParameters::operator!=(
293*d9f75844SAndroid Build Coastguard Worker     const VideoEncoder::RateControlParameters& rhs) const {
294*d9f75844SAndroid Build Coastguard Worker   return !(rhs == *this);
295*d9f75844SAndroid Build Coastguard Worker }
296*d9f75844SAndroid Build Coastguard Worker 
297*d9f75844SAndroid Build Coastguard Worker VideoEncoder::RateControlParameters::~RateControlParameters() = default;
298*d9f75844SAndroid Build Coastguard Worker 
SetFecControllerOverride(FecControllerOverride * fec_controller_override)299*d9f75844SAndroid Build Coastguard Worker void VideoEncoder::SetFecControllerOverride(
300*d9f75844SAndroid Build Coastguard Worker     FecControllerOverride* fec_controller_override) {}
301*d9f75844SAndroid Build Coastguard Worker 
InitEncode(const VideoCodec * codec_settings,int32_t number_of_cores,size_t max_payload_size)302*d9f75844SAndroid Build Coastguard Worker int32_t VideoEncoder::InitEncode(const VideoCodec* codec_settings,
303*d9f75844SAndroid Build Coastguard Worker                                  int32_t number_of_cores,
304*d9f75844SAndroid Build Coastguard Worker                                  size_t max_payload_size) {
305*d9f75844SAndroid Build Coastguard Worker   const VideoEncoder::Capabilities capabilities(/* loss_notification= */ false);
306*d9f75844SAndroid Build Coastguard Worker   const VideoEncoder::Settings settings(capabilities, number_of_cores,
307*d9f75844SAndroid Build Coastguard Worker                                         max_payload_size);
308*d9f75844SAndroid Build Coastguard Worker   // In theory, this and the other version of InitEncode() could end up calling
309*d9f75844SAndroid Build Coastguard Worker   // each other in a loop until we get a stack overflow.
310*d9f75844SAndroid Build Coastguard Worker   // In practice, any subclass of VideoEncoder would overload at least one
311*d9f75844SAndroid Build Coastguard Worker   // of these, and we have a TODO in the header file to make this pure virtual.
312*d9f75844SAndroid Build Coastguard Worker   return InitEncode(codec_settings, settings);
313*d9f75844SAndroid Build Coastguard Worker }
314*d9f75844SAndroid Build Coastguard Worker 
InitEncode(const VideoCodec * codec_settings,const VideoEncoder::Settings & settings)315*d9f75844SAndroid Build Coastguard Worker int VideoEncoder::InitEncode(const VideoCodec* codec_settings,
316*d9f75844SAndroid Build Coastguard Worker                              const VideoEncoder::Settings& settings) {
317*d9f75844SAndroid Build Coastguard Worker   // In theory, this and the other version of InitEncode() could end up calling
318*d9f75844SAndroid Build Coastguard Worker   // each other in a loop until we get a stack overflow.
319*d9f75844SAndroid Build Coastguard Worker   // In practice, any subclass of VideoEncoder would overload at least one
320*d9f75844SAndroid Build Coastguard Worker   // of these, and we have a TODO in the header file to make this pure virtual.
321*d9f75844SAndroid Build Coastguard Worker   return InitEncode(codec_settings, settings.number_of_cores,
322*d9f75844SAndroid Build Coastguard Worker                     settings.max_payload_size);
323*d9f75844SAndroid Build Coastguard Worker }
324*d9f75844SAndroid Build Coastguard Worker 
OnPacketLossRateUpdate(float packet_loss_rate)325*d9f75844SAndroid Build Coastguard Worker void VideoEncoder::OnPacketLossRateUpdate(float packet_loss_rate) {}
326*d9f75844SAndroid Build Coastguard Worker 
OnRttUpdate(int64_t rtt_ms)327*d9f75844SAndroid Build Coastguard Worker void VideoEncoder::OnRttUpdate(int64_t rtt_ms) {}
328*d9f75844SAndroid Build Coastguard Worker 
OnLossNotification(const LossNotification & loss_notification)329*d9f75844SAndroid Build Coastguard Worker void VideoEncoder::OnLossNotification(
330*d9f75844SAndroid Build Coastguard Worker     const LossNotification& loss_notification) {}
331*d9f75844SAndroid Build Coastguard Worker 
332*d9f75844SAndroid Build Coastguard Worker // TODO(webrtc:9722): Remove and make pure virtual.
GetEncoderInfo() const333*d9f75844SAndroid Build Coastguard Worker VideoEncoder::EncoderInfo VideoEncoder::GetEncoderInfo() const {
334*d9f75844SAndroid Build Coastguard Worker   return EncoderInfo();
335*d9f75844SAndroid Build Coastguard Worker }
336*d9f75844SAndroid Build Coastguard Worker 
337*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
338