1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Windows specific implementation of VideoCaptureDevice.
6// DirectShow is used for capturing. DirectShow provide its own threads
7// for capturing.
8
9#ifndef MEDIA_VIDEO_CAPTURE_WIN_CAPABILITY_LIST_WIN_H_
10#define MEDIA_VIDEO_CAPTURE_WIN_CAPABILITY_LIST_WIN_H_
11
12#include <list>
13
14#include "base/basictypes.h"
15#include "base/threading/non_thread_safe.h"
16#include "media/video/capture/video_capture_types.h"
17
18namespace media {
19
20struct VideoCaptureCapabilityWin {
21  explicit VideoCaptureCapabilityWin(int index)
22      : stream_index(index),
23        frame_rate_numerator(0),
24        frame_rate_denominator(1) {}
25  int stream_index;
26  // Internally to Media Foundation Api type devices we use rational framerates
27  // so framerates can be properly represented, f.i. 29.971fps= 30000/1001.
28  int frame_rate_numerator;
29  int frame_rate_denominator;
30  VideoCaptureFormat supported_format;
31};
32
33class CapabilityList : public base::NonThreadSafe {
34 public:
35  CapabilityList();
36  ~CapabilityList();
37
38  bool empty() const { return capabilities_.empty(); }
39
40  // Appends an entry to the list.
41  void Add(const VideoCaptureCapabilityWin& capability);
42
43  // Loops through the list of capabilities and returns an index of the best
44  // matching capability.  The algorithm prioritizes height, width, frame rate
45  // and color format in that order.
46  const VideoCaptureCapabilityWin& GetBestMatchedFormat(
47      int requested_width,
48      int requested_height,
49      float requested_frame_rate) const;
50
51 private:
52  typedef std::list<VideoCaptureCapabilityWin> Capabilities;
53  Capabilities capabilities_;
54
55  DISALLOW_COPY_AND_ASSIGN(CapabilityList);
56};
57
58}  // namespace media
59
60#endif  // MEDIA_VIDEO_CAPTURE_WIN_CAPABILITY_LIST_WIN_H_
61