Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / media / mojo / services / mojo_renderer_service.h
index 0459c31..35e47cd 100644 (file)
@@ -9,8 +9,8 @@
 #include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/timer/timer.h"
 #include "media/base/audio_decoder_config.h"
-#include "media/base/audio_hardware_config.h"
 #include "media/base/buffering_state.h"
 #include "media/base/pipeline_status.h"
 #include "media/mojo/interfaces/media_renderer.mojom.h"
@@ -22,8 +22,10 @@ class ApplicationConnection;
 
 namespace media {
 
-class AudioRenderer;
+class AudioRendererSink;
+class DemuxerStreamProviderShim;
 class MojoDemuxerStreamAdapter;
+class Renderer;
 
 // A mojo::MediaRenderer implementation that uses media::AudioRenderer to
 // decode and render audio to a sink obtained from the ApplicationConnection.
@@ -34,53 +36,64 @@ class MojoRendererService : public mojo::InterfaceImpl<mojo::MediaRenderer> {
   // allow |this| to connect to a sink that will receive decoded data ready
   // for playback.
   explicit MojoRendererService(mojo::ApplicationConnection* connection);
-  virtual ~MojoRendererService();
+  ~MojoRendererService() override;
 
   // mojo::MediaRenderer implementation.
-  virtual void Initialize(mojo::DemuxerStreamPtr stream,
-                          const mojo::Callback<void()>& callback) MOJO_OVERRIDE;
-  virtual void Flush(const mojo::Callback<void()>& callback) MOJO_OVERRIDE;
-  virtual void StartPlayingFrom(int64_t time_delta_usec) MOJO_OVERRIDE;
-  virtual void SetPlaybackRate(float playback_rate) MOJO_OVERRIDE;
-  virtual void SetVolume(float volume) MOJO_OVERRIDE;
+  void Initialize(mojo::DemuxerStreamPtr audio,
+                  mojo::DemuxerStreamPtr video,
+                  const mojo::Closure& callback) override;
+  void Flush(const mojo::Closure& callback) override;
+  void StartPlayingFrom(int64_t time_delta_usec) override;
+  void SetPlaybackRate(float playback_rate) override;
+  void SetVolume(float volume) override;
 
  private:
+  enum State {
+    STATE_UNINITIALIZED,
+    STATE_INITIALIZING,
+    STATE_FLUSHING,
+    STATE_PLAYING,
+    STATE_ERROR
+  };
+
   // Called when the MojoDemuxerStreamAdapter is ready to go (has a config,
   // pipe handle, etc) and can be handed off to a renderer for use.
-  void OnStreamReady();
+  void OnStreamReady(const mojo::Closure& callback);
 
   // Called when |audio_renderer_| initialization has completed.
-  void OnAudioRendererInitializeDone(PipelineStatus status);
+  void OnRendererInitializeDone(const mojo::Closure& callback);
 
   // Callback executed by filters to update statistics.
   void OnUpdateStatistics(const PipelineStatistics& stats);
 
-  // Callback executed by audio renderer to update clock time.
-  void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time);
+  // Periodically polls the media time from the renderer and notifies the client
+  // if the media time has changed since the last update.  If |force| is true,
+  // the client is notified even if the time is unchanged.
+  void UpdateMediaTime(bool force);
+  void SchedulePeriodicMediaTimeUpdates();
 
   // Callback executed by audio renderer when buffering state changes.
   // TODO(tim): Need old and new.
   void OnBufferingStateChanged(BufferingState new_buffering_state);
 
   // Callback executed when a renderer has ended.
-  void OnAudioRendererEnded();
+  void OnRendererEnded();
 
   // Callback executed when a runtime error happens.
   void OnError(PipelineStatus error);
 
-  scoped_ptr<MojoDemuxerStreamAdapter> stream_;
-  scoped_ptr<AudioRenderer> audio_renderer_;
+  State state_;
 
-  mojo::Callback<void()> init_cb_;
+  scoped_refptr<AudioRendererSink> audio_renderer_sink_;
+  scoped_ptr<Renderer> renderer_;
+  scoped_ptr<DemuxerStreamProviderShim> stream_provider_;
 
-  // TODO(tim): Figure out how to set up hardware config.
-  // NOTE: AudioRendererImpl stores a const& to the config we pass in (hmm..).
-  // Hence stack-allocating one and passing it to Initialize results in
-  // undefined badness (e.g, hangs trying to acquire config_lock_);
-  media::AudioHardwareConfig hardware_config_;
+  base::RepeatingTimer<MojoRendererService> time_update_timer_;
+  uint64_t last_media_time_usec_;
 
   base::WeakPtrFactory<MojoRendererService> weak_factory_;
   base::WeakPtr<MojoRendererService> weak_this_;
+
   DISALLOW_COPY_AND_ASSIGN(MojoRendererService);
 };