blob: 2d236cb1d00eba791f5f5847eb3b21253229e65c [file] [log] [blame]
// 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/stream_source_segment.h"
#include <fuchsia/media/cpp/fidl.h>
#include <lib/async/cpp/task.h>
#include "garnet/bin/mediaplayer/util/callback_joiner.h"
#include "garnet/bin/mediaplayer/util/safe_clone.h"
#include "lib/fxl/logging.h"
namespace media_player {
// static
std::unique_ptr<StreamSourceSegment> StreamSourceSegment::Create(
int64_t duration_ns, bool can_pause, bool can_seek,
std::unique_ptr<media_player::Metadata> metadata) {
return std::make_unique<StreamSourceSegment>(duration_ns, can_pause, can_seek,
std::move(metadata));
}
StreamSourceSegment::StreamSourceSegment(
int64_t duration_ns, bool can_pause, bool can_seek,
std::unique_ptr<media_player::Metadata> metadata)
: SourceSegment(false),
duration_ns_(duration_ns),
can_pause_(can_pause),
can_seek_(can_seek),
metadata_(std::move(metadata)) {}
StreamSourceSegment::~StreamSourceSegment() {}
void StreamSourceSegment::AddStream(std::shared_ptr<Node> node,
const StreamType& output_stream_type) {
FXL_DCHECK(node);
size_t index = nodes_.size();
nodes_.push_back(graph().Add(node));
OnStreamUpdated(index, output_stream_type, nodes_.back().output(),
false); // more
}
void StreamSourceSegment::DidProvision() {
async::PostTask(dispatcher(), [this, weak_this = GetWeakThis()]() {
if (!weak_this) {
return;
}
if (provisioned()) {
NotifyUpdate();
}
});
}
void StreamSourceSegment::WillDeprovision() {
for (auto node_ref : nodes_) {
graph().RemoveNode(node_ref);
}
}
void StreamSourceSegment::Flush(bool hold_frame, fit::closure callback) {
auto callback_joiner = CallbackJoiner::Create();
for (auto node_ref : nodes_) {
graph().FlushOutput(node_ref.output(), hold_frame,
callback_joiner->NewCallback());
}
callback_joiner->WhenJoined(std::move(callback));
}
void StreamSourceSegment::Seek(int64_t position, fit::closure callback) {
FXL_DCHECK(can_seek_);
// TODO(dalesat): Implement.
FXL_NOTIMPLEMENTED();
}
} // namespace media_player