| /* | |
| * 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 |