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

#include "garnet/bin/mediaplayer/core/source_segment.h"

#include <lib/async/dispatcher.h>
#include "lib/fxl/logging.h"

namespace media_player {

SourceSegment::SourceSegment(bool stream_add_imminent)
    : weak_factory_(this), stream_add_imminent_(stream_add_imminent) {}

SourceSegment::~SourceSegment() {}

void SourceSegment::Provision(Graph* graph, async_dispatcher_t* dispatcher,
                              fit::closure updateCallback,
                              StreamUpdateCallback stream_update_callback) {
  FXL_DCHECK(graph);
  FXL_DCHECK(dispatcher);

  stream_update_callback_ = std::move(stream_update_callback);
  Segment::Provision(graph, dispatcher, std::move(updateCallback));
}

void SourceSegment::Deprovision() {
  Segment::Deprovision();
  stream_update_callback_ = nullptr;
}

void SourceSegment::SetStreamUpdateCallback(
    StreamUpdateCallback stream_update_callback) {
  stream_update_callback_ = std::move(stream_update_callback);
}

void SourceSegment::OnStreamUpdated(size_t index, const StreamType& type,
                                    OutputRef output, bool more) {
  FXL_DCHECK(output);

  if (streams_.size() <= index) {
    streams_.resize(index + 1);
  }

  Stream& stream = streams_[index];
  stream.stream_type_ = type.Clone();
  stream.output_ = output;

  stream_add_imminent_ = more;

  if (stream_update_callback_) {
    stream_update_callback_(index, &stream, more);
  }
}

void SourceSegment::OnStreamRemoved(size_t index, bool more) {
  FXL_DCHECK(index < streams_.size());

  Stream& stream = streams_[index];
  stream.stream_type_ = nullptr;
  stream.output_ = nullptr;

  stream_add_imminent_ = more;

  if (stream_update_callback_) {
    stream_update_callback_(index, nullptr, more);
  }

  // Trim invalid elements of the end of |streams_|.
  while (!streams_.empty() && !streams_.back().valid()) {
    streams_.pop_back();
  }
}

}  // namespace media_player
