1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_BASE_PIPELINE_H_
6 #define MEDIA_BASE_PIPELINE_H_
10 #include "base/time/time.h"
11 #include "media/base/audio_decoder_config.h"
12 #include "media/base/buffering_state.h"
13 #include "media/base/media_export.h"
14 #include "media/base/media_status.h"
15 #include "media/base/media_track.h"
16 #include "media/base/pipeline_metadata.h"
17 #include "media/base/pipeline_status.h"
18 #include "media/base/ranges.h"
19 #include "media/base/video_decoder_config.h"
20 #include "media/base/video_transformation.h"
21 #include "media/base/waiting.h"
22 #include "third_party/abseil-cpp/absl/types/optional.h"
23 #include "ui/gfx/geometry/size.h"
25 #if defined(TIZEN_VIDEO_HOLE)
26 #include "ui/gfx/geometry/rect_f.h"
34 class MEDIA_EXPORT Pipeline {
38 // Executed whenever an error occurs except when the error occurs during
39 // Start/Seek/Resume or Suspend. Those errors are reported via |seek_cb|
40 // and |suspend_cb| respectively.
41 // NOTE: The client is responsible for calling Pipeline::Stop().
42 virtual void OnError(PipelineStatus status) = 0;
44 // Executed whenever some fallback-enabled portion of the pipeline (Just
45 // Decoders and Renderers for now) fails in such a way that a fallback
46 // is still possible without a fatal pipeline error.
47 virtual void OnFallback(PipelineStatus status) = 0;
49 // Executed whenever the media reaches the end.
50 virtual void OnEnded() = 0;
52 // Executed when the content duration, container video size, start time,
53 // and whether the content has audio and/or video in supported formats are
55 virtual void OnMetadata(const PipelineMetadata& metadata) = 0;
57 // Executed whenever there are changes in the buffering state of the
58 // pipeline. |reason| indicates the cause of the state change, when known.
59 virtual void OnBufferingStateChange(BufferingState state,
60 BufferingStateChangeReason reason) = 0;
62 // Executed whenever the presentation duration changes.
63 virtual void OnDurationChange() = 0;
65 // Executed whenever the pipeline is waiting because of |reason|.
66 virtual void OnWaiting(WaitingReason reason) = 0;
68 // Executed for the first video frame and whenever natural size changes.
69 virtual void OnVideoNaturalSizeChange(const gfx::Size& size) = 0;
71 // Executed for the first video frame and whenever opacity changes.
72 virtual void OnVideoOpacityChange(bool opaque) = 0;
74 // Executed when the average keyframe distance for the video changes.
75 virtual void OnVideoAverageKeyframeDistanceUpdate() = 0;
77 // Executed whenever DemuxerStream status returns kConfigChange. Initial
78 // configs provided by OnMetadata.
79 virtual void OnAudioConfigChange(const AudioDecoderConfig& config) = 0;
80 virtual void OnVideoConfigChange(const VideoDecoderConfig& config) = 0;
82 // Executed whenever the underlying AudioDecoder or VideoDecoder changes
84 virtual void OnAudioPipelineInfoChange(const AudioPipelineInfo& info) = 0;
85 virtual void OnVideoPipelineInfoChange(const VideoPipelineInfo& info) = 0;
87 // Executed whenever the video frame rate changes. |fps| will be unset if
88 // the frame rate is unstable. The duration used for the frame rate is
89 // based on wall clock time, not media time.
90 virtual void OnVideoFrameRateChange(absl::optional<int> fps) = 0;
92 #if defined(TIZEN_MULTIMEDIA)
93 virtual void OnRequestSuspend() = 0;
97 virtual ~Pipeline() {}
99 // StartType provides the option to start the pipeline without a renderer;
100 // pipeline initialization will stop once metadata has been retrieved. The
101 // flags below indicate when suspended start will be invoked.
102 enum class StartType {
103 kNormal, // Follow the normal startup path.
104 kSuspendAfterMetadataForAudioOnly, // Suspend after metadata for audio
106 kSuspendAfterMetadata, // Always suspend after metadata.
109 // Build a pipeline to using the given |demuxer| to construct a filter chain,
110 // executing |seek_cb| when the initial seek has completed. Methods on
111 // PipelineClient may be called up until Stop() has completed. It is an error
112 // to call this method after the pipeline has already started.
114 // If a |start_type| is specified which allows suspension, pipeline startup
115 // will halt after metadata has been retrieved and the pipeline will be in a
117 virtual void Start(StartType start_type,
120 PipelineStatusCallback seek_cb) = 0;
122 // Track switching works similarly for both audio and video. Callbacks are
123 // used to notify when it is time to procede to the next step, since many of
124 // the operations are asynchronous.
125 // ──────────────────── Track Switch Control Flow ───────────────────────
126 // pipeline | demuxer | demuxer_stream | renderer | video/audio_renderer
130 // switch track | | |
132 // | disable/enable stream | |
133 // | -----------> | |
134 // active streams | | |
136 // | switch track | |
137 // --------------------------------------> |
138 // | | | Flush/Restart/Reset
139 // | | | --------------->
140 // Notify pipeline of completed track change (via callback)
141 // <-----------------------------------------------------
142 // ──────────────────── Sometime in the future ──────────────────────────
143 // | | | OnBufferingStateChange
144 // | | | <----------------
145 // | OnBufferingStateChange | |
146 // <-------------------------------------- |
149 // |enabled_track_ids| contains track ids of enabled audio tracks.
150 virtual void OnEnabledAudioTracksChanged(
151 const std::vector<MediaTrack::Id>& enabled_track_ids,
152 base::OnceClosure change_completed_cb) = 0;
154 // |selected_track_id| is either empty, which means no video track is
155 // selected, or contains the selected video track id.
156 virtual void OnSelectedVideoTrackChanged(
157 absl::optional<MediaTrack::Id> selected_track_id,
158 base::OnceClosure change_completed_cb) = 0;
160 // Signal to the pipeline that there has been a client request to access
162 virtual void OnExternalVideoFrameRequest() = 0;
164 // Stops the pipeline. This is a blocking function.
165 // If the pipeline is started, it must be stopped before destroying it.
166 // It it permissible to call Stop() at any point during the lifetime of the
169 // Once Stop is called any outstanding completion callbacks
170 // for Start/Seek/Suspend/Resume or Client methods will *not* be called.
171 virtual void Stop() = 0;
173 // Attempt to seek to the position specified by time. |seek_cb| will be
174 // executed when the all filters in the pipeline have processed the seek.
176 // Clients are expected to call GetMediaTime() to check whether the seek
179 // It is an error to call this method if the pipeline has not started or
180 // has been suspended.
181 virtual void Seek(base::TimeDelta time, PipelineStatusCallback seek_cb) = 0;
183 // Suspends the pipeline, discarding the current renderer.
185 // While suspended, GetMediaTime() returns the presentation timestamp of the
186 // last rendered frame.
188 // It is an error to call this method if the pipeline has not started or is
190 virtual void Suspend(PipelineStatusCallback suspend_cb) = 0;
192 // Resume the pipeline and seek to |timestamp|.
194 // It is an error to call this method if the pipeline has not finished
196 virtual void Resume(base::TimeDelta timestamp,
197 PipelineStatusCallback seek_cb) = 0;
199 // Returns true if the pipeline has been started via Start(). If IsRunning()
200 // returns true, it is expected that Stop() will be called before destroying
202 virtual bool IsRunning() const = 0;
204 // Returns true if the pipeline has been suspended via Suspend() or during
205 // Start(). If IsSuspended() returns true, it is expected that Resume() will
206 // be called to resume playback.
207 virtual bool IsSuspended() const = 0;
209 // Gets the current playback rate of the pipeline. When the pipeline is
210 // started, the playback rate will be 0.0. A rate of 1.0 indicates
211 // that the pipeline is rendering the media at the standard rate. Valid
212 // values for playback rate are >= 0.0.
213 virtual double GetPlaybackRate() const = 0;
215 // Attempt to adjust the playback rate. Setting a playback rate of 0.0 pauses
216 // all rendering of the media. A rate of 1.0 indicates a normal playback
217 // rate. Values for the playback rate must be greater than or equal to 0.0.
219 // TODO(scherkus): What about maximum rate? Does HTML5 specify a max?
220 virtual void SetPlaybackRate(double playback_rate) = 0;
222 // Gets the current volume setting being used by the audio renderer. When
223 // the pipeline is started, this value will be 1.0f. Valid values range
224 // from 0.0f to 1.0f.
225 virtual float GetVolume() const = 0;
227 // Attempt to set the volume of the audio renderer. Valid values for volume
228 // range from 0.0f (muted) to 1.0f (full volume). This value affects all
229 // channels proportionately for multi-channel audio streams.
230 virtual void SetVolume(float volume) = 0;
232 // Hint from player about target latency as a guide for the desired amount of
233 // post-decode buffering required to start playback or resume from
234 // seek/underflow. A null option indicates the hint is unset and the pipeline
235 // can choose its own default.
236 virtual void SetLatencyHint(absl::optional<base::TimeDelta> latency_hint) = 0;
238 // Sets whether pitch adjustment should be applied when the playback rate is
239 // different than 1.0.
240 virtual void SetPreservesPitch(bool preserves_pitch) = 0;
242 // Sets a flag indicating whether the audio stream was played with user
244 virtual void SetWasPlayedWithUserActivation(
245 bool was_played_with_user_activation) = 0;
247 // Returns the current media playback time, which progresses from 0 until
248 // GetMediaDuration().
249 virtual base::TimeDelta GetMediaTime() const = 0;
251 // Get approximate time ranges of buffered media.
252 virtual Ranges<base::TimeDelta> GetBufferedTimeRanges() const = 0;
254 // Get the duration of the media in microseconds. If the duration has not
255 // been determined yet, then returns 0.
256 virtual base::TimeDelta GetMediaDuration() const = 0;
258 // Return true if loading progress has been made since the last time this
259 // method was called.
260 virtual bool DidLoadingProgress() = 0;
262 // Gets the current pipeline statistics.
263 virtual PipelineStatistics GetStatistics() const = 0;
265 using CdmAttachedCB = base::OnceCallback<void(bool)>;
266 virtual void SetCdm(CdmContext* cdm_context,
267 CdmAttachedCB cdm_attached_cb) = 0;
269 #if defined(TIZEN_VIDEO_HOLE)
270 virtual void SetMediaGeometry(const gfx::RectF rect_f) = 0;
276 #endif // MEDIA_BASE_PIPELINE_H_