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 <memory>
|
||||||
|
|
||||||
|
#include "api/video_codecs/vp8_frame_buffer_controller.h"
|
||||||
#include "modules/video_coding/include/video_codec_interface.h"
|
#include "modules/video_coding/include/video_codec_interface.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@ -22,6 +23,10 @@ namespace webrtc {
|
|||||||
class VP8Encoder {
|
class VP8Encoder {
|
||||||
public:
|
public:
|
||||||
static std::unique_ptr<VideoEncoder> Create();
|
static std::unique_ptr<VideoEncoder> Create();
|
||||||
|
|
||||||
|
static std::unique_ptr<VideoEncoder> Create(
|
||||||
|
std::unique_ptr<Vp8FrameBufferControllerFactory>
|
||||||
|
frame_buffer_controller_factory);
|
||||||
}; // end of VP8Encoder class
|
}; // end of VP8Encoder class
|
||||||
|
|
||||||
class VP8Decoder {
|
class VP8Decoder {
|
||||||
|
@ -136,7 +136,14 @@ bool UpdateVpxConfiguration(size_t stream_index,
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
std::unique_ptr<VideoEncoder> VP8Encoder::Create() {
|
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(
|
vpx_enc_frame_flags_t LibvpxVp8Encoder::EncodeFlags(
|
||||||
@ -169,9 +176,21 @@ vpx_enc_frame_flags_t LibvpxVp8Encoder::EncodeFlags(
|
|||||||
}
|
}
|
||||||
|
|
||||||
LibvpxVp8Encoder::LibvpxVp8Encoder()
|
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::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)),
|
: libvpx_(std::move(interface)),
|
||||||
experimental_cpu_speed_config_arm_(CpuSpeedExperiment::GetConfigs()),
|
experimental_cpu_speed_config_arm_(CpuSpeedExperiment::GetConfigs()),
|
||||||
rate_control_settings_(RateControlSettings::ParseFromFieldTrials()),
|
rate_control_settings_(RateControlSettings::ParseFromFieldTrials()),
|
||||||
@ -182,6 +201,8 @@ LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface)
|
|||||||
cpu_speed_default_(-6),
|
cpu_speed_default_(-6),
|
||||||
number_of_cores_(0),
|
number_of_cores_(0),
|
||||||
rc_max_intra_target_(0),
|
rc_max_intra_target_(0),
|
||||||
|
frame_buffer_controller_factory_(
|
||||||
|
std::move(frame_buffer_controller_factory)),
|
||||||
key_frame_request_(kMaxSimulcastStreams, false),
|
key_frame_request_(kMaxSimulcastStreams, false),
|
||||||
variable_framerate_experiment_(ParseVariableFramerateConfig(
|
variable_framerate_experiment_(ParseVariableFramerateConfig(
|
||||||
"WebRTC-VP8VariableFramerateScreenshare")),
|
"WebRTC-VP8VariableFramerateScreenshare")),
|
||||||
@ -351,9 +372,12 @@ int LibvpxVp8Encoder::InitEncode(const VideoCodec* inst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
RTC_DCHECK(!frame_buffer_controller_);
|
RTC_DCHECK(!frame_buffer_controller_);
|
||||||
// TODO(bugs.webrtc.org/10382): Inject the factory.
|
if (frame_buffer_controller_factory_) {
|
||||||
|
frame_buffer_controller_ = frame_buffer_controller_factory_->Create(*inst);
|
||||||
|
} else {
|
||||||
Vp8TemporalLayersFactory factory;
|
Vp8TemporalLayersFactory factory;
|
||||||
frame_buffer_controller_ = factory.Create(*inst);
|
frame_buffer_controller_ = factory.Create(*inst);
|
||||||
|
}
|
||||||
|
|
||||||
number_of_cores_ = number_of_cores;
|
number_of_cores_ = number_of_cores;
|
||||||
timestamp_ = 0;
|
timestamp_ = 0;
|
||||||
|
@ -36,7 +36,12 @@ namespace webrtc {
|
|||||||
class LibvpxVp8Encoder : public VideoEncoder {
|
class LibvpxVp8Encoder : public VideoEncoder {
|
||||||
public:
|
public:
|
||||||
LibvpxVp8Encoder();
|
LibvpxVp8Encoder();
|
||||||
|
explicit LibvpxVp8Encoder(std::unique_ptr<Vp8FrameBufferControllerFactory>
|
||||||
|
frame_buffer_controller_factory);
|
||||||
explicit LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface);
|
explicit LibvpxVp8Encoder(std::unique_ptr<LibvpxInterface> interface);
|
||||||
|
LibvpxVp8Encoder(std::unique_ptr<Vp8FrameBufferControllerFactory>
|
||||||
|
frame_buffer_controller_factory,
|
||||||
|
std::unique_ptr<LibvpxInterface> interface);
|
||||||
~LibvpxVp8Encoder() override;
|
~LibvpxVp8Encoder() override;
|
||||||
|
|
||||||
int Release() override;
|
int Release() override;
|
||||||
@ -102,6 +107,8 @@ class LibvpxVp8Encoder : public VideoEncoder {
|
|||||||
int cpu_speed_default_;
|
int cpu_speed_default_;
|
||||||
int number_of_cores_;
|
int number_of_cores_;
|
||||||
uint32_t rc_max_intra_target_;
|
uint32_t rc_max_intra_target_;
|
||||||
|
const std::unique_ptr<Vp8FrameBufferControllerFactory>
|
||||||
|
frame_buffer_controller_factory_;
|
||||||
std::unique_ptr<Vp8FrameBufferController> frame_buffer_controller_;
|
std::unique_ptr<Vp8FrameBufferController> frame_buffer_controller_;
|
||||||
std::vector<bool> key_frame_request_;
|
std::vector<bool> key_frame_request_;
|
||||||
std::vector<bool> send_stream_;
|
std::vector<bool> send_stream_;
|
||||||
|
@ -19,7 +19,7 @@ namespace webrtc {
|
|||||||
namespace jni {
|
namespace jni {
|
||||||
|
|
||||||
static jlong JNI_LibvpxVp8Encoder_CreateEncoder(JNIEnv* jni) {
|
static jlong JNI_LibvpxVp8Encoder_CreateEncoder(JNIEnv* jni) {
|
||||||
return jlongFromPointer(VP8Encoder::Create().release());
|
return jlongFromPointer(VP8Encoder::Create(nullptr).release());
|
||||||
}
|
}
|
||||||
|
|
||||||
static jlong JNI_LibvpxVp8Decoder_CreateDecoder(JNIEnv* jni) {
|
static jlong JNI_LibvpxVp8Decoder_CreateDecoder(JNIEnv* jni) {
|
||||||
|
Reference in New Issue
Block a user