/* * 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. */ #ifndef API_VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_ #define API_VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_ #include #include "api/adaptation/resource.h" #include "api/fec_controller_override.h" #include "api/rtp_parameters.h" // For DegradationPreference. #include "api/scoped_refptr.h" #include "api/units/data_rate.h" #include "api/video/video_bitrate_allocator.h" #include "api/video/video_sink_interface.h" #include "api/video/video_source_interface.h" #include "api/video_codecs/video_encoder.h" #include "api/video_codecs/video_encoder_config.h" namespace webrtc { // This interface represents a class responsible for creating and driving the // encoder(s) for a single video stream. It is also responsible for adaptation // decisions related to video quality, requesting reduced frame rate or // resolution from the VideoSource when needed. // TODO(bugs.webrtc.org/8830): This interface is under development. Changes // under consideration include: // // 1. Taking out responsibility for adaptation decisions, instead only reporting // per-frame measurements to the decision maker. // // 2. Moving responsibility for simulcast and for software fallback into this // class. class VideoStreamEncoderInterface : public rtc::VideoSinkInterface { public: // Interface for receiving encoded video frames and notifications about // configuration changes. class EncoderSink : public EncodedImageCallback { public: virtual void OnEncoderConfigurationChanged( std::vector streams, bool is_svc, VideoEncoderConfig::ContentType content_type, int min_transmit_bitrate_bps) = 0; }; // If the resource is overusing, the VideoStreamEncoder will try to reduce // resolution or frame rate until no resource is overusing. // TODO(https://crbug.com/webrtc/11565): When the ResourceAdaptationProcessor // is moved to Call this method could be deleted altogether in favor of // Call-level APIs only. virtual void AddAdaptationResource(rtc::scoped_refptr resource) = 0; virtual std::vector> GetAdaptationResources() = 0; // Sets the source that will provide video frames to the VideoStreamEncoder's // OnFrame method. |degradation_preference| control whether or not resolution // or frame rate may be reduced. The VideoStreamEncoder registers itself with // |source|, and signals adaptation decisions to the source in the form of // VideoSinkWants. // TODO(nisse): When adaptation logic is extracted from this class, // it no longer needs to know the source. virtual void SetSource( rtc::VideoSourceInterface* source, const DegradationPreference& degradation_preference) = 0; // Sets the |sink| that gets the encoded frames. |rotation_applied| means // that the source must support rotation. Only set |rotation_applied| if the // remote side does not support the rotation extension. virtual void SetSink(EncoderSink* sink, bool rotation_applied) = 0; // Sets an initial bitrate, later overriden by OnBitrateUpdated. Mainly // affects the resolution of the initial key frame: If incoming frames are // larger than reasonable for the start bitrate, and scaling is enabled, // VideoStreamEncoder asks the source to scale down and drops a few initial // frames. // TODO(nisse): This is a poor interface, and mixes bandwidth estimation and // codec configuration in an undesired way. For the actual send bandwidth, we // should always be somewhat conservative, but we may nevertheless want to let // the application configure a more optimistic quality for the initial // resolution. Should be replaced by a construction time setting. virtual void SetStartBitrate(int start_bitrate_bps) = 0; // Request a key frame. Used for signalling from the remote receiver. virtual void SendKeyFrame() = 0; // Inform the encoder that a loss has occurred. virtual void OnLossNotification( const VideoEncoder::LossNotification& loss_notification) = 0; // Set the currently estimated network properties. A |target_bitrate| // of zero pauses the encoder. // |stable_target_bitrate| is a filtered version of |target_bitrate|. It is // always less or equal to it. It can be used to avoid rapid changes of // expensive encoding settings, such as resolution. // |link_allocation| is the bandwidth available for this video stream on the // network link. It is always at least |target_bitrate| but may be higher // if we are not network constrained. virtual void OnBitrateUpdated(DataRate target_bitrate, DataRate stable_target_bitrate, DataRate link_allocation, uint8_t fraction_lost, int64_t round_trip_time_ms, double cwnd_reduce_ratio) = 0; // Register observer for the bitrate allocation between the temporal // and spatial layers. virtual void SetBitrateAllocationObserver( VideoBitrateAllocationObserver* bitrate_observer) = 0; // Set a FecControllerOverride, through which the encoder may override // decisions made by FecController. virtual void SetFecControllerOverride( FecControllerOverride* fec_controller_override) = 0; // Creates and configures an encoder with the given |config|. The // |max_data_payload_length| is used to support single NAL unit // packetization for H.264. virtual void ConfigureEncoder(VideoEncoderConfig config, size_t max_data_payload_length) = 0; // Permanently stop encoding. After this method has returned, it is // guaranteed that no encoded frames will be delivered to the sink. virtual void Stop() = 0; }; } // namespace webrtc #endif // API_VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_