Don't poll EncoderInfo from encoder twice per frame

Bug: webrtc:9890
Change-Id: Id4c2062a1c0c6be699f2096b4c0b334c98f3c4ba
Reviewed-on: https://webrtc-review.googlesource.com/c/111083
Commit-Queue: Erik Språng <sprang@webrtc.org>
Reviewed-by: Mirta Dvornicic <mirtad@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25672}
diff --git a/modules/video_coding/video_coding_impl.cc b/modules/video_coding/video_coding_impl.cc
index 4fb5ae3..58397ad 100644
--- a/modules/video_coding/video_coding_impl.cc
+++ b/modules/video_coding/video_coding_impl.cc
@@ -136,7 +136,7 @@
 
   int32_t AddVideoFrame(const VideoFrame& videoFrame,
                         const CodecSpecificInfo* codecSpecificInfo) override {
-    return sender_.AddVideoFrame(videoFrame, codecSpecificInfo);
+    return sender_.AddVideoFrame(videoFrame, codecSpecificInfo, absl::nullopt);
   }
 
   int32_t IntraFrameRequest(size_t stream_index) override {
diff --git a/modules/video_coding/video_coding_impl.h b/modules/video_coding/video_coding_impl.h
index ac88166..e27a2fe 100644
--- a/modules/video_coding/video_coding_impl.h
+++ b/modules/video_coding/video_coding_impl.h
@@ -17,6 +17,7 @@
 #include <string>
 #include <vector>
 
+#include "absl/types/optional.h"
 #include "modules/video_coding/decoder_database.h"
 #include "modules/video_coding/encoder_database.h"
 #include "modules/video_coding/frame_buffer.h"
@@ -93,7 +94,8 @@
       VideoBitrateAllocationObserver* bitrate_updated_callback);
 
   int32_t AddVideoFrame(const VideoFrame& videoFrame,
-                        const CodecSpecificInfo* codecSpecificInfo);
+                        const CodecSpecificInfo* codecSpecificInfo,
+                        absl::optional<VideoEncoder::EncoderInfo> encoder_info);
 
   int32_t IntraFrameRequest(size_t stream_index);
   int32_t EnableFrameDropper(bool enable);
diff --git a/modules/video_coding/video_sender.cc b/modules/video_coding/video_sender.cc
index f95d7fc..4bd5253 100644
--- a/modules/video_coding/video_sender.cc
+++ b/modules/video_coding/video_sender.cc
@@ -245,8 +245,10 @@
 }
 
 // Add one raw video frame to the encoder, blocking.
-int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
-                                   const CodecSpecificInfo* codecSpecificInfo) {
+int32_t VideoSender::AddVideoFrame(
+    const VideoFrame& videoFrame,
+    const CodecSpecificInfo* codecSpecificInfo,
+    absl::optional<VideoEncoder::EncoderInfo> encoder_info) {
   EncoderParameters encoder_params;
   std::vector<FrameType> next_frame_types;
   bool encoder_has_internal_source = false;
@@ -260,14 +262,15 @@
   if (_encoder == nullptr)
     return VCM_UNINITIALIZED;
   SetEncoderParameters(encoder_params, encoder_has_internal_source);
-
-  const VideoEncoder::EncoderInfo encoder_info = _encoder->GetEncoderInfo();
+  if (!encoder_info) {
+    encoder_info = _encoder->GetEncoderInfo();
+  }
 
   // Frame dropping is enabled iff frame dropping has been requested, and
   // frame dropping is not force-disabled, and rate controller is not trusted.
-  const bool frame_dropping_enabled = frame_dropper_requested_ &&
-                                      !force_disable_frame_dropper_ &&
-                                      !encoder_info.has_trusted_rate_controller;
+  const bool frame_dropping_enabled =
+      frame_dropper_requested_ && !force_disable_frame_dropper_ &&
+      !encoder_info->has_trusted_rate_controller;
   _mediaOpt.EnableFrameDropper(frame_dropping_enabled);
 
   if (_mediaOpt.DropFrame()) {
@@ -295,7 +298,7 @@
   const bool is_buffer_type_supported =
       buffer_type == VideoFrameBuffer::Type::kI420 ||
       (buffer_type == VideoFrameBuffer::Type::kNative &&
-       encoder_info.supports_native_handle);
+       encoder_info->supports_native_handle);
   if (!is_buffer_type_supported) {
     // This module only supports software encoding.
     // TODO(pbos): Offload conversion from the encoder thread.
diff --git a/modules/video_coding/video_sender_unittest.cc b/modules/video_coding/video_sender_unittest.cc
index e423de5..c2ff0f6 100644
--- a/modules/video_coding/video_sender_unittest.cc
+++ b/modules/video_coding/video_sender_unittest.cc
@@ -186,7 +186,10 @@
 
   void AddFrame() {
     assert(generator_.get());
-    sender_->AddVideoFrame(*generator_->NextFrame(), NULL);
+    sender_->AddVideoFrame(*generator_->NextFrame(), nullptr,
+                           encoder_ ? absl::optional<VideoEncoder::EncoderInfo>(
+                                          encoder_->GetEncoderInfo())
+                                    : absl::nullopt);
   }
 
   SimulatedClock clock_;
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index 508c564..a22d58a 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -902,7 +902,7 @@
   }
   encoder_info_ = info;
 
-  video_sender_.AddVideoFrame(out_frame, nullptr);
+  video_sender_.AddVideoFrame(out_frame, nullptr, encoder_info_);
 }
 
 void VideoStreamEncoder::SendKeyFrame() {