Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Unified Diff: services/media/framework/stages/distributor_stage.cc

Issue 1577953002: Motown in-proc streaming framework used to implement media services. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: sync Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/media/framework/stages/distributor_stage.cc
diff --git a/services/media/framework/stages/distributor_stage.cc b/services/media/framework/stages/distributor_stage.cc
new file mode 100644
index 0000000000000000000000000000000000000000..749de98c35e1ab314375d7995a707bac7905d2e5
--- /dev/null
+++ b/services/media/framework/stages/distributor_stage.cc
@@ -0,0 +1,91 @@
+// Copyright 2016 The Chromium 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 "services/media/framework/stages/distributor_stage.h"
+
+namespace mojo {
+namespace media {
+
+DistributorStage::DistributorStage(
+ MultiStreamPacketSourcePtr packet_source) :
+ packet_source_(packet_source),
+ ended_streams_(0) {
+ DCHECK(packet_source);
+ outputs_.resize(packet_source->stream_count());
+}
+
+DistributorStage::~DistributorStage() {}
+
+uint32_t DistributorStage::input_count() const {
+ return 0;
+};
+
+StageInput& DistributorStage::input(uint32_t index) {
+ NOTREACHED();
+ static StageInput result;
+ return result;
+}
+
+uint32_t DistributorStage::output_count() const {
+ return outputs_.size();
+}
+
+StageOutput& DistributorStage::output(uint32_t index) {
+ DCHECK(index < outputs_.size());
+ return outputs_[index];
+}
+
+bool DistributorStage::Prepare(UpdateCallback update_callback) {
+ for (StageOutput& output : outputs_) {
+ output.Prepare(false);
+ }
+ return false;
+}
+
+void DistributorStage::Update(Engine* engine) {
+ DCHECK(engine);
+
+ bool has_positive_demand = false;
+ for (StageOutput& output : outputs_) {
+ if (output.demand() == Demand::kPositive) {
+ has_positive_demand = true;
+ break;
+ }
+ }
+
+ while (true) {
+ if (cached_packet_ && has_positive_demand) {
+ DCHECK(cached_packet_output_index_ < outputs_.size());
+ StageOutput& output = outputs_[cached_packet_output_index_];
+
+ if (output.demand() != Demand::kNegative) {
+ // cached_packet_ is intended for an output which will accept packets.
+ output.SupplyPacket(std::move(cached_packet_), engine);
+ } else {
+ }
+ }
+
+ if (cached_packet_) {
+ // There's still a cached packet. We're done for now.
+ return;
+ }
+
+ if (ended_streams_ == outputs_.size()) {
+ // We've seen end-of-stream for all streams. All done.
+ return;
+ }
+
+ // Pull a packet from the source.
+ cached_packet_ = packet_source_->PullPacket(&cached_packet_output_index_);
+ DCHECK(cached_packet_);
+ DCHECK(cached_packet_output_index_ < outputs_.size());
+
+ if (cached_packet_->end_of_stream()) {
+ ended_streams_++;
+ }
+ }
+}
+
+} // namespace media
+} // namespace mojo
« no previous file with comments | « services/media/framework/stages/distributor_stage.h ('k') | services/media/framework/stages/lpcm_stage_input.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698