mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00

The purpose of this interface is to allow VideoEncoder to override the bandwidth allocation set by FecController in RtpVideoSender. This CL defines the interface and sends it down to VideoSender. Two upcoming CLs will: 1. Make LibvpxVp8Encoder pass it on to the (injectable) FrameBufferController, where it might be put to good use. 2. Modify RtpVideoSender to respond to the message sent to it via this API. TBR=kwiberg@webrtc.org Bug: webrtc:10769 Change-Id: I2ef82f0ddcde7fd078e32d8aabf6efe43e0f7f8a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/143962 Commit-Queue: Elad Alon <eladalon@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28416}
121 lines
5.4 KiB
C++
121 lines
5.4 KiB
C++
/*
|
|
* 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/fec_controller_override.h"
|
|
#include "api/rtp_parameters.h" // For DegradationPreference.
|
|
#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,
|
|
VideoEncoderConfig::ContentType content_type,
|
|
int min_transmit_bitrate_bps) = 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.
|
|
// |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 link_allocation,
|
|
uint8_t fraction_lost,
|
|
int64_t round_trip_time_ms) = 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.
|
|
// TODO(bugs.webrtc.org/10769): Update downstream projects and then make this
|
|
// pure-virtual.
|
|
virtual void SetFecControllerOverride(
|
|
FecControllerOverride* fec_controller_override) {}
|
|
|
|
// 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_
|