This CL wires up the new SetRates() method of the video encoders, and refactors a few things in the process: Most notably, the VideoStreamEncoderInterface is update so that the |target_headroom| parameter is replaced with |link_allocation|, meaning that instead of indicating bitrate capacity in excess of the target bitrate, it indicates to total network capacity allocated for the stream including the target bitrate. This matches the VideoEncoder API. The VideoEncoder::RateControlParameters struct gets a few new helper methods. In VideoStreamEncoder, instead of adding more fields to the |last_observed_bitrate*| family, uses an optional struct that inherits from VideoEncoder::RateControlParameters. Bug: webrtc:10481 Change-Id: Iee3965531142ae9b964ed86c0d51db59b1cdd61c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/131123 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Åsa Persson <asapersson@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27487}
148 lines
4.6 KiB
C++
148 lines
4.6 KiB
C++
/*
|
|
* Copyright (c) 2017 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.
|
|
*/
|
|
|
|
#include "api/video_codecs/video_encoder.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include "rtc_base/checks.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// TODO(mflodman): Add default complexity for VP9 and VP9.
|
|
VideoCodecVP8 VideoEncoder::GetDefaultVp8Settings() {
|
|
VideoCodecVP8 vp8_settings;
|
|
memset(&vp8_settings, 0, sizeof(vp8_settings));
|
|
|
|
vp8_settings.numberOfTemporalLayers = 1;
|
|
vp8_settings.denoisingOn = true;
|
|
vp8_settings.automaticResizeOn = false;
|
|
vp8_settings.frameDroppingOn = true;
|
|
vp8_settings.keyFrameInterval = 3000;
|
|
|
|
return vp8_settings;
|
|
}
|
|
|
|
VideoCodecVP9 VideoEncoder::GetDefaultVp9Settings() {
|
|
VideoCodecVP9 vp9_settings;
|
|
memset(&vp9_settings, 0, sizeof(vp9_settings));
|
|
|
|
vp9_settings.numberOfTemporalLayers = 1;
|
|
vp9_settings.denoisingOn = true;
|
|
vp9_settings.frameDroppingOn = true;
|
|
vp9_settings.keyFrameInterval = 3000;
|
|
vp9_settings.adaptiveQpMode = true;
|
|
vp9_settings.automaticResizeOn = true;
|
|
vp9_settings.numberOfSpatialLayers = 1;
|
|
vp9_settings.flexibleMode = false;
|
|
vp9_settings.interLayerPred = InterLayerPredMode::kOn;
|
|
|
|
return vp9_settings;
|
|
}
|
|
|
|
VideoCodecH264 VideoEncoder::GetDefaultH264Settings() {
|
|
VideoCodecH264 h264_settings;
|
|
memset(&h264_settings, 0, sizeof(h264_settings));
|
|
|
|
h264_settings.frameDroppingOn = true;
|
|
h264_settings.keyFrameInterval = 3000;
|
|
h264_settings.numberOfTemporalLayers = 1;
|
|
h264_settings.spsData = nullptr;
|
|
h264_settings.spsLen = 0;
|
|
h264_settings.ppsData = nullptr;
|
|
h264_settings.ppsLen = 0;
|
|
h264_settings.profile = H264::kProfileConstrainedBaseline;
|
|
|
|
return h264_settings;
|
|
}
|
|
|
|
VideoEncoder::ScalingSettings::ScalingSettings() = default;
|
|
|
|
VideoEncoder::ScalingSettings::ScalingSettings(KOff) : ScalingSettings() {}
|
|
|
|
VideoEncoder::ScalingSettings::ScalingSettings(int low, int high)
|
|
: thresholds(QpThresholds(low, high)) {}
|
|
|
|
VideoEncoder::ScalingSettings::ScalingSettings(int low,
|
|
int high,
|
|
int min_pixels)
|
|
: thresholds(QpThresholds(low, high)), min_pixels_per_frame(min_pixels) {}
|
|
|
|
VideoEncoder::ScalingSettings::ScalingSettings(const ScalingSettings&) =
|
|
default;
|
|
|
|
VideoEncoder::ScalingSettings::~ScalingSettings() {}
|
|
|
|
// static
|
|
constexpr VideoEncoder::ScalingSettings::KOff
|
|
VideoEncoder::ScalingSettings::kOff;
|
|
// static
|
|
constexpr uint8_t VideoEncoder::EncoderInfo::kMaxFramerateFraction;
|
|
|
|
VideoEncoder::EncoderInfo::EncoderInfo()
|
|
: scaling_settings(VideoEncoder::ScalingSettings::kOff),
|
|
supports_native_handle(false),
|
|
implementation_name("unknown"),
|
|
has_trusted_rate_controller(false),
|
|
is_hardware_accelerated(true),
|
|
has_internal_source(false),
|
|
fps_allocation{absl::InlinedVector<uint8_t, kMaxTemporalStreams>(
|
|
1,
|
|
kMaxFramerateFraction)} {}
|
|
|
|
VideoEncoder::EncoderInfo::EncoderInfo(const EncoderInfo&) = default;
|
|
|
|
VideoEncoder::EncoderInfo::~EncoderInfo() = default;
|
|
|
|
VideoEncoder::RateControlParameters::RateControlParameters()
|
|
: bitrate(VideoBitrateAllocation()),
|
|
framerate_fps(0.0),
|
|
bandwidth_allocation(DataRate::Zero()) {}
|
|
|
|
VideoEncoder::RateControlParameters::RateControlParameters(
|
|
const VideoBitrateAllocation& bitrate,
|
|
double framerate_fps,
|
|
DataRate bandwidth_allocation)
|
|
: bitrate(bitrate),
|
|
framerate_fps(framerate_fps),
|
|
bandwidth_allocation(bandwidth_allocation) {}
|
|
|
|
VideoEncoder::RateControlParameters::~RateControlParameters() = default;
|
|
|
|
int32_t VideoEncoder::SetRates(uint32_t bitrate, uint32_t framerate) {
|
|
RTC_NOTREACHED() << "SetRate(uint32_t, uint32_t) is deprecated.";
|
|
return -1;
|
|
}
|
|
|
|
int32_t VideoEncoder::SetRateAllocation(
|
|
const VideoBitrateAllocation& allocation,
|
|
uint32_t framerate) {
|
|
return SetRates(allocation.get_sum_kbps(), framerate);
|
|
}
|
|
|
|
void VideoEncoder::SetRates(const RateControlParameters& parameters) {
|
|
SetRateAllocation(parameters.bitrate,
|
|
static_cast<uint32_t>(parameters.framerate_fps + 0.5));
|
|
}
|
|
|
|
void VideoEncoder::OnPacketLossRateUpdate(float packet_loss_rate) {}
|
|
|
|
void VideoEncoder::OnRttUpdate(int64_t rtt_ms) {}
|
|
|
|
void VideoEncoder::OnLossNotification(
|
|
const LossNotification& loss_notification) {}
|
|
|
|
// TODO(webrtc:9722): Remove and make pure virtual.
|
|
VideoEncoder::EncoderInfo VideoEncoder::GetEncoderInfo() const {
|
|
return EncoderInfo();
|
|
}
|
|
|
|
} // namespace webrtc
|