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

Side by Side Diff: chrome/renderer/gpu_video_decoder_host.h

Issue 6713005: Move a bunch of gpu/worker/plugin renderer code to content. I temporarily disabled the sad plugi... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/gpu_channel_host.cc ('k') | chrome/renderer/gpu_video_decoder_host.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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_GPU_VIDEO_DECODER_HOST_H_
6 #define CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_
7
8 #include <deque>
9 #include <map>
10
11 #include "base/shared_memory.h"
12 #include "base/singleton.h"
13 #include "chrome/renderer/gpu_channel_host.h"
14 #include "ipc/ipc_message.h"
15 #include "media/base/buffers.h"
16 #include "media/base/video_frame.h"
17 #include "media/video/video_decode_engine.h"
18
19 using media::VideoFrame;
20 using media::Buffer;
21
22 class MessageRouter;
23 struct GpuVideoDecoderInitDoneParam;
24
25 // This class is used to talk to GpuVideoDecoder in the GPU process through
26 // IPC messages. It implements the interface of VideoDecodeEngine so users
27 // view it as a regular video decode engine, the implementation is a portal
28 // to the GPU process.
29 //
30 // THREAD SEMANTICS
31 //
32 // All methods of this class can be accessed on any thread. A message loop
33 // needs to be provided to class through Initialize() for accessing the
34 // IPC channel. Event handlers are called on that message loop.
35 //
36 // Since this class is not refcounted, it is important to delete this
37 // object only after OnUninitializeCompelte() is called.
38 class GpuVideoDecoderHost : public media::VideoDecodeEngine,
39 public IPC::Channel::Listener {
40 public:
41 // |router| is used to dispatch IPC messages to this object.
42 // |ipc_sender| is used to send IPC messages to GPU process.
43 // It is important that the above two objects are accessed on the
44 // |message_loop_|.
45 GpuVideoDecoderHost(MessageRouter* router,
46 IPC::Message::Sender* ipc_sender,
47 int context_route_id,
48 int32 decoder_host_id);
49 virtual ~GpuVideoDecoderHost();
50
51 // IPC::Channel::Listener.
52 virtual void OnChannelConnected(int32 peer_pid) {}
53 virtual void OnChannelError();
54 virtual bool OnMessageReceived(const IPC::Message& message);
55
56 // media::VideoDecodeEngine implementation.
57 virtual void Initialize(MessageLoop* message_loop,
58 VideoDecodeEngine::EventHandler* event_handler,
59 media::VideoDecodeContext* context,
60 const media::VideoCodecConfig& config);
61 virtual void ConsumeVideoSample(scoped_refptr<Buffer> buffer);
62 virtual void ProduceVideoFrame(scoped_refptr<VideoFrame> frame);
63 virtual void Uninitialize();
64 virtual void Flush();
65 virtual void Seek();
66
67 private:
68 typedef std::map<int32, scoped_refptr<media::VideoFrame> > VideoFrameMap;
69
70 // Internal states.
71 enum GpuVideoDecoderHostState {
72 kStateUninitialized,
73 kStateNormal,
74 kStateError,
75 kStateFlushing,
76 };
77
78 // Takes care of sending IPC message to create a video decoder.
79 void CreateVideoDecoder();
80
81 // Handlers for messages received from the GPU process.
82 void OnCreateVideoDecoderDone(int32 decoder_id);
83 void OnInitializeDone(const GpuVideoDecoderInitDoneParam& param);
84 void OnUninitializeDone();
85 void OnFlushDone();
86 void OnPrerollDone();
87 void OnEmptyThisBufferACK();
88 void OnProduceVideoSample();
89 void OnConsumeVideoFrame(int32 frame_id, int64 timestamp,
90 int64 duration, int32 flags);
91 void OnAllocateVideoFrames(int32 n, uint32 width,
92 uint32 height, int32 format);
93 void OnReleaseAllVideoFrames();
94
95 // Handler for VideoDecodeContext. This method is called when video frames
96 // allocation is done.
97 void OnAllocateVideoFramesDone();
98
99 // Send a message to the GPU process to inform that a video frame is
100 // allocated.
101 void SendVideoFrameAllocated(int32 frame_id,
102 scoped_refptr<media::VideoFrame> frame);
103
104 // Send a video sample to the GPU process and tell it to use the buffer for
105 // video decoding.
106 void SendConsumeVideoSample();
107
108 // Look up the frame_id for |frame| and send a message to the GPU process
109 // to use that video frame to produce an output.
110 void SendProduceVideoFrame(scoped_refptr<media::VideoFrame> frame);
111
112 // A router used to send us IPC messages.
113 MessageRouter* router_;
114
115 // Sends IPC messages to the GPU process.
116 IPC::Message::Sender* ipc_sender_;
117
118 // Route ID of the GLES2 context in the GPU process.
119 int context_route_id_;
120
121 // Message loop that this object runs on.
122 MessageLoop* message_loop_;
123
124 // We expect that the client of us will always available during our life span.
125 EventHandler* event_handler_;
126
127 // A Context for allocating video frame textures.
128 media::VideoDecodeContext* context_;
129
130 // Dimensions of the video.
131 int width_;
132 int height_;
133
134 // Current state of video decoder.
135 GpuVideoDecoderHostState state_;
136
137 // ID of this GpuVideoDecoderHost.
138 int32 decoder_host_id_;
139
140 // ID of GpuVideoDecoder in the GPU process.
141 int32 decoder_id_;
142
143 // We are not able to push all received buffer to gpu process at once.
144 std::deque<scoped_refptr<Buffer> > input_buffer_queue_;
145
146 // Currently we do not use ring buffer in input buffer, therefore before
147 // GPU process had finished access it, we should not touch it.
148 bool input_buffer_busy_;
149
150 // Transfer buffers for both input and output.
151 // TODO(jiesun): remove output buffer when hardware composition is ready.
152 scoped_ptr<base::SharedMemory> input_transfer_buffer_;
153
154 // Frame ID for the newly generated video frame.
155 int32 current_frame_id_;
156
157 // The list of video frames allocated by VideoDecodeContext.
158 std::vector<scoped_refptr<media::VideoFrame> > video_frames_;
159
160 // The mapping between video frame ID and a video frame.
161 VideoFrameMap video_frame_map_;
162
163 DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoderHost);
164 };
165
166 #endif // CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_
OLDNEW
« no previous file with comments | « chrome/renderer/gpu_channel_host.cc ('k') | chrome/renderer/gpu_video_decoder_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698