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

Side by Side Diff: media/remoting/remoting_renderer_controller.cc

Issue 2538853002: Media Remoting: Draw remoting interstitial on poster image. (Closed)
Patch Set: Addressed comments. Created 4 years 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/remoting/remoting_renderer_controller.h" 5 #include "media/remoting/remoting_renderer_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/threading/thread_checker.h" 9 #include "base/threading/thread_checker.h"
10 #include "media/base/video_renderer_sink.h"
11 #include "media/base/video_util.h"
10 #include "media/remoting/remoting_cdm_context.h" 12 #include "media/remoting/remoting_cdm_context.h"
13 #include "media/remoting/remoting_interstitial_ui.h"
14 #include "skia/ext/image_operations.h"
11 15
12 namespace media { 16 namespace media {
13 17
18 namespace {
19
20 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) {
21 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270)
22 return gfx::Size(natural_size.height(), natural_size.width());
23 return natural_size;
24 }
25
26 // Resizes |image| to fit in the center of |canvas_size| and preserves the
27 // image's aspect ratio as close as possible.
28 SkBitmap ResizeImage(const SkBitmap& image, const gfx::Size& canvas_size) {
miu 2016/12/03 01:05:31 This is view, not controller functionality. It sho
xjz 2016/12/06 19:50:55 Done.
29 DCHECK(!canvas_size.IsEmpty());
miu 2016/12/03 01:05:31 ditto here: Maybe this should be: if (canvas_si
xjz 2016/12/06 19:50:55 Not applicable now. If canvas_size is empty, we wo
30
31 const gfx::Size image_size = gfx::Size(image.width(), image.height());
32 if (image_size == canvas_size)
33 return image;
34
35 gfx::Size scaled_size = ScaleSizeToFitWithinTarget(image_size, canvas_size);
36 if (scaled_size == image_size)
37 return image;
38
39 return skia::ImageOperations::Resize(
40 image, skia::ImageOperations::RESIZE_BEST, scaled_size.width(),
41 scaled_size.height());
42 }
43
44 } // namespace
45
14 RemotingRendererController::RemotingRendererController( 46 RemotingRendererController::RemotingRendererController(
15 scoped_refptr<RemotingSourceImpl> remoting_source) 47 scoped_refptr<RemotingSourceImpl> remoting_source)
16 : remoting_source_(remoting_source), weak_factory_(this) { 48 : remoting_source_(remoting_source), weak_factory_(this) {
17 remoting_source_->AddClient(this); 49 remoting_source_->AddClient(this);
18 } 50 }
19 51
20 RemotingRendererController::~RemotingRendererController() { 52 RemotingRendererController::~RemotingRendererController() {
21 DCHECK(thread_checker_.CalledOnValidThread()); 53 DCHECK(thread_checker_.CalledOnValidThread());
22 remoting_source_->RemoveClient(this); 54 remoting_source_->RemoveClient(this);
23 } 55 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 auto* remoting_cdm_context = RemotingCdmContext::From(cdm_context); 98 auto* remoting_cdm_context = RemotingCdmContext::From(cdm_context);
67 if (!remoting_cdm_context) 99 if (!remoting_cdm_context)
68 return; 100 return;
69 101
70 remoting_source_->RemoveClient(this); 102 remoting_source_->RemoveClient(this);
71 remoting_source_ = remoting_cdm_context->GetRemotingSource(); 103 remoting_source_ = remoting_cdm_context->GetRemotingSource();
72 remoting_source_->AddClient(this); // Calls OnSessionStateChanged(). 104 remoting_source_->AddClient(this); // Calls OnSessionStateChanged().
73 UpdateAndMaybeSwitch(); 105 UpdateAndMaybeSwitch();
74 } 106 }
75 107
108 void RemotingRendererController::OnSetPoster(const GURL& poster) {
109 DCHECK(thread_checker_.CalledOnValidThread());
110
111 // Clear |post_image_| if url changes.
112 SkBitmap empty;
113 if (poster != poster_)
114 poster_image_.swap(empty);
115
116 poster_ = poster;
miu 2016/12/03 01:05:31 If the URL has changed, we need to re-render a new
xjz 2016/12/06 19:50:55 Done.
117 }
118
76 void RemotingRendererController::SetSwitchRendererCallback( 119 void RemotingRendererController::SetSwitchRendererCallback(
77 const base::Closure& cb) { 120 const base::Closure& cb) {
78 DCHECK(thread_checker_.CalledOnValidThread()); 121 DCHECK(thread_checker_.CalledOnValidThread());
79 DCHECK(!cb.is_null()); 122 DCHECK(!cb.is_null());
80 123
81 switch_renderer_cb_ = cb; 124 switch_renderer_cb_ = cb;
82 UpdateAndMaybeSwitch(); 125 UpdateAndMaybeSwitch();
83 } 126 }
84 127
85 base::WeakPtr<remoting::RpcBroker> RemotingRendererController::GetRpcBroker() 128 base::WeakPtr<remoting::RpcBroker> RemotingRendererController::GetRpcBroker()
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 // For encrypted content, it's only valid to switch to remoting renderer, 279 // For encrypted content, it's only valid to switch to remoting renderer,
237 // and never back to the local renderer. The RemotingCdmController will 280 // and never back to the local renderer. The RemotingCdmController will
238 // force-stop the session when remoting has ended; so no need to call 281 // force-stop the session when remoting has ended; so no need to call
239 // StopRemoting() from here. 282 // StopRemoting() from here.
240 DCHECK(!is_encrypted_); 283 DCHECK(!is_encrypted_);
241 switch_renderer_cb_.Run(); 284 switch_renderer_cb_.Run();
242 remoting_source_->StopRemoting(this); 285 remoting_source_->StopRemoting(this);
243 } 286 }
244 } 287 }
245 288
289 void RemotingRendererController::SetDownloadPosterCallback(
290 const DownloadPosterCallback& cb) {
291 DCHECK(thread_checker_.CalledOnValidThread());
292 DCHECK(download_poster_cb_.is_null());
293 download_poster_cb_ = cb;
294 }
295
296 void RemotingRendererController::ShowInterstitial(
297 VideoRendererSink* video_renderer_sink) {
298 if (!video_renderer_sink)
miu 2016/12/03 01:05:31 Please add: DCHECK(thread_checker_.CalledOnValidTh
xjz 2016/12/06 19:50:55 Done.
299 return;
300
301 if (poster_image_.drawsNothing() && !poster_.is_empty() &&
302 !download_poster_cb_.is_null()) {
303 download_poster_cb_.Run(
304 poster_, base::Bind(&RemotingRendererController::PosterImageDownloaded,
305 weak_factory_.GetWeakPtr(), video_renderer_sink));
306 } else {
307 ShowInterstitialOnSink(
308 video_renderer_sink, SkBitmap(),
309 GetRotatedVideoSize(pipeline_metadata_.video_rotation,
310 pipeline_metadata_.natural_size),
311 remoting_source_->state() == RemotingSessionState::SESSION_STARTED);
312 }
313 }
314
315 void RemotingRendererController::PosterImageDownloaded(
316 VideoRendererSink* video_renderer_sink,
317 const SkBitmap& image) {
318 DCHECK(poster_image_.drawsNothing());
miu 2016/12/03 01:05:31 ditto: Please add DCHECK(thread_checker_.CalledOnV
xjz 2016/12/06 19:50:55 Done.
319 DCHECK(video_renderer_sink);
320
321 const gfx::Size canvas_size = GetRotatedVideoSize(
miu 2016/12/03 01:05:31 The rest of this method is view, not controller fu
xjz 2016/12/06 19:50:55 Done. Added a callback to RemotingRendererControll
322 pipeline_metadata_.video_rotation, pipeline_metadata_.natural_size);
323
324 if (!image.drawsNothing()) {
325 poster_image_ = ResizeImage(image, canvas_size);
326 }
327
328 ShowInterstitialOnSink(
329 video_renderer_sink, poster_image_, canvas_size,
330 remoting_source_->state() == RemotingSessionState::SESSION_STARTED);
331 }
332
246 } // namespace media 333 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698