OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ | 5 #ifndef MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ |
6 #define MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ | 6 #define MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "media/capture/video/video_capture_device.h" | 13 #include "media/capture/video/video_capture_device.h" |
14 | 14 |
15 namespace media { | 15 namespace media { |
16 | 16 |
17 // Encapsulates factory logic to make a working FakeVideoCaptureDevice based | 17 struct FakeDeviceState; |
18 // on a given target OutputMode and frame rate. | 18 class FakePhotoDevice; |
19 class CAPTURE_EXPORT FakeVideoCaptureDeviceMaker { | 19 class FrameDeliverer; |
20 class FrameDelivererFactory; | |
21 | |
22 // Paints a "pacman-like" animated circle including textual information such | |
23 // as a frame count and timer. | |
24 class PacmanFramePainter { | |
mcasas
2017/03/02 21:07:09
This class can and should be forward declared here
chfremer
2017/03/02 23:03:04
They used to be forward-declared, but I had to mov
| |
20 public: | 25 public: |
21 enum class PixelFormat { | 26 enum class Format { I420, SK_N32, Y16 }; |
22 I420 = media::PIXEL_FORMAT_I420, | 27 |
23 Y16 = media::PIXEL_FORMAT_Y16, | 28 PacmanFramePainter(Format pixel_format, |
24 MJPEG = media::PIXEL_FORMAT_MJPEG | 29 const FakeDeviceState* fake_device_state); |
25 }; | 30 |
31 void PaintFrame(base::TimeDelta elapsed_time, uint8_t* target_buffer); | |
32 | |
33 private: | |
34 void DrawGradientSquares(base::TimeDelta elapsed_time, | |
35 uint8_t* target_buffer); | |
36 | |
37 void DrawPacman(base::TimeDelta elapsed_time, uint8_t* target_buffer); | |
38 | |
39 const Format pixel_format_; | |
40 const FakeDeviceState* fake_device_state_ = nullptr; | |
41 }; | |
42 | |
43 // Implementation of VideoCaptureDevice that generates test frames. This is | |
44 // useful for testing the video capture components without having to use real | |
45 // devices. The implementation schedules delayed tasks to itself to generate and | |
46 // deliver frames at the requested rate. | |
47 class FakeVideoCaptureDevice : public VideoCaptureDevice { | |
48 public: | |
26 enum class DeliveryMode { | 49 enum class DeliveryMode { |
27 USE_DEVICE_INTERNAL_BUFFERS, | 50 USE_DEVICE_INTERNAL_BUFFERS, |
28 USE_CLIENT_PROVIDED_BUFFERS | 51 USE_CLIENT_PROVIDED_BUFFERS |
29 }; | 52 }; |
30 | 53 |
54 FakeVideoCaptureDevice( | |
55 const VideoCaptureFormats& supported_formats, | |
56 std::unique_ptr<FrameDelivererFactory> frame_deliverer_factory, | |
57 std::unique_ptr<FakePhotoDevice> photo_device, | |
58 std::unique_ptr<FakeDeviceState> device_state); | |
59 ~FakeVideoCaptureDevice() override; | |
60 | |
31 static void GetSupportedSizes(std::vector<gfx::Size>* supported_sizes); | 61 static void GetSupportedSizes(std::vector<gfx::Size>* supported_sizes); |
32 | 62 |
33 static std::unique_ptr<VideoCaptureDevice> MakeInstance( | 63 // VideoCaptureDevice implementation. |
34 PixelFormat pixel_format, | 64 void AllocateAndStart(const VideoCaptureParams& params, |
35 DeliveryMode delivery_mode, | 65 std::unique_ptr<Client> client) override; |
36 float frame_rate); | 66 void StopAndDeAllocate() override; |
67 void GetPhotoCapabilities(GetPhotoCapabilitiesCallback callback) override; | |
68 void SetPhotoOptions(mojom::PhotoSettingsPtr settings, | |
69 SetPhotoOptionsCallback callback) override; | |
70 void TakePhoto(TakePhotoCallback callback) override; | |
71 | |
72 private: | |
73 void BeepAndScheduleNextCapture(base::TimeTicks expected_execution_time); | |
74 void OnNextFrameDue(base::TimeTicks expected_execution_time, int session_id); | |
75 | |
76 const VideoCaptureFormats supported_formats_; | |
77 const std::unique_ptr<FrameDelivererFactory> frame_deliverer_factory_; | |
78 const std::unique_ptr<FakePhotoDevice> photo_device_; | |
79 const std::unique_ptr<FakeDeviceState> device_state_; | |
80 std::unique_ptr<FrameDeliverer> frame_deliverer_; | |
81 int current_session_id_ = 0; | |
82 | |
83 // Time when the next beep occurs. | |
84 base::TimeDelta beep_time_; | |
85 // Time since the fake video started rendering frames. | |
86 base::TimeDelta elapsed_time_; | |
87 | |
88 base::ThreadChecker thread_checker_; | |
89 | |
90 // FakeVideoCaptureDevice post tasks to itself for frame construction and | |
91 // needs to deal with asynchronous StopAndDeallocate(). | |
92 base::WeakPtrFactory<FakeVideoCaptureDevice> weak_factory_; | |
93 | |
94 DISALLOW_COPY_AND_ASSIGN(FakeVideoCaptureDevice); | |
95 }; | |
96 | |
97 // Represents the current state of a FakeVideoCaptureDevice. | |
98 // This is a separate struct because read-access to it is shared with several | |
99 // collaborating classes. | |
100 struct FakeDeviceState { | |
101 FakeDeviceState(float zoom, float frame_rate, VideoPixelFormat pixel_format) | |
102 : zoom(zoom), | |
103 format(gfx::Size(), frame_rate, pixel_format, PIXEL_STORAGE_CPU) {} | |
104 | |
105 uint32_t zoom; | |
106 VideoCaptureFormat format; | |
107 }; | |
108 | |
109 // A dependency needed by FakeVideoCaptureDevice. | |
110 class FrameDelivererFactory { | |
111 public: | |
112 FrameDelivererFactory(FakeVideoCaptureDevice::DeliveryMode delivery_mode, | |
113 const FakeDeviceState* device_state); | |
114 | |
115 std::unique_ptr<FrameDeliverer> CreateFrameDeliverer( | |
116 const VideoCaptureFormat& format); | |
117 | |
118 private: | |
119 const FakeVideoCaptureDevice::DeliveryMode delivery_mode_; | |
120 const FakeDeviceState* device_state_ = nullptr; | |
121 }; | |
122 | |
123 // Implements the photo functionality of a FakeVideoCaptureDevice | |
124 class FakePhotoDevice { | |
125 public: | |
126 FakePhotoDevice(std::unique_ptr<PacmanFramePainter> sk_n32_painter, | |
127 const FakeDeviceState* fake_device_state); | |
128 ~FakePhotoDevice(); | |
129 | |
130 void GetPhotoCapabilities( | |
131 VideoCaptureDevice::GetPhotoCapabilitiesCallback callback); | |
132 void TakePhoto(VideoCaptureDevice::TakePhotoCallback callback, | |
133 base::TimeDelta elapsed_time); | |
134 | |
135 private: | |
136 const std::unique_ptr<PacmanFramePainter> sk_n32_painter_; | |
137 const FakeDeviceState* const fake_device_state_; | |
37 }; | 138 }; |
38 | 139 |
39 } // namespace media | 140 } // namespace media |
40 | 141 |
41 #endif // MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ | 142 #endif // MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ |
OLD | NEW |