webrtc_frame_scheduler_constant_rate.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2021 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. #ifndef REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_CONSTANT_RATE_H_
  5. #define REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_CONSTANT_RATE_H_
  6. #include "remoting/protocol/webrtc_frame_scheduler.h"
  7. #include "base/sequence_checker.h"
  8. #include "base/thread_annotations.h"
  9. #include "base/timer/timer.h"
  10. namespace remoting {
  11. namespace protocol {
  12. // WebrtcFrameSchedulerConstantRate is an implementation of WebrtcFrameScheduler
  13. // that captures frames at a fixed rate. It uses the maximum frame rate provided
  14. // by SetMaxFramerateFps().
  15. class WebrtcFrameSchedulerConstantRate : public WebrtcFrameScheduler {
  16. public:
  17. WebrtcFrameSchedulerConstantRate();
  18. WebrtcFrameSchedulerConstantRate(const WebrtcFrameSchedulerConstantRate&) =
  19. delete;
  20. WebrtcFrameSchedulerConstantRate& operator=(
  21. const WebrtcFrameSchedulerConstantRate&) = delete;
  22. ~WebrtcFrameSchedulerConstantRate() override;
  23. // VideoChannelStateObserver implementation.
  24. void OnKeyFrameRequested() override;
  25. void OnTargetBitrateChanged(int bitrate_kbps) override;
  26. void OnFrameEncoded(
  27. WebrtcVideoEncoder::EncodeResult encode_result,
  28. const WebrtcVideoEncoder::EncodedFrame* encoded_frame) override;
  29. void OnEncodedFrameSent(
  30. webrtc::EncodedImageCallback::Result result,
  31. const WebrtcVideoEncoder::EncodedFrame& frame) override;
  32. // WebrtcFrameScheduler implementation.
  33. void Start(const base::RepeatingClosure& capture_callback) override;
  34. void Pause(bool pause) override;
  35. void OnFrameCaptured(const webrtc::DesktopFrame* frame) override;
  36. void SetMaxFramerateFps(int max_framerate_fps) override;
  37. private:
  38. void ScheduleNextFrame();
  39. void CaptureNextFrame();
  40. base::RepeatingClosure capture_callback_
  41. GUARDED_BY_CONTEXT(sequence_checker_);
  42. bool paused_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
  43. base::OneShotTimer capture_timer_ GUARDED_BY_CONTEXT(sequence_checker_);
  44. base::TimeTicks last_capture_started_time_
  45. GUARDED_BY_CONTEXT(sequence_checker_);
  46. // Set to true when a frame is being captured. Used to avoid scheduling more
  47. // than one capture in parallel.
  48. bool frame_pending_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
  49. // Framerate for scheduling frames. Initially 0 to prevent scheduling before
  50. // the output sink has been added.
  51. int max_framerate_fps_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
  52. SEQUENCE_CHECKER(sequence_checker_);
  53. };
  54. } // namespace protocol
  55. } // namespace remoting
  56. #endif // REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_CONSTANT_RATE_H_