// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_
#define REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_

#include "remoting/protocol/webrtc_frame_scheduler.h"

#include <memory>

#include "base/containers/queue.h"
#include "base/threading/thread_checker.h"
#include "base/timer/timer.h"
#include "remoting/base/leaky_bucket.h"
#include "remoting/base/running_samples.h"
#include "remoting/codec/frame_processing_time_estimator.h"
#include "remoting/protocol/video_channel_state_observer.h"

namespace remoting {
namespace protocol {

class BandwidthEstimator;

// WebrtcFrameSchedulerSimple is a simple implementation of WebrtcFrameScheduler
// that always keeps only one frame in the pipeline. It schedules each frame
// such that it is encoded and ready to be sent by the time previous one is
// expected to finish sending.
class WebrtcFrameSchedulerSimple : public VideoChannelStateObserver,
                                   public WebrtcFrameScheduler {
 public:
  WebrtcFrameSchedulerSimple();
  ~WebrtcFrameSchedulerSimple() override;

  // VideoChannelStateObserver implementation.
  void OnKeyFrameRequested() override;
  void OnChannelParameters(int packet_loss, base::TimeDelta rtt) override;
  void OnTargetBitrateChanged(int bitrate_kbps) override;

  // WebrtcFrameScheduler implementation.
  void Start(WebrtcDummyVideoEncoderFactory* video_encoder_factory,
             const base::Closure& capture_callback) override;
  void Pause(bool pause) override;
  bool OnFrameCaptured(const webrtc::DesktopFrame* frame,
                       WebrtcVideoEncoder::FrameParams* params_out) override;
  void OnFrameEncoded(const WebrtcVideoEncoder::EncodedFrame* encoded_frame,
                      HostFrameStats* frame_stats) override;

  // Allows unit-tests to fake the current time.
  void SetCurrentTimeForTest(base::TimeTicks now);

 private:
  void ScheduleNextFrame();
  void CaptureNextFrame();

  // Returns the current time according to base::TimeTicks::Now(),
  // or a fake time provided by a unit-test.
  base::TimeTicks Now();

  // Non-null if a fake current time is set by unit-test.
  base::TimeTicks fake_now_for_test_;

  base::Closure capture_callback_;
  bool paused_ = false;

  // Set to true after the first key frame is requested.
  bool encoder_ready_ = false;

  // Set to true when a key frame was requested.
  bool key_frame_request_ = false;

  base::TimeTicks last_capture_started_time_;

  // Set in OnFrameCaptured() whenever a (non-null) frame (possibly with an
  // empty updated region) is sent to the encoder. Empty frames are still sent,
  // but at a throttled rate.
  base::TimeTicks latest_frame_encode_start_time_;

  LeakyBucket pacing_bucket_;

  // Set to true when a frame is being captured or encoded.
  bool frame_pending_ = false;

  base::TimeDelta rtt_estimate_;

  // Set to true when encoding unchanged frames for top-off.
  bool top_off_is_active_ = false;

  // Accumulator for capture and encoder delay history, as well as the transit
  // time.
  FrameProcessingTimeEstimator processing_time_estimator_;

  // Accumulator for updated region area in the previously encoded frames.
  RunningSamples updated_region_area_;

  base::OneShotTimer capture_timer_;

  // Estimates the bandwidth.
  const std::unique_ptr<BandwidthEstimator> bandwidth_estimator_;

  base::ThreadChecker thread_checker_;
  base::WeakPtrFactory<WebrtcFrameSchedulerSimple> weak_factory_;
};

}  // namespace protocol
}  // namespace remoting

#endif  // REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_
