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

Unified Diff: media/filters/skcanvas_video_renderer.cc

Issue 619343003: Optimize to copy from rotated video to canvas. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add unittests Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/skcanvas_video_renderer.h ('k') | media/filters/skcanvas_video_renderer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/skcanvas_video_renderer.cc
diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc
index 9bdd393e56c31c368b926de08be9e4e42a993382..7cb6c5eb873499e092f92995004741b4b93434b8 100644
--- a/media/filters/skcanvas_video_renderer.cc
+++ b/media/filters/skcanvas_video_renderer.cc
@@ -327,42 +327,57 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame,
if (!SkInstallDiscardablePixelRef(generator_, &last_frame_)) {
NOTREACHED();
}
+ DCHECK(video_frame->visible_rect().width() == last_frame_.width() &&
+ video_frame->visible_rect().height() == last_frame_.height());
- // TODO(rileya): Perform this rotation on the canvas, rather than allocating
- // a new bitmap and copying.
+ last_frame_timestamp_ = video_frame->timestamp();
+ } else if (generator_) {
+ generator_->set_frame(video_frame);
+ }
+
+ paint.setXfermodeMode(mode);
+ paint.setFilterLevel(SkPaint::kLow_FilterLevel);
+
+ bool need_transform =
+ video_rotation != VIDEO_ROTATION_0 ||
+ dest_rect.size() != video_frame->visible_rect().size() ||
+ !dest_rect.origin().IsOrigin();
+ if (need_transform) {
+ canvas->save();
+ canvas->translate(
+ SkFloatToScalar(dest_rect.x() + (dest_rect.width() * 0.5f)),
+ SkFloatToScalar(dest_rect.y() + (dest_rect.height() * 0.5f)));
+ SkScalar angle = SkFloatToScalar(0.0f);
switch (video_rotation) {
case VIDEO_ROTATION_0:
break;
case VIDEO_ROTATION_90:
- last_frame_ = SkBitmapOperations::Rotate(
- last_frame_, SkBitmapOperations::ROTATION_90_CW);
+ angle = SkFloatToScalar(90.0f);
break;
case VIDEO_ROTATION_180:
- last_frame_ = SkBitmapOperations::Rotate(
- last_frame_, SkBitmapOperations::ROTATION_180_CW);
+ angle = SkFloatToScalar(180.0f);
break;
case VIDEO_ROTATION_270:
- last_frame_ = SkBitmapOperations::Rotate(
- last_frame_, SkBitmapOperations::ROTATION_270_CW);
+ angle = SkFloatToScalar(270.0f);
break;
}
+ canvas->rotate(angle);
- // We copied the frame into a new bitmap and threw out the old one, so we
- // no longer have a |generator_| around. This should be removed when the
- // above TODO is addressed.
- if (video_rotation != VIDEO_ROTATION_0)
- generator_ = NULL;
-
- last_frame_timestamp_ = video_frame->timestamp();
- } else if (generator_) {
- generator_->set_frame(video_frame);
+ gfx::SizeF rotated_dest_size = dest_rect.size();
+ if (video_rotation == VIDEO_ROTATION_90 ||
+ video_rotation == VIDEO_ROTATION_270) {
+ rotated_dest_size =
+ gfx::SizeF(rotated_dest_size.height(), rotated_dest_size.width());
+ }
+ canvas->scale(
+ SkFloatToScalar(rotated_dest_size.width() / last_frame_.width()),
+ SkFloatToScalar(rotated_dest_size.height() / last_frame_.height()));
+ canvas->translate(-SkFloatToScalar(last_frame_.width() * 0.5f),
+ -SkFloatToScalar(last_frame_.height() * 0.5f));
}
-
- paint.setXfermodeMode(mode);
-
- // Paint using |last_frame_|.
- paint.setFilterLevel(SkPaint::kLow_FilterLevel);
- canvas->drawBitmapRect(last_frame_, NULL, dest, &paint);
+ canvas->drawBitmap(last_frame_, 0, 0, &paint);
+ if (need_transform)
+ canvas->restore();
canvas->flush();
}
« no previous file with comments | « media/filters/skcanvas_video_renderer.h ('k') | media/filters/skcanvas_video_renderer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698