diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-07 23:09:13 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-07 23:09:13 +0000 |
commit | 68c665ed1c84aa8373ffeb8905d3b61e126490db (patch) | |
tree | 0fbbed508bb8c2aa65ec7f9e8b69c26f25c030e8 /chrome/renderer/media | |
parent | e37397a176eac68e8b18b2708e4ee41e131af0bf (diff) | |
download | chromium_src-68c665ed1c84aa8373ffeb8905d3b61e126490db.zip chromium_src-68c665ed1c84aa8373ffeb8905d3b61e126490db.tar.gz chromium_src-68c665ed1c84aa8373ffeb8905d3b61e126490db.tar.bz2 |
Add a VideoDecodeContext that provides resources for a VideoDecodeEngine
Also define a Gles2VideoDecodeContext to be used in the chrome renderer.
BUG=53714
TEST=none
Review URL: http://codereview.chromium.org/3233003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58772 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/media')
-rw-r--r-- | chrome/renderer/media/gles2_video_decode_context.cc | 34 | ||||
-rw-r--r-- | chrome/renderer/media/gles2_video_decode_context.h | 117 |
2 files changed, 151 insertions, 0 deletions
diff --git a/chrome/renderer/media/gles2_video_decode_context.cc b/chrome/renderer/media/gles2_video_decode_context.cc new file mode 100644 index 0000000..d54334b --- /dev/null +++ b/chrome/renderer/media/gles2_video_decode_context.cc @@ -0,0 +1,34 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/renderer/media/gles2_video_decode_context.h" + +Gles2VideoDecodeContext::Gles2VideoDecodeContext( + StorageType type, WebKit::WebGLES2Context* context) + : type_(type), context_(context) { +} + +Gles2VideoDecodeContext::~Gles2VideoDecodeContext() { + // TODO(hclam): Implement. +} + +void* Gles2VideoDecodeContext::GetDevice() { + // This decode context is used inside the renderer and so hardware decoder + // device handler should be used. + return NULL; +} + +void Gles2VideoDecodeContext::AllocateVideoFrames( + int n, size_t width, size_t height, AllocationCompleteCallback* callback) { + // TODO(hclam): Implement. +} + +void Gles2VideoDecodeContext::ReleaseVideoFrames(int n, + media::VideoFrame* frames) { + // TODO(hclam): Implement. +} + +void Gles2VideoDecodeContext::Destroy(DestructionCompleteCallback* callback) { + // TODO(hclam): Implement. +} diff --git a/chrome/renderer/media/gles2_video_decode_context.h b/chrome/renderer/media/gles2_video_decode_context.h new file mode 100644 index 0000000..fd9c9233 --- /dev/null +++ b/chrome/renderer/media/gles2_video_decode_context.h @@ -0,0 +1,117 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_RENDERER_MEDIA_GLES2_VIDEO_DECODE_CONTEXT_H_ +#define CHROME_RENDERER_MEDIA_GLES2_VIDEO_DECODE_CONTEXT_H_ + +#include "media/video/video_decode_context.h" + +namespace WebKit { +class WebGLES2Context; +} // namespace WebKit + +// FUNCTIONS +// +// This is a class that provides a video decode context using a GLES2 backend. +// It provides resources for a VideoDecodeEngine to store decoded video frames +// in the GLES2 context. +// +// This class is aware of the command buffer implementation of GLES2 inside the +// Chrome renderer and keeps a reference of ggl::Context. It might use GLES2 +// commands specific to Chrome's renderer process to provide needed resources. +// +// There are two different kinds of video frame storage provided by this class: +// 1. Memory mapped YUV textures (aka software decoding mode). +// Each video frame allocated is backed by 3 luminance textures carrying +// the Y, U and V planes. +// +// Furthermore each texture is memory mapped and appears to the +// VideoDecodeEngine as 3 planes backed by system memory. +// +// The usage of these 3 textures is that the VideoDecodeEngine is performing +// software video decoding and use them as if they are allocated in plain +// system memory (in fact they are allocated in system memory and shared +// bwith the GPU process). An additional step of uploading the content to +// video memory is needed. Since VideoDecodeEngine is unaware of the video +// memory, this upload operation is performed by video renderer provided by +// Chrome. +// +// After the content is uploaded to video memory, WebKit will see the video +// frame as 3 textures and will perform the necessary operations for +// rendering. +// +// 2. RGBA texture (aka hardware decoding mode). +// In this mode of operation each video frame is backed by a RGBA texture. +// This is used only when hardware video decoding is used. The texture needs +// to be generated and allocated inside the renderer process first. This +// will establish a translation between texture ID in the renderer process +// and the GPU process. +// +// The texture ID generated is used by IpcVideoDecodeEngine only to be sent +// the GPU process. Inside the GPU process the texture ID is translated to +// a real texture ID inside the actual GLES context. The real texture ID is +// then assigned to the hardware video decoder for storing the video frame. +// +// WebKit will see the video frame as a normal RGBA texture and perform +// necessary render operations. +// +// In both operation modes, the objective is to have WebKit see the video frames +// as regular textures. +// +// THREAD SEMANTICS +// +// This class is accessed on two threads, namely the Render Thread and the +// Video Decoder Thread. +// +// GLES2 context and all OpenGL method calls should be accessed on the Render +// Thread. +// +// VideoDecodeContext implementations are accessed on the Video Decoder Thread. +// +class Gles2VideoDecodeContext : public media::VideoDecodeContext { + public: + enum StorageType { + // This video decode context provides YUV textures as storage. This is used + // only in software decoding mode. + kMemoryMappedYuvTextures, + + // This video decode context provides RBGA textures as storage. This is + // used in hardware decoding mode. + kRgbaTextures, + }; + + //-------------------------------------------------------------------------- + // Render Thread + Gles2VideoDecodeContext(StorageType type, + WebKit::WebGLES2Context* gles2context); + + // TODO(hclam): Need to figure out which thread destroys this object. + virtual ~Gles2VideoDecodeContext(); + + //-------------------------------------------------------------------------- + // Video Decoder Thread + + // media::VideoDecodeContext implementation. + virtual void* GetDevice(); + virtual void AllocateVideoFrames(int n, size_t width, size_t height, + AllocationCompleteCallback* callback); + virtual void ReleaseVideoFrames(int n, media::VideoFrame* frames); + virtual void Destroy(DestructionCompleteCallback* callback); + + //-------------------------------------------------------------------------- + // Any thread + // Accessor of the current mode of this decode context. + bool IsMemoryMapped() const { return type_ == kMemoryMappedYuvTextures; } + + private: + // Type of storage provided by this class. + StorageType type_; + + // TODO(hclam): We should keep a ggl::Context instead. + WebKit::WebGLES2Context* context_; + + DISALLOW_COPY_AND_ASSIGN(Gles2VideoDecodeContext); +}; + +#endif // CHROME_RENDERER_MEDIA_GLES2_VIDEO_DECODE_CONTEXT_H_ |