// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_BASE_PIPELINE_IMPL_H_ #define MEDIA_BASE_PIPELINE_IMPL_H_ #include <memory> #include <optional> #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "media/base/media_export.h" #include "media/base/pipeline.h" #include "media/base/renderer.h" #include "media/base/renderer_factory_selector.h" namespace base { class SingleThreadTaskRunner; } namespace media { class MediaLog; // Callbacks used for Renderer creation. When the RendererType is nullopt, the // current base one will be created. CreateRendererCB; RendererCreatedCB; AsyncCreateRendererCB; // Pipeline runs the media pipeline. Filters are created and called on the // task runner injected into this object. Pipeline works like a state // machine to perform asynchronous initialization, pausing, seeking and playing. // // Here's a state diagram that describes the lifetime of this object. // // [ *Created ] [ Any State ] // | Start() | Stop() // V V // [ Starting ] [ Stopping ] // | | // V V // [ Playing ] <---------. [ Stopped ] // | | | Seek() | // | | V | // | | [ Seeking ] ---' // | | ^ // | | *TrackChange() | // | V | // | [ Switching ] ----' // | ^ // | Suspend() | // V | // [ Suspending ] | // | | // V | // [ Suspended ] | // | Resume() | // V | // [ Resuming ] ---------' // // Initialization is a series of state transitions from "Created" through each // filter initialization state. When all filter initialization states have // completed, we simulate a Seek() to the beginning of the media to give filters // a chance to preroll. From then on the normal Seek() transitions are carried // out and we start playing the media. // // If Stop() is ever called, this object will transition to "Stopped" state. // Pipeline::Stop() is never called from within PipelineImpl. It's |client_|'s // responsibility to call stop when appropriate. // // TODO(sandersd): It should be possible to pass through Suspended when going // from InitDemuxer to InitRenderer, thereby eliminating the Resuming state. // Some annoying differences between the two paths need to be removed first. class MEDIA_EXPORT PipelineImpl : public Pipeline { … }; } // namespace media #endif // MEDIA_BASE_PIPELINE_IMPL_H_