Allow injecting a Vp8FrameBufferControllerFactory

Injection is made possible through VP8Encoder::Create.
According to native-api.md, it is a defacto public API despite
not being in the api/ folder.

Bug: webrtc:10259, webrtc:10382
Change-Id: Ifc5d55aa99613cfee0fcb4f0c6690121c85b2e3e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128883
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27281}
This commit is contained in:
Elad Alon
2019-03-25 13:19:43 +01:00
committed by Commit Bot
parent 2214b91c1f
commit f2ca8c5341
4 changed files with 42 additions and 6 deletions

View File

@ -15,6 +15,7 @@
#include <memory>
#include "api/video_codecs/vp8_frame_buffer_controller.h"
#include "modules/video_coding/include/video_codec_interface.h"
namespace webrtc {
@ -22,6 +23,10 @@ namespace webrtc {
class VP8Encoder {
public:
static std::unique_ptr<VideoEncoder> Create();
static std::unique_ptr<VideoEncoder> Create(
std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory);
}; // end of VP8Encoder class
class VP8Decoder {

View File

@ -136,7 +136,14 @@ bool UpdateVpxConfiguration(size_t stream_index,
} // namespace
std::unique_ptr<VideoEncoder> VP8Encoder::Create() {
return absl::make_unique<LibvpxVp8Encoder>();
return VP8Encoder::Create(nullptr);
}
std::unique_ptr<VideoEncoder> VP8Encoder::Create(
std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory) {
return absl::make_unique<LibvpxVp8Encoder>(
std::move(frame_buffer_controller_factory));
}
vpx_enc_frame_flags_t LibvpxVp8Encoder::EncodeFlags(
@ -169,9 +176,21 @@ vpx_enc_frame_flags_t LibvpxVp8Encoder::EncodeFlags(
}
LibvpxVp8Encoder::LibvpxVp8Encoder()
: LibvpxVp8Encoder(LibvpxInterface::CreateEncoder()) {}
: LibvpxVp8Encoder(nullptr, LibvpxInterface::CreateEncoder()) {}
LibvpxVp8Encoder::LibvpxVp8Encoder(
std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory)
: LibvpxVp8Encoder(std::move(frame_buffer_controller_factory),
LibvpxInterface::CreateEncoder()) {}
LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface)
: LibvpxVp8Encoder(nullptr, std::move(interface)) {}
LibvpxVp8Encoder::LibvpxVp8Encoder(
std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory,
std::unique_ptr<LibvpxInterface> interface)
: libvpx_(std::move(interface)),
experimental_cpu_speed_config_arm_(CpuSpeedExperiment::GetConfigs()),
rate_control_settings_(RateControlSettings::ParseFromFieldTrials()),
@ -182,6 +201,8 @@ LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface)
cpu_speed_default_(-6),
number_of_cores_(0),
rc_max_intra_target_(0),
frame_buffer_controller_factory_(
std::move(frame_buffer_controller_factory)),
key_frame_request_(kMaxSimulcastStreams, false),
variable_framerate_experiment_(ParseVariableFramerateConfig(
"WebRTC-VP8VariableFramerateScreenshare")),
@ -351,9 +372,12 @@ int LibvpxVp8Encoder::InitEncode(const VideoCodec* inst,
}
RTC_DCHECK(!frame_buffer_controller_);
// TODO(bugs.webrtc.org/10382): Inject the factory.
Vp8TemporalLayersFactory factory;
frame_buffer_controller_ = factory.Create(*inst);
if (frame_buffer_controller_factory_) {
frame_buffer_controller_ = frame_buffer_controller_factory_->Create(*inst);
} else {
Vp8TemporalLayersFactory factory;
frame_buffer_controller_ = factory.Create(*inst);
}
number_of_cores_ = number_of_cores;
timestamp_ = 0;

View File

@ -36,7 +36,12 @@ namespace webrtc {
class LibvpxVp8Encoder : public VideoEncoder {
public:
LibvpxVp8Encoder();
explicit LibvpxVp8Encoder(std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory);
explicit LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface);
LibvpxVp8Encoder(std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory,
std::unique_ptr<LibvpxInterface> interface);
~LibvpxVp8Encoder() override;
int Release() override;
@ -102,6 +107,8 @@ class LibvpxVp8Encoder : public VideoEncoder {
int cpu_speed_default_;
int number_of_cores_;
uint32_t rc_max_intra_target_;
const std::unique_ptr<Vp8FrameBufferControllerFactory>
frame_buffer_controller_factory_;
std::unique_ptr<Vp8FrameBufferController> frame_buffer_controller_;
std::vector<bool> key_frame_request_;
std::vector<bool> send_stream_;