Add new video codec factories
This CL adds interfaces for the new video codec factories and wires them
up in WebRtcVideoEngine. The default behavior is unmodified however, and
the new code is currently unused except for the tests.
A follow-up CL will be uploaded for exposing them in the
PeerConnectionFactory API: https://codereview.webrtc.org/3004353002/.
BUG=webrtc:7925
R=andersc@webrtc.org, stefan@webrtc.org
Review-Url: https://codereview.webrtc.org/3007073002 .
Cr-Commit-Position: refs/heads/master@{#19828}
diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc
index a21f633..26b9397 100644
--- a/webrtc/media/engine/webrtcvideoengine.cc
+++ b/webrtc/media/engine/webrtcvideoengine.cc
@@ -17,8 +17,11 @@
#include <utility>
#include "webrtc/api/video/i420_buffer.h"
+#include "webrtc/api/video_codecs/sdp_video_format.h"
#include "webrtc/api/video_codecs/video_decoder.h"
+#include "webrtc/api/video_codecs/video_decoder_factory.h"
#include "webrtc/api/video_codecs/video_encoder.h"
+#include "webrtc/api/video_codecs/video_encoder_factory.h"
#include "webrtc/call/call.h"
#include "webrtc/common_video/h264/profile_level_id.h"
#include "webrtc/media/engine/constants.h"
@@ -86,8 +89,8 @@
// Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter
// interface.
-// TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory
-// interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925.
+// TODO(magjed): Remove once WebRtcVideoEncoderFactory* is deprecated and
+// webrtc:7925 is fixed.
class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter {
public:
explicit CricketEncoderFactoryAdapter(
@@ -130,6 +133,66 @@
WebRtcVideoDecoderFactory* const external_decoder_factory_;
};
+// Wraps webrtc::VideoEncoderFactory into common EncoderFactoryAdapter
+// interface.
+class WebRtcEncoderFactoryAdapter : public EncoderFactoryAdapter {
+ public:
+ explicit WebRtcEncoderFactoryAdapter(
+ std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory)
+ : encoder_factory_(std::move(encoder_factory)) {}
+
+ private:
+ AllocatedEncoder CreateVideoEncoder(
+ const VideoCodec& codec,
+ bool is_conference_mode_screenshare) const override {
+ if (!encoder_factory_)
+ return AllocatedEncoder();
+ const webrtc::SdpVideoFormat format(codec.name, codec.params);
+ const webrtc::VideoEncoderFactory::CodecInfo info =
+ encoder_factory_->QueryVideoEncoder(format);
+ return AllocatedEncoder(encoder_factory_->CreateVideoEncoder(format),
+ info.is_hardware_accelerated,
+ info.has_internal_source);
+ }
+
+ std::vector<VideoCodec> GetSupportedCodecs() const override {
+ if (!encoder_factory_)
+ return std::vector<VideoCodec>();
+ std::vector<VideoCodec> codecs;
+ for (const webrtc::SdpVideoFormat& format :
+ encoder_factory_->GetSupportedFormats()) {
+ VideoCodec codec;
+ codec.name = format.name;
+ codec.params = format.parameters;
+ codecs.push_back(codec);
+ }
+ return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
+ }
+
+ std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
+};
+
+// Wraps webrtc::VideoDecoderFactory into common DecoderFactoryAdapter
+// interface.
+class WebRtcDecoderFactoryAdapter : public DecoderFactoryAdapter {
+ public:
+ explicit WebRtcDecoderFactoryAdapter(
+ std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory)
+ : decoder_factory_(std::move(decoder_factory)) {}
+
+ private:
+ std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
+ const VideoCodec& codec,
+ const VideoDecoderParams& decoder_params) const override {
+ return decoder_factory_
+ ? decoder_factory_->CreateVideoDecoder(
+ webrtc::SdpVideoFormat(codec.name, codec.params))
+ : nullptr;
+ }
+
+ std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
+};
+
// If this field trial is enabled, we will enable sending FlexFEC and disable
// sending ULPFEC whenever the former has been negotiated in the SDPs.
bool IsFlexfecFieldTrialEnabled() {
@@ -401,6 +464,16 @@
LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
}
+WebRtcVideoEngine::WebRtcVideoEngine(
+ std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
+ std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory)
+ : decoder_factory_(
+ new WebRtcDecoderFactoryAdapter(std::move(video_decoder_factory))),
+ encoder_factory_(
+ new WebRtcEncoderFactoryAdapter(std::move(video_encoder_factory))) {
+ LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
+}
+
WebRtcVideoEngine::~WebRtcVideoEngine() {
LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine";
}