| Index: chrome/renderer/media/gles2_video_decode_context.h
|
| 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 0000000000000000000000000000000000000000..fd9c9233d3cf2ef3bae5fe9e3afa7012b8b2190d
|
| --- /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_
|
|
|