123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * 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 <vector>
- #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<VideoFrame> {
- 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;
- };
- // 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(nisse): 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.
- 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_
|