Built in video codec factories.
To prepare for making the software codecs optional and injectable, these
codec factories provide a way to pass in identical factories as were the
default old behaviour.
Bug: webrtc:7925
Change-Id: I0c70fa3c56c999e9d1af6e172eff2fbba849e921
Reviewed-on: https://webrtc-review.googlesource.com/71162
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23096}
diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn
index e2ac074..38951fd 100644
--- a/api/video_codecs/BUILD.gn
+++ b/api/video_codecs/BUILD.gn
@@ -35,3 +35,40 @@
"../../rtc_base:rtc_base_approved",
]
}
+
+rtc_static_library("builtin_video_decoder_factory") {
+ visibility = [ "*" ]
+ allow_poison = [
+ "audio_codecs", # TODO(bugs.webrtc.org/8396): Remove.
+ "software_video_codecs",
+ ]
+ sources = [
+ "builtin_video_decoder_factory.cc",
+ "builtin_video_decoder_factory.h",
+ ]
+
+ deps = [
+ ":video_codecs_api",
+ "../../media:rtc_internal_video_codecs",
+ "../../rtc_base:ptr_util",
+ ]
+}
+
+rtc_static_library("builtin_video_encoder_factory") {
+ visibility = [ "*" ]
+ allow_poison = [
+ "audio_codecs", # TODO(bugs.webrtc.org/8396): Remove.
+ "software_video_codecs",
+ ]
+ sources = [
+ "builtin_video_encoder_factory.cc",
+ "builtin_video_encoder_factory.h",
+ ]
+
+ deps = [
+ ":video_codecs_api",
+ "../../media:rtc_internal_video_codecs",
+ "../../media:rtc_media_base",
+ "../../rtc_base:ptr_util",
+ ]
+}
diff --git a/api/video_codecs/builtin_video_decoder_factory.cc b/api/video_codecs/builtin_video_decoder_factory.cc
new file mode 100644
index 0000000..7395b96
--- /dev/null
+++ b/api/video_codecs/builtin_video_decoder_factory.cc
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+
+#include "media/engine/internaldecoderfactory.h"
+#include "rtc_base/ptr_util.h"
+
+namespace webrtc {
+
+std::unique_ptr<VideoDecoderFactory> CreateBuiltinVideoDecoderFactory() {
+ return rtc::MakeUnique<InternalDecoderFactory>();
+}
+
+} // namespace webrtc
diff --git a/api/video_codecs/builtin_video_decoder_factory.h b/api/video_codecs/builtin_video_decoder_factory.h
new file mode 100644
index 0000000..1f8e75c
--- /dev/null
+++ b/api/video_codecs/builtin_video_decoder_factory.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_VIDEO_CODECS_BUILTIN_VIDEO_DECODER_FACTORY_H_
+#define API_VIDEO_CODECS_BUILTIN_VIDEO_DECODER_FACTORY_H_
+
+#include <memory>
+
+#include "api/video_codecs/video_decoder_factory.h"
+
+namespace webrtc {
+
+// Creates a new factory that can create the built-in types of video decoders.
+std::unique_ptr<VideoDecoderFactory> CreateBuiltinVideoDecoderFactory();
+
+} // namespace webrtc
+
+#endif // API_VIDEO_CODECS_BUILTIN_VIDEO_DECODER_FACTORY_H_
diff --git a/api/video_codecs/builtin_video_encoder_factory.cc b/api/video_codecs/builtin_video_encoder_factory.cc
new file mode 100644
index 0000000..b866810
--- /dev/null
+++ b/api/video_codecs/builtin_video_encoder_factory.cc
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "api/video_codecs/builtin_video_encoder_factory.h"
+
+#include <vector>
+
+#include "api/video_codecs/sdp_video_format.h"
+#include "media/base/codec.h"
+#include "media/base/mediaconstants.h"
+#include "media/engine/internalencoderfactory.h"
+#include "media/engine/vp8_encoder_simulcast_proxy.h"
+#include "rtc_base/ptr_util.h"
+
+namespace webrtc {
+
+namespace {
+
+bool IsFormatSupported(const std::vector<SdpVideoFormat>& supported_formats,
+ const SdpVideoFormat& format) {
+ for (const SdpVideoFormat& supported_format : supported_formats) {
+ if (cricket::IsSameCodec(format.name, format.parameters,
+ supported_format.name,
+ supported_format.parameters)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// This class wraps the internal factory and adds simulcast.
+class BuiltinVideoEncoderFactory : public VideoEncoderFactory {
+ public:
+ BuiltinVideoEncoderFactory()
+ : internal_encoder_factory_(new InternalEncoderFactory()) {}
+
+ VideoEncoderFactory::CodecInfo QueryVideoEncoder(
+ const SdpVideoFormat& format) const override {
+ // Format must be one of the internal formats.
+ RTC_DCHECK(IsFormatSupported(
+ internal_encoder_factory_->GetSupportedFormats(), format));
+ VideoEncoderFactory::CodecInfo info;
+ info.has_internal_source = false;
+ info.is_hardware_accelerated = false;
+ return info;
+ }
+
+ std::unique_ptr<VideoEncoder> CreateVideoEncoder(
+ const SdpVideoFormat& format) override {
+ // Try creating internal encoder.
+ std::unique_ptr<VideoEncoder> internal_encoder;
+ if (IsFormatSupported(internal_encoder_factory_->GetSupportedFormats(),
+ format)) {
+ internal_encoder =
+ cricket::CodecNamesEq(format.name.c_str(), cricket::kVp8CodecName)
+ ? rtc::MakeUnique<VP8EncoderSimulcastProxy>(
+ internal_encoder_factory_.get())
+ : internal_encoder_factory_->CreateVideoEncoder(format);
+ }
+
+ return internal_encoder;
+ }
+
+ std::vector<SdpVideoFormat> GetSupportedFormats() const override {
+ return internal_encoder_factory_->GetSupportedFormats();
+ }
+
+ private:
+ const std::unique_ptr<VideoEncoderFactory> internal_encoder_factory_;
+};
+
+} // namespace
+
+std::unique_ptr<VideoEncoderFactory> CreateBuiltinVideoEncoderFactory() {
+ return rtc::MakeUnique<BuiltinVideoEncoderFactory>();
+}
+
+} // namespace webrtc
diff --git a/api/video_codecs/builtin_video_encoder_factory.h b/api/video_codecs/builtin_video_encoder_factory.h
new file mode 100644
index 0000000..6a6618f
--- /dev/null
+++ b/api/video_codecs/builtin_video_encoder_factory.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_VIDEO_CODECS_BUILTIN_VIDEO_ENCODER_FACTORY_H_
+#define API_VIDEO_CODECS_BUILTIN_VIDEO_ENCODER_FACTORY_H_
+
+#include <memory>
+
+#include "api/video_codecs/video_encoder_factory.h"
+
+namespace webrtc {
+
+// Creates a new factory that can create the built-in types of video encoders.
+// The factory has simulcast support for VP8.
+std::unique_ptr<VideoEncoderFactory> CreateBuiltinVideoEncoderFactory();
+
+} // namespace webrtc
+
+#endif // API_VIDEO_CODECS_BUILTIN_VIDEO_ENCODER_FACTORY_H_
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index c9c2752..ed6e060 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -670,7 +670,11 @@
"../api:video_frame_api",
"../api/audio_codecs:builtin_audio_decoder_factory",
"../api/audio_codecs:builtin_audio_encoder_factory",
+ "../api/video_codecs:builtin_video_decoder_factory",
+ "../api/video_codecs:builtin_video_encoder_factory",
"../media:rtc_audio_video",
+ "../modules/audio_device:audio_device",
+ "../modules/audio_processing:audio_processing",
"../modules/video_capture:video_capture_module",
"../pc:libjingle_peerconnection",
"../rtc_base:rtc_base",
diff --git a/examples/peerconnection/client/conductor.cc b/examples/peerconnection/client/conductor.cc
index 7e36746..2483e48 100644
--- a/examples/peerconnection/client/conductor.cc
+++ b/examples/peerconnection/client/conductor.cc
@@ -17,8 +17,12 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/test/fakeconstraints.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "examples/peerconnection/client/defaults.h"
#include "media/engine/webrtcvideocapturerfactory.h"
+#include "modules/audio_device/include/audio_device.h"
+#include "modules/audio_processing/include/audio_processing.h"
#include "modules/video_capture/video_capture_factory.h"
#include "rtc_base/checks.h"
#include "rtc_base/json.h"
@@ -73,8 +77,13 @@
RTC_DCHECK(!peer_connection_);
peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
+ nullptr /* network_thread */, nullptr /* worker_thread */,
+ nullptr /* signaling_thread */, nullptr /* default_adm */,
webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory());
+ webrtc::CreateBuiltinAudioDecoderFactory(),
+ webrtc::CreateBuiltinVideoEncoderFactory(),
+ webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */);
if (!peer_connection_factory_) {
main_wnd_->MessageBox("Error",
diff --git a/media/BUILD.gn b/media/BUILD.gn
index fe6b4c0..589c7bc 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -486,6 +486,7 @@
"engine/fakewebrtcdeviceinfo.h",
"engine/fakewebrtcvcmfactory.h",
"engine/fakewebrtcvideocapturemodule.h",
+ "engine/fakewebrtcvideoengine.cc",
"engine/fakewebrtcvideoengine.h",
]
diff --git a/media/engine/fakewebrtcvideoengine.cc b/media/engine/fakewebrtcvideoengine.cc
new file mode 100644
index 0000000..59157eb
--- /dev/null
+++ b/media/engine/fakewebrtcvideoengine.cc
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "media/engine/fakewebrtcvideoengine.h"
+
+#include "media/base/codec.h"
+#include "media/engine/simulcast_encoder_adapter.h"
+#include "media/engine/vp8_encoder_simulcast_proxy.h"
+#include "media/engine/webrtcvideodecoderfactory.h"
+#include "media/engine/webrtcvideoencoderfactory.h"
+#include "modules/video_coding/include/video_error_codes.h"
+#include "rtc_base/basictypes.h"
+#include "rtc_base/gunit.h"
+#include "rtc_base/stringutils.h"
+
+namespace cricket {
+
+namespace {
+
+static const int kEventTimeoutMs = 10000;
+
+bool IsFormatSupported(
+ const std::vector<webrtc::SdpVideoFormat>& supported_formats,
+ const webrtc::SdpVideoFormat& format) {
+ for (const webrtc::SdpVideoFormat& supported_format : supported_formats) {
+ if (IsSameCodec(format.name, format.parameters, supported_format.name,
+ supported_format.parameters)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace
+
+// Decoder.
+FakeWebRtcVideoDecoder::FakeWebRtcVideoDecoder(
+ FakeWebRtcVideoDecoderFactory* factory)
+ : num_frames_received_(0), factory_(factory) {}
+
+FakeWebRtcVideoDecoder::~FakeWebRtcVideoDecoder() {
+ if (factory_) {
+ factory_->DecoderDestroyed(this);
+ }
+}
+
+int32_t FakeWebRtcVideoDecoder::InitDecode(const webrtc::VideoCodec*, int32_t) {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoDecoder::Decode(const webrtc::EncodedImage&,
+ bool,
+ const webrtc::RTPFragmentationHeader*,
+ const webrtc::CodecSpecificInfo*,
+ int64_t) {
+ num_frames_received_++;
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoDecoder::RegisterDecodeCompleteCallback(
+ webrtc::DecodedImageCallback*) {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoDecoder::Release() {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int FakeWebRtcVideoDecoder::GetNumFramesReceived() const {
+ return num_frames_received_;
+}
+
+// Decoder factory.
+FakeWebRtcVideoDecoderFactory::FakeWebRtcVideoDecoderFactory()
+ : num_created_decoders_(0),
+ internal_decoder_factory_(new webrtc::InternalDecoderFactory()) {}
+
+FakeWebRtcVideoDecoderFactory::~FakeWebRtcVideoDecoderFactory() {
+ delete internal_decoder_factory_;
+}
+
+std::vector<webrtc::SdpVideoFormat>
+FakeWebRtcVideoDecoderFactory::GetSupportedFormats() const {
+ std::vector<webrtc::SdpVideoFormat> formats =
+ internal_decoder_factory_->GetSupportedFormats();
+
+ // Add external codecs.
+ for (const webrtc::SdpVideoFormat& format : supported_codec_formats_) {
+ // Don't add same codec twice.
+ if (!IsFormatSupported(formats, format))
+ formats.push_back(format);
+ }
+
+ return formats;
+}
+
+std::unique_ptr<webrtc::VideoDecoder>
+FakeWebRtcVideoDecoderFactory::CreateVideoDecoder(
+ const webrtc::SdpVideoFormat& format) {
+ if (IsFormatSupported(supported_codec_formats_, format)) {
+ num_created_decoders_++;
+ std::unique_ptr<FakeWebRtcVideoDecoder> decoder =
+ rtc::MakeUnique<FakeWebRtcVideoDecoder>(this);
+ decoders_.push_back(decoder.get());
+ return decoder;
+ } else {
+ return internal_decoder_factory_->CreateVideoDecoder(format);
+ }
+}
+
+void FakeWebRtcVideoDecoderFactory::DecoderDestroyed(
+ FakeWebRtcVideoDecoder* decoder) {
+ decoders_.erase(std::remove(decoders_.begin(), decoders_.end(), decoder),
+ decoders_.end());
+}
+
+void FakeWebRtcVideoDecoderFactory::AddSupportedVideoCodecType(
+ const webrtc::SdpVideoFormat& format) {
+ supported_codec_formats_.push_back(format);
+}
+
+int FakeWebRtcVideoDecoderFactory::GetNumCreatedDecoders() {
+ return num_created_decoders_;
+}
+
+const std::vector<FakeWebRtcVideoDecoder*>&
+FakeWebRtcVideoDecoderFactory::decoders() {
+ return decoders_;
+}
+
+// Encoder.
+FakeWebRtcVideoEncoder::FakeWebRtcVideoEncoder(
+ FakeWebRtcVideoEncoderFactory* factory)
+ : init_encode_event_(false, false),
+ num_frames_encoded_(0),
+ factory_(factory) {}
+
+FakeWebRtcVideoEncoder::~FakeWebRtcVideoEncoder() {
+ if (factory_) {
+ factory_->EncoderDestroyed(this);
+ }
+}
+
+int32_t FakeWebRtcVideoEncoder::InitEncode(
+ const webrtc::VideoCodec* codecSettings,
+ int32_t numberOfCores,
+ size_t maxPayloadSize) {
+ rtc::CritScope lock(&crit_);
+ codec_settings_ = *codecSettings;
+ init_encode_event_.Set();
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoEncoder::Encode(
+ const webrtc::VideoFrame& inputImage,
+ const webrtc::CodecSpecificInfo* codecSpecificInfo,
+ const std::vector<webrtc::FrameType>* frame_types) {
+ rtc::CritScope lock(&crit_);
+ ++num_frames_encoded_;
+ init_encode_event_.Set();
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoEncoder::RegisterEncodeCompleteCallback(
+ webrtc::EncodedImageCallback* callback) {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoEncoder::Release() {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoEncoder::SetChannelParameters(uint32_t packetLoss,
+ int64_t rtt) {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+int32_t FakeWebRtcVideoEncoder::SetRateAllocation(
+ const webrtc::VideoBitrateAllocation& allocation,
+ uint32_t framerate) {
+ return WEBRTC_VIDEO_CODEC_OK;
+}
+
+bool FakeWebRtcVideoEncoder::WaitForInitEncode() {
+ return init_encode_event_.Wait(kEventTimeoutMs);
+}
+
+webrtc::VideoCodec FakeWebRtcVideoEncoder::GetCodecSettings() {
+ rtc::CritScope lock(&crit_);
+ return codec_settings_;
+}
+
+int FakeWebRtcVideoEncoder::GetNumEncodedFrames() {
+ rtc::CritScope lock(&crit_);
+ return num_frames_encoded_;
+}
+
+// Video encoder factory.
+FakeWebRtcVideoEncoderFactory::FakeWebRtcVideoEncoderFactory()
+ : created_video_encoder_event_(false, false),
+ num_created_encoders_(0),
+ encoders_have_internal_sources_(false),
+ internal_encoder_factory_(new webrtc::InternalEncoderFactory()),
+ vp8_factory_mode_(false) {}
+
+FakeWebRtcVideoEncoderFactory::~FakeWebRtcVideoEncoderFactory() {
+ delete internal_encoder_factory_;
+}
+
+std::vector<webrtc::SdpVideoFormat>
+FakeWebRtcVideoEncoderFactory::GetSupportedFormats() const {
+ std::vector<webrtc::SdpVideoFormat> formats =
+ internal_encoder_factory_->GetSupportedFormats();
+
+ // Add external codecs.
+ for (const webrtc::SdpVideoFormat& format : formats_) {
+ // Don't add same codec twice.
+ if (!IsFormatSupported(formats, format))
+ formats.push_back(format);
+ }
+
+ return formats;
+}
+
+std::unique_ptr<webrtc::VideoEncoder>
+FakeWebRtcVideoEncoderFactory::CreateVideoEncoder(
+ const webrtc::SdpVideoFormat& format) {
+ rtc::CritScope lock(&crit_);
+ std::unique_ptr<webrtc::VideoEncoder> encoder;
+ if (IsFormatSupported(formats_, format)) {
+ if (CodecNamesEq(format.name.c_str(), kVp8CodecName) &&
+ !vp8_factory_mode_) {
+ // The simulcast adapter will ask this factory for multiple VP8
+ // encoders. Enter vp8_factory_mode so that we now create these encoders
+ // instead of more adapters.
+ vp8_factory_mode_ = true;
+ encoder = rtc::MakeUnique<webrtc::SimulcastEncoderAdapter>(this);
+ } else {
+ num_created_encoders_++;
+ created_video_encoder_event_.Set();
+ encoder = rtc::MakeUnique<FakeWebRtcVideoEncoder>(this);
+ encoders_.push_back(static_cast<FakeWebRtcVideoEncoder*>(encoder.get()));
+ }
+ } else {
+ RTC_LOG(LS_INFO) << "FakeWebRtcVideoEncoderFactory: no match for "
+ << format.name;
+ for (auto elem : format.parameters) {
+ RTC_LOG(LS_INFO) << elem.first << " " << elem.second;
+ }
+ encoder = CodecNamesEq(format.name.c_str(), kVp8CodecName)
+ ? rtc::MakeUnique<webrtc::VP8EncoderSimulcastProxy>(
+ internal_encoder_factory_)
+ : internal_encoder_factory_->CreateVideoEncoder(format);
+ }
+ return encoder;
+}
+
+webrtc::VideoEncoderFactory::CodecInfo
+FakeWebRtcVideoEncoderFactory::QueryVideoEncoder(
+ const webrtc::SdpVideoFormat& format) const {
+ if (IsFormatSupported(formats_, format)) {
+ webrtc::VideoEncoderFactory::CodecInfo info;
+ info.has_internal_source = encoders_have_internal_sources_;
+ info.is_hardware_accelerated = true;
+ return info;
+ } else {
+ return internal_encoder_factory_->QueryVideoEncoder(format);
+ }
+}
+
+bool FakeWebRtcVideoEncoderFactory::WaitForCreatedVideoEncoders(
+ int num_encoders) {
+ int64_t start_offset_ms = rtc::TimeMillis();
+ int64_t wait_time = kEventTimeoutMs;
+ do {
+ if (GetNumCreatedEncoders() >= num_encoders)
+ return true;
+ wait_time = kEventTimeoutMs - (rtc::TimeMillis() - start_offset_ms);
+ } while (wait_time > 0 && created_video_encoder_event_.Wait(wait_time));
+ return false;
+}
+
+void FakeWebRtcVideoEncoderFactory::EncoderDestroyed(
+ FakeWebRtcVideoEncoder* encoder) {
+ rtc::CritScope lock(&crit_);
+ encoders_.erase(std::remove(encoders_.begin(), encoders_.end(), encoder),
+ encoders_.end());
+}
+
+void FakeWebRtcVideoEncoderFactory::set_encoders_have_internal_sources(
+ bool internal_source) {
+ encoders_have_internal_sources_ = internal_source;
+}
+
+void FakeWebRtcVideoEncoderFactory::AddSupportedVideoCodec(
+ const webrtc::SdpVideoFormat& format) {
+ formats_.push_back(format);
+}
+
+void FakeWebRtcVideoEncoderFactory::AddSupportedVideoCodecType(
+ const std::string& name) {
+ // This is to match the default H264 params of cricket::VideoCodec.
+ cricket::VideoCodec video_codec(name);
+ formats_.push_back(
+ webrtc::SdpVideoFormat(video_codec.name, video_codec.params));
+}
+
+int FakeWebRtcVideoEncoderFactory::GetNumCreatedEncoders() {
+ rtc::CritScope lock(&crit_);
+ return num_created_encoders_;
+}
+
+const std::vector<FakeWebRtcVideoEncoder*>
+FakeWebRtcVideoEncoderFactory::encoders() {
+ rtc::CritScope lock(&crit_);
+ return encoders_;
+}
+
+} // namespace cricket
diff --git a/media/engine/fakewebrtcvideoengine.h b/media/engine/fakewebrtcvideoengine.h
index 3705a83..3a1fbdd 100644
--- a/media/engine/fakewebrtcvideoengine.h
+++ b/media/engine/fakewebrtcvideoengine.h
@@ -11,248 +11,132 @@
#ifndef MEDIA_ENGINE_FAKEWEBRTCVIDEOENGINE_H_
#define MEDIA_ENGINE_FAKEWEBRTCVIDEOENGINE_H_
-#include <map>
-#include <set>
-#include <vector>
+#include <memory>
#include <string>
+#include <vector>
#include "api/video_codecs/video_decoder.h"
+#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder.h"
-#include "media/base/codec.h"
-#include "media/engine/webrtcvideodecoderfactory.h"
-#include "media/engine/webrtcvideoencoderfactory.h"
-#include "modules/video_coding/include/video_error_codes.h"
-#include "rtc_base/basictypes.h"
+#include "api/video_codecs/video_encoder_factory.h"
+#include "media/engine/internaldecoderfactory.h"
+#include "media/engine/internalencoderfactory.h"
#include "rtc_base/criticalsection.h"
-#include "rtc_base/gunit.h"
-#include "rtc_base/stringutils.h"
+#include "rtc_base/event.h"
+#include "rtc_base/ptr_util.h"
#include "rtc_base/thread_annotations.h"
namespace cricket {
-static const int kEventTimeoutMs = 10000;
+
+class FakeWebRtcVideoDecoderFactory;
+class FakeWebRtcVideoEncoderFactory;
// Fake class for mocking out webrtc::VideoDecoder
class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder {
public:
- FakeWebRtcVideoDecoder() : num_frames_received_(0) {}
+ explicit FakeWebRtcVideoDecoder(FakeWebRtcVideoDecoderFactory* factory);
+ ~FakeWebRtcVideoDecoder();
- virtual int32_t InitDecode(const webrtc::VideoCodec*, int32_t) {
- return WEBRTC_VIDEO_CODEC_OK;
- }
-
+ virtual int32_t InitDecode(const webrtc::VideoCodec*, int32_t);
virtual int32_t Decode(const webrtc::EncodedImage&,
bool,
const webrtc::RTPFragmentationHeader*,
const webrtc::CodecSpecificInfo*,
- int64_t) {
- num_frames_received_++;
- return WEBRTC_VIDEO_CODEC_OK;
- }
+ int64_t);
+ virtual int32_t RegisterDecodeCompleteCallback(webrtc::DecodedImageCallback*);
+ virtual int32_t Release();
- virtual int32_t RegisterDecodeCompleteCallback(
- webrtc::DecodedImageCallback*) {
- return WEBRTC_VIDEO_CODEC_OK;
- }
-
- virtual int32_t Release() { return WEBRTC_VIDEO_CODEC_OK; }
-
- int GetNumFramesReceived() const {
- return num_frames_received_;
- }
+ int GetNumFramesReceived() const;
private:
int num_frames_received_;
+ FakeWebRtcVideoDecoderFactory* factory_;
};
-// Fake class for mocking out WebRtcVideoDecoderFactory.
-class FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory {
+// Fake class for mocking out webrtc::VideoDecoderFactory.
+// TODO(bugs.webrtc.org/9228): Remove internal_decoder_factory_.
+class FakeWebRtcVideoDecoderFactory : public webrtc::VideoDecoderFactory {
public:
- FakeWebRtcVideoDecoderFactory()
- : num_created_decoders_(0) {
- }
+ FakeWebRtcVideoDecoderFactory();
+ ~FakeWebRtcVideoDecoderFactory();
- virtual webrtc::VideoDecoder* CreateVideoDecoder(
- webrtc::VideoCodecType type) {
- if (supported_codec_types_.count(type) == 0) {
- return NULL;
- }
- FakeWebRtcVideoDecoder* decoder = new FakeWebRtcVideoDecoder();
- decoders_.push_back(decoder);
- num_created_decoders_++;
- return decoder;
- }
+ std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override;
+ std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
+ const webrtc::SdpVideoFormat& format) override;
- virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams(
- webrtc::VideoCodecType type,
- VideoDecoderParams params) {
- params_.push_back(params);
- return CreateVideoDecoder(type);
- }
-
- virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) {
- decoders_.erase(
- std::remove(decoders_.begin(), decoders_.end(), decoder),
- decoders_.end());
- delete decoder;
- }
-
- void AddSupportedVideoCodecType(webrtc::VideoCodecType type) {
- supported_codec_types_.insert(type);
- }
-
- int GetNumCreatedDecoders() {
- return num_created_decoders_;
- }
-
- const std::vector<FakeWebRtcVideoDecoder*>& decoders() {
- return decoders_;
- }
-
- const std::vector<VideoDecoderParams>& params() { return params_; }
+ void DecoderDestroyed(FakeWebRtcVideoDecoder* decoder);
+ void AddSupportedVideoCodecType(const webrtc::SdpVideoFormat& format);
+ int GetNumCreatedDecoders();
+ const std::vector<FakeWebRtcVideoDecoder*>& decoders();
private:
- std::set<webrtc::VideoCodecType> supported_codec_types_;
+ std::vector<webrtc::SdpVideoFormat> supported_codec_formats_;
std::vector<FakeWebRtcVideoDecoder*> decoders_;
int num_created_decoders_;
- std::vector<VideoDecoderParams> params_;
+ webrtc::InternalDecoderFactory* internal_decoder_factory_;
};
// Fake class for mocking out webrtc::VideoEnoder
class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder {
public:
- FakeWebRtcVideoEncoder()
- : init_encode_event_(false, false), num_frames_encoded_(0) {}
+ explicit FakeWebRtcVideoEncoder(FakeWebRtcVideoEncoderFactory* factory);
+ ~FakeWebRtcVideoEncoder();
int32_t InitEncode(const webrtc::VideoCodec* codecSettings,
int32_t numberOfCores,
- size_t maxPayloadSize) override {
- rtc::CritScope lock(&crit_);
- codec_settings_ = *codecSettings;
- init_encode_event_.Set();
- return WEBRTC_VIDEO_CODEC_OK;
- }
-
- bool WaitForInitEncode() { return init_encode_event_.Wait(kEventTimeoutMs); }
-
- webrtc::VideoCodec GetCodecSettings() {
- rtc::CritScope lock(&crit_);
- return codec_settings_;
- }
-
+ size_t maxPayloadSize) override;
int32_t Encode(const webrtc::VideoFrame& inputImage,
const webrtc::CodecSpecificInfo* codecSpecificInfo,
- const std::vector<webrtc::FrameType>* frame_types) override {
- rtc::CritScope lock(&crit_);
- ++num_frames_encoded_;
- init_encode_event_.Set();
- return WEBRTC_VIDEO_CODEC_OK;
- }
-
+ const std::vector<webrtc::FrameType>* frame_types) override;
int32_t RegisterEncodeCompleteCallback(
- webrtc::EncodedImageCallback* callback) override {
- return WEBRTC_VIDEO_CODEC_OK;
- }
-
- int32_t Release() override { return WEBRTC_VIDEO_CODEC_OK; }
-
- int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override {
- return WEBRTC_VIDEO_CODEC_OK;
- }
-
+ webrtc::EncodedImageCallback* callback) override;
+ int32_t Release() override;
+ int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override;
int32_t SetRateAllocation(const webrtc::VideoBitrateAllocation& allocation,
- uint32_t framerate) override {
- return WEBRTC_VIDEO_CODEC_OK;
- }
+ uint32_t framerate) override;
- int GetNumEncodedFrames() {
- rtc::CritScope lock(&crit_);
- return num_frames_encoded_;
- }
+ bool WaitForInitEncode();
+ webrtc::VideoCodec GetCodecSettings();
+ int GetNumEncodedFrames();
private:
rtc::CriticalSection crit_;
rtc::Event init_encode_event_;
int num_frames_encoded_ RTC_GUARDED_BY(crit_);
webrtc::VideoCodec codec_settings_ RTC_GUARDED_BY(crit_);
+ FakeWebRtcVideoEncoderFactory* factory_;
};
-// Fake class for mocking out WebRtcVideoEncoderFactory.
-class FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory {
+// Fake class for mocking out webrtc::VideoEncoderFactory.
+// TODO(bugs.webrtc.org/9228): Remove internal_encoder_factory_.
+class FakeWebRtcVideoEncoderFactory : public webrtc::VideoEncoderFactory {
public:
- FakeWebRtcVideoEncoderFactory()
- : created_video_encoder_event_(false, false),
- num_created_encoders_(0),
- encoders_have_internal_sources_(false) {}
+ FakeWebRtcVideoEncoderFactory();
+ ~FakeWebRtcVideoEncoderFactory();
- webrtc::VideoEncoder* CreateVideoEncoder(
- const cricket::VideoCodec& codec) override {
- rtc::CritScope lock(&crit_);
- if (!FindMatchingCodec(codecs_, codec))
- return nullptr;
- FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder();
- encoders_.push_back(encoder);
- num_created_encoders_++;
- created_video_encoder_event_.Set();
- return encoder;
- }
+ std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override;
+ std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder(
+ const webrtc::SdpVideoFormat& format) override;
+ CodecInfo QueryVideoEncoder(
+ const webrtc::SdpVideoFormat& format) const override;
- bool WaitForCreatedVideoEncoders(int num_encoders) {
- int64_t start_offset_ms = rtc::TimeMillis();
- int64_t wait_time = kEventTimeoutMs;
- do {
- if (GetNumCreatedEncoders() >= num_encoders)
- return true;
- wait_time = kEventTimeoutMs - (rtc::TimeMillis() - start_offset_ms);
- } while (wait_time > 0 && created_video_encoder_event_.Wait(wait_time));
- return false;
- }
-
- void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override {
- rtc::CritScope lock(&crit_);
- encoders_.erase(
- std::remove(encoders_.begin(), encoders_.end(), encoder),
- encoders_.end());
- delete encoder;
- }
-
- const std::vector<cricket::VideoCodec>& supported_codecs() const override {
- return codecs_;
- }
-
- bool EncoderTypeHasInternalSource(
- webrtc::VideoCodecType type) const override {
- return encoders_have_internal_sources_;
- }
-
- void set_encoders_have_internal_sources(bool internal_source) {
- encoders_have_internal_sources_ = internal_source;
- }
-
- void AddSupportedVideoCodec(const cricket::VideoCodec& codec) {
- codecs_.push_back(codec);
- }
-
- void AddSupportedVideoCodecType(const std::string& name) {
- codecs_.push_back(cricket::VideoCodec(name));
- }
-
- int GetNumCreatedEncoders() {
- rtc::CritScope lock(&crit_);
- return num_created_encoders_;
- }
-
- const std::vector<FakeWebRtcVideoEncoder*> encoders() {
- rtc::CritScope lock(&crit_);
- return encoders_;
- }
+ bool WaitForCreatedVideoEncoders(int num_encoders);
+ void EncoderDestroyed(FakeWebRtcVideoEncoder* encoder);
+ void set_encoders_have_internal_sources(bool internal_source);
+ void AddSupportedVideoCodec(const webrtc::SdpVideoFormat& format);
+ void AddSupportedVideoCodecType(const std::string& name);
+ int GetNumCreatedEncoders();
+ const std::vector<FakeWebRtcVideoEncoder*> encoders();
private:
rtc::CriticalSection crit_;
rtc::Event created_video_encoder_event_;
- std::vector<cricket::VideoCodec> codecs_;
+ std::vector<webrtc::SdpVideoFormat> formats_;
std::vector<FakeWebRtcVideoEncoder*> encoders_ RTC_GUARDED_BY(crit_);
int num_created_encoders_ RTC_GUARDED_BY(crit_);
bool encoders_have_internal_sources_;
+ webrtc::InternalEncoderFactory* internal_encoder_factory_;
+ bool vp8_factory_mode_;
};
} // namespace cricket
diff --git a/media/engine/vp8_encoder_simulcast_proxy.h b/media/engine/vp8_encoder_simulcast_proxy.h
index 7e9fd4e..7763ad0 100644
--- a/media/engine/vp8_encoder_simulcast_proxy.h
+++ b/media/engine/vp8_encoder_simulcast_proxy.h
@@ -25,7 +25,7 @@
class VP8EncoderSimulcastProxy : public VP8Encoder {
public:
explicit VP8EncoderSimulcastProxy(VideoEncoderFactory* factory);
- virtual ~VP8EncoderSimulcastProxy();
+ ~VP8EncoderSimulcastProxy() override;
// Implements VideoEncoder.
int Release() override;
diff --git a/media/engine/webrtcvideoengine_unittest.cc b/media/engine/webrtcvideoengine_unittest.cc
index 6be9bc7..54f6470 100644
--- a/media/engine/webrtcvideoengine_unittest.cc
+++ b/media/engine/webrtcvideoengine_unittest.cc
@@ -183,9 +183,9 @@
call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))),
encoder_factory_(new cricket::FakeWebRtcVideoEncoderFactory),
decoder_factory_(new cricket::FakeWebRtcVideoDecoderFactory),
- engine_(std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(
+ engine_(std::unique_ptr<cricket::FakeWebRtcVideoEncoderFactory>(
encoder_factory_),
- std::unique_ptr<cricket::WebRtcVideoDecoderFactory>(
+ std::unique_ptr<cricket::FakeWebRtcVideoDecoderFactory>(
decoder_factory_)) {
std::vector<VideoCodec> engine_codecs = engine_.codecs();
RTC_DCHECK(!engine_codecs.empty());
@@ -227,10 +227,6 @@
// Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly
// initialized when the constructor is called.
std::unique_ptr<webrtc::Call> call_;
- // TODO(magjed): Update all tests to use new video codec factories once the
- // old factories are deprecated,
- // https://bugs.chromium.org/p/webrtc/issues/detail?id=7925.
- // These factories are owned by the video engine.
cricket::FakeWebRtcVideoEncoderFactory* encoder_factory_;
cricket::FakeWebRtcVideoDecoderFactory* decoder_factory_;
WebRtcVideoEngine engine_;
@@ -468,16 +464,16 @@
using webrtc::H264::ProfileLevelIdToString;
using webrtc::H264::ProfileLevelId;
using webrtc::H264::kLevel1;
- cricket::VideoCodec h264_constrained_baseline("H264");
- h264_constrained_baseline.params[kH264FmtpProfileLevelId] =
+ webrtc::SdpVideoFormat h264_constrained_baseline("H264");
+ h264_constrained_baseline.parameters[kH264FmtpProfileLevelId] =
*ProfileLevelIdToString(
ProfileLevelId(webrtc::H264::kProfileConstrainedBaseline, kLevel1));
- cricket::VideoCodec h264_constrained_high("H264");
- h264_constrained_high.params[kH264FmtpProfileLevelId] =
+ webrtc::SdpVideoFormat h264_constrained_high("H264");
+ h264_constrained_high.parameters[kH264FmtpProfileLevelId] =
*ProfileLevelIdToString(
ProfileLevelId(webrtc::H264::kProfileConstrainedHigh, kLevel1));
- cricket::VideoCodec h264_high("H264");
- h264_high.params[kH264FmtpProfileLevelId] = *ProfileLevelIdToString(
+ webrtc::SdpVideoFormat h264_high("H264");
+ h264_high.parameters[kH264FmtpProfileLevelId] = *ProfileLevelIdToString(
ProfileLevelId(webrtc::H264::kProfileHigh, kLevel1));
encoder_factory_->AddSupportedVideoCodec(h264_constrained_baseline);
@@ -489,11 +485,15 @@
// Now search for RTX codecs for them. Expect that they all have associated
// RTX codecs.
EXPECT_TRUE(HasRtxCodec(
- codecs, FindMatchingCodec(codecs, h264_constrained_baseline)->id));
+ codecs,
+ FindMatchingCodec(codecs, cricket::VideoCodec(h264_constrained_baseline))
+ ->id));
EXPECT_TRUE(HasRtxCodec(
- codecs, FindMatchingCodec(codecs, h264_constrained_high)->id));
+ codecs,
+ FindMatchingCodec(codecs, cricket::VideoCodec(h264_constrained_high))
+ ->id));
EXPECT_TRUE(HasRtxCodec(
- codecs, FindMatchingCodec(codecs, h264_high)->id));
+ codecs, FindMatchingCodec(codecs, cricket::VideoCodec(h264_high))->id));
}
#if !defined(RTC_DISABLE_VP9)
@@ -595,8 +595,14 @@
engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions());
cricket::VideoSendParameters parameters;
// We need to look up the codec in the engine to get the correct payload type.
- for (const VideoCodec& codec : encoder_factory_->supported_codecs())
- parameters.codecs.push_back(GetEngineCodec(codec.name));
+ for (const webrtc::SdpVideoFormat& format :
+ encoder_factory_->GetSupportedFormats()) {
+ cricket::VideoCodec engine_codec = GetEngineCodec(format.name);
+ if (std::find(parameters.codecs.begin(), parameters.codecs.end(),
+ engine_codec) == parameters.codecs.end()) {
+ parameters.codecs.push_back(engine_codec);
+ }
+ }
EXPECT_TRUE(channel->SetSendParameters(parameters));
@@ -659,7 +665,11 @@
EXPECT_EQ(cricket::CS_RUNNING,
capturer.Start(capturer.GetSupportedFormats()->front()));
- std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
+ std::unique_ptr<VideoMediaChannel> channel(
+ engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
+ cricket::VideoSendParameters parameters;
+ parameters.codecs.push_back(GetEngineCodec("H264"));
+ EXPECT_TRUE(channel->SetSendParameters(parameters));
EXPECT_TRUE(
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -669,9 +679,9 @@
ASSERT_EQ_WAIT(1u, encoder_factory_->encoders().size(), kTimeout);
- cricket::VideoSendParameters parameters;
- parameters.codecs.push_back(GetEngineCodec("VP8"));
- EXPECT_TRUE(channel->SetSendParameters(parameters));
+ cricket::VideoSendParameters new_parameters;
+ new_parameters.codecs.push_back(GetEngineCodec("VP8"));
+ EXPECT_TRUE(channel->SetSendParameters(new_parameters));
// Sending one frame will switch encoder.
EXPECT_TRUE(capturer.CaptureFrame());
@@ -766,7 +776,11 @@
TEST_F(WebRtcVideoEngineTest, SimulcastDisabledForH264) {
encoder_factory_->AddSupportedVideoCodecType("H264");
- std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
+ std::unique_ptr<VideoMediaChannel> channel(
+ engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
+ cricket::VideoSendParameters parameters;
+ parameters.codecs.push_back(GetEngineCodec("H264"));
+ EXPECT_TRUE(channel->SetSendParameters(parameters));
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
EXPECT_TRUE(
@@ -850,7 +864,7 @@
}
TEST_F(WebRtcVideoEngineTest, RegisterExternalDecodersIfSupported) {
- decoder_factory_->AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
+ decoder_factory_->AddSupportedVideoCodecType(webrtc::SdpVideoFormat("VP8"));
cricket::VideoRecvParameters parameters;
parameters.codecs.push_back(GetEngineCodec("VP8"));
@@ -877,7 +891,7 @@
// For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
// codecs.
encoder_factory_->AddSupportedVideoCodecType("H264");
- decoder_factory_->AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
+ decoder_factory_->AddSupportedVideoCodecType(webrtc::SdpVideoFormat("H264"));
std::vector<cricket::VideoCodec> codecs;
codecs.push_back(GetEngineCodec("H264"));
@@ -968,7 +982,7 @@
const webrtc::SdpVideoFormat format("VP8");
EXPECT_CALL(*encoder_factory, QueryVideoEncoder(format))
.WillRepeatedly(testing::Return(codec_info));
- FakeWebRtcVideoEncoder* const encoder = new FakeWebRtcVideoEncoder();
+ FakeWebRtcVideoEncoder* const encoder = new FakeWebRtcVideoEncoder(nullptr);
rtc::Event encoder_created(false, false);
EXPECT_CALL(*encoder_factory, CreateVideoEncoderProxy(format))
.WillOnce(
@@ -977,7 +991,7 @@
::testing::Return(encoder)));
// Mock decoder creation. |engine| take ownership of the decoder.
- FakeWebRtcVideoDecoder* const decoder = new FakeWebRtcVideoDecoder();
+ FakeWebRtcVideoDecoder* const decoder = new FakeWebRtcVideoDecoder(nullptr);
EXPECT_CALL(*decoder_factory, CreateVideoDecoderProxy(format))
.WillOnce(testing::Return(decoder));
@@ -1062,25 +1076,6 @@
EXPECT_TRUE(recv_channel->RemoveRecvStream(recv_ssrc));
}
-// Verifies that id given in stream params is passed to the decoder factory.
-TEST_F(WebRtcVideoEngineTest, StreamParamsIdPassedToDecoderFactory) {
- decoder_factory_->AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
- cricket::VideoRecvParameters parameters;
- parameters.codecs.push_back(GetEngineCodec("VP8"));
-
- std::unique_ptr<VideoMediaChannel> channel(
- SetUpForExternalDecoderFactory(parameters.codecs));
-
- StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc);
- sp.id = "FakeStreamParamsId";
- EXPECT_TRUE(channel->AddRecvStream(sp));
- EXPECT_EQ(1u, decoder_factory_->decoders().size());
-
- std::vector<cricket::VideoDecoderParams> params = decoder_factory_->params();
- ASSERT_EQ(1u, params.size());
- EXPECT_EQ(sp.id, params[0].receive_stream_id);
-}
-
TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) {
encoder_factory_->AddSupportedVideoCodecType("VP8");
std::unique_ptr<FakeCall> fake_call(new FakeCall());
@@ -1144,8 +1139,10 @@
protected:
WebRtcVideoChannelBaseTest()
: call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))),
- engine_(std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(),
- std::unique_ptr<cricket::WebRtcVideoDecoderFactory>()) {}
+ engine_(std::unique_ptr<cricket::FakeWebRtcVideoEncoderFactory>(
+ new cricket::FakeWebRtcVideoEncoderFactory()),
+ std::unique_ptr<cricket::FakeWebRtcVideoDecoderFactory>(
+ new cricket::FakeWebRtcVideoDecoderFactory())) {}
virtual void SetUp() {
cricket::MediaConfig media_config;
@@ -5721,9 +5718,9 @@
: fake_call_(),
encoder_factory_(new cricket::FakeWebRtcVideoEncoderFactory),
decoder_factory_(new cricket::FakeWebRtcVideoDecoderFactory),
- engine_(std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(
+ engine_(std::unique_ptr<cricket::FakeWebRtcVideoEncoderFactory>(
encoder_factory_),
- std::unique_ptr<cricket::WebRtcVideoDecoderFactory>(
+ std::unique_ptr<cricket::FakeWebRtcVideoDecoderFactory>(
decoder_factory_)),
last_ssrc_(0) {}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 23c5ef4..5cb084f 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -377,6 +377,8 @@
"../api:libjingle_peerconnection_api",
"../api:libjingle_peerconnection_test_api",
"../api:rtc_stats_api",
+ "../api/video_codecs:builtin_video_decoder_factory",
+ "../api/video_codecs:builtin_video_encoder_factory",
"../call:call_interfaces",
"../logging:rtc_event_log_api",
"../media:rtc_data",
@@ -384,6 +386,7 @@
"../media:rtc_media_base",
"../media:rtc_media_tests_utils",
"../modules/audio_device:audio_device",
+ "../modules/audio_processing:audio_processing",
"../p2p:p2p_test_utils",
"../rtc_base:checks",
"../rtc_base:rtc_base",
@@ -506,6 +509,9 @@
"../api/audio_codecs:builtin_audio_encoder_factory",
"../api/audio_codecs/L16:audio_decoder_L16",
"../api/audio_codecs/L16:audio_encoder_L16",
+ "../api/video_codecs:builtin_video_decoder_factory",
+ "../api/video_codecs:builtin_video_encoder_factory",
+ "../api/video_codecs:video_codecs_api",
"../call:call_interfaces",
"../logging:rtc_event_log_api",
"../logging:rtc_event_log_impl_base",
diff --git a/pc/peerconnection_bundle_unittest.cc b/pc/peerconnection_bundle_unittest.cc
index dfd47cd..b31861d 100644
--- a/pc/peerconnection_bundle_unittest.cc
+++ b/pc/peerconnection_bundle_unittest.cc
@@ -11,6 +11,8 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/peerconnectionproxy.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "p2p/base/fakeportallocator.h"
#include "p2p/base/teststunserver.h"
#include "p2p/client/basicportallocator.h"
@@ -168,8 +170,10 @@
#endif
pc_factory_ = CreatePeerConnectionFactory(
rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
- FakeAudioCaptureModule::Create(), CreateBuiltinAudioEncoderFactory(),
- CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ rtc::scoped_refptr<AudioDeviceModule>(FakeAudioCaptureModule::Create()),
+ CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory(),
+ CreateBuiltinVideoEncoderFactory(), CreateBuiltinVideoDecoderFactory(),
+ nullptr /* audio_mixer */, nullptr /* audio_processing */);
}
WrapperPtr CreatePeerConnection() {
diff --git a/pc/peerconnection_crypto_unittest.cc b/pc/peerconnection_crypto_unittest.cc
index b2f2469..5077358 100644
--- a/pc/peerconnection_crypto_unittest.cc
+++ b/pc/peerconnection_crypto_unittest.cc
@@ -10,6 +10,8 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "p2p/base/fakeportallocator.h"
#include "pc/mediasession.h"
#include "pc/peerconnectionwrapper.h"
@@ -46,7 +48,9 @@
pc_factory_ = CreatePeerConnectionFactory(
rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
FakeAudioCaptureModule::Create(), CreateBuiltinAudioEncoderFactory(),
- CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ CreateBuiltinAudioDecoderFactory(), CreateBuiltinVideoEncoderFactory(),
+ CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */);
}
WrapperPtr CreatePeerConnection() {
diff --git a/pc/peerconnection_ice_unittest.cc b/pc/peerconnection_ice_unittest.cc
index 1f8213e..3c1782c 100644
--- a/pc/peerconnection_ice_unittest.cc
+++ b/pc/peerconnection_ice_unittest.cc
@@ -21,6 +21,8 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/peerconnectionproxy.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "pc/test/fakeaudiocapturemodule.h"
#include "rtc_base/fakenetwork.h"
#include "rtc_base/gunit.h"
@@ -89,8 +91,10 @@
#endif
pc_factory_ = CreatePeerConnectionFactory(
rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
- FakeAudioCaptureModule::Create(), CreateBuiltinAudioEncoderFactory(),
- CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ rtc::scoped_refptr<AudioDeviceModule>(FakeAudioCaptureModule::Create()),
+ CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory(),
+ CreateBuiltinVideoEncoderFactory(), CreateBuiltinVideoDecoderFactory(),
+ nullptr /* audio_mixer */, nullptr /* audio_processing */);
}
WrapperPtr CreatePeerConnection() {
@@ -948,7 +952,9 @@
pc_factory_ = CreatePeerConnectionFactory(
rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
FakeAudioCaptureModule::Create(), CreateBuiltinAudioEncoderFactory(),
- CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ CreateBuiltinAudioDecoderFactory(), CreateBuiltinVideoEncoderFactory(),
+ CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */);
}
void CreatePeerConnection(const RTCConfiguration& config) {
std::unique_ptr<cricket::FakePortAllocator> port_allocator(
diff --git a/pc/peerconnection_integrationtest.cc b/pc/peerconnection_integrationtest.cc
index 40218e7..c3a41e4 100644
--- a/pc/peerconnection_integrationtest.cc
+++ b/pc/peerconnection_integrationtest.cc
@@ -30,6 +30,9 @@
#include "api/peerconnectionproxy.h"
#include "api/rtpreceiverinterface.h"
#include "api/test/fakeconstraints.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
+#include "api/video_codecs/sdp_video_format.h"
#include "media/engine/fakewebrtcvideoengine.h"
#include "p2p/base/p2pconstants.h"
#include "p2p/base/portinterface.h"
@@ -604,9 +607,15 @@
rtc::Thread* const signaling_thread = rtc::Thread::Current();
peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
network_thread, worker_thread, signaling_thread,
- fake_audio_capture_module_, webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory(), fake_video_encoder_factory_,
- fake_video_decoder_factory_);
+ rtc::scoped_refptr<webrtc::AudioDeviceModule>(
+ fake_audio_capture_module_),
+ webrtc::CreateBuiltinAudioEncoderFactory(),
+ webrtc::CreateBuiltinAudioDecoderFactory(),
+ std::unique_ptr<FakeWebRtcVideoEncoderFactory>(
+ fake_video_encoder_factory_),
+ std::unique_ptr<FakeWebRtcVideoDecoderFactory>(
+ fake_video_decoder_factory_),
+ nullptr /* audio_mixer */, nullptr /* audio_processing */);
if (!peer_connection_factory_) {
return false;
}
@@ -658,7 +667,7 @@
void EnableVideoDecoderFactory() {
video_decoder_factory_enabled_ = true;
fake_video_decoder_factory_->AddSupportedVideoCodecType(
- webrtc::kVideoCodecVP8);
+ webrtc::SdpVideoFormat("VP8"));
}
rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrackInternal(
diff --git a/pc/peerconnection_rtp_unittest.cc b/pc/peerconnection_rtp_unittest.cc
index 942bd46..36fa5c7 100644
--- a/pc/peerconnection_rtp_unittest.cc
+++ b/pc/peerconnection_rtp_unittest.cc
@@ -17,6 +17,8 @@
#include "api/mediastreaminterface.h"
#include "api/peerconnectioninterface.h"
#include "api/umametrics.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "pc/mediasession.h"
#include "pc/mediastream.h"
#include "pc/mediastreamtrack.h"
@@ -70,8 +72,10 @@
FakeAudioCaptureModule::Create(),
CreateBuiltinAudioEncoderFactory(),
CreateBuiltinAudioDecoderFactory(),
- nullptr,
- nullptr)) {}
+ CreateBuiltinVideoEncoderFactory(),
+ CreateBuiltinVideoDecoderFactory(),
+ nullptr /* audio_mixer */,
+ nullptr /* audio_processing */)) {}
std::unique_ptr<PeerConnectionWrapper> CreatePeerConnection() {
return CreatePeerConnection(RTCConfiguration());
diff --git a/pc/peerconnection_signaling_unittest.cc b/pc/peerconnection_signaling_unittest.cc
index 3059fd2..73a659b 100644
--- a/pc/peerconnection_signaling_unittest.cc
+++ b/pc/peerconnection_signaling_unittest.cc
@@ -16,6 +16,8 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/peerconnectionproxy.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "pc/peerconnection.h"
#include "pc/peerconnectionwrapper.h"
#include "pc/sdputils.h"
@@ -68,8 +70,10 @@
#endif
pc_factory_ = CreatePeerConnectionFactory(
rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
- FakeAudioCaptureModule::Create(), CreateBuiltinAudioEncoderFactory(),
- CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ rtc::scoped_refptr<AudioDeviceModule>(FakeAudioCaptureModule::Create()),
+ CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory(),
+ CreateBuiltinVideoEncoderFactory(), CreateBuiltinVideoDecoderFactory(),
+ nullptr /* audio_mixer */, nullptr /* audio_processing */);
}
WrapperPtr CreatePeerConnection() {
diff --git a/pc/peerconnectionfactory_unittest.cc b/pc/peerconnectionfactory_unittest.cc
index c8133a3..66036b1 100644
--- a/pc/peerconnectionfactory_unittest.cc
+++ b/pc/peerconnectionfactory_unittest.cc
@@ -16,6 +16,8 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/mediastreaminterface.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "media/base/fakevideocapturer.h"
#include "p2p/base/fakeportallocator.h"
#include "pc/peerconnectionfactory.h"
@@ -93,10 +95,14 @@
// level, and using a real one could make tests flaky e.g. when run in
// parallel.
factory_ = webrtc::CreatePeerConnectionFactory(
- rtc::Thread::Current(), rtc::Thread::Current(),
- FakeAudioCaptureModule::Create(),
+ rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
+ rtc::scoped_refptr<webrtc::AudioDeviceModule>(
+ FakeAudioCaptureModule::Create()),
webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ webrtc::CreateBuiltinAudioDecoderFactory(),
+ webrtc::CreateBuiltinVideoEncoderFactory(),
+ webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */);
ASSERT_TRUE(factory_.get() != NULL);
port_allocator_.reset(
@@ -147,8 +153,13 @@
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
webrtc::CreatePeerConnectionFactory(
+ nullptr /* network_thread */, nullptr /* worker_thread */,
+ nullptr /* signaling_thread */, nullptr /* default_adm */,
webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory()));
+ webrtc::CreateBuiltinAudioDecoderFactory(),
+ webrtc::CreateBuiltinVideoEncoderFactory(),
+ webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */));
NullPeerConnectionObserver observer;
webrtc::PeerConnectionInterface::RTCConfiguration config;
diff --git a/pc/peerconnectioninterface_unittest.cc b/pc/peerconnectioninterface_unittest.cc
index 0d5f177..799baa6 100644
--- a/pc/peerconnectioninterface_unittest.cc
+++ b/pc/peerconnectioninterface_unittest.cc
@@ -22,6 +22,8 @@
#include "api/rtpreceiverinterface.h"
#include "api/rtpsenderinterface.h"
#include "api/test/fakeconstraints.h"
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "logging/rtc_event_log/output/rtc_event_log_output_file.h"
#include "media/base/fakevideocapturer.h"
#include "media/engine/webrtcmediaengine.h"
@@ -688,8 +690,13 @@
fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
pc_factory_ = webrtc::CreatePeerConnectionFactory(
rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
- fake_audio_capture_module_, webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr);
+ rtc::scoped_refptr<webrtc::AudioDeviceModule>(
+ fake_audio_capture_module_),
+ webrtc::CreateBuiltinAudioEncoderFactory(),
+ webrtc::CreateBuiltinAudioDecoderFactory(),
+ webrtc::CreateBuiltinVideoEncoderFactory(),
+ webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */);
ASSERT_TRUE(pc_factory_);
pc_factory_for_test_ =
PeerConnectionFactoryForTest::CreatePeerConnectionFactoryForTest();
@@ -1398,7 +1405,10 @@
rtc::Thread::Current(), rtc::Thread::Current(),
rtc::Thread::Current(), fake_audio_capture_module_,
webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr));
+ webrtc::CreateBuiltinAudioDecoderFactory(),
+ webrtc::CreateBuiltinVideoEncoderFactory(),
+ webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */));
rtc::scoped_refptr<PeerConnectionInterface> pc(
pc_factory->CreatePeerConnection(
config, nullptr, std::move(port_allocator), nullptr, &observer_));
diff --git a/pc/test/peerconnectiontestwrapper.cc b/pc/test/peerconnectiontestwrapper.cc
index 1b87208..a3ee5ab3 100644
--- a/pc/test/peerconnectiontestwrapper.cc
+++ b/pc/test/peerconnectiontestwrapper.cc
@@ -12,6 +12,9 @@
#include <utility>
#include <vector>
+#include "api/video_codecs/builtin_video_decoder_factory.h"
+#include "api/video_codecs/builtin_video_encoder_factory.h"
+#include "modules/audio_processing/include/audio_processing.h"
#include "p2p/base/fakeportallocator.h"
#include "pc/sdputils.h"
#include "pc/test/fakeperiodicvideocapturer.h"
@@ -80,8 +83,11 @@
peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
network_thread_, worker_thread_, rtc::Thread::Current(),
- fake_audio_capture_module_, audio_encoder_factory, audio_decoder_factory,
- nullptr, nullptr);
+ rtc::scoped_refptr<webrtc::AudioDeviceModule>(fake_audio_capture_module_),
+ audio_encoder_factory, audio_decoder_factory,
+ webrtc::CreateBuiltinVideoEncoderFactory(),
+ webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
+ nullptr /* audio_processing */);
if (!peer_connection_factory_) {
return false;
}