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#ifndef MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_TYPES_H_
6#define MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_TYPES_H_
7
8#include <vector>
9
10#include "media/base/media_export.h"
11#include "ui/gfx/size.h"
12
13namespace media {
14
15// TODO(wjia): this type should be defined in a common place and
16// shared with device manager.
17typedef int VideoCaptureSessionId;
18
19// Color formats from camera.
20enum VideoPixelFormat {
21  PIXEL_FORMAT_UNKNOWN,  // Color format not set.
22  PIXEL_FORMAT_I420,
23  PIXEL_FORMAT_YUY2,
24  PIXEL_FORMAT_UYVY,
25  PIXEL_FORMAT_RGB24,
26  PIXEL_FORMAT_ARGB,
27  PIXEL_FORMAT_MJPEG,
28  PIXEL_FORMAT_NV21,
29  PIXEL_FORMAT_YV12,
30  PIXEL_FORMAT_TEXTURE,  // Capture format as a GL texture.
31  PIXEL_FORMAT_MAX,
32};
33
34// Policies for capture devices that has source content with dynamic resolution.
35enum ResolutionChangePolicy {
36  // Capture device outputs a fixed resolution all the time. The resolution of
37  // the first frame is the resolution for all frames.
38  // It is implementation specific for the capture device to scale, letter-box
39  // and pillar-box. The only gurantee is that resolution will never change.
40  RESOLUTION_POLICY_FIXED,
41
42  // Capture device outputs frames with dynamic resolution. The width and height
43  // will not exceed the maximum dimensions specified. The typical scenario is
44  // the frames will have the same aspect ratio as the original content and
45  // scaled down to fit inside the limit.
46  RESOLUTION_POLICY_DYNAMIC_WITHIN_LIMIT,
47
48  RESOLUTION_POLICY_LAST,
49};
50
51// Some drivers use rational time per frame instead of float frame rate, this
52// constant k is used to convert between both: A fps -> [k/k*A] seconds/frame.
53const int kFrameRatePrecision = 10000;
54
55// Video capture format specification.
56// This class is used by the video capture device to specify the format of every
57// frame captured and returned to a client. It is also used to specify a
58// supported capture format by a device.
59class MEDIA_EXPORT VideoCaptureFormat {
60 public:
61  VideoCaptureFormat();
62  VideoCaptureFormat(const gfx::Size& frame_size,
63                     float frame_rate,
64                     VideoPixelFormat pixel_format);
65
66  std::string ToString() const;
67  static std::string PixelFormatToString(VideoPixelFormat format);
68
69  // Checks that all values are in the expected range. All limits are specified
70  // in media::Limits.
71  bool IsValid() const;
72
73  gfx::Size frame_size;
74  float frame_rate;
75  VideoPixelFormat pixel_format;
76};
77
78typedef std::vector<VideoCaptureFormat> VideoCaptureFormats;
79
80// Parameters for starting video capture.
81// This class is used by the client of a video capture device to specify the
82// format of frames in which the client would like to have captured frames
83// returned.
84class MEDIA_EXPORT VideoCaptureParams {
85 public:
86  VideoCaptureParams();
87
88  // Requests a resolution and format at which the capture will occur.
89  VideoCaptureFormat requested_format;
90
91  // Policy for resolution change.
92  ResolutionChangePolicy resolution_change_policy;
93};
94
95}  // namespace media
96
97#endif  // MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_TYPES_H_
98