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

Unified Diff: content/renderer/media/renderer_gpu_video_decoder_factories.cc

Issue 11016006: Support reading pixels from HW-decoded video textures into canvas/webgl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 3 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 | « content/renderer/media/renderer_gpu_video_decoder_factories.h ('k') | media/base/video_frame.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/renderer_gpu_video_decoder_factories.cc
diff --git a/content/renderer/media/renderer_gpu_video_decoder_factories.cc b/content/renderer/media/renderer_gpu_video_decoder_factories.cc
index 30ffde71b2354506f1f0dd95e0c7a9a45bd0f275..9ef68e89fa767622c7ce5050cbebedfffa133aaf 100644
--- a/content/renderer/media/renderer_gpu_video_decoder_factories.cc
+++ b/content/renderer/media/renderer_gpu_video_decoder_factories.cc
@@ -121,8 +121,8 @@ void RendererGpuVideoDecoderFactories::AsyncCreateTextures(
gles2->BindTexture(texture_target, texture_id);
gles2->TexParameteri(texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
gles2->TexParameteri(texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- gles2->TexParameterf(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gles2->TexParameterf(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (texture_target == GL_TEXTURE_2D) {
gles2->TexImage2D(texture_target, 0, GL_RGBA, size.width(), size.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
@@ -152,6 +152,49 @@ void RendererGpuVideoDecoderFactories::AsyncDeleteTexture(uint32 texture_id) {
DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
}
+void RendererGpuVideoDecoderFactories::ReadPixels(
+ uint32 texture_id, uint32 texture_target, const gfx::Size& size,
+ void* pixels) {
+ base::WaitableEvent waiter(false, false);
+ if (!message_loop_->BelongsToCurrentThread()) {
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncReadPixels, this,
+ texture_id, texture_target, size, pixels, &waiter));
+ waiter.Wait();
+ } else {
+ AsyncReadPixels(texture_id, texture_target, size, pixels, &waiter);
+ }
+}
+
+void RendererGpuVideoDecoderFactories::AsyncReadPixels(
+ uint32 texture_id, uint32 texture_target, const gfx::Size& size,
+ void* pixels, base::WaitableEvent* waiter) {
+ DCHECK(message_loop_->BelongsToCurrentThread());
+ if (!context_)
+ return;
+
+ gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation();
+
+ gles2->ActiveTexture(GL_TEXTURE0);
+ gles2->BindTexture(texture_target, texture_id);
+ gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ GLuint fb;
+ gles2->GenFramebuffers(1, &fb);
+ gles2->BindFramebuffer(GL_FRAMEBUFFER, fb);
+ gles2->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ texture_target, texture_id, 0);
+ gles2->PixelStorei(GL_PACK_ALIGNMENT, 4);
+ gles2->ReadPixels(0, 0, size.width(), size.height(), GL_RGBA,
+ GL_UNSIGNED_BYTE, pixels);
+ gles2->DeleteFramebuffers(1, &fb);
+ DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
+ waiter->Signal();
+}
+
base::SharedMemory* RendererGpuVideoDecoderFactories::CreateSharedMemory(
size_t size) {
DCHECK_NE(MessageLoop::current(), ChildThread::current()->message_loop());
« no previous file with comments | « content/renderer/media/renderer_gpu_video_decoder_factories.h ('k') | media/base/video_frame.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698