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

Unified 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698