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

Unified Diff: services/media/factory_service/media_timeline_controller_impl.h

Issue 2009643002: Motown: Implement MediaTimelineController and use it. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Sync Created 4 years, 7 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/factory_service/media_timeline_controller_impl.h
diff --git a/services/media/factory_service/media_timeline_controller_impl.h b/services/media/factory_service/media_timeline_controller_impl.h
new file mode 100644
index 0000000000000000000000000000000000000000..7dca89d08a030542c1ed18d96e22db97b6618325
--- /dev/null
+++ b/services/media/factory_service/media_timeline_controller_impl.h
@@ -0,0 +1,161 @@
+// 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.
+
+#ifndef MOJO_SERVICES_MEDIA_FACTORY_TIMELINE_CONTROLLER_IMPL_H_
+#define MOJO_SERVICES_MEDIA_FACTORY_TIMELINE_CONTROLLER_IMPL_H_
+
+#include <memory>
+#include <vector>
+
+#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/services/media/common/cpp/local_time.h"
+#include "mojo/services/media/common/cpp/timeline.h"
+#include "mojo/services/media/common/cpp/timeline_function.h"
+#include "mojo/services/media/core/interfaces/timeline_controller.mojom.h"
+#include "services/media/common/mojo_publisher.h"
+#include "services/media/factory_service/factory_service.h"
+#include "services/media/framework/util/callback_joiner.h"
+
+namespace mojo {
+namespace media {
+
+// Mojo agent that controls timing in a graph.
+class MediaTimelineControllerImpl
+ : public MediaFactoryService::Product<MediaTimelineController>,
+ public MediaTimelineController,
+ public MediaTimelineControlSite,
+ public TimelineConsumer {
+ public:
+ static std::shared_ptr<MediaTimelineControllerImpl> Create(
+ InterfaceRequest<MediaTimelineController> request,
+ MediaFactoryService* owner);
+
+ ~MediaTimelineControllerImpl() override;
+
+ // MediaTimelineController implementation.
+ void AddControlSite(
+ InterfaceHandle<MediaTimelineControlSite> control_site) override;
+
+ void GetControlSite(
+ InterfaceRequest<MediaTimelineControlSite> control_site) override;
+
+ // MediaTimelineControlSite implementation.
+ void GetStatus(uint64_t version_last_seen,
+ const GetStatusCallback& callback) override;
+
+ void GetTimelineConsumer(
+ InterfaceRequest<TimelineConsumer> timeline_consumer) override;
+
+ // TimelineConsumer implementation.
+ void SetTimelineTransform(
+ int64_t subject_time,
+ uint32_t reference_delta,
+ uint32_t subject_delta,
+ int64_t effective_reference_time,
+ int64_t effective_subject_time,
+ const SetTimelineTransformCallback& callback) override;
+
+ private:
+ static constexpr int64_t kDefaultLeadTime = Timeline::ns_from_ms(30);
+
+ // Relationship to subordinate control site.
+ struct SiteState {
+ SiteState(MediaTimelineControllerImpl* parent,
+ MediaTimelineControlSitePtr site);
+
+ SiteState(SiteState&& other);
+
+ ~SiteState();
+
+ void HandleStatusUpdates(
+ uint64_t version = MediaTimelineControlSite::kInitialStatus,
+ MediaTimelineControlSiteStatusPtr status = nullptr);
+
+ MediaTimelineControllerImpl* parent_;
+ MediaTimelineControlSitePtr site_;
+ TimelineConsumerPtr consumer_;
+ bool end_of_stream_ = false;
+ };
+
+ class TimelineTransition
+ : public std::enable_shared_from_this<TimelineTransition> {
+ public:
+ TimelineTransition(int64_t reference_time,
+ int64_t subject_time,
+ uint32_t reference_delta,
+ uint32_t subject_delta,
+ const SetTimelineTransformCallback& callback);
+
+ ~TimelineTransition();
+
+ // Calls returns a new callback for a child (site) transition. THIS METHOD
+ // WILL ONLY WORK IF THERE IS ALREADY A SHARED POINTER TO THIS OBJECT.
+ std::function<void(bool)> NewCallback() {
+ callback_joiner_.Spawn();
+
+ std::shared_ptr<TimelineTransition> this_ptr = shared_from_this();
+ DCHECK(!this_ptr.unique());
+
+ return [this_ptr](bool completed) {
+ DCHECK(this_ptr);
+ if (!completed && !this_ptr->cancelled_) {
+ LOG(WARNING) << "A site transition was cancelled unexpectedly.";
+ }
+ this_ptr->callback_joiner_.Complete();
+ };
+ }
+
+ // Cancels this transition.
+ void Cancel() {
+ DCHECK(!cancelled_);
+ cancelled_ = true;
+ DCHECK(callback_.is_null());
+ callback_.Run(false);
+ callback_.reset();
+ completed_callback_.reset();
+ }
+
+ // Specifies a callback to be called if and when the transition is complete.
+ // The callback will never be called if the transition is cancelled.
+ void WhenCompleted(const mojo::Callback<void()>& completed_callback) {
+ DCHECK(completed_callback_.is_null());
+ if (callback_.is_null() && !cancelled_) {
+ completed_callback.Run();
+ } else {
+ completed_callback_ = completed_callback;
+ }
+ }
+
+ // Returns the TimelineFunction that will result from this transition.
+ const TimelineFunction& new_timeline_function() const {
+ return new_timeline_function_;
+ }
+
+ private:
+ TimelineFunction new_timeline_function_;
+ SetTimelineTransformCallback callback_;
+ CallbackJoiner callback_joiner_;
+ bool cancelled_ = false;
+ Callback<void()> completed_callback_;
+ };
+
+ MediaTimelineControllerImpl(InterfaceRequest<MediaTimelineController> request,
+ MediaFactoryService* owner);
+
+ // Takes action when a site changes its end-of-stream value.
+ void HandleSiteEndOfStreamChange();
+
+ Binding<MediaTimelineControlSite> control_site_binding_;
+ Binding<TimelineConsumer> consumer_binding_;
+ MojoPublisher<GetStatusCallback> status_publisher_;
+ std::vector<SiteState> site_states_;
+ TimelineFunction current_timeline_function_;
+ bool end_of_stream_;
+ std::weak_ptr<TimelineTransition> pending_transition_;
+};
+
+} // namespace media
+} // namespace mojo
+
+#endif // MOJO_SERVICES_MEDIA_FACTORY_TIMELINE_CONTROLLER_IMPL_H_
« no previous file with comments | « services/media/factory_service/media_player_impl.cc ('k') | services/media/factory_service/media_timeline_controller_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698