Index: webrtc/media/engine/webrtcvideoengine.cc |
diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc |
index a21f63359dafef87d3e43d26e18a72ed614279ca..26b9397f3b52c4c146486e16ee29af0d32e56756 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 @@ std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs( |
// 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 @@ class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter { |
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 @@ WebRtcVideoEngine::WebRtcVideoEngine( |
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"; |
} |