diff --git a/modules/video_coding/codecs/vp8/include/vp8.h b/modules/video_coding/codecs/vp8/include/vp8.h index 5a6f1e067f..fc2c123874 100644 --- a/modules/video_coding/codecs/vp8/include/vp8.h +++ b/modules/video_coding/codecs/vp8/include/vp8.h @@ -15,6 +15,7 @@ #include +#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 Create(); + + static std::unique_ptr Create( + std::unique_ptr + frame_buffer_controller_factory); }; // end of VP8Encoder class class VP8Decoder { diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc index 7282c55b40..4e367d3e13 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc @@ -136,7 +136,14 @@ bool UpdateVpxConfiguration(size_t stream_index, } // namespace std::unique_ptr VP8Encoder::Create() { - return absl::make_unique(); + return VP8Encoder::Create(nullptr); +} + +std::unique_ptr VP8Encoder::Create( + std::unique_ptr + frame_buffer_controller_factory) { + return absl::make_unique( + 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 + frame_buffer_controller_factory) + : LibvpxVp8Encoder(std::move(frame_buffer_controller_factory), + LibvpxInterface::CreateEncoder()) {} LibvpxVp8Encoder::LibvpxVp8Encoder(std::unique_ptr interface) + : LibvpxVp8Encoder(nullptr, std::move(interface)) {} + +LibvpxVp8Encoder::LibvpxVp8Encoder( + std::unique_ptr + frame_buffer_controller_factory, + std::unique_ptr 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 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; diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h index 11a2e6a6ea..511504199b 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h @@ -36,7 +36,12 @@ namespace webrtc { class LibvpxVp8Encoder : public VideoEncoder { public: LibvpxVp8Encoder(); + explicit LibvpxVp8Encoder(std::unique_ptr + frame_buffer_controller_factory); explicit LibvpxVp8Encoder(std::unique_ptr interface); + LibvpxVp8Encoder(std::unique_ptr + frame_buffer_controller_factory, + std::unique_ptr 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 + frame_buffer_controller_factory_; std::unique_ptr frame_buffer_controller_; std::vector key_frame_request_; std::vector send_stream_; diff --git a/sdk/android/src/jni/vp8_codec.cc b/sdk/android/src/jni/vp8_codec.cc index 2daa611bba..bbc6024b8e 100644 --- a/sdk/android/src/jni/vp8_codec.cc +++ b/sdk/android/src/jni/vp8_codec.cc @@ -19,7 +19,7 @@ namespace webrtc { namespace 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) {