| Index: webrtc/config.h
|
| diff --git a/webrtc/config.h b/webrtc/config.h
|
| index 9303f548e7299d857447970f0208d2e476665a76..0e8b769b69701febc27edd524cfcf77703dca170 100644
|
| --- a/webrtc/config.h
|
| +++ b/webrtc/config.h
|
| @@ -17,6 +17,8 @@
|
| #include <vector>
|
|
|
| #include "webrtc/base/optional.h"
|
| +#include "webrtc/base/refcount.h"
|
| +#include "webrtc/base/scoped_ref_ptr.h"
|
| #include "webrtc/common_types.h"
|
| #include "webrtc/typedefs.h"
|
|
|
| @@ -118,13 +120,60 @@ struct VideoStream {
|
| // bitrate threshold of 100k and an estimate of 105k does not imply that we
|
| // get 100k in one temporal layer and 5k in the other, just that the bitrate
|
| // in the first temporal layer should not exceed 100k.
|
| - // TODO(pbos): Apart from a special case for two-layer screencast these
|
| + // TODO(kthelgason): Apart from a special case for two-layer screencast these
|
| // thresholds are not propagated to the VideoEncoder. To be implemented.
|
| std::vector<int> temporal_layer_thresholds_bps;
|
| };
|
|
|
| struct VideoEncoderConfig {
|
| public:
|
| + // These are reference counted to permit copying VideoEncoderConfig and be
|
| + // kept alive until all encoder_specific_settings go out of scope.
|
| + // TODO(kthelgason): Consider removing the need for copying VideoEncoderConfig
|
| + // and use rtc::Optional for encoder_specific_settings instead.
|
| + class EncoderSpecificSettings : public rtc::RefCountInterface {
|
| + public:
|
| + // TODO(pbos): Remove FillEncoderSpecificSettings as soon as VideoCodec is
|
| + // not in use and encoder implementations ask for codec-specific structs
|
| + // directly.
|
| + void FillEncoderSpecificSettings(VideoCodec* codec_struct) const;
|
| +
|
| + virtual void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const;
|
| + virtual void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const;
|
| + virtual void FillVideoCodecH264(VideoCodecH264* h264_settings) const;
|
| + private:
|
| + virtual ~EncoderSpecificSettings() {}
|
| + friend struct VideoEncoderConfig;
|
| + };
|
| +
|
| + class H264EncoderSpecificSettings : public EncoderSpecificSettings {
|
| + public:
|
| + explicit H264EncoderSpecificSettings(const VideoCodecH264& specifics);
|
| + virtual void FillVideoCodecH264(
|
| + VideoCodecH264* h264_settings) const override;
|
| +
|
| + private:
|
| + VideoCodecH264 specifics_;
|
| + };
|
| +
|
| + class Vp8EncoderSpecificSettings : public EncoderSpecificSettings {
|
| + public:
|
| + explicit Vp8EncoderSpecificSettings(const VideoCodecVP8& specifics);
|
| + virtual void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const override;
|
| +
|
| + private:
|
| + VideoCodecVP8 specifics_;
|
| + };
|
| +
|
| + class Vp9EncoderSpecificSettings : public EncoderSpecificSettings {
|
| + public:
|
| + explicit Vp9EncoderSpecificSettings(const VideoCodecVP9& specifics);
|
| + virtual void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const override;
|
| +
|
| + private:
|
| + VideoCodecVP9 specifics_;
|
| + };
|
| +
|
| enum class ContentType {
|
| kRealtimeVideo,
|
| kScreen,
|
| @@ -144,7 +193,7 @@ struct VideoEncoderConfig {
|
| std::vector<VideoStream> streams;
|
| std::vector<SpatialLayer> spatial_layers;
|
| ContentType content_type;
|
| - void* encoder_specific_settings;
|
| + rtc::scoped_refptr<const EncoderSpecificSettings> encoder_specific_settings;
|
|
|
| // Padding will be used up to this bitrate regardless of the bitrate produced
|
| // by the encoder. Padding above what's actually produced by the encoder helps
|
|
|