Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(348)

Side by Side Diff: media/mojo/clients/mojo_renderer.h

Issue 2491043003: MediaResource refactoring to support multiple streams (Closed)
Patch Set: rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/macros.h" 10 #include "base/macros.h"
11 #include "base/time/default_tick_clock.h" 11 #include "base/time/default_tick_clock.h"
12 #include "base/unguessable_token.h" 12 #include "base/unguessable_token.h"
13 #include "media/base/demuxer_stream.h" 13 #include "media/base/demuxer_stream.h"
14 #include "media/base/renderer.h" 14 #include "media/base/renderer.h"
15 #include "media/base/time_delta_interpolator.h" 15 #include "media/base/time_delta_interpolator.h"
16 #include "media/mojo/interfaces/renderer.mojom.h" 16 #include "media/mojo/interfaces/renderer.mojom.h"
17 #include "mojo/public/cpp/bindings/associated_binding.h" 17 #include "mojo/public/cpp/bindings/associated_binding.h"
18 18
19 namespace base { 19 namespace base {
20 class SingleThreadTaskRunner; 20 class SingleThreadTaskRunner;
21 } 21 }
22 22
23 namespace media { 23 namespace media {
24 24
25 class DemuxerStreamProvider; 25 class MediaResource;
26 class MojoDemuxerStreamImpl; 26 class MojoDemuxerStreamImpl;
27 class VideoOverlayFactory; 27 class VideoOverlayFactory;
28 class VideoRendererSink; 28 class VideoRendererSink;
29 29
30 // A media::Renderer that proxies to a mojom::Renderer. That 30 // A media::Renderer that proxies to a mojom::Renderer. That
31 // mojom::Renderer proxies back to the MojoRenderer via the 31 // mojom::Renderer proxies back to the MojoRenderer via the
32 // mojom::RendererClient interface. 32 // mojom::RendererClient interface.
33 // 33 //
34 // This class can be created on any thread, where the |remote_renderer| is 34 // This class can be created on any thread, where the |remote_renderer| is
35 // connected and passed in the constructor. Then Initialize() will be called on 35 // connected and passed in the constructor. Then Initialize() will be called on
36 // the |task_runner| and starting from that point this class is bound to the 36 // the |task_runner| and starting from that point this class is bound to the
37 // |task_runner|*. That means all Renderer and RendererClient methods will be 37 // |task_runner|*. That means all Renderer and RendererClient methods will be
38 // called/dispached on the |task_runner|. The only exception is GetMediaTime(), 38 // called/dispached on the |task_runner|. The only exception is GetMediaTime(),
39 // which can be called on any thread. 39 // which can be called on any thread.
40 class MojoRenderer : public Renderer, public mojom::RendererClient { 40 class MojoRenderer : public Renderer, public mojom::RendererClient {
41 public: 41 public:
42 MojoRenderer(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 42 MojoRenderer(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
43 std::unique_ptr<VideoOverlayFactory> video_overlay_factory, 43 std::unique_ptr<VideoOverlayFactory> video_overlay_factory,
44 VideoRendererSink* video_renderer_sink, 44 VideoRendererSink* video_renderer_sink,
45 mojom::RendererPtr remote_renderer); 45 mojom::RendererPtr remote_renderer);
46 ~MojoRenderer() override; 46 ~MojoRenderer() override;
47 47
48 // Renderer implementation. 48 // Renderer implementation.
49 void Initialize(DemuxerStreamProvider* demuxer_stream_provider, 49 void Initialize(MediaResource* media_resource,
50 media::RendererClient* client, 50 media::RendererClient* client,
51 const PipelineStatusCB& init_cb) override; 51 const PipelineStatusCB& init_cb) override;
52 void SetCdm(CdmContext* cdm_context, 52 void SetCdm(CdmContext* cdm_context,
53 const CdmAttachedCB& cdm_attached_cb) override; 53 const CdmAttachedCB& cdm_attached_cb) override;
54 void Flush(const base::Closure& flush_cb) override; 54 void Flush(const base::Closure& flush_cb) override;
55 void StartPlayingFrom(base::TimeDelta time) override; 55 void StartPlayingFrom(base::TimeDelta time) override;
56 void SetPlaybackRate(double playback_rate) override; 56 void SetPlaybackRate(double playback_rate) override;
57 void SetVolume(float volume) override; 57 void SetVolume(float volume) override;
58 base::TimeDelta GetMediaTime() override; 58 base::TimeDelta GetMediaTime() override;
59 59
(...skipping 18 matching lines...) Expand all
78 void OnVideoOpacityChange(bool opaque) override; 78 void OnVideoOpacityChange(bool opaque) override;
79 void OnWaitingForDecryptionKey() override; 79 void OnWaitingForDecryptionKey() override;
80 void OnStatisticsUpdate(const PipelineStatistics& stats) override; 80 void OnStatisticsUpdate(const PipelineStatistics& stats) override;
81 void OnDurationChange(base::TimeDelta duration) override; 81 void OnDurationChange(base::TimeDelta duration) override;
82 82
83 // Binds |remote_renderer_| to the mojo message pipe. Can be called multiple 83 // Binds |remote_renderer_| to the mojo message pipe. Can be called multiple
84 // times. If an error occurs during connection, OnConnectionError will be 84 // times. If an error occurs during connection, OnConnectionError will be
85 // called asynchronously. 85 // called asynchronously.
86 void BindRemoteRendererIfNeeded(); 86 void BindRemoteRendererIfNeeded();
87 87
88 // Initialize the remote renderer when |demuxer_stream_provider| is of type 88 // Initialize the remote renderer when |media_resource| is of type
89 // DemuxerSteamProvider::Type::STREAM. 89 // DemuxerSteamProvider::Type::STREAM.
tguilbert 2017/01/24 23:24:41 MediaResource::Type
servolk 2017/01/25 00:57:32 Done.
90 void InitializeRendererFromStreams(media::RendererClient* client); 90 void InitializeRendererFromStreams(media::RendererClient* client);
91 91
92 // Initialize the remote renderer when |demuxer_stream_provider| is of type 92 // Initialize the remote renderer when |media_resource| is of type
93 // DemuxerSteamProvider::Type::URL. 93 // DemuxerSteamProvider::Type::URL.
tguilbert 2017/01/24 23:24:40 Same thing here.
servolk 2017/01/25 00:57:32 Done.
94 void InitializeRendererFromUrl(media::RendererClient* client); 94 void InitializeRendererFromUrl(media::RendererClient* client);
95 95
96 // Callback for connection error on |remote_renderer_|. 96 // Callback for connection error on |remote_renderer_|.
97 void OnConnectionError(); 97 void OnConnectionError();
98 98
99 // Callback for connection error on any of |streams_|. 99 // Callback for connection error on any of |streams_|.
100 void OnDemuxerStreamConnectionError(MojoDemuxerStreamImpl* stream); 100 void OnDemuxerStreamConnectionError(MojoDemuxerStreamImpl* stream);
101 101
102 // Callbacks for |remote_renderer_| methods. 102 // Callbacks for |remote_renderer_| methods.
103 void OnInitialized(media::RendererClient* client, bool success); 103 void OnInitialized(media::RendererClient* client, bool success);
104 void OnFlushed(); 104 void OnFlushed();
105 void OnCdmAttached(bool success); 105 void OnCdmAttached(bool success);
106 106
107 void CancelPendingCallbacks(); 107 void CancelPendingCallbacks();
108 108
109 // |task_runner| on which all methods are invoked, except for GetMediaTime(), 109 // |task_runner| on which all methods are invoked, except for GetMediaTime(),
110 // which can be called on any thread. 110 // which can be called on any thread.
111 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 111 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
112 112
113 // Overlay factory used to create overlays for video frames rendered 113 // Overlay factory used to create overlays for video frames rendered
114 // by the remote renderer. 114 // by the remote renderer.
115 std::unique_ptr<VideoOverlayFactory> video_overlay_factory_; 115 std::unique_ptr<VideoOverlayFactory> video_overlay_factory_;
116 116
117 // Video frame overlays are rendered onto this sink. 117 // Video frame overlays are rendered onto this sink.
118 // Rendering of a new overlay is only needed when video natural size changes. 118 // Rendering of a new overlay is only needed when video natural size changes.
119 VideoRendererSink* video_renderer_sink_ = nullptr; 119 VideoRendererSink* video_renderer_sink_ = nullptr;
120 120
121 // Provider of audio/video DemuxerStreams. Must be valid throughout the 121 // Provider of audio/video DemuxerStreams. Must be valid throughout the
122 // lifetime of |this|. 122 // lifetime of |this|.
123 DemuxerStreamProvider* demuxer_stream_provider_ = nullptr; 123 MediaResource* media_resource_ = nullptr;
124 124
125 // Client of |this| renderer passed in Initialize. 125 // Client of |this| renderer passed in Initialize.
126 media::RendererClient* client_ = nullptr; 126 media::RendererClient* client_ = nullptr;
127 127
128 // Mojo demuxer streams. 128 // Mojo demuxer streams.
129 // Owned by MojoRenderer instead of remote mojom::Renderer 129 // Owned by MojoRenderer instead of remote mojom::Renderer
130 // becuase these demuxer streams need to be destroyed as soon as |this| is 130 // becuase these demuxer streams need to be destroyed as soon as |this| is
131 // destroyed. The local demuxer streams returned by DemuxerStreamProvider 131 // destroyed. The local demuxer streams returned by MediaResource
132 // cannot be used after |this| is destroyed. 132 // cannot be used after |this| is destroyed.
133 // TODO(alokp): Add tests for MojoDemuxerStreamImpl. 133 // TODO(alokp): Add tests for MojoDemuxerStreamImpl.
134 std::vector<std::unique_ptr<MojoDemuxerStreamImpl>> streams_; 134 std::vector<std::unique_ptr<MojoDemuxerStreamImpl>> streams_;
135 135
136 // This class is constructed on one thread and used exclusively on another 136 // This class is constructed on one thread and used exclusively on another
137 // thread. This member is used to safely pass the RendererPtr from one thread 137 // thread. This member is used to safely pass the RendererPtr from one thread
138 // to another. It is set in the constructor and is consumed in Initialize(). 138 // to another. It is set in the constructor and is consumed in Initialize().
139 mojom::RendererPtrInfo remote_renderer_info_; 139 mojom::RendererPtrInfo remote_renderer_info_;
140 140
141 // Remote Renderer, bound to |task_runner_| during Initialize(). 141 // Remote Renderer, bound to |task_runner_| during Initialize().
(...skipping 12 matching lines...) Expand all
154 mutable base::Lock lock_; 154 mutable base::Lock lock_;
155 base::DefaultTickClock media_clock_; 155 base::DefaultTickClock media_clock_;
156 media::TimeDeltaInterpolator media_time_interpolator_; 156 media::TimeDeltaInterpolator media_time_interpolator_;
157 157
158 DISALLOW_COPY_AND_ASSIGN(MojoRenderer); 158 DISALLOW_COPY_AND_ASSIGN(MojoRenderer);
159 }; 159 };
160 160
161 } // namespace media 161 } // namespace media
162 162
163 #endif // MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_ 163 #endif // MEDIA_MOJO_CLIENTS_MOJO_RENDERER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698