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

#include <array>
#include <map>
#include <memory>
#include <set>
#include <utility>

#include "webrtc/base/constructormagic.h"
#include "webrtc/base/criticalsection.h"
#include "webrtc/base/event.h"
#include "webrtc/base/thread_annotations.h"

namespace webrtc {

class Clock;
class VCMJitterEstimator;
class VCMTiming;

namespace video_coding {

class FrameObject;

class FrameBuffer {
 public:
  FrameBuffer(Clock* clock,
              VCMJitterEstimator* jitter_estimator,
              const VCMTiming* timing);

  // Insert a frame into the frame buffer.
  void InsertFrame(std::unique_ptr<FrameObject> frame);

  // Get the next frame for decoding. Will return at latest after
  // |max_wait_time_ms|, with either a managed FrameObject or an empty
  // unique ptr if there is no available frame for decoding.
  std::unique_ptr<FrameObject> NextFrame(int64_t max_wait_time_ms);

  // Start the frame buffer, has no effect if the frame buffer is started.
  // The frame buffer is started upon construction.
  void Start();

  // Stop the frame buffer, causing any sleeping thread in NextFrame to
  // return immediately.
  void Stop();

 private:
  // FrameKey is a pair of (picture id, spatial layer).
  using FrameKey = std::pair<uint16_t, uint8_t>;

  // Comparator used to sort frames, first on their picture id, and second
  // on their spatial layer.
  struct FrameComp {
    bool operator()(const FrameKey& f1, const FrameKey& f2) const;
  };

  // Determines whether a frame is continuous.
  bool IsContinuous(const FrameObject& frame) const
      EXCLUSIVE_LOCKS_REQUIRED(crit_);

  // Keep track of decoded frames.
  std::set<FrameKey, FrameComp> decoded_frames_ GUARDED_BY(crit_);

  // The actual buffer that holds the FrameObjects.
  std::map<FrameKey, std::unique_ptr<FrameObject>, FrameComp> frames_
      GUARDED_BY(crit_);

  rtc::CriticalSection crit_;
  Clock* const clock_;
  rtc::Event frame_inserted_event_;
  VCMJitterEstimator* const jitter_estimator_;
  const VCMTiming* const timing_;
  int newest_picture_id_ GUARDED_BY(crit_);
  bool stopped_ GUARDED_BY(crit_);

  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FrameBuffer);
};

}  // namespace video_coding
}  // namespace webrtc

#endif  // WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER2_H_
