Refactor VP8 encoder creation logic
Now decision between using SimulcastEncoderAdapter and using VP8 encoder
is postponed before codec is initialized for VP8 internal codecs. This is done
be new VP8EncoderProxy class. New error code for codec initialization is used
to signal that simulcast parameters are not supported.
Bug: webrtc:7925
Change-Id: I3a82c21bf5dfaaa7fa25350986830523f02c39d8
Reviewed-on: https://webrtc-review.googlesource.com/13980
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20419}
diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc
index 80b4507..f5c6a29 100644
--- a/media/engine/webrtcvideoengine.cc
+++ b/media/engine/webrtcvideoengine.cc
@@ -42,6 +42,7 @@
#include "rtc_base/timeutils.h"
#include "rtc_base/trace_event.h"
#include "system_wrappers/include/field_trial.h"
+#include "vp8_encoder_simulcast_proxy.h"
using DegradationPreference = webrtc::VideoSendStream::DegradationPreference;
@@ -67,8 +68,7 @@
virtual ~EncoderFactoryAdapter() {}
virtual AllocatedEncoder CreateVideoEncoder(
- const VideoCodec& codec,
- bool is_conference_mode_screenshare) const = 0;
+ const VideoCodec& codec) const = 0;
virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0;
};
@@ -99,9 +99,7 @@
external_encoder_factory_(std::move(external_encoder_factory)) {}
private:
- AllocatedEncoder CreateVideoEncoder(
- const VideoCodec& codec,
- bool is_conference_mode_screenshare) const override;
+ AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec) const override;
std::vector<VideoCodec> GetSupportedCodecs() const override;
@@ -134,9 +132,7 @@
: encoder_factory_(std::move(encoder_factory)) {}
private:
- AllocatedEncoder CreateVideoEncoder(
- const VideoCodec& codec,
- bool is_conference_mode_screenshare) const override {
+ AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec) const override {
if (!encoder_factory_)
return AllocatedEncoder();
const webrtc::SdpVideoFormat format(codec.name, codec.params);
@@ -1688,8 +1684,7 @@
EncoderFactoryAdapter::AllocatedEncoder
CricketEncoderFactoryAdapter::CreateVideoEncoder(
- const VideoCodec& codec,
- bool is_conference_mode_screenshare) const {
+ const VideoCodec& codec) const {
// Try creating external encoder.
if (external_encoder_factory_ != nullptr &&
FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
@@ -1719,12 +1714,10 @@
// Try creating internal encoder.
std::unique_ptr<webrtc::VideoEncoder> internal_encoder;
if (FindMatchingCodec(internal_encoder_factory_->supported_codecs(), codec)) {
- if (CodecNamesEq(codec.name.c_str(), kVp8CodecName) &&
- is_conference_mode_screenshare && UseSimulcastScreenshare()) {
- // TODO(sprang): Remove this adapter once libvpx supports simulcast with
- // same-resolution substreams.
+ if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) {
internal_encoder = std::unique_ptr<webrtc::VideoEncoder>(
- new webrtc::SimulcastEncoderAdapter(internal_encoder_factory_.get()));
+ new webrtc::VP8EncoderSimulcastProxy(
+ internal_encoder_factory_.get()));
} else {
internal_encoder = std::unique_ptr<webrtc::VideoEncoder>(
internal_encoder_factory_->CreateVideoEncoder(codec));
@@ -1753,13 +1746,8 @@
std::unique_ptr<webrtc::VideoEncoder> new_encoder;
if (force_encoder_allocation || !allocated_encoder_ ||
allocated_codec_ != codec_settings.codec) {
- const bool is_conference_mode_screenshare =
- parameters_.encoder_config.content_type ==
- webrtc::VideoEncoderConfig::ContentType::kScreen &&
- parameters_.conference_mode;
EncoderFactoryAdapter::AllocatedEncoder new_allocated_encoder =
- encoder_factory_->CreateVideoEncoder(codec_settings.codec,
- is_conference_mode_screenshare);
+ encoder_factory_->CreateVideoEncoder(codec_settings.codec);
new_encoder = std::unique_ptr<webrtc::VideoEncoder>(
std::move(new_allocated_encoder.encoder));
parameters_.config.encoder_settings.encoder = new_encoder.get();