|  | /* | 
|  | *  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 "absl/memory/memory.h" | 
|  | #include "absl/strings/match.h" | 
|  | #include "api/video_codecs/sdp_video_format.h" | 
|  | #include "api/video_codecs/video_encoder.h" | 
|  | #include "media/base/codec.h" | 
|  | #include "media/base/media_constants.h" | 
|  | #include "media/engine/encoder_simulcast_proxy.h" | 
|  | #include "media/engine/internal_encoder_factory.h" | 
|  | #include "rtc_base/checks.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 = absl::make_unique<EncoderSimulcastProxy>( | 
|  | internal_encoder_factory_.get(), 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 absl::make_unique<BuiltinVideoEncoderFactory>(); | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |