Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ | 5 #ifndef MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ |
| 6 #define MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ | 6 #define MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/time/default_tick_clock.h" | 14 #include "base/time/default_tick_clock.h" |
| 15 #include "base/unguessable_token.h" | 15 #include "base/unguessable_token.h" |
| 16 #include "media/base/demuxer_stream.h" | 16 #include "media/base/demuxer_stream.h" |
| 17 #include "media/base/renderer.h" | 17 #include "media/base/renderer.h" |
| 18 #include "media/base/time_delta_interpolator.h" | 18 #include "media/base/time_delta_interpolator.h" |
| 19 #include "media/mojo/interfaces/renderer.mojom.h" | 19 #include "media/mojo/interfaces/renderer.mojom.h" |
| 20 #include "mojo/public/cpp/bindings/associated_binding.h" | 20 #include "mojo/public/cpp/bindings/associated_binding.h" |
| 21 | 21 |
| 22 namespace base { | 22 namespace base { |
| 23 class SingleThreadTaskRunner; | 23 class SingleThreadTaskRunner; |
| 24 } | 24 } |
| 25 | 25 |
| 26 namespace media { | 26 namespace media { |
| 27 | 27 |
| 28 class DemuxerStreamProvider; | 28 class MediaResource; |
| 29 class MojoDemuxerStreamImpl; | 29 class MojoDemuxerStreamImpl; |
| 30 class VideoOverlayFactory; | 30 class VideoOverlayFactory; |
| 31 class VideoRendererSink; | 31 class VideoRendererSink; |
| 32 | 32 |
| 33 // A media::Renderer that proxies to a mojom::Renderer. That | 33 // A media::Renderer that proxies to a mojom::Renderer. That |
| 34 // mojom::Renderer proxies back to the MojoRenderer via the | 34 // mojom::Renderer proxies back to the MojoRenderer via the |
| 35 // mojom::RendererClient interface. | 35 // mojom::RendererClient interface. |
| 36 // | 36 // |
| 37 // This class can be created on any thread, where the |remote_renderer| is | 37 // This class can be created on any thread, where the |remote_renderer| is |
| 38 // connected and passed in the constructor. Then Initialize() will be called on | 38 // connected and passed in the constructor. Then Initialize() will be called on |
| 39 // the |task_runner| and starting from that point this class is bound to the | 39 // the |task_runner| and starting from that point this class is bound to the |
| 40 // |task_runner|*. That means all Renderer and RendererClient methods will be | 40 // |task_runner|*. That means all Renderer and RendererClient methods will be |
| 41 // called/dispached on the |task_runner|. The only exception is GetMediaTime(), | 41 // called/dispached on the |task_runner|. The only exception is GetMediaTime(), |
| 42 // which can be called on any thread. | 42 // which can be called on any thread. |
| 43 class MojoRenderer : public Renderer, public mojom::RendererClient { | 43 class MojoRenderer : public Renderer, public mojom::RendererClient { |
| 44 public: | 44 public: |
| 45 MojoRenderer(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 45 MojoRenderer(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 46 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, | 46 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, |
| 47 VideoRendererSink* video_renderer_sink, | 47 VideoRendererSink* video_renderer_sink, |
| 48 mojom::RendererPtr remote_renderer); | 48 mojom::RendererPtr remote_renderer); |
| 49 ~MojoRenderer() override; | 49 ~MojoRenderer() override; |
| 50 | 50 |
| 51 // Renderer implementation. | 51 // Renderer implementation. |
| 52 void Initialize(DemuxerStreamProvider* demuxer_stream_provider, | 52 void Initialize(MediaResource* media_resource, |
| 53 media::RendererClient* client, | 53 media::RendererClient* client, |
| 54 const PipelineStatusCB& init_cb) override; | 54 const PipelineStatusCB& init_cb) override; |
| 55 void SetCdm(CdmContext* cdm_context, | 55 void SetCdm(CdmContext* cdm_context, |
| 56 const CdmAttachedCB& cdm_attached_cb) override; | 56 const CdmAttachedCB& cdm_attached_cb) override; |
| 57 void Flush(const base::Closure& flush_cb) override; | 57 void Flush(const base::Closure& flush_cb) override; |
| 58 void StartPlayingFrom(base::TimeDelta time) override; | 58 void StartPlayingFrom(base::TimeDelta time) override; |
| 59 void SetPlaybackRate(double playback_rate) override; | 59 void SetPlaybackRate(double playback_rate) override; |
| 60 void SetVolume(float volume) override; | 60 void SetVolume(float volume) override; |
| 61 base::TimeDelta GetMediaTime() override; | 61 base::TimeDelta GetMediaTime() override; |
| 62 | 62 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 81 void OnVideoOpacityChange(bool opaque) override; | 81 void OnVideoOpacityChange(bool opaque) override; |
| 82 void OnWaitingForDecryptionKey() override; | 82 void OnWaitingForDecryptionKey() override; |
| 83 void OnStatisticsUpdate(const PipelineStatistics& stats) override; | 83 void OnStatisticsUpdate(const PipelineStatistics& stats) override; |
| 84 void OnDurationChange(base::TimeDelta duration) override; | 84 void OnDurationChange(base::TimeDelta duration) override; |
| 85 | 85 |
| 86 // Binds |remote_renderer_| to the mojo message pipe. Can be called multiple | 86 // Binds |remote_renderer_| to the mojo message pipe. Can be called multiple |
| 87 // times. If an error occurs during connection, OnConnectionError will be | 87 // times. If an error occurs during connection, OnConnectionError will be |
| 88 // called asynchronously. | 88 // called asynchronously. |
| 89 void BindRemoteRendererIfNeeded(); | 89 void BindRemoteRendererIfNeeded(); |
| 90 | 90 |
| 91 // Initialize the remote renderer when |demuxer_stream_provider| is of type | 91 // Initialize the remote renderer when |media_resource| is of type |
| 92 // DemuxerSteamProvider::Type::STREAM. | 92 // MediaResource::Type::STREAM. |
| 93 void InitializeRendererFromStreams(media::RendererClient* client); | 93 void InitializeRendererFromStreams(media::RendererClient* client); |
| 94 | 94 |
| 95 // Initialize the remote renderer when |demuxer_stream_provider| is of type | 95 // Initialize the remote renderer when |media_resource| is of type |
| 96 // DemuxerSteamProvider::Type::URL. | 96 // MediaResource::Type::URL. |
| 97 void InitializeRendererFromUrl(media::RendererClient* client); | 97 void InitializeRendererFromUrl(media::RendererClient* client); |
| 98 | 98 |
| 99 // Callback for connection error on |remote_renderer_|. | 99 // Callback for connection error on |remote_renderer_|. |
| 100 void OnConnectionError(); | 100 void OnConnectionError(); |
| 101 | 101 |
| 102 // Callback for connection error on any of |streams_|. The |stream| parameter | 102 // Callback for connection error on any of |streams_|. The |stream| parameter |
| 103 // indicates which stream the error happened on. | 103 // indicates which stream the error happened on. |
| 104 void OnDemuxerStreamConnectionError(MojoDemuxerStreamImpl* stream); | 104 void OnDemuxerStreamConnectionError(MojoDemuxerStreamImpl* stream); |
| 105 | 105 |
| 106 // Callbacks for |remote_renderer_| methods. | 106 // Callbacks for |remote_renderer_| methods. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 117 // Overlay factory used to create overlays for video frames rendered | 117 // Overlay factory used to create overlays for video frames rendered |
| 118 // by the remote renderer. | 118 // by the remote renderer. |
| 119 std::unique_ptr<VideoOverlayFactory> video_overlay_factory_; | 119 std::unique_ptr<VideoOverlayFactory> video_overlay_factory_; |
| 120 | 120 |
| 121 // Video frame overlays are rendered onto this sink. | 121 // Video frame overlays are rendered onto this sink. |
| 122 // Rendering of a new overlay is only needed when video natural size changes. | 122 // Rendering of a new overlay is only needed when video natural size changes. |
| 123 VideoRendererSink* video_renderer_sink_ = nullptr; | 123 VideoRendererSink* video_renderer_sink_ = nullptr; |
| 124 | 124 |
| 125 // Provider of audio/video DemuxerStreams. Must be valid throughout the | 125 // Provider of audio/video DemuxerStreams. Must be valid throughout the |
| 126 // lifetime of |this|. | 126 // lifetime of |this|. |
| 127 DemuxerStreamProvider* demuxer_stream_provider_ = nullptr; | 127 MediaResource* media_resource_ = nullptr; |
| 128 | 128 |
| 129 // Client of |this| renderer passed in Initialize. | 129 // Client of |this| renderer passed in Initialize. |
| 130 media::RendererClient* client_ = nullptr; | 130 media::RendererClient* client_ = nullptr; |
| 131 | 131 |
| 132 // Mojo demuxer streams. | 132 // Mojo demuxer streams. |
| 133 // Owned by MojoRenderer instead of remote mojom::Renderer | 133 // Owned by MojoRenderer instead of remote mojom::Renderer |
| 134 // becuase these demuxer streams need to be destroyed as soon as |this| is | 134 // becuase these demuxer streams need to be destroyed as soon as |this| is |
| 135 // destroyed. The local demuxer streams returned by DemuxerStreamProvider | 135 // destroyed. The local demuxer streams returned by MediaResource |
|
xhwang
2017/02/01 18:26:04
nit: reflow comments
servolk
2017/02/01 22:29:17
Done.
| |
| 136 // cannot be used after |this| is destroyed. | 136 // cannot be used after |this| is destroyed. |
| 137 // TODO(alokp): Add tests for MojoDemuxerStreamImpl. | 137 // TODO(alokp): Add tests for MojoDemuxerStreamImpl. |
| 138 std::vector<std::unique_ptr<MojoDemuxerStreamImpl>> streams_; | 138 std::vector<std::unique_ptr<MojoDemuxerStreamImpl>> streams_; |
| 139 | 139 |
| 140 // This class is constructed on one thread and used exclusively on another | 140 // This class is constructed on one thread and used exclusively on another |
| 141 // thread. This member is used to safely pass the RendererPtr from one thread | 141 // thread. This member is used to safely pass the RendererPtr from one thread |
| 142 // to another. It is set in the constructor and is consumed in Initialize(). | 142 // to another. It is set in the constructor and is consumed in Initialize(). |
| 143 mojom::RendererPtrInfo remote_renderer_info_; | 143 mojom::RendererPtrInfo remote_renderer_info_; |
| 144 | 144 |
| 145 // Remote Renderer, bound to |task_runner_| during Initialize(). | 145 // Remote Renderer, bound to |task_runner_| during Initialize(). |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 158 mutable base::Lock lock_; | 158 mutable base::Lock lock_; |
| 159 base::DefaultTickClock media_clock_; | 159 base::DefaultTickClock media_clock_; |
| 160 media::TimeDeltaInterpolator media_time_interpolator_; | 160 media::TimeDeltaInterpolator media_time_interpolator_; |
| 161 | 161 |
| 162 DISALLOW_COPY_AND_ASSIGN(MojoRenderer); | 162 DISALLOW_COPY_AND_ASSIGN(MojoRenderer); |
| 163 }; | 163 }; |
| 164 | 164 |
| 165 } // namespace media | 165 } // namespace media |
| 166 | 166 |
| 167 #endif // MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ | 167 #endif // MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ |
| OLD | NEW |