// Copyright 2017 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.

#include "starboard/shared/starboard/player/filter/audio_frame_tracker.h"

#include <queue>

#include "starboard/common/log.h"
#include "starboard/common/mutex.h"
#include "starboard/common/scoped_ptr.h"
#include "starboard/media.h"
#include "starboard/shared/starboard/thread_checker.h"

namespace starboard {
namespace shared {
namespace starboard {
namespace player {
namespace filter {

void AudioFrameTracker::Reset() {
  frame_records_.clear();
  frames_played_adjusted_to_playback_rate_ = 0;
}

void AudioFrameTracker::AddFrames(int number_of_frames, double playback_rate) {
  SB_DCHECK(playback_rate > 0);

  last_playback_rate_ = playback_rate;

  if (number_of_frames == 0) {
    return;
  }

  if (frame_records_.empty() ||
      frame_records_.back().playback_rate != playback_rate) {
    FrameRecord record = {number_of_frames, playback_rate};
    frame_records_.push_back(record);
  } else {
    frame_records_.back().number_of_frames += number_of_frames;
  }
}

void AudioFrameTracker::RecordPlayedFrames(int number_of_frames) {
  while (number_of_frames > 0 && !frame_records_.empty()) {
    FrameRecord& record = frame_records_.front();
    if (record.number_of_frames > number_of_frames) {
      frames_played_adjusted_to_playback_rate_ +=
          static_cast<int>(number_of_frames * record.playback_rate);
      record.number_of_frames -= number_of_frames;
      number_of_frames = 0;
    } else {
      number_of_frames -= record.number_of_frames;
      frames_played_adjusted_to_playback_rate_ +=
          static_cast<int>(record.number_of_frames * record.playback_rate);
      frame_records_.erase(frame_records_.begin());
    }
  }
  SB_LOG_IF(ERROR, number_of_frames != 0)
      << "played frames overflow " << number_of_frames;
}

int64_t AudioFrameTracker::GetFutureFramesPlayedAdjustedToPlaybackRate(
    int number_of_frames,
    double* playback_rate) const {
  SB_DCHECK(playback_rate);

  if (frame_records_.empty()) {
    *playback_rate = last_playback_rate_;
  }

  auto frames_played = frames_played_adjusted_to_playback_rate_;
  for (auto& record : frame_records_) {
    *playback_rate = record.playback_rate;

    if (number_of_frames == 0) {
      break;
    }

    if (record.number_of_frames > number_of_frames) {
      frames_played +=
          static_cast<int>(number_of_frames * record.playback_rate);
      number_of_frames = 0;
    } else {
      number_of_frames -= record.number_of_frames;
      frames_played +=
          static_cast<int>(record.number_of_frames * record.playback_rate);
    }
  }

  return frames_played;
}

}  // namespace filter
}  // namespace player
}  // namespace starboard
}  // namespace shared
}  // namespace starboard
