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

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

Issue 840473002: media: Support creation and SetCdm() for mojo based CDM. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix TODO. Created 5 years, 9 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_service.h" 5 #include "media/mojo/services/mojo_renderer_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "media/base/audio_decoder.h" 11 #include "media/base/audio_decoder.h"
12 #include "media/base/audio_renderer.h" 12 #include "media/base/audio_renderer.h"
13 #include "media/base/audio_renderer_sink.h" 13 #include "media/base/audio_renderer_sink.h"
14 #include "media/base/cdm_context.h"
14 #include "media/base/decryptor.h" 15 #include "media/base/decryptor.h"
15 #include "media/base/media_log.h" 16 #include "media/base/media_log.h"
16 #include "media/base/video_renderer.h" 17 #include "media/base/video_renderer.h"
17 #include "media/mojo/services/demuxer_stream_provider_shim.h" 18 #include "media/mojo/services/demuxer_stream_provider_shim.h"
18 #include "media/mojo/services/renderer_config.h" 19 #include "media/mojo/services/renderer_config.h"
19 #include "media/renderers/audio_renderer_impl.h" 20 #include "media/renderers/audio_renderer_impl.h"
20 #include "media/renderers/renderer_impl.h" 21 #include "media/renderers/renderer_impl.h"
21 #include "media/renderers/video_renderer_impl.h" 22 #include "media/renderers/video_renderer_impl.h"
22 23
23 namespace media { 24 namespace media {
24 25
25 // Time interval to update media time. 26 // Time interval to update media time.
26 const int kTimeUpdateIntervalMs = 50; 27 const int kTimeUpdateIntervalMs = 50;
27 28
28 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log, 29 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log,
29 const std::string& error) { 30 const std::string& error) {
30 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); 31 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
31 } 32 }
32 33
33 static void PaintNothing(const scoped_refptr<VideoFrame>& frame) { 34 static void PaintNothing(const scoped_refptr<VideoFrame>& frame) {
34 } 35 }
35 36
36 MojoRendererService::MojoRendererService() 37 MojoRendererService::MojoRendererService(
37 : state_(STATE_UNINITIALIZED), 38 CdmContextProvider* cdm_context_provider)
39 : cdm_context_provider_(cdm_context_provider),
40 state_(STATE_UNINITIALIZED),
38 last_media_time_usec_(0), 41 last_media_time_usec_(0),
39 weak_factory_(this) { 42 weak_factory_(this) {
40 weak_this_ = weak_factory_.GetWeakPtr(); 43 weak_this_ = weak_factory_.GetWeakPtr();
41 DVLOG(1) << __FUNCTION__; 44 DVLOG(1) << __FUNCTION__;
42 45
43 scoped_refptr<base::SingleThreadTaskRunner> task_runner( 46 scoped_refptr<base::SingleThreadTaskRunner> task_runner(
44 base::MessageLoop::current()->task_runner()); 47 base::MessageLoop::current()->task_runner());
45 scoped_refptr<MediaLog> media_log(new MediaLog()); 48 scoped_refptr<MediaLog> media_log(new MediaLog());
46 RendererConfig* renderer_config = RendererConfig::Get(); 49 RendererConfig* renderer_config = RendererConfig::Get();
47 audio_renderer_sink_ = renderer_config->GetAudioRendererSink(); 50 audio_renderer_sink_ = renderer_config->GetAudioRendererSink();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 void MojoRendererService::SetPlaybackRate(float playback_rate) { 105 void MojoRendererService::SetPlaybackRate(float playback_rate) {
103 DVLOG(2) << __FUNCTION__ << ": " << playback_rate; 106 DVLOG(2) << __FUNCTION__ << ": " << playback_rate;
104 DCHECK_EQ(state_, STATE_PLAYING); 107 DCHECK_EQ(state_, STATE_PLAYING);
105 renderer_->SetPlaybackRate(playback_rate); 108 renderer_->SetPlaybackRate(playback_rate);
106 } 109 }
107 110
108 void MojoRendererService::SetVolume(float volume) { 111 void MojoRendererService::SetVolume(float volume) {
109 renderer_->SetVolume(volume); 112 renderer_->SetVolume(volume);
110 } 113 }
111 114
115 void MojoRendererService::SetCdm(int32_t cdm_id,
116 const mojo::Callback<void(bool)>& callback) {
117 if (!cdm_context_provider_) {
118 LOG(ERROR) << "CDM context provider not available.";
ddorwin 2015/05/15 19:10:07 Should this be more helpful? For example, it wasn'
119 callback.Run(false);
120 return;
121 }
122
123 CdmContext* cdm_context = cdm_context_provider_->GetCdmContext(cdm_id);
124 if (!cdm_context) {
125 LOG(ERROR) << "CDM context not found: " << cdm_id;
ddorwin 2015/05/15 19:10:07 Not DLOG? Same above. suggestion: s/: / for /
126 callback.Run(false);
127 return;
128 }
129
130 renderer_->SetCdm(cdm_context, base::Bind(&MojoRendererService::OnCdmAttached,
131 weak_this_, callback));
132 }
133
112 void MojoRendererService::OnStreamReady(const mojo::Closure& callback) { 134 void MojoRendererService::OnStreamReady(const mojo::Closure& callback) {
113 DCHECK_EQ(state_, STATE_INITIALIZING); 135 DCHECK_EQ(state_, STATE_INITIALIZING);
114 136
115 renderer_->Initialize( 137 renderer_->Initialize(
116 stream_provider_.get(), 138 stream_provider_.get(),
117 base::Bind( 139 base::Bind(
118 &MojoRendererService::OnRendererInitializeDone, weak_this_, callback), 140 &MojoRendererService::OnRendererInitializeDone, weak_this_, callback),
119 base::Bind(&MojoRendererService::OnUpdateStatistics, weak_this_), 141 base::Bind(&MojoRendererService::OnUpdateStatistics, weak_this_),
120 base::Bind(&MojoRendererService::OnBufferingStateChanged, weak_this_), 142 base::Bind(&MojoRendererService::OnBufferingStateChanged, weak_this_),
121 base::Bind(&PaintNothing), 143 base::Bind(&PaintNothing),
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 void MojoRendererService::SchedulePeriodicMediaTimeUpdates() { 183 void MojoRendererService::SchedulePeriodicMediaTimeUpdates() {
162 UpdateMediaTime(true); 184 UpdateMediaTime(true);
163 time_update_timer_.Start( 185 time_update_timer_.Start(
164 FROM_HERE, 186 FROM_HERE,
165 base::TimeDelta::FromMilliseconds(kTimeUpdateIntervalMs), 187 base::TimeDelta::FromMilliseconds(kTimeUpdateIntervalMs),
166 base::Bind(&MojoRendererService::UpdateMediaTime, weak_this_, false)); 188 base::Bind(&MojoRendererService::UpdateMediaTime, weak_this_, false));
167 } 189 }
168 190
169 void MojoRendererService::OnBufferingStateChanged( 191 void MojoRendererService::OnBufferingStateChanged(
170 BufferingState new_buffering_state) { 192 BufferingState new_buffering_state) {
171 DVLOG(2) << __FUNCTION__ << "(" << new_buffering_state << ") "; 193 DVLOG(2) << __FUNCTION__ << "(" << new_buffering_state << ")";
172 client_->OnBufferingStateChange( 194 client_->OnBufferingStateChange(
173 static_cast<mojo::BufferingState>(new_buffering_state)); 195 static_cast<mojo::BufferingState>(new_buffering_state));
174 } 196 }
175 197
176 void MojoRendererService::OnRendererEnded() { 198 void MojoRendererService::OnRendererEnded() {
177 DVLOG(1) << __FUNCTION__; 199 DVLOG(1) << __FUNCTION__;
178 CancelPeriodicMediaTimeUpdates(); 200 CancelPeriodicMediaTimeUpdates();
179 client_->OnEnded(); 201 client_->OnEnded();
180 } 202 }
181 203
182 void MojoRendererService::OnError(PipelineStatus error) { 204 void MojoRendererService::OnError(PipelineStatus error) {
183 DVLOG(1) << __FUNCTION__; 205 DVLOG(1) << __FUNCTION__ << "(" << error << ")";
184 state_ = STATE_ERROR; 206 state_ = STATE_ERROR;
185 client_->OnError(); 207 client_->OnError();
186 } 208 }
187 209
188 void MojoRendererService::OnFlushCompleted(const mojo::Closure& callback) { 210 void MojoRendererService::OnFlushCompleted(const mojo::Closure& callback) {
189 DVLOG(1) << __FUNCTION__; 211 DVLOG(1) << __FUNCTION__;
190 DCHECK_EQ(state_, STATE_FLUSHING); 212 DCHECK_EQ(state_, STATE_FLUSHING);
191 state_ = STATE_PLAYING; 213 state_ = STATE_PLAYING;
192 callback.Run(); 214 callback.Run();
193 } 215 }
194 216
217 void MojoRendererService::OnCdmAttached(
218 const mojo::Callback<void(bool)>& callback,
219 bool success) {
220 DVLOG(1) << __FUNCTION__ << "(" << success << ")";
221 callback.Run(success);
222 }
223
195 } // namespace media 224 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698