1 /* 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_ 12 #define API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_ 13 14 #include <memory> 15 #include <vector> 16 17 #include "absl/types/optional.h" 18 #include "api/units/data_rate.h" 19 #include "api/video_codecs/sdp_video_format.h" 20 21 namespace webrtc { 22 23 class VideoEncoder; 24 25 // A factory that creates VideoEncoders. 26 // NOTE: This class is still under development and may change without notice. 27 class VideoEncoderFactory { 28 public: 29 // TODO(magjed): Try to get rid of this struct. 30 struct CodecInfo { 31 // |has_internal_source| is true if encoders created by this factory of the 32 // given codec will use internal camera sources, meaning that they don't 33 // require/expect frames to be delivered via webrtc::VideoEncoder::Encode. 34 // This flag is used as the internal_source parameter to 35 // webrtc::ViEExternalCodec::RegisterExternalSendCodec. 36 bool has_internal_source = false; 37 }; 38 39 // An injectable class that is continuously updated with encoding conditions 40 // and selects the best encoder given those conditions. 41 class EncoderSelectorInterface { 42 public: ~EncoderSelectorInterface()43 virtual ~EncoderSelectorInterface() {} 44 45 // Informs the encoder selector about which encoder that is currently being 46 // used. 47 virtual void OnCurrentEncoder(const SdpVideoFormat& format) = 0; 48 49 // Called every time the available bitrate is updated. Should return a 50 // non-empty if an encoder switch should be performed. 51 virtual absl::optional<SdpVideoFormat> OnAvailableBitrate( 52 const DataRate& rate) = 0; 53 54 // Called if the currently used encoder reports itself as broken. Should 55 // return a non-empty if an encoder switch should be performed. 56 virtual absl::optional<SdpVideoFormat> OnEncoderBroken() = 0; 57 }; 58 59 // Returns a list of supported video formats in order of preference, to use 60 // for signaling etc. 61 virtual std::vector<SdpVideoFormat> GetSupportedFormats() const = 0; 62 63 // Returns a list of supported video formats in order of preference, that can 64 // also be tagged with additional information to allow the VideoEncoderFactory 65 // to separate between different implementations when CreateVideoEncoder is 66 // called. GetImplementations()67 virtual std::vector<SdpVideoFormat> GetImplementations() const { 68 return GetSupportedFormats(); 69 } 70 71 // Returns information about how this format will be encoded. The specified 72 // format must be one of the supported formats by this factory. 73 74 // TODO(magjed): Try to get rid of this method. Since is_hardware_accelerated 75 // is unused, only factories producing internal source encoders (in itself a 76 // deprecated feature) needs to override this method. QueryVideoEncoder(const SdpVideoFormat & format)77 virtual CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const { 78 return CodecInfo(); 79 } 80 81 // Creates a VideoEncoder for the specified format. 82 virtual std::unique_ptr<VideoEncoder> CreateVideoEncoder( 83 const SdpVideoFormat& format) = 0; 84 GetEncoderSelector()85 virtual std::unique_ptr<EncoderSelectorInterface> GetEncoderSelector() const { 86 return nullptr; 87 } 88 ~VideoEncoderFactory()89 virtual ~VideoEncoderFactory() {} 90 }; 91 92 } // namespace webrtc 93 94 #endif // API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_ 95