Chromium Code Reviews| 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 class FrameDeliverer; |
| 18 // on a given target OutputMode and frame rate. | 18 class FrameDelivererFactory; |
| 19 class CAPTURE_EXPORT FakeVideoCaptureDeviceMaker { | 19 |
| 20 // Represents the current state of a FakeVideoCaptureDevice. | |
| 21 // This is a separate struct because read-access to it is shared with several | |
| 22 // collaborating classes. | |
| 23 struct FakeDeviceState { | |
| 24 FakeDeviceState(float zoom, float frame_rate, VideoPixelFormat pixel_format) | |
| 25 : zoom(zoom), | |
| 26 format(gfx::Size(), frame_rate, pixel_format, PIXEL_STORAGE_CPU) {} | |
| 27 | |
| 28 uint32_t zoom; | |
| 29 VideoCaptureFormat format; | |
| 30 }; | |
| 31 | |
| 32 // Paints a "pacman-like" animated circle including textual information such | |
| 33 // as a frame count and timer. | |
| 34 class PacmanFramePainter { | |
| 20 public: | 35 public: |
| 21 enum class PixelFormat { | 36 enum class Format { I420, SK_N32, Y16 }; |
| 22 I420 = media::PIXEL_FORMAT_I420, | 37 |
| 23 Y16 = media::PIXEL_FORMAT_Y16, | 38 PacmanFramePainter(Format pixel_format, |
| 24 MJPEG = media::PIXEL_FORMAT_MJPEG | 39 const FakeDeviceState* fake_device_state); |
| 25 }; | 40 |
| 41 void PaintFrame(base::TimeDelta elapsed_time, uint8_t* target_buffer); | |
|
emircan
2017/03/01 18:58:58
const base::TimeDelta&
chfremer
2017/03/01 21:55:48
Doing so raises a build warning that says this typ
| |
| 42 | |
| 43 private: | |
| 44 void DrawGradientSquares(base::TimeDelta elapsed_time, | |
|
emircan
2017/03/01 18:58:58
const base::TimeDelta&
chfremer
2017/03/01 21:55:48
same
| |
| 45 uint8_t* target_buffer); | |
| 46 | |
| 47 void DrawPacman(base::TimeDelta elapsed_time, uint8_t* target_buffer); | |
| 48 | |
| 49 const Format pixel_format_; | |
| 50 const FakeDeviceState* fake_device_state_ = nullptr; | |
| 51 }; | |
| 52 | |
| 53 // Implements the photo functionality of a VideoCaptureDevice | |
| 54 class FakePhotoDevice { | |
| 55 public: | |
| 56 FakePhotoDevice(std::unique_ptr<PacmanFramePainter> sk_n32_painter, | |
| 57 const FakeDeviceState* fake_device_state); | |
| 58 ~FakePhotoDevice(); | |
| 59 | |
| 60 void GetPhotoCapabilities( | |
| 61 VideoCaptureDevice::GetPhotoCapabilitiesCallback callback); | |
| 62 void TakePhoto(VideoCaptureDevice::TakePhotoCallback callback, | |
| 63 base::TimeDelta elapsed_time); | |
| 64 | |
| 65 private: | |
| 66 const std::unique_ptr<PacmanFramePainter> sk_n32_painter_; | |
| 67 const FakeDeviceState* const fake_device_state_; | |
| 68 }; | |
| 69 | |
| 70 // Implementation of VideoCaptureDevice that generates test frames. This is | |
| 71 // useful for testing the video capture components without having to use real | |
| 72 // devices. The implementation schedules delayed tasks to itself to generate and | |
| 73 // deliver frames at the requested rate. | |
| 74 class FakeVideoCaptureDevice : public VideoCaptureDevice { | |
|
emircan
2017/03/01 18:58:58
Can you reorder these classes in a way that would
chfremer
2017/03/01 21:55:48
Done.
I kept the current order in the .cc file, s
| |
| 75 public: | |
| 26 enum class DeliveryMode { | 76 enum class DeliveryMode { |
| 27 USE_DEVICE_INTERNAL_BUFFERS, | 77 USE_DEVICE_INTERNAL_BUFFERS, |
| 28 USE_CLIENT_PROVIDED_BUFFERS | 78 USE_CLIENT_PROVIDED_BUFFERS |
| 29 }; | 79 }; |
| 30 | 80 |
| 81 FakeVideoCaptureDevice( | |
| 82 const VideoCaptureFormats& supported_formats, | |
| 83 std::unique_ptr<FrameDelivererFactory> frame_deliverer_factory, | |
| 84 std::unique_ptr<FakePhotoDevice> photo_device, | |
| 85 std::unique_ptr<FakeDeviceState> device_state); | |
| 86 ~FakeVideoCaptureDevice() override; | |
| 87 | |
| 31 static void GetSupportedSizes(std::vector<gfx::Size>* supported_sizes); | 88 static void GetSupportedSizes(std::vector<gfx::Size>* supported_sizes); |
| 32 | 89 |
| 33 static std::unique_ptr<VideoCaptureDevice> MakeInstance( | 90 // VideoCaptureDevice implementation. |
| 34 PixelFormat pixel_format, | 91 void AllocateAndStart(const VideoCaptureParams& params, |
| 35 DeliveryMode delivery_mode, | 92 std::unique_ptr<Client> client) override; |
| 36 float frame_rate); | 93 void StopAndDeAllocate() override; |
| 94 void GetPhotoCapabilities(GetPhotoCapabilitiesCallback callback) override; | |
| 95 void SetPhotoOptions(mojom::PhotoSettingsPtr settings, | |
| 96 SetPhotoOptionsCallback callback) override; | |
| 97 void TakePhoto(TakePhotoCallback callback) override; | |
| 98 | |
| 99 private: | |
| 100 void BeepAndScheduleNextCapture(base::TimeTicks expected_execution_time); | |
| 101 void OnNextFrameDue(base::TimeTicks expected_execution_time, int session_id); | |
| 102 | |
| 103 const VideoCaptureFormats supported_formats_; | |
| 104 const std::unique_ptr<FrameDelivererFactory> frame_deliverer_factory_; | |
| 105 const std::unique_ptr<FakePhotoDevice> photo_device_; | |
| 106 const std::unique_ptr<FakeDeviceState> device_state_; | |
| 107 std::unique_ptr<FrameDeliverer> frame_deliverer_; | |
| 108 int current_session_id_ = 0; | |
| 109 | |
| 110 // Time when the next beep occurs. | |
| 111 base::TimeDelta beep_time_; | |
| 112 // Time since the fake video started rendering frames. | |
| 113 base::TimeDelta elapsed_time_; | |
| 114 | |
| 115 base::ThreadChecker thread_checker_; | |
| 116 | |
| 117 // FakeVideoCaptureDevice post tasks to itself for frame construction and | |
| 118 // needs to deal with asynchronous StopAndDeallocate(). | |
| 119 base::WeakPtrFactory<FakeVideoCaptureDevice> weak_factory_; | |
| 120 | |
| 121 DISALLOW_COPY_AND_ASSIGN(FakeVideoCaptureDevice); | |
| 122 }; | |
| 123 | |
| 124 class FrameDelivererFactory { | |
| 125 public: | |
| 126 FrameDelivererFactory(FakeVideoCaptureDevice::DeliveryMode delivery_mode, | |
| 127 const FakeDeviceState* device_state); | |
| 128 | |
| 129 std::unique_ptr<FrameDeliverer> CreateFrameDeliverer( | |
| 130 const VideoCaptureFormat& format); | |
| 131 | |
| 132 private: | |
| 133 const FakeVideoCaptureDevice::DeliveryMode delivery_mode_; | |
| 134 const FakeDeviceState* device_state_ = nullptr; | |
| 37 }; | 135 }; |
| 38 | 136 |
| 39 } // namespace media | 137 } // namespace media |
| 40 | 138 |
| 41 #endif // MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ | 139 #endif // MEDIA_CAPTURE_VIDEO_FAKE_VIDEO_CAPTURE_DEVICE_H_ |
| OLD | NEW |