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

// Windows specific implementation of VideoCaptureDevice.
// DirectShow is used for capturing. DirectShow provide its own threads
// for capturing.

#ifndef MEDIA_CAPTURE_VIDEO_WIN_CAPABILITY_LIST_WIN_H_
#define MEDIA_CAPTURE_VIDEO_WIN_CAPABILITY_LIST_WIN_H_

#include <list>
#include <windows.h>

#include "media/capture/video_capture_types.h"

namespace media {

struct CapabilityWin {
  CapabilityWin(int media_type_index, const VideoCaptureFormat& format)
      : media_type_index(media_type_index),
        supported_format(format),
        info_header(),
        stream_index(0),
        source_pixel_format(format.pixel_format) {}

  // Used by VideoCaptureDeviceWin.
  CapabilityWin(int media_type_index,
                const VideoCaptureFormat& format,
                const BITMAPINFOHEADER& info_header)
      : media_type_index(media_type_index),
        supported_format(format),
        info_header(info_header),
        stream_index(0),
        source_pixel_format(format.pixel_format) {}

  // Used by VideoCaptureDeviceMFWin.
  CapabilityWin(int media_type_index,
                const VideoCaptureFormat& format,
                int stream_index,
                VideoPixelFormat source_format)
      : media_type_index(media_type_index),
        supported_format(format),
        info_header(),
        stream_index(stream_index),
        source_pixel_format(source_format) {}

  const int media_type_index;
  const VideoCaptureFormat supported_format;

  // |info_header| is only valid if DirectShow is used.
  const BITMAPINFOHEADER info_header;

  // |stream_index| is only valid if MediaFoundation is used.
  const int stream_index;

  // |source_pixel_format| may differ from |supported_format|
  // if MediaFoundation is used.
  VideoPixelFormat source_pixel_format;
};

typedef std::list<CapabilityWin> CapabilityList;

const CapabilityWin& GetBestMatchedCapability(
    const VideoCaptureFormat& requested,
    const CapabilityList& capabilities);

}  // namespace media

#endif  // MEDIA_CAPTURE_VIDEO_WIN_CAPABILITY_LIST_WIN_H_
