Index: chromecast/media/cma/filters/cma_renderer.h |
diff --git a/chromecast/media/cma/filters/cma_renderer.h b/chromecast/media/cma/filters/cma_renderer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d1c83ac09ad4ea9ed8cea5d0f399a3444b4c32c8 |
--- /dev/null |
+++ b/chromecast/media/cma/filters/cma_renderer.h |
@@ -0,0 +1,150 @@ |
+// Copyright 2014 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 CHROMECAST_MEDIA_CMA_FILTERS_CMA_RENDERER_H_ |
+#define CHROMECAST_MEDIA_CMA_FILTERS_CMA_RENDERER_H_ |
+ |
+#include "base/macros.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/synchronization/lock.h" |
+#include "base/threading/thread_checker.h" |
+#include "base/time/default_tick_clock.h" |
+#include "media/base/buffering_state.h" |
+#include "media/base/renderer.h" |
+#include "ui/gfx/geometry/size.h" |
+ |
+namespace base { |
+class MessageLoopProxy; |
+} |
+ |
+namespace media { |
+class DemuxerStreamProvider; |
+class TimeDeltaInterpolator; |
+class VideoFrame; |
+} |
+ |
+namespace chromecast { |
+namespace media { |
+class AudioPipeline; |
+class BalancedMediaTaskRunnerFactory; |
+class MediaPipeline; |
+class VideoPipeline; |
+ |
+class CmaRenderer : public ::media::Renderer { |
+ public: |
+ explicit CmaRenderer(scoped_ptr<MediaPipeline> media_pipeline); |
+ ~CmaRenderer() override; |
+ |
+ // ::media::Renderer implementation: |
+ void Initialize( |
+ ::media::DemuxerStreamProvider* demuxer_stream_provider, |
+ const base::Closure& init_cb, |
+ const ::media::StatisticsCB& statistics_cb, |
+ const ::media::BufferingStateCB& buffering_state_cb, |
+ const PaintCB& paint_cb, |
+ const base::Closure& ended_cb, |
+ const ::media::PipelineStatusCB& error_cb) override; |
+ void Flush(const base::Closure& flush_cb) override; |
+ void StartPlayingFrom(base::TimeDelta time) override; |
+ void SetPlaybackRate(float playback_rate) override; |
+ void SetVolume(float volume) override; |
+ base::TimeDelta GetMediaTime() override; |
+ bool HasAudio() override; |
+ bool HasVideo() override; |
+ void SetCdm(::media::CdmContext* cdm_context, |
+ const ::media::CdmAttachedCB& cdm_attached_cb) override; |
+ |
+ private: |
+ enum State { |
+ kUninitialized, |
+ kPlaying, |
+ kFlushed, |
+ kError, |
+ }; |
+ |
+ // Asynchronous initialization sequence. These four methods are invoked in |
+ // the order below, with a successful initialization making it to |
+ // OnVideoPipelineInitializeDone, regardless of which streams are present. |
+ void InitializeAudioPipeline(); |
+ void OnAudioPipelineInitializeDone(::media::PipelineStatus status); |
+ void InitializeVideoPipeline(); |
+ void OnVideoPipelineInitializeDone(::media::PipelineStatus status); |
+ |
+ // Callbacks for AvPipelineClient. |
+ void OnEosReached(bool is_audio); |
+ void OnStatisticsUpdated(const ::media::PipelineStatistics& stats); |
+ void OnNaturalSizeChanged(const gfx::Size& size); |
+ |
+ // Callbacks for MediaPipelineClient. |
+ void OnPlaybackTimeUpdated(base::TimeDelta time, |
+ base::TimeDelta max_time, |
+ base::TimeTicks capture_time); |
+ void OnBufferingNotification(::media::BufferingState state); |
+ |
+ void OnFlushDone(::media::PipelineStatus status); |
+ void OnError(::media::PipelineStatus status); |
+ |
+ void FireAllPendingCallbacks(); |
+ |
+ // Begin a state transition. |
+ // Return true if delayed because of a pending state transition. |
+ void BeginStateTransition(); |
+ void CompleteStateTransition(State new_state); |
+ |
+ base::ThreadChecker thread_checker_; |
+ |
+ scoped_refptr<BalancedMediaTaskRunnerFactory> media_task_runner_factory_; |
+ scoped_ptr<MediaPipeline> media_pipeline_; |
+ AudioPipeline* audio_pipeline_; |
+ VideoPipeline* video_pipeline_; |
+ |
+ ::media::DemuxerStreamProvider* demuxer_stream_provider_; |
+ |
+ // Set of callbacks. |
+ PaintCB paint_cb_; |
+ base::Closure init_cb_; |
+ ::media::StatisticsCB statistics_cb_; |
+ base::Closure ended_cb_; |
+ ::media::PipelineStatusCB error_cb_; |
+ ::media::BufferingStateCB buffering_state_cb_; |
+ base::Closure flush_cb_; |
+ |
+ // Renderer state. |
+ // Used mostly for checking that transitions are correct. |
+ State state_; |
+ bool is_pending_transition_; |
+ |
+ bool has_audio_; |
+ bool has_video_; |
+ |
+ bool received_audio_eos_; |
+ bool received_video_eos_; |
+ |
+ // Data members for helping the creation of the initial video hole frame. |
+ gfx::Size initial_natural_size_; |
+ bool initial_video_hole_created_; |
+ |
+ // Lock protecting access to |time_interpolator_|. |
+ base::Lock time_interpolator_lock_; |
+ |
+ // base::TickClock used by |time_interpolator_|. |
+ base::DefaultTickClock default_tick_clock_; |
+ |
+ // Tracks the most recent media time update and provides interpolated values |
+ // as playback progresses. |
+ scoped_ptr< ::media::TimeDeltaInterpolator> time_interpolator_; |
+ |
+ float playback_rate_; |
+ |
+ base::WeakPtr<CmaRenderer> weak_this_; |
+ base::WeakPtrFactory<CmaRenderer> weak_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CmaRenderer); |
+}; |
+ |
+} // namespace media |
+} // namespace chromecast |
+ |
+#endif // CHROMECAST_MEDIA_CMA_FILTERS_CMA_RENDERER_H_ |