mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-15 23:01:21 +01:00

This CL plumbs an additional signal from VideoSendStream down to VideoStreamEncoder, namely the amount of headroom that's left between the encoder max bitrate and the current bitrate allocation for the media track. This will be used in follow-up CLs to tune encoder rate adjustment and some codec specific paramaters a bit differently, based on the knowledge if we are network constrained or not. Bug: webrtc:10155 Change-Id: Ic6ccc79be5c6845468bab65b4ca9918b56923fa4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125981 Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27008}
106 lines
4.7 KiB
C++
106 lines
4.7 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/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;
|
|
|
|
// Set the currently estimated network properties. A |bitrate_bps|
|
|
// of zero pauses the encoder.
|
|
virtual void OnBitrateUpdated(DataRate target_bitrate,
|
|
DataRate target_headroom,
|
|
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;
|
|
|
|
// 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_
|