// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MEDIA_BASE_DECODER_BUFFER_CACHE_H_
#define COBALT_MEDIA_BASE_DECODER_BUFFER_CACHE_H_

#include <deque>

#include "base/memory/ref_counted.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "third_party/chromium//media/base/decoder_buffer.h"
#include "third_party/chromium//media/base/demuxer_stream.h"

namespace cobalt {
namespace media {

// This class can be used to hold media buffers in decoding order.  It also
// provides function that given a media time, the function will find a key frame
// before the media time and clear all buffers before the key frame.  This class
// can be used to "replay" the video from the current playback position and can
// be useful to implement suspend/resume.
class DecoderBufferCache {
 public:
  typedef ::media::DecoderBuffer DecoderBuffer;
  typedef ::media::DemuxerStream DemuxerStream;

  DecoderBufferCache();

  void AddBuffer(DemuxerStream::Type type,
                 const scoped_refptr<DecoderBuffer>& buffer);
  void ClearSegmentsBeforeMediaTime(base::TimeDelta media_time);
  void ClearAll();

  // Start resuming, reset indices to audio/video buffers to the very beginning.
  void StartResuming();
  scoped_refptr<DecoderBuffer> GetBuffer(DemuxerStream::Type type) const;
  void AdvanceToNextBuffer(DemuxerStream::Type type);

 private:
  typedef std::deque<scoped_refptr<DecoderBuffer>> Buffers;
  typedef std::deque<base::TimeDelta> KeyFrameTimestamps;

  static size_t ClearSegmentsBeforeMediaTime(
      base::TimeDelta media_time, Buffers* buffers,
      KeyFrameTimestamps* key_frame_timestamps);

  THREAD_CHECKER(thread_checker_);

  Buffers audio_buffers_;
  KeyFrameTimestamps audio_key_frame_timestamps_;

  Buffers video_buffers_;
  KeyFrameTimestamps video_key_frame_timestamps_;

  size_t audio_buffer_index_;
  size_t video_buffer_index_;
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_BASE_DECODER_BUFFER_CACHE_H_
