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

Side by Side Diff: media/mojo/services/mojo_renderer_impl.cc

Issue 1873513003: Add video-rendering to mojo media pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor cleanup Created 4 years, 8 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 #include "media/mojo/services/mojo_renderer_impl.h" 5 #include "media/mojo/services/mojo_renderer_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "media/base/demuxer_stream_provider.h" 13 #include "media/base/demuxer_stream_provider.h"
14 #include "media/base/video_decoder_config.h"
15 #include "media/base/video_renderer_sink.h"
14 #include "media/mojo/services/mojo_demuxer_stream_impl.h" 16 #include "media/mojo/services/mojo_demuxer_stream_impl.h"
17 #include "media/mojo/services/video_overlay_factory.h"
18 #include "mojo/converters/geometry/geometry_type_converters.h"
15 19
16 namespace media { 20 namespace media {
17 21
18 MojoRendererImpl::MojoRendererImpl( 22 MojoRendererImpl::MojoRendererImpl(
19 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 23 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
24 VideoRendererSink* video_renderer_sink,
25 GpuVideoAcceleratorFactories* gpu_factories,
20 interfaces::RendererPtr remote_renderer) 26 interfaces::RendererPtr remote_renderer)
21 : task_runner_(task_runner), 27 : task_runner_(task_runner),
28 video_renderer_sink_(video_renderer_sink),
29 gpu_factories_(gpu_factories),
22 remote_renderer_info_(remote_renderer.PassInterface()), 30 remote_renderer_info_(remote_renderer.PassInterface()),
23 binding_(this) { 31 binding_(this) {
24 DVLOG(1) << __FUNCTION__; 32 DVLOG(1) << __FUNCTION__;
25 } 33 }
26 34
27 MojoRendererImpl::~MojoRendererImpl() { 35 MojoRendererImpl::~MojoRendererImpl() {
28 DVLOG(1) << __FUNCTION__; 36 DVLOG(1) << __FUNCTION__;
29 DCHECK(task_runner_->BelongsToCurrentThread()); 37 DCHECK(task_runner_->BelongsToCurrentThread());
30 } 38 }
31 39
32 // TODO(xhwang): Support |waiting_for_decryption_key_cb| and |statictics_cb|. 40 // TODO(xhwang): Support |waiting_for_decryption_key_cb| and |statictics_cb|.
33 // See http://crbug.com/585287 41 // See http://crbug.com/585287
34 void MojoRendererImpl::Initialize( 42 void MojoRendererImpl::Initialize(
35 DemuxerStreamProvider* demuxer_stream_provider, 43 DemuxerStreamProvider* demuxer_stream_provider,
36 const PipelineStatusCB& init_cb, 44 const PipelineStatusCB& init_cb,
37 const StatisticsCB& /* statistics_cb */, 45 const StatisticsCB& /* statistics_cb */,
38 const BufferingStateCB& buffering_state_cb, 46 const BufferingStateCB& buffering_state_cb,
47 const NaturalSizeChangedCB& natural_size_changed_cb,
39 const base::Closure& ended_cb, 48 const base::Closure& ended_cb,
40 const PipelineStatusCB& error_cb, 49 const PipelineStatusCB& error_cb,
41 const base::Closure& /* waiting_for_decryption_key_cb */) { 50 const base::Closure& /* waiting_for_decryption_key_cb */) {
42 DVLOG(1) << __FUNCTION__; 51 DVLOG(1) << __FUNCTION__;
43 DCHECK(task_runner_->BelongsToCurrentThread()); 52 DCHECK(task_runner_->BelongsToCurrentThread());
44 DCHECK(demuxer_stream_provider); 53 DCHECK(demuxer_stream_provider);
45 54
46 // Bind |remote_renderer_| to the |task_runner_|. 55 // Bind |remote_renderer_| to the |task_runner_|.
47 remote_renderer_.Bind(std::move(remote_renderer_info_)); 56 remote_renderer_.Bind(std::move(remote_renderer_info_));
48 57
49 // If connection error has happened, fail immediately. 58 // If connection error has happened, fail immediately.
50 if (remote_renderer_.encountered_error()) { 59 if (remote_renderer_.encountered_error()) {
51 task_runner_->PostTask( 60 task_runner_->PostTask(
52 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INITIALIZATION_FAILED)); 61 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INITIALIZATION_FAILED));
53 return; 62 return;
54 } 63 }
55 64
56 // Otherwise, set an error handler to catch the connection error. 65 // Otherwise, set an error handler to catch the connection error.
57 // Using base::Unretained(this) is safe because |this| owns 66 // Using base::Unretained(this) is safe because |this| owns
58 // |remote_renderer_|, and the error handler can't be invoked once 67 // |remote_renderer_|, and the error handler can't be invoked once
59 // |remote_renderer_| is destroyed. 68 // |remote_renderer_| is destroyed.
60 remote_renderer_.set_connection_error_handler( 69 remote_renderer_.set_connection_error_handler(
61 base::Bind(&MojoRendererImpl::OnConnectionError, base::Unretained(this))); 70 base::Bind(&MojoRendererImpl::OnConnectionError, base::Unretained(this)));
62 71
63 demuxer_stream_provider_ = demuxer_stream_provider; 72 demuxer_stream_provider_ = demuxer_stream_provider;
64 init_cb_ = init_cb; 73 init_cb_ = init_cb;
65 buffering_state_cb_ = buffering_state_cb; 74 buffering_state_cb_ = buffering_state_cb;
75 natural_size_changed_cb_ = natural_size_changed_cb;
66 ended_cb_ = ended_cb; 76 ended_cb_ = ended_cb;
67 error_cb_ = error_cb; 77 error_cb_ = error_cb;
68 78
69 // Create audio and video interfaces::DemuxerStream and bind its lifetime to 79 // Create audio and video interfaces::DemuxerStream and bind its lifetime to
70 // the pipe. 80 // the pipe.
71 DemuxerStream* const audio = 81 DemuxerStream* const audio =
72 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); 82 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO);
73 DemuxerStream* const video = 83 DemuxerStream* const video =
74 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); 84 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO);
75 85
76 interfaces::DemuxerStreamPtr audio_stream; 86 interfaces::DemuxerStreamPtr audio_stream;
77 if (audio) 87 if (audio)
78 new MojoDemuxerStreamImpl(audio, GetProxy(&audio_stream)); 88 new MojoDemuxerStreamImpl(audio, GetProxy(&audio_stream));
79 89
80 interfaces::DemuxerStreamPtr video_stream; 90 interfaces::DemuxerStreamPtr video_stream;
81 if (video) 91 if (video) {
82 new MojoDemuxerStreamImpl(video, GetProxy(&video_stream)); 92 new MojoDemuxerStreamImpl(video, GetProxy(&video_stream));
93 video_overlay_factory_.reset(new VideoOverlayFactory(gpu_factories_));
94 }
83 95
84 // Using base::Unretained(this) is safe because |this| owns 96 // Using base::Unretained(this) is safe because |this| owns
85 // |remote_renderer_|, and the callback won't be dispatched if 97 // |remote_renderer_|, and the callback won't be dispatched if
86 // |remote_renderer_| is destroyed. 98 // |remote_renderer_| is destroyed.
87 remote_renderer_->Initialize( 99 remote_renderer_->Initialize(
88 binding_.CreateInterfacePtrAndBind(), std::move(audio_stream), 100 binding_.CreateInterfacePtrAndBind(), std::move(audio_stream),
89 std::move(video_stream), 101 std::move(video_stream),
90 base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this))); 102 base::Bind(&MojoRendererImpl::OnInitialized, base::Unretained(this)));
91 } 103 }
92 104
(...skipping 16 matching lines...) Expand all
109 void MojoRendererImpl::Flush(const base::Closure& flush_cb) { 121 void MojoRendererImpl::Flush(const base::Closure& flush_cb) {
110 DVLOG(2) << __FUNCTION__; 122 DVLOG(2) << __FUNCTION__;
111 DCHECK(task_runner_->BelongsToCurrentThread()); 123 DCHECK(task_runner_->BelongsToCurrentThread());
112 remote_renderer_->Flush(flush_cb); 124 remote_renderer_->Flush(flush_cb);
113 } 125 }
114 126
115 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) { 127 void MojoRendererImpl::StartPlayingFrom(base::TimeDelta time) {
116 DVLOG(2) << __FUNCTION__; 128 DVLOG(2) << __FUNCTION__;
117 DCHECK(task_runner_->BelongsToCurrentThread()); 129 DCHECK(task_runner_->BelongsToCurrentThread());
118 130
131 if (HasVideo()) {
132 DCHECK(video_overlay_factory_);
133 DCHECK(video_renderer_sink_);
134 DemuxerStream* video_stream =
135 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO);
136 video_renderer_sink_->PaintFrameUsingOldRenderingPath(
xhwang 2016/04/12 19:40:37 We have a comment that PaintFrameUsingOldRendering
137 video_overlay_factory_->CreateFrame(
138 video_stream->video_decoder_config().natural_size()));
139 }
140
119 { 141 {
120 base::AutoLock auto_lock(lock_); 142 base::AutoLock auto_lock(lock_);
121 time_ = time; 143 time_ = time;
122 } 144 }
123
124 remote_renderer_->StartPlayingFrom(time.InMicroseconds()); 145 remote_renderer_->StartPlayingFrom(time.InMicroseconds());
125 } 146 }
126 147
127 void MojoRendererImpl::SetPlaybackRate(double playback_rate) { 148 void MojoRendererImpl::SetPlaybackRate(double playback_rate) {
128 DVLOG(2) << __FUNCTION__; 149 DVLOG(2) << __FUNCTION__;
129 DCHECK(task_runner_->BelongsToCurrentThread()); 150 DCHECK(task_runner_->BelongsToCurrentThread());
130 remote_renderer_->SetPlaybackRate(playback_rate); 151 remote_renderer_->SetPlaybackRate(playback_rate);
131 } 152 }
132 153
133 void MojoRendererImpl::SetVolume(float volume) { 154 void MojoRendererImpl::SetVolume(float volume) {
(...skipping 29 matching lines...) Expand all
163 time_ = base::TimeDelta::FromMicroseconds(time_usec); 184 time_ = base::TimeDelta::FromMicroseconds(time_usec);
164 } 185 }
165 186
166 void MojoRendererImpl::OnBufferingStateChange( 187 void MojoRendererImpl::OnBufferingStateChange(
167 interfaces::BufferingState state) { 188 interfaces::BufferingState state) {
168 DVLOG(2) << __FUNCTION__; 189 DVLOG(2) << __FUNCTION__;
169 DCHECK(task_runner_->BelongsToCurrentThread()); 190 DCHECK(task_runner_->BelongsToCurrentThread());
170 buffering_state_cb_.Run(static_cast<media::BufferingState>(state)); 191 buffering_state_cb_.Run(static_cast<media::BufferingState>(state));
171 } 192 }
172 193
194 void MojoRendererImpl::OnNaturalSizeChanged(mojo::SizePtr size) {
195 DVLOG(2) << __FUNCTION__;
196 DCHECK(task_runner_->BelongsToCurrentThread());
197 natural_size_changed_cb_.Run(size.To<gfx::Size>());
198 }
199
173 void MojoRendererImpl::OnEnded() { 200 void MojoRendererImpl::OnEnded() {
174 DVLOG(1) << __FUNCTION__; 201 DVLOG(1) << __FUNCTION__;
175 DCHECK(task_runner_->BelongsToCurrentThread()); 202 DCHECK(task_runner_->BelongsToCurrentThread());
176 ended_cb_.Run(); 203 ended_cb_.Run();
177 } 204 }
178 205
179 void MojoRendererImpl::OnError() { 206 void MojoRendererImpl::OnError() {
180 DVLOG(1) << __FUNCTION__; 207 DVLOG(1) << __FUNCTION__;
181 DCHECK(task_runner_->BelongsToCurrentThread()); 208 DCHECK(task_runner_->BelongsToCurrentThread());
182 DCHECK(init_cb_.is_null()); 209 DCHECK(init_cb_.is_null());
(...skipping 18 matching lines...) Expand all
201 void MojoRendererImpl::OnInitialized(bool success) { 228 void MojoRendererImpl::OnInitialized(bool success) {
202 DVLOG(1) << __FUNCTION__; 229 DVLOG(1) << __FUNCTION__;
203 DCHECK(task_runner_->BelongsToCurrentThread()); 230 DCHECK(task_runner_->BelongsToCurrentThread());
204 DCHECK(!init_cb_.is_null()); 231 DCHECK(!init_cb_.is_null());
205 232
206 base::ResetAndReturn(&init_cb_) 233 base::ResetAndReturn(&init_cb_)
207 .Run(success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED); 234 .Run(success ? PIPELINE_OK : PIPELINE_ERROR_INITIALIZATION_FAILED);
208 } 235 }
209 236
210 } // namespace media 237 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698