/*
 *  Copyright (c) 2022 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 VIDEO_FRAME_BUFFER_PROXY_H_
#define VIDEO_FRAME_BUFFER_PROXY_H_

#include <memory>

#include "api/metronome/metronome.h"
#include "api/task_queue/task_queue_base.h"
#include "api/video/encoded_frame.h"
#include "api/webrtc_key_value_config.h"
#include "modules/video_coding/include/video_coding_defines.h"
#include "modules/video_coding/timing.h"
#include "rtc_base/task_queue.h"
#include "system_wrappers/include/clock.h"
#include "video/decode_synchronizer.h"

namespace webrtc {

class FrameSchedulingReceiver {
 public:
  virtual ~FrameSchedulingReceiver() = default;

  virtual void OnEncodedFrame(std::unique_ptr<EncodedFrame> frame) = 0;
  virtual void OnDecodableFrameTimeout(TimeDelta wait_time) = 0;
};

// Temporary class to enable replacement of frame_buffer2 with frame_buffer3.
// Once frame_buffer3 has shown to work with a field trial, frame_buffer2 will
// be removed and this class should be directly integrated into
// video_receive_stream2. bugs.webrtc.org/13343 tracks this integration.
class FrameBufferProxy {
 public:
  static std::unique_ptr<FrameBufferProxy> CreateFromFieldTrial(
      Clock* clock,
      TaskQueueBase* worker_queue,
      VCMTiming* timing,
      VCMReceiveStatisticsCallback* stats_proxy,
      rtc::TaskQueue* decode_queue,
      FrameSchedulingReceiver* receiver,
      TimeDelta max_wait_for_keyframe,
      TimeDelta max_wait_for_frame,
      DecodeSynchronizer* decode_sync,
      const WebRtcKeyValueConfig& field_trials);
  virtual ~FrameBufferProxy() = default;

  // Run on the worker thread.
  virtual void StopOnWorker() = 0;
  virtual void SetProtectionMode(VCMVideoProtection protection_mode) = 0;
  virtual void Clear() = 0;
  virtual absl::optional<int64_t> InsertFrame(
      std::unique_ptr<EncodedFrame> frame) = 0;
  virtual void UpdateRtt(int64_t max_rtt_ms) = 0;
  virtual int Size() = 0;

  // Run on either the worker thread or the decode thread.
  virtual void StartNextDecode(bool keyframe_required) = 0;
};

}  // namespace webrtc

#endif  // VIDEO_FRAME_BUFFER_PROXY_H_
