| /* | 
 |  *  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 VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_ | 
 | #define VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_ | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "api/adaptation/resource.h" | 
 | #include "api/fec_controller_override.h" | 
 | #include "api/rtc_error.h" | 
 | #include "api/rtp_parameters.h"  // For DegradationPreference. | 
 | #include "api/rtp_sender_interface.h" | 
 | #include "api/scoped_refptr.h" | 
 | #include "api/units/data_rate.h" | 
 | #include "api/video/video_bitrate_allocator.h" | 
 | #include "api/video/video_layers_allocation.h" | 
 | #include "api/video/video_sink_interface.h" | 
 | #include "api/video/video_source_interface.h" | 
 | #include "api/video_codecs/video_encoder.h" | 
 | #include "video/config/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: | 
 |   // Interface for receiving encoded video frames and notifications about | 
 |   // configuration changes. | 
 |   class EncoderSink : public EncodedImageCallback { | 
 |    public: | 
 |     virtual void OnEncoderConfigurationChanged( | 
 |         std::vector<VideoStream> streams, | 
 |         bool is_svc, | 
 |         VideoEncoderConfig::ContentType content_type, | 
 |         int min_transmit_bitrate_bps) = 0; | 
 |  | 
 |     virtual void OnBitrateAllocationUpdated( | 
 |         const VideoBitrateAllocation& allocation) = 0; | 
 |  | 
 |     virtual void OnVideoLayersAllocationUpdated( | 
 |         VideoLayersAllocation allocation) = 0; | 
 |   }; | 
 |  | 
 |   virtual ~VideoStreamEncoderInterface() = default; | 
 |  | 
 |   // 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> resource) = 0; | 
 |   virtual std::vector<rtc::scoped_refptr<Resource>> | 
 |   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(bugs.webrtc.org/14246): When adaptation logic is extracted from this | 
 |   // class, it no longer needs to know the source. | 
 |   virtual void SetSource( | 
 |       rtc::VideoSourceInterface<VideoFrame>* 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 with | 
 |   // no arguments and for RTCRtpSender.generateKeyFrame with a list of | 
 |   // rids/layers. | 
 |   virtual void SendKeyFrame(const std::vector<VideoFrameType>& layers = {}) = 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; | 
 |  | 
 |   // 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; | 
 |   virtual void ConfigureEncoder(VideoEncoderConfig config, | 
 |                                 size_t max_data_payload_length, | 
 |                                 SetParametersCallback callback) = 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  // VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_ |