diff options
Diffstat (limited to 'third_party/libwebrtc/test/frame_generator_capturer.h')
-rw-r--r-- | third_party/libwebrtc/test/frame_generator_capturer.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/third_party/libwebrtc/test/frame_generator_capturer.h b/third_party/libwebrtc/test/frame_generator_capturer.h new file mode 100644 index 0000000000..6824ba681e --- /dev/null +++ b/third_party/libwebrtc/test/frame_generator_capturer.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef TEST_FRAME_GENERATOR_CAPTURER_H_ +#define TEST_FRAME_GENERATOR_CAPTURER_H_ + +#include <cstddef> +#include <cstdint> +#include <memory> + +#include "absl/types/optional.h" +#include "api/task_queue/task_queue_factory.h" +#include "api/test/frame_generator_interface.h" +#include "api/video/color_space.h" +#include "api/video/video_frame.h" +#include "api/video/video_rotation.h" +#include "api/video/video_sink_interface.h" +#include "api/video/video_source_interface.h" +#include "rtc_base/synchronization/mutex.h" +#include "rtc_base/task_queue.h" +#include "rtc_base/task_utils/repeating_task.h" +#include "rtc_base/thread_annotations.h" +#include "system_wrappers/include/clock.h" +#include "test/test_video_capturer.h" + +namespace webrtc { +namespace test { + +class FrameGeneratorCapturer : public TestVideoCapturer { + public: + class SinkWantsObserver { + public: + // OnSinkWantsChanged is called when FrameGeneratorCapturer::AddOrUpdateSink + // is called. + virtual void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink, + const rtc::VideoSinkWants& wants) = 0; + + protected: + virtual ~SinkWantsObserver() {} + }; + + FrameGeneratorCapturer( + Clock* clock, + std::unique_ptr<FrameGeneratorInterface> frame_generator, + int target_fps, + TaskQueueFactory& task_queue_factory); + virtual ~FrameGeneratorCapturer(); + + void Start() override; + void Stop() override; + void ChangeResolution(size_t width, size_t height); + void ChangeFramerate(int target_framerate); + + int GetFrameWidth() const override; + int GetFrameHeight() const override; + + struct Resolution { + int width; + int height; + }; + absl::optional<Resolution> GetResolution() const; + + void OnOutputFormatRequest(int width, + int height, + const absl::optional<int>& max_fps); + + void SetSinkWantsObserver(SinkWantsObserver* observer); + + void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, + const rtc::VideoSinkWants& wants) override; + void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override; + + void ForceFrame(); + void SetFakeRotation(VideoRotation rotation); + void SetFakeColorSpace(absl::optional<ColorSpace> color_space); + + int64_t first_frame_capture_time() const { return first_frame_capture_time_; } + + bool Init(); + + private: + void InsertFrame(); + static bool Run(void* obj); + int GetCurrentConfiguredFramerate(); + void UpdateFps(int max_fps) RTC_EXCLUSIVE_LOCKS_REQUIRED(&lock_); + + Clock* const clock_; + RepeatingTaskHandle frame_task_; + bool sending_; + SinkWantsObserver* sink_wants_observer_ RTC_GUARDED_BY(&lock_); + + Mutex lock_; + std::unique_ptr<FrameGeneratorInterface> frame_generator_; + + int source_fps_ RTC_GUARDED_BY(&lock_); + int target_capture_fps_ RTC_GUARDED_BY(&lock_); + absl::optional<int> wanted_fps_ RTC_GUARDED_BY(&lock_); + VideoRotation fake_rotation_ = kVideoRotation_0; + absl::optional<ColorSpace> fake_color_space_ RTC_GUARDED_BY(&lock_); + + int64_t first_frame_capture_time_; + + // Must be the last field, so it will be deconstructed first as tasks + // in the TaskQueue access other fields of the instance of this class. + rtc::TaskQueue task_queue_; +}; +} // namespace test +} // namespace webrtc + +#endif // TEST_FRAME_GENERATOR_CAPTURER_H_ |