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:
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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_;
|
||||
|
Reference in New Issue
Block a user