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

Unified Diff: media/filters/skcanvas_video_renderer.cc

Issue 818853004: Revert of media: Optimize HW Video to 2D Canvas copy. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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 35cc94e4ea3317c736ba5d74af44cd88d594d529..2243445d459e903f6d230604a757f6c36cc4c0cb 100644
--- a/media/filters/skcanvas_video_renderer.cc
+++ b/media/filters/skcanvas_video_renderer.cc
@@ -4,17 +4,13 @@
#include "media/filters/skcanvas_video_renderer.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/common/mailbox_holder.h"
+#include "base/logging.h"
#include "media/base/video_frame.h"
#include "media/base/yuv_convert.h"
-#include "skia/ext/refptr.h"
#include "third_party/libyuv/include/libyuv.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkImageGenerator.h"
#include "third_party/skia/include/gpu/GrContext.h"
-#include "third_party/skia/include/gpu/SkGrPixelRef.h"
#include "ui/gfx/skbitmap_operations.h"
// Skia internal format depends on a platform. On Android it is ABGR, on others
@@ -217,79 +213,6 @@
break;
}
}
-
-bool IsSkBitmapProperlySizedTexture(const SkBitmap* bitmap,
- const gfx::Size& size) {
- return bitmap->getTexture() && bitmap->width() == size.width() &&
- bitmap->height() == size.height();
-}
-
-bool AllocateSkBitmapTexture(GrContext* gr,
- SkBitmap* bitmap,
- const gfx::Size& size) {
- DCHECK(gr);
- GrTextureDesc desc;
- // Use kRGBA_8888_GrPixelConfig, not kSkia8888_GrPixelConfig, to avoid
- // RGBA to BGRA conversion.
- desc.fConfig = kRGBA_8888_GrPixelConfig;
- desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit;
- desc.fSampleCnt = 0;
- desc.fOrigin = kTopLeft_GrSurfaceOrigin;
- desc.fWidth = size.width();
- desc.fHeight = size.height();
- skia::RefPtr<GrTexture> texture = skia::AdoptRef(
- gr->refScratchTexture(desc, GrContext::kExact_ScratchTexMatch));
- if (!texture.get())
- return false;
-
- SkImageInfo info = SkImageInfo::MakeN32Premul(desc.fWidth, desc.fHeight);
- SkGrPixelRef* pixel_ref = SkNEW_ARGS(SkGrPixelRef, (info, texture.get()));
- if (!pixel_ref)
- return false;
- bitmap->setInfo(info);
- bitmap->setPixelRef(pixel_ref)->unref();
- return true;
-}
-
-bool CopyVideoFrameTextureToSkBitmapTexture(VideoFrame* video_frame,
- SkBitmap* bitmap,
- const Context3D& context_3d) {
- // Check if we could reuse existing texture based bitmap.
- // Otherwise, release existing texture based bitmap and allocate
- // a new one based on video size.
- if (!IsSkBitmapProperlySizedTexture(bitmap,
- video_frame->visible_rect().size())) {
- if (!AllocateSkBitmapTexture(context_3d.gr_context, bitmap,
- video_frame->visible_rect().size())) {
- return false;
- }
- }
-
- unsigned texture_id =
- static_cast<unsigned>((bitmap->getTexture())->getTextureHandle());
- // If CopyVideoFrameTextureToGLTexture() changes the state of the
- // |texture_id|, it's needed to invalidate the state cached in skia,
- // but currently the state isn't changed.
- SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture(
- context_3d.gl, video_frame, texture_id, 0, GL_RGBA, GL_UNSIGNED_BYTE,
- true, false);
- return true;
-}
-
-class SyncPointClientImpl : public VideoFrame::SyncPointClient {
- public:
- explicit SyncPointClientImpl(gpu::gles2::GLES2Interface* gl) : gl_(gl) {}
- ~SyncPointClientImpl() override {}
- uint32 InsertSyncPoint() override { return gl_->InsertSyncPointCHROMIUM(); }
- void WaitSyncPoint(uint32 sync_point) override {
- gl_->WaitSyncPointCHROMIUM(sync_point);
- }
-
- private:
- gpu::gles2::GLES2Interface* gl_;
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(SyncPointClientImpl);
-};
} // anonymous namespace
@@ -383,7 +306,7 @@
base::TimeDelta::FromSeconds(kTemporaryResourceDeletionDelay),
this,
&SkCanvasVideoRenderer::ResetLastFrame),
- accelerated_generator_(nullptr),
+ accelerated_generator_(NULL),
accelerated_last_frame_timestamp_(media::kNoTimestamp()),
accelerated_frame_deleting_timer_(
FROM_HERE,
@@ -400,8 +323,7 @@
const gfx::RectF& dest_rect,
uint8 alpha,
SkXfermode::Mode mode,
- VideoRotation video_rotation,
- const Context3D& context_3d) {
+ VideoRotation video_rotation) {
if (alpha == 0) {
return;
}
@@ -421,30 +343,16 @@
return;
}
- SkBitmap* target_frame = nullptr;
+ SkBitmap* target_frame = NULL;
if (canvas->getGrContext()) {
if (accelerated_last_frame_.isNull() ||
video_frame->timestamp() != accelerated_last_frame_timestamp_) {
- if (video_frame->format() == VideoFrame::NATIVE_TEXTURE) {
- DCHECK(context_3d.gl);
- DCHECK(context_3d.gr_context);
- // Draw HW Video on HW Canvas.
- DCHECK(!accelerated_generator_);
- if (!CopyVideoFrameTextureToSkBitmapTexture(
- video_frame.get(), &accelerated_last_frame_, context_3d)) {
- NOTREACHED();
- return;
- }
- } else {
- // Draw SW Video on HW Canvas.
- accelerated_generator_ = new VideoImageGenerator(video_frame);
-
- // Note: This takes ownership of |accelerated_generator_|.
- if (!SkInstallDiscardablePixelRef(accelerated_generator_,
- &accelerated_last_frame_)) {
- NOTREACHED();
- return;
- }
+ accelerated_generator_ = new VideoImageGenerator(video_frame);
+
+ // Note: This takes ownership of |accelerated_generator_|.
+ if (!SkInstallDiscardablePixelRef(accelerated_generator_,
+ &accelerated_last_frame_)) {
+ NOTREACHED();
}
DCHECK(video_frame->visible_rect().width() ==
accelerated_last_frame_.width() &&
@@ -452,13 +360,13 @@
accelerated_last_frame_.height());
accelerated_last_frame_timestamp_ = video_frame->timestamp();
- } else if (accelerated_generator_) {
+ } else {
accelerated_generator_->set_frame(video_frame);
}
target_frame = &accelerated_last_frame_;
accelerated_frame_deleting_timer_.Reset();
} else {
- // Draw both SW and HW Video on SW Canvas.
+ // Check if we should convert and update |last_frame_|.
if (last_frame_.isNull() ||
video_frame->timestamp() != last_frame_timestamp_) {
// Check if |bitmap| needs to be (re)allocated.
@@ -526,53 +434,18 @@
canvas->flush();
// SkCanvas::flush() causes the generator to generate SkImage, so delete
// |video_frame| not to be outlived.
- if (canvas->getGrContext() && accelerated_generator_)
- accelerated_generator_->set_frame(nullptr);
+ if (canvas->getGrContext())
+ accelerated_generator_->set_frame(NULL);
}
void SkCanvasVideoRenderer::Copy(const scoped_refptr<VideoFrame>& video_frame,
SkCanvas* canvas) {
- Paint(video_frame, canvas, video_frame->visible_rect(), 0xff,
- SkXfermode::kSrc_Mode, media::VIDEO_ROTATION_0, Context3D());
-}
-
-// static
-void SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture(
- gpu::gles2::GLES2Interface* gl,
- VideoFrame* video_frame,
- unsigned int texture,
- unsigned int level,
- unsigned int internal_format,
- unsigned int type,
- bool premultiply_alpha,
- bool flip_y) {
- DCHECK(video_frame && video_frame->format() == VideoFrame::NATIVE_TEXTURE);
- const gpu::MailboxHolder* mailbox_holder = video_frame->mailbox_holder();
- DCHECK(mailbox_holder->texture_target == GL_TEXTURE_2D ||
- mailbox_holder->texture_target == GL_TEXTURE_EXTERNAL_OES);
-
- gl->WaitSyncPointCHROMIUM(mailbox_holder->sync_point);
- uint32 source_texture = gl->CreateAndConsumeTextureCHROMIUM(
- mailbox_holder->texture_target, mailbox_holder->mailbox.name);
-
- // The video is stored in a unmultiplied format, so premultiply
- // if necessary.
- gl->PixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, premultiply_alpha);
- // Application itself needs to take care of setting the right |flip_y|
- // value down to get the expected result.
- // "flip_y == true" means to reverse the video orientation while
- // "flip_y == false" means to keep the intrinsic orientation.
- gl->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y);
- gl->CopyTextureCHROMIUM(GL_TEXTURE_2D, source_texture, texture, level,
- internal_format, type);
- gl->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false);
- gl->PixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, false);
-
- gl->DeleteTextures(1, &source_texture);
- gl->Flush();
-
- SyncPointClientImpl client(gl);
- video_frame->UpdateReleaseSyncPoint(&client);
+ Paint(video_frame,
+ canvas,
+ video_frame->visible_rect(),
+ 0xff,
+ SkXfermode::kSrc_Mode,
+ media::VIDEO_ROTATION_0);
}
void SkCanvasVideoRenderer::ResetLastFrame() {
« 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