Index: media/remoting/remoting_renderer_controller.cc |
diff --git a/media/remoting/remoting_renderer_controller.cc b/media/remoting/remoting_renderer_controller.cc |
index 5f0d37eacdbc7a5939d49d5b0941e7077d07da8f..a388ad4a641a94cd3d4a0795d0d3d46a1a414752 100644 |
--- a/media/remoting/remoting_renderer_controller.cc |
+++ b/media/remoting/remoting_renderer_controller.cc |
@@ -7,10 +7,42 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
#include "base/threading/thread_checker.h" |
+#include "media/base/video_renderer_sink.h" |
+#include "media/base/video_util.h" |
#include "media/remoting/remoting_cdm_context.h" |
+#include "media/remoting/remoting_interstitial_ui.h" |
+#include "skia/ext/image_operations.h" |
namespace media { |
+namespace { |
+ |
+gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) { |
+ if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270) |
+ return gfx::Size(natural_size.height(), natural_size.width()); |
+ return natural_size; |
+} |
+ |
+// Resizes |image| to fit in the center of |canvas_size| and preserves the |
+// image's aspect ratio as close as possible. |
+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.
|
+ 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
|
+ |
+ const gfx::Size image_size = gfx::Size(image.width(), image.height()); |
+ if (image_size == canvas_size) |
+ return image; |
+ |
+ gfx::Size scaled_size = ScaleSizeToFitWithinTarget(image_size, canvas_size); |
+ if (scaled_size == image_size) |
+ return image; |
+ |
+ return skia::ImageOperations::Resize( |
+ image, skia::ImageOperations::RESIZE_BEST, scaled_size.width(), |
+ scaled_size.height()); |
+} |
+ |
+} // namespace |
+ |
RemotingRendererController::RemotingRendererController( |
scoped_refptr<RemotingSourceImpl> remoting_source) |
: remoting_source_(remoting_source), weak_factory_(this) { |
@@ -73,6 +105,17 @@ void RemotingRendererController::OnSetCdm(CdmContext* cdm_context) { |
UpdateAndMaybeSwitch(); |
} |
+void RemotingRendererController::OnSetPoster(const GURL& poster) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // Clear |post_image_| if url changes. |
+ SkBitmap empty; |
+ if (poster != poster_) |
+ poster_image_.swap(empty); |
+ |
+ 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.
|
+} |
+ |
void RemotingRendererController::SetSwitchRendererCallback( |
const base::Closure& cb) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -243,4 +286,48 @@ void RemotingRendererController::UpdateAndMaybeSwitch() { |
} |
} |
+void RemotingRendererController::SetDownloadPosterCallback( |
+ const DownloadPosterCallback& cb) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(download_poster_cb_.is_null()); |
+ download_poster_cb_ = cb; |
+} |
+ |
+void RemotingRendererController::ShowInterstitial( |
+ VideoRendererSink* video_renderer_sink) { |
+ 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.
|
+ return; |
+ |
+ if (poster_image_.drawsNothing() && !poster_.is_empty() && |
+ !download_poster_cb_.is_null()) { |
+ download_poster_cb_.Run( |
+ poster_, base::Bind(&RemotingRendererController::PosterImageDownloaded, |
+ weak_factory_.GetWeakPtr(), video_renderer_sink)); |
+ } else { |
+ ShowInterstitialOnSink( |
+ video_renderer_sink, SkBitmap(), |
+ GetRotatedVideoSize(pipeline_metadata_.video_rotation, |
+ pipeline_metadata_.natural_size), |
+ remoting_source_->state() == RemotingSessionState::SESSION_STARTED); |
+ } |
+} |
+ |
+void RemotingRendererController::PosterImageDownloaded( |
+ VideoRendererSink* video_renderer_sink, |
+ const SkBitmap& image) { |
+ 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.
|
+ DCHECK(video_renderer_sink); |
+ |
+ 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
|
+ pipeline_metadata_.video_rotation, pipeline_metadata_.natural_size); |
+ |
+ if (!image.drawsNothing()) { |
+ poster_image_ = ResizeImage(image, canvas_size); |
+ } |
+ |
+ ShowInterstitialOnSink( |
+ video_renderer_sink, poster_image_, canvas_size, |
+ remoting_source_->state() == RemotingSessionState::SESSION_STARTED); |
+} |
+ |
} // namespace media |