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}
This commit is contained in:
Erik Språng
2018-11-15 17:52:43 +01:00
committed by Commit Bot
parent 645a3afcea
commit eee39206a2
5 changed files with 20 additions and 12 deletions

View File

@ -136,7 +136,7 @@ class VideoCodingModuleImpl : public VideoCodingModule {
int32_t AddVideoFrame(const VideoFrame& videoFrame, int32_t AddVideoFrame(const VideoFrame& videoFrame,
const CodecSpecificInfo* codecSpecificInfo) override { const CodecSpecificInfo* codecSpecificInfo) override {
return sender_.AddVideoFrame(videoFrame, codecSpecificInfo); return sender_.AddVideoFrame(videoFrame, codecSpecificInfo, absl::nullopt);
} }
int32_t IntraFrameRequest(size_t stream_index) override { int32_t IntraFrameRequest(size_t stream_index) override {

View File

@ -17,6 +17,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "absl/types/optional.h"
#include "modules/video_coding/decoder_database.h" #include "modules/video_coding/decoder_database.h"
#include "modules/video_coding/encoder_database.h" #include "modules/video_coding/encoder_database.h"
#include "modules/video_coding/frame_buffer.h" #include "modules/video_coding/frame_buffer.h"
@ -93,7 +94,8 @@ class VideoSender {
VideoBitrateAllocationObserver* bitrate_updated_callback); VideoBitrateAllocationObserver* bitrate_updated_callback);
int32_t AddVideoFrame(const VideoFrame& videoFrame, 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 IntraFrameRequest(size_t stream_index);
int32_t EnableFrameDropper(bool enable); int32_t EnableFrameDropper(bool enable);

View File

@ -245,8 +245,10 @@ void VideoSender::SetEncoderParameters(EncoderParameters params,
} }
// Add one raw video frame to the encoder, blocking. // Add one raw video frame to the encoder, blocking.
int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame, int32_t VideoSender::AddVideoFrame(
const CodecSpecificInfo* codecSpecificInfo) { const VideoFrame& videoFrame,
const CodecSpecificInfo* codecSpecificInfo,
absl::optional<VideoEncoder::EncoderInfo> encoder_info) {
EncoderParameters encoder_params; EncoderParameters encoder_params;
std::vector<FrameType> next_frame_types; std::vector<FrameType> next_frame_types;
bool encoder_has_internal_source = false; bool encoder_has_internal_source = false;
@ -260,14 +262,15 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
if (_encoder == nullptr) if (_encoder == nullptr)
return VCM_UNINITIALIZED; return VCM_UNINITIALIZED;
SetEncoderParameters(encoder_params, encoder_has_internal_source); SetEncoderParameters(encoder_params, encoder_has_internal_source);
if (!encoder_info) {
const VideoEncoder::EncoderInfo encoder_info = _encoder->GetEncoderInfo(); encoder_info = _encoder->GetEncoderInfo();
}
// Frame dropping is enabled iff frame dropping has been requested, and // Frame dropping is enabled iff frame dropping has been requested, and
// frame dropping is not force-disabled, and rate controller is not trusted. // frame dropping is not force-disabled, and rate controller is not trusted.
const bool frame_dropping_enabled = frame_dropper_requested_ && const bool frame_dropping_enabled =
!force_disable_frame_dropper_ && frame_dropper_requested_ && !force_disable_frame_dropper_ &&
!encoder_info.has_trusted_rate_controller; !encoder_info->has_trusted_rate_controller;
_mediaOpt.EnableFrameDropper(frame_dropping_enabled); _mediaOpt.EnableFrameDropper(frame_dropping_enabled);
if (_mediaOpt.DropFrame()) { if (_mediaOpt.DropFrame()) {
@ -295,7 +298,7 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
const bool is_buffer_type_supported = const bool is_buffer_type_supported =
buffer_type == VideoFrameBuffer::Type::kI420 || buffer_type == VideoFrameBuffer::Type::kI420 ||
(buffer_type == VideoFrameBuffer::Type::kNative && (buffer_type == VideoFrameBuffer::Type::kNative &&
encoder_info.supports_native_handle); encoder_info->supports_native_handle);
if (!is_buffer_type_supported) { if (!is_buffer_type_supported) {
// This module only supports software encoding. // This module only supports software encoding.
// TODO(pbos): Offload conversion from the encoder thread. // TODO(pbos): Offload conversion from the encoder thread.

View File

@ -186,7 +186,10 @@ class TestVideoSender : public ::testing::Test {
void AddFrame() { void AddFrame() {
assert(generator_.get()); assert(generator_.get());
sender_->AddVideoFrame(*generator_->NextFrame(), NULL); sender_->AddVideoFrame(*generator_->NextFrame(), nullptr,
encoder_ ? absl::optional<VideoEncoder::EncoderInfo>(
encoder_->GetEncoderInfo())
: absl::nullopt);
} }
SimulatedClock clock_; SimulatedClock clock_;

View File

@ -902,7 +902,7 @@ void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame,
} }
encoder_info_ = info; encoder_info_ = info;
video_sender_.AddVideoFrame(out_frame, nullptr); video_sender_.AddVideoFrame(out_frame, nullptr, encoder_info_);
} }
void VideoStreamEncoder::SendKeyFrame() { void VideoStreamEncoder::SendKeyFrame() {