Chromium Code Reviews

Side by Side Diff: chrome/renderer/media/gles2_video_decode_context.h

Issue 3233003: Add a VideoDecodeContext that provides resources for a VideoDecodeEngine (Closed)
Patch Set: updated API Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
(Empty)
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_RENDERER_MEDIA_GLES2_VIDEO_DECODE_CONTEXT_H_
6 #define CHROME_RENDERER_MEDIA_GLES2_VIDEO_DECODE_CONTEXT_H_
7
8 #include "media/video/video_decode_context.h"
9
10 namespace WebKit {
11 class WebGLES2Context;
12 } // namespace WebKit
13
14 // FUNCTIONS
15 //
16 // This is a class that provides a video decode context using a GLES2 backend.
17 // It provides resources for a VideoDecodeEngine to store decoded video frames
18 // in the GLES2 context.
19 //
20 // This class is aware of the command buffer implementation of GLES2 inside the
21 // Chrome renderer and keeps a reference of ggl::Context. It might use GLES2
22 // commands specific to Chrome's renderer process to provide needed resources.
23 //
24 // There are two different kinds of video frame storage provided by this class:
25 // 1. Memory mapped YUV textures (aka software decoding mode).
26 // Each video frame allocated is backed by 3 luminance textures carrying
27 // the Y, U and V planes.
28 //
29 // Furthermore each texture is memory mapped and appears to the
30 // VideoDecodeEngine as 3 planes backed by system memory.
31 //
32 // The usage of these 3 textures is that the VideoDecodeEngine is performing
33 // software video decoding and use them as if they are allocated in plain
34 // system memory (in fact they are allocated in system memory and shared
35 // bwith the GPU process). An additional step of uploading the content to
36 // video memory is needed. Since VideoDecodeEngine is unaware of the video
37 // memory, this upload operation is performed by video renderer provided by
38 // Chrome.
39 //
40 // After the content is uploaded to video memory, WebKit will see the video
41 // frame as 3 textures and will perform the necessary operations for
42 // rendering.
43 //
44 // 2. RGBA texture (aka hardware decoding mode).
45 // In this mode of operation each video frame is backed by a RGBA texture.
46 // This is used only when hardware video decoding is used. The texture needs
47 // to be generated and allocated inside the renderer process first. This
48 // will establish a translation between texture ID in the renderer process
49 // and the GPU process.
50 //
51 // The texture ID generated is used by IpcVideoDecodeEngine only to be sent
52 // the GPU process. Inside the GPU process the texture ID is translated to
53 // a real texture ID inside the actual GLES context. The real texture ID is
54 // then assigned to the hardware video decoder for storing the video frame.
55 //
56 // WebKit will see the video frame as a normal RGBA texture and perform
57 // necessary render operations.
58 //
59 // In both operation modes, the objective is to have WebKit see the video frames
60 // as regular textures.
61 //
62 // THREAD SEMANTICS
63 //
64 // This class is accessed on two threads, namely the Render Thread and the
65 // Video Decoder Thread.
66 //
67 // GLES2 context and all OpenGL method calls should be accessed on the Render
68 // Thread.
69 //
70 // VideoDecodeContext implementations are accessed on the Video Decoder Thread.
71 //
72 class Gles2VideoDecodeContext : public media::VideoDecodeContext {
73 public:
74 enum StorageType {
75 // This video decode context provides YUV textures as storage. This is used
76 // only in software decoding mode.
77 kMemoryMappedYuvTextures,
78
79 // This video decode context provides RBGA textures as storage. This is
80 // used in hardware decoding mode.
81 kRgbaTextures,
82 };
83
84 //--------------------------------------------------------------------------
85 // Render Thread
86 Gles2VideoDecodeContext(StorageType type,
87 WebKit::WebGLES2Context* gles2context);
88
89 // TODO(hclam): Need to figure out which thread destroys this object.
90 virtual ~Gles2VideoDecodeContext();
91
92 //--------------------------------------------------------------------------
93 // Video Decoder Thread
94
95 // media::VideoDecodeContext implementation.
96 virtual void* GetDevice();
97 virtual void AllocateVideoFrames(int n, size_t width, size_t height,
98 AllocationCompleteCallback* callback);
99 virtual void ReleaseVideoFrames(int n, media::VideoFrame* frames);
100 virtual void Destroy(DestructionCompleteCallback* callback);
101
102 //--------------------------------------------------------------------------
103 // Any thread
104 // Accessor of the current mode of this decode context.
105 bool IsMemoryMapped() const { return type_ == kMemoryMappedYuvTextures; }
106
107 private:
108 // Type of storage provided by this class.
109 StorageType type_;
110
111 // TODO(hclam): We should keep a ggl::Context instead.
112 WebKit::WebGLES2Context* context_;
113
114 DISALLOW_COPY_AND_ASSIGN(Gles2VideoDecodeContext);
115 };
116
117 #endif // CHROME_RENDERER_MEDIA_GLES2_VIDEO_DECODE_CONTEXT_H_
OLDNEW

Powered by Google App Engine