/* * Copyright (c) 2020 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 "video/alignment_adjuster.h" #include <algorithm> #include <limits> #include "absl/algorithm/container.h" #include "rtc_base/logging.h" namespace webrtc { namespace { // Round each scale factor to the closest rational in form alignment/i where i // is a multiple of `requested_alignment`. Each resolution divisible by // `alignment` will be divisible by `requested_alignment` after the scale factor // is applied. double RoundToMultiple(int alignment, int requested_alignment, VideoEncoderConfig* config, bool update_config) { … } } // namespace // Input: encoder_info.requested_resolution_alignment (K) // Input: encoder_info.apply_alignment_to_all_simulcast_layers (B) // Input: vector config->simulcast_layers.scale_resolution_down_by (S[i]) // Output: // If B is false, returns K and does not adjust scaling factors. // Otherwise, returns adjusted alignment (A), adjusted scaling factors (S'[i]) // are written in `config` such that: // // A / S'[i] are integers divisible by K // sum abs(S'[i] - S[i]) -> min // A integer <= 16 // // Solution chooses closest S'[i] in a form A / j where j is a multiple of K. int AlignmentAdjuster::GetAlignmentAndMaybeAdjustScaleFactors( const VideoEncoder::EncoderInfo& encoder_info, VideoEncoderConfig* config, absl::optional<size_t> max_layers) { … } } // namespace webrtc