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,
const CodecSpecificInfo* codecSpecificInfo) override {
return sender_.AddVideoFrame(videoFrame, codecSpecificInfo);
return sender_.AddVideoFrame(videoFrame, codecSpecificInfo, absl::nullopt);
}
int32_t IntraFrameRequest(size_t stream_index) override {

View File

@ -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 @@ class VideoSender {
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);

View File

@ -245,8 +245,10 @@ void VideoSender::SetEncoderParameters(EncoderParameters params,
}
// 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 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
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 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
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.

View File

@ -186,7 +186,10 @@ class TestVideoSender : public ::testing::Test {
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_;

View File

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