mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-16 15:20:42 +01:00

Bug: webrtc:42226242 Change-Id: I7292811f782ec9a6710c84b1fc36e42ae7ea2c17 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/359840 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Dor Hen <dorhen@meta.com> Cr-Commit-Position: refs/heads/main@{#42802}
116 lines
4 KiB
C++
116 lines
4 KiB
C++
/*
|
|
* Copyright (c) 2019 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/vp8_temporal_layers.h"
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "absl/algorithm/container.h"
|
|
#include "api/fec_controller_override.h"
|
|
#include "api/video_codecs/video_encoder.h"
|
|
#include "api/video_codecs/vp8_frame_buffer_controller.h"
|
|
#include "api/video_codecs/vp8_frame_config.h"
|
|
#include "rtc_base/checks.h"
|
|
|
|
namespace webrtc {
|
|
|
|
Vp8TemporalLayers::Vp8TemporalLayers(
|
|
std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers,
|
|
FecControllerOverride* fec_controller_override)
|
|
: controllers_(std::move(controllers)) {
|
|
RTC_DCHECK(!controllers_.empty());
|
|
RTC_DCHECK(absl::c_none_of(
|
|
controllers_,
|
|
[](const std::unique_ptr<Vp8FrameBufferController>& controller) {
|
|
return controller.get() == nullptr;
|
|
}));
|
|
if (fec_controller_override) {
|
|
fec_controller_override->SetFecAllowed(true);
|
|
}
|
|
}
|
|
|
|
void Vp8TemporalLayers::SetQpLimits(size_t stream_index,
|
|
int min_qp,
|
|
int max_qp) {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
return controllers_[stream_index]->SetQpLimits(0, min_qp, max_qp);
|
|
}
|
|
|
|
size_t Vp8TemporalLayers::StreamCount() const {
|
|
return controllers_.size();
|
|
}
|
|
|
|
bool Vp8TemporalLayers::SupportsEncoderFrameDropping(
|
|
size_t stream_index) const {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
return controllers_[stream_index]->SupportsEncoderFrameDropping(0);
|
|
}
|
|
|
|
void Vp8TemporalLayers::OnRatesUpdated(
|
|
size_t stream_index,
|
|
const std::vector<uint32_t>& bitrates_bps,
|
|
int framerate_fps) {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
return controllers_[stream_index]->OnRatesUpdated(0, bitrates_bps,
|
|
framerate_fps);
|
|
}
|
|
|
|
Vp8EncoderConfig Vp8TemporalLayers::UpdateConfiguration(size_t stream_index) {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
return controllers_[stream_index]->UpdateConfiguration(0);
|
|
}
|
|
|
|
Vp8FrameConfig Vp8TemporalLayers::NextFrameConfig(size_t stream_index,
|
|
uint32_t rtp_timestamp) {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
return controllers_[stream_index]->NextFrameConfig(0, rtp_timestamp);
|
|
}
|
|
|
|
void Vp8TemporalLayers::OnEncodeDone(size_t stream_index,
|
|
uint32_t rtp_timestamp,
|
|
size_t size_bytes,
|
|
bool is_keyframe,
|
|
int qp,
|
|
CodecSpecificInfo* info) {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
return controllers_[stream_index]->OnEncodeDone(0, rtp_timestamp, size_bytes,
|
|
is_keyframe, qp, info);
|
|
}
|
|
|
|
void Vp8TemporalLayers::OnFrameDropped(size_t stream_index,
|
|
uint32_t rtp_timestamp) {
|
|
RTC_DCHECK_LT(stream_index, controllers_.size());
|
|
controllers_[stream_index]->OnFrameDropped(stream_index, rtp_timestamp);
|
|
}
|
|
|
|
void Vp8TemporalLayers::OnPacketLossRateUpdate(float packet_loss_rate) {
|
|
for (auto& controller : controllers_) {
|
|
controller->OnPacketLossRateUpdate(packet_loss_rate);
|
|
}
|
|
}
|
|
|
|
void Vp8TemporalLayers::OnRttUpdate(int64_t rtt_ms) {
|
|
for (auto& controller : controllers_) {
|
|
controller->OnRttUpdate(rtt_ms);
|
|
}
|
|
}
|
|
|
|
void Vp8TemporalLayers::OnLossNotification(
|
|
const VideoEncoder::LossNotification& loss_notification) {
|
|
for (auto& controller : controllers_) {
|
|
controller->OnLossNotification(loss_notification);
|
|
}
|
|
}
|
|
|
|
} // namespace webrtc
|