// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/capture/video/win/capability_list_win.h"

#include <algorithm>
#include <functional>

#include "base/logging.h"
#include "media/capture/video_capture_types.h"

namespace media {

static bool CompareCapability(const VideoCaptureFormat& requested,
                              const CapabilityWin& capability_lhs,
                              const CapabilityWin& capability_rhs) {
  const VideoCaptureFormat& lhs = capability_lhs.supported_format;
  const VideoCaptureFormat& rhs = capability_rhs.supported_format;

  const int diff_height_lhs =
      std::abs(lhs.frame_size.height() - requested.frame_size.height());
  const int diff_height_rhs =
      std::abs(rhs.frame_size.height() - requested.frame_size.height());
  if (diff_height_lhs != diff_height_rhs)
    return diff_height_lhs < diff_height_rhs;

  const int diff_width_lhs =
      std::abs(lhs.frame_size.width() - requested.frame_size.width());
  const int diff_width_rhs =
      std::abs(rhs.frame_size.width() - requested.frame_size.width());
  if (diff_width_lhs != diff_width_rhs)
    return diff_width_lhs < diff_width_rhs;

  const float diff_fps_lhs = std::fabs(lhs.frame_rate - requested.frame_rate);
  const float diff_fps_rhs = std::fabs(rhs.frame_rate - requested.frame_rate);
  if (diff_fps_lhs != diff_fps_rhs)
    return diff_fps_lhs < diff_fps_rhs;

  return VideoCaptureFormat::ComparePixelFormatPreference(lhs.pixel_format,
                                                          rhs.pixel_format);
}

const CapabilityWin& GetBestMatchedCapability(
    const VideoCaptureFormat& requested,
    const CapabilityList& capabilities) {
  DCHECK(!capabilities.empty());
  const CapabilityWin* best_match = &(*capabilities.begin());
  for (const CapabilityWin& capability : capabilities) {
    if (CompareCapability(requested, capability, *best_match))
      best_match = &capability;
  }
  return *best_match;
}

}  // namespace media
