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

#ifndef VIDEO_ALIGNMENT_ADJUSTER_H_
#define VIDEO_ALIGNMENT_ADJUSTER_H_

#include "api/video_codecs/video_encoder.h"
#include "video/config/video_encoder_config.h"

namespace webrtc {

class AlignmentAdjuster {
 public:
  // Returns the resolution alignment requested by the encoder (i.e
  // `EncoderInfo::requested_resolution_alignment` which ensures that delivered
  // frames to the encoder are divisible by this alignment).
  //
  // If `EncoderInfo::apply_alignment_to_all_simulcast_layers` is enabled, the
  // alignment will be adjusted to ensure that each simulcast layer also is
  // divisible by `requested_resolution_alignment`. The configured scale factors
  // `scale_resolution_down_by` may be adjusted to a common multiple to limit
  // the alignment value to avoid largely cropped frames and possibly with an
  // aspect ratio far from the original.

  // Note: `max_layers` currently only taken into account when using default
  // scale factors.
  static int GetAlignmentAndMaybeAdjustScaleFactors(
      const VideoEncoder::EncoderInfo& info,
      VideoEncoderConfig* config,
      absl::optional<size_t> max_layers);
};

}  // namespace webrtc

#endif  // VIDEO_ALIGNMENT_ADJUSTER_H_
