| /* |
| * 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/mediaconstants.h" |
| #include "media/engine/encoder_simulcast_proxy.h" |
| #include "media/engine/internalencoderfactory.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::EqualsIgnoreCase(format.name, cricket::kVp8CodecName) |
| ? absl::make_unique<EncoderSimulcastProxy>( |
| internal_encoder_factory_.get(), format) |
| : 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 absl::make_unique<BuiltinVideoEncoderFactory>(); |
| } |
| |
| } // namespace webrtc |