1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_MOJO_SERVICES_MOJO_RENDERER_IMPL_H_
6#define MEDIA_MOJO_SERVICES_MOJO_RENDERER_IMPL_H_
7
8#include "base/macros.h"
9#include "base/memory/weak_ptr.h"
10#include "media/base/renderer.h"
11#include "media/mojo/interfaces/media_renderer.mojom.h"
12
13namespace base {
14class SingleThreadTaskRunner;
15}
16
17namespace mojo {
18class ServiceProvider;
19}
20
21namespace media {
22class DemuxerStreamProvider;
23
24// A media::Renderer that proxies to a mojo::MediaRenderer. That
25// mojo::MediaRenderer proxies back to the MojoRendererImpl via the
26// mojo::MediaRendererClient interface.
27//
28// MojoRendererImpl implements media::Renderer for use as either an audio
29// or video renderer.
30//
31// TODO(tim): Only audio is currently supported. http://crbug.com/410451.
32class MojoRendererImpl : public Renderer, public mojo::MediaRendererClient {
33 public:
34  // |task_runner| is the TaskRunner on which all methods are invoked.
35  // |demuxer_stream_provider| provides encoded streams for decoding and
36  //     rendering.
37  // |audio_renderer_provider| is a ServiceProvider from a connected
38  //     Application that is hosting a mojo::MediaRenderer.
39  MojoRendererImpl(
40      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
41      DemuxerStreamProvider* demuxer_stream_provider,
42      mojo::ServiceProvider* audio_renderer_provider);
43  virtual ~MojoRendererImpl();
44
45  // Renderer implementation.
46  virtual void Initialize(const base::Closure& init_cb,
47                          const StatisticsCB& statistics_cb,
48                          const base::Closure& ended_cb,
49                          const PipelineStatusCB& error_cb,
50                          const BufferingStateCB& buffering_state_cb) OVERRIDE;
51  virtual void Flush(const base::Closure& flush_cb) OVERRIDE;
52  virtual void StartPlayingFrom(base::TimeDelta time) OVERRIDE;
53  virtual void SetPlaybackRate(float playback_rate) OVERRIDE;
54  virtual void SetVolume(float volume) OVERRIDE;
55  virtual base::TimeDelta GetMediaTime() OVERRIDE;
56  virtual bool HasAudio() OVERRIDE;
57  virtual bool HasVideo() OVERRIDE;
58  virtual void SetCdm(MediaKeys* cdm) OVERRIDE;
59
60  // mojo::MediaRendererClient implementation.
61  virtual void OnTimeUpdate(int64_t time_usec,
62                            int64_t max_time_usec) MOJO_OVERRIDE;
63  virtual void OnBufferingStateChange(mojo::BufferingState state) MOJO_OVERRIDE;
64  virtual void OnEnded() MOJO_OVERRIDE;
65  virtual void OnError() MOJO_OVERRIDE;
66
67 private:
68  // Called when |remote_audio_renderer_| has finished initializing.
69  void OnInitialized();
70
71  // Task runner used to execute pipeline tasks.
72  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
73
74  DemuxerStreamProvider* demuxer_stream_provider_;
75  mojo::MediaRendererPtr remote_audio_renderer_;
76
77  // Callbacks passed to Initialize() that we forward messages from
78  // |remote_audio_renderer_| through.
79  base::Closure init_cb_;
80  base::Closure ended_cb_;
81  PipelineStatusCB error_cb_;
82  BufferingStateCB buffering_state_cb_;
83
84  base::WeakPtrFactory<MojoRendererImpl> weak_factory_;
85  DISALLOW_COPY_AND_ASSIGN(MojoRendererImpl);
86};
87
88}  // namespace media
89
90#endif  // MEDIA_MOJO_SERVICES_MOJO_RENDERER_IMPL_H_
91