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

Unified Diff: media/blink/webmediaplayer_impl.cc

Issue 445013002: media: Optimize HW Video to 2D Canvas copy. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resolve comments, rebase to ToT 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
Index: media/blink/webmediaplayer_impl.cc
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index d5a411fcb3144c02a50cee3f17795dcc51637639..9504c32c5b42388ee22e2b78d7511fa097092852 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -22,8 +22,6 @@
#include "base/synchronization/waitable_event.h"
#include "cc/blink/web_layer_impl.h"
#include "cc/layers/video_layer.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/common/mailbox_holder.h"
#include "media/audio/null_audio_sink.h"
#include "media/base/audio_hardware_config.h"
#include "media/base/bind_to_current_loop.h"
@@ -38,7 +36,6 @@
#include "media/blink/webaudiosourceprovider_impl.h"
#include "media/blink/webinbandtexttrack_impl.h"
#include "media/blink/webmediaplayer_delegate.h"
-#include "media/blink/webmediaplayer_params.h"
#include "media/blink/webmediaplayer_util.h"
#include "media/blink/webmediasource_impl.h"
#include "media/filters/audio_renderer_impl.h"
@@ -60,6 +57,7 @@
#include "third_party/WebKit/public/web/WebLocalFrame.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
#include "third_party/WebKit/public/web/WebView.h"
+#include "webkit/common/gpu/webgraphicscontext3d_impl.h"
using blink::WebCanvas;
using blink::WebMediaPlayer;
@@ -88,23 +86,6 @@ namespace {
const double kMinRate = 0.0625;
const double kMaxRate = 16.0;
-class SyncPointClientImpl : public media::VideoFrame::SyncPointClient {
- public:
- explicit SyncPointClientImpl(
- blink::WebGraphicsContext3D* web_graphics_context)
- : web_graphics_context_(web_graphics_context) {}
- ~SyncPointClientImpl() override {}
- uint32 InsertSyncPoint() override {
- return web_graphics_context_->insertSyncPoint();
- }
- void WaitSyncPoint(uint32 sync_point) override {
- web_graphics_context_->waitSyncPoint(sync_point);
- }
-
- private:
- blink::WebGraphicsContext3D* web_graphics_context_;
-};
-
} // namespace
namespace media {
@@ -159,6 +140,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
client_(client),
delegate_(delegate),
defer_load_cb_(params.defer_load_cb()),
+ shared_main_thread_context_3d_provider_cb_(
+ params.shared_main_thread_context_3d_provider_cb()),
gpu_factories_(params.gpu_factories()),
supports_save_(true),
chunk_demuxer_(NULL),
@@ -536,13 +519,24 @@ void WebMediaPlayerImpl::paint(blink::WebCanvas* canvas,
GetCurrentFrameFromCompositor();
gfx::Rect gfx_rect(rect);
-
- skcanvas_video_renderer_.Paint(video_frame,
+ Context3DProvider provider{nullptr, nullptr};
+ if (canvas->getGrContext() ||
+ (video_frame.get() &&
scherkus (not reviewing) 2014/10/30 20:40:11 nit: is .get() needed?
dshwang 2014/10/31 09:29:16 needed.
+ video_frame->format() == media::VideoFrame::NATIVE_TEXTURE)) {
+ if (!shared_main_thread_context_3d_provider_cb_.is_null()) {
+ provider = shared_main_thread_context_3d_provider_cb_.Run();
+ }
+ // GPU Process crashed.
+ if (!provider.gl)
+ return;
+ }
+ skcanvas_video_renderer_.Paint(video_frame.get(),
scherkus (not reviewing) 2014/10/30 20:40:11 nit: is .get() needed?
dshwang 2014/10/31 09:29:16 not needed.
canvas,
gfx_rect,
alpha,
mode,
- pipeline_metadata_.video_rotation);
+ pipeline_metadata_.video_rotation,
+ provider);
}
bool WebMediaPlayerImpl::hasSingleSecurityOrigin() const {
@@ -602,43 +596,24 @@ bool WebMediaPlayerImpl::copyVideoTextureToPlatformTexture(
scoped_refptr<VideoFrame> video_frame =
GetCurrentFrameFromCompositor();
- if (!video_frame.get())
- return false;
- if (video_frame->format() != VideoFrame::NATIVE_TEXTURE)
- return false;
-
- const gpu::MailboxHolder* mailbox_holder = video_frame->mailbox_holder();
- if (mailbox_holder->texture_target != GL_TEXTURE_2D)
+ if (!video_frame.get() ||
scherkus (not reviewing) 2014/10/30 20:40:11 nit: is .get() needed?
dshwang 2014/10/31 09:29:16 needed
+ video_frame->format() != media::VideoFrame::NATIVE_TEXTURE) {
return false;
+ }
- web_graphics_context->waitSyncPoint(mailbox_holder->sync_point);
- uint32 source_texture = web_graphics_context->createAndConsumeTextureCHROMIUM(
- GL_TEXTURE_2D, mailbox_holder->mailbox.name);
-
- // The video is stored in a unmultiplied format, so premultiply
- // if necessary.
- web_graphics_context->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.
- web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y);
- web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D,
- source_texture,
- texture,
- level,
- internal_format,
- type);
- web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false);
- web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM,
- false);
-
- web_graphics_context->deleteTexture(source_texture);
- web_graphics_context->flush();
-
- SyncPointClientImpl client(web_graphics_context);
- video_frame->UpdateReleaseSyncPoint(&client);
+ // TODO(dshwang): need more elegant way to convert WebGraphicsContext3D to
+ // GLES2Interface.
+ gpu::gles2::GLES2Interface* gl =
+ static_cast<webkit::gpu::WebGraphicsContext3DImpl*>(web_graphics_context)
+ ->GetGLInterface();
+ SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture(gl,
+ video_frame.get(),
scherkus (not reviewing) 2014/10/30 20:40:11 nit: is .get() needed?
dshwang 2014/10/31 09:29:16 needed
+ texture,
+ level,
+ internal_format,
+ type,
+ premultiply_alpha,
+ flip_y);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698