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

Side by Side Diff: content/renderer/pepper_platform_video_decoder_impl.cc

Issue 7260008: Implement proper synchronization between HW video decode IPC and CommandBuffer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years, 5 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/pepper_platform_video_decoder_impl.h" 5 #include "content/renderer/pepper_platform_video_decoder_impl.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "content/common/child_process.h" 11 #include "content/common/child_process.h"
12 #include "content/renderer/gpu/gpu_channel_host.h" 12 #include "content/renderer/gpu/gpu_channel_host.h"
13 #include "content/renderer/gpu/gpu_video_decode_accelerator_host.h" 13 #include "content/renderer/gpu/gpu_video_decode_accelerator_host.h"
14 #include "content/renderer/gpu/gpu_video_service_host.h" 14 #include "content/renderer/gpu/gpu_video_service_host.h"
15 #include "content/renderer/render_thread.h" 15 #include "content/renderer/render_thread.h"
16 16
17 using media::BitstreamBuffer; 17 using media::BitstreamBuffer;
18 18
19 PlatformVideoDecoderImpl::PlatformVideoDecoderImpl( 19 PlatformVideoDecoderImpl::PlatformVideoDecoderImpl(
20 VideoDecodeAccelerator::Client* client, uint32 command_buffer_route_id) 20 VideoDecodeAccelerator::Client* client,
21 int32 command_buffer_route_id,
22 gpu::CommandBufferHelper* cmd_buffer_helper)
21 : client_(client), 23 : client_(client),
22 command_buffer_route_id_(command_buffer_route_id), 24 command_buffer_route_id_(command_buffer_route_id),
23 decoder_(NULL), 25 cmd_buffer_helper_(cmd_buffer_helper),
24 message_loop_(NULL) { 26 decoder_(NULL) {
25 DCHECK(client); 27 DCHECK(client);
26 } 28 }
27 29
28 PlatformVideoDecoderImpl::~PlatformVideoDecoderImpl() {} 30 PlatformVideoDecoderImpl::~PlatformVideoDecoderImpl() {}
29 31
30 bool PlatformVideoDecoderImpl::GetConfigs( 32 bool PlatformVideoDecoderImpl::GetConfigs(
31 const std::vector<uint32>& requested_configs, 33 const std::vector<uint32>& requested_configs,
32 std::vector<uint32>* matched_configs) { 34 std::vector<uint32>* matched_configs) {
33 // TODO(vrk): Implement. 35 // TODO(vrk): Implement.
34 NOTIMPLEMENTED(); 36 NOTIMPLEMENTED();
35 return true; 37 return true;
36 } 38 }
37 39
38 bool PlatformVideoDecoderImpl::Initialize(const std::vector<uint32>& config) { 40 bool PlatformVideoDecoderImpl::Initialize(const std::vector<uint32>& config) {
39 // TODO(vrk): Support multiple decoders. 41 // TODO(vrk): Support multiple decoders.
40 if (decoder_.get()) 42 if (decoder_.get())
41 return true; 43 return true;
42 44
43 RenderThread* render_thread = RenderThread::current(); 45 RenderThread* render_thread = RenderThread::current();
44 DCHECK(render_thread); 46 DCHECK(render_thread);
45 message_loop_ = MessageLoop::current();
46 DCHECK(message_loop_);
47 47
48 channel_ = render_thread->EstablishGpuChannelSync( 48 channel_ = render_thread->EstablishGpuChannelSync(
49 content::CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); 49 content::CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE);
50 50
51 if (!channel_.get()) 51 if (!channel_.get())
52 return false; 52 return false;
53 53
54 DCHECK_EQ(channel_->state(), GpuChannelHost::kConnected); 54 DCHECK_EQ(channel_->state(), GpuChannelHost::kConnected);
55 55
56 // Set a callback to ensure decoder is only initialized after channel is 56 // Set a callback to ensure decoder is only initialized after channel is
57 // connected and GpuVidoServiceHost message filter is added to channel. 57 // connected and GpuVidoServiceHost message filter is added to channel.
58 base::Closure initialize = base::Bind( 58 base::Closure initialize = base::Bind(
59 &PlatformVideoDecoderImpl::InitializeDecoder, 59 &PlatformVideoDecoderImpl::InitializeDecoder,
60 base::Unretained(this), 60 base::Unretained(this),
61 config); 61 config);
62 62
63 GpuVideoServiceHost* video_service = channel_->gpu_video_service_host(); 63 GpuVideoServiceHost* video_service = channel_->gpu_video_service_host();
64 video_service->SetOnInitialized(initialize); 64 video_service->SetOnInitialized(initialize);
65 return true; 65 return true;
66 } 66 }
67 67
68 void PlatformVideoDecoderImpl::InitializeDecoder( 68 void PlatformVideoDecoderImpl::InitializeDecoder(
69 const std::vector<uint32>& configs) { 69 const std::vector<uint32>& configs) {
70 // Only create GpuVideoDecodeAcceleratorHost on IO thread. 70 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
71 if (ChildProcess::current()->io_message_loop() != MessageLoop::current() ) {
72 ChildProcess::current()->io_message_loop()->
73 PostTask(FROM_HERE, base::Bind(
74 &PlatformVideoDecoderImpl::InitializeDecoder,
75 base::Unretained(this),
76 configs));
77 return;
78 }
79 GpuVideoServiceHost* video_service = channel_->gpu_video_service_host(); 71 GpuVideoServiceHost* video_service = channel_->gpu_video_service_host();
80 decoder_.reset(video_service->CreateVideoAccelerator( 72 decoder_.reset(video_service->CreateVideoAccelerator(
81 this, command_buffer_route_id_)); 73 this, command_buffer_route_id_, cmd_buffer_helper_));
82 74
83 // Send IPC message to initialize decoder in GPU process. 75 // Send IPC message to initialize decoder in GPU process.
84 decoder_->Initialize(configs); 76 decoder_->Initialize(configs);
85 } 77 }
86 78
87 bool PlatformVideoDecoderImpl::Decode(const BitstreamBuffer& bitstream_buffer) { 79 void PlatformVideoDecoderImpl::Decode(const BitstreamBuffer& bitstream_buffer) {
88 DCHECK(decoder_.get()); 80 DCHECK(decoder_.get());
89 return decoder_->Decode(bitstream_buffer); 81 decoder_->Decode(bitstream_buffer);
90 } 82 }
91 83
92 void PlatformVideoDecoderImpl::AssignGLESBuffers( 84 void PlatformVideoDecoderImpl::AssignGLESBuffers(
93 const std::vector<media::GLESBuffer>& buffers) { 85 const std::vector<media::GLESBuffer>& buffers) {
94 DCHECK(decoder_.get()); 86 DCHECK(decoder_.get());
95 decoder_->AssignGLESBuffers(buffers); 87 decoder_->AssignGLESBuffers(buffers);
96 } 88 }
97 89
98 void PlatformVideoDecoderImpl::AssignSysmemBuffers( 90 void PlatformVideoDecoderImpl::AssignSysmemBuffers(
99 const std::vector<media::SysmemBuffer>& buffers) { 91 const std::vector<media::SysmemBuffer>& buffers) {
100 DCHECK(decoder_.get()); 92 DCHECK(decoder_.get());
101 decoder_->AssignSysmemBuffers(buffers); 93 decoder_->AssignSysmemBuffers(buffers);
102 } 94 }
103 95
104 void PlatformVideoDecoderImpl::ReusePictureBuffer( 96 void PlatformVideoDecoderImpl::ReusePictureBuffer(
105 int32 picture_buffer_id) { 97 int32 picture_buffer_id) {
106 DCHECK(decoder_.get()); 98 DCHECK(decoder_.get());
107 decoder_->ReusePictureBuffer(picture_buffer_id); 99 decoder_->ReusePictureBuffer(picture_buffer_id);
108 } 100 }
109 101
110 bool PlatformVideoDecoderImpl::Flush() { 102 void PlatformVideoDecoderImpl::Flush() {
111 DCHECK(decoder_.get()); 103 DCHECK(decoder_.get());
112 return decoder_->Flush(); 104 decoder_->Flush();
113 } 105 }
114 106
115 bool PlatformVideoDecoderImpl::Abort() { 107 void PlatformVideoDecoderImpl::Abort() {
116 DCHECK(decoder_.get()); 108 DCHECK(decoder_.get());
117 return decoder_->Abort(); 109 decoder_->Abort();
118 } 110 }
119 111
120 void PlatformVideoDecoderImpl::NotifyEndOfStream() { 112 void PlatformVideoDecoderImpl::NotifyEndOfStream() {
121 DCHECK(message_loop_); 113 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
122 message_loop_-> 114 client_->NotifyEndOfStream();
123 PostTask(FROM_HERE, base::Bind(
124 &VideoDecodeAccelerator::Client::NotifyEndOfStream,
125 base::Unretained(client_)));
126 } 115 }
127 116
128 void PlatformVideoDecoderImpl::NotifyError( 117 void PlatformVideoDecoderImpl::NotifyError(
129 VideoDecodeAccelerator::Error error) { 118 VideoDecodeAccelerator::Error error) {
130 DCHECK(message_loop_); 119 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
131 message_loop_-> 120 client_->NotifyError(error);
132 PostTask(FROM_HERE, base::Bind(
133 &VideoDecodeAccelerator::Client::NotifyError,
134 base::Unretained(client_),
135 error));
136 } 121 }
137 122
138 void PlatformVideoDecoderImpl::ProvidePictureBuffers( 123 void PlatformVideoDecoderImpl::ProvidePictureBuffers(
139 uint32 requested_num_of_buffers, 124 uint32 requested_num_of_buffers,
140 const gfx::Size& dimensions, 125 const gfx::Size& dimensions,
141 media::VideoDecodeAccelerator::MemoryType type) { 126 media::VideoDecodeAccelerator::MemoryType type) {
142 DCHECK(message_loop_); 127 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
143 message_loop_-> 128 client_->ProvidePictureBuffers(requested_num_of_buffers, dimensions, type);
144 PostTask(FROM_HERE, base::Bind(
145 &VideoDecodeAccelerator::Client::ProvidePictureBuffers,
146 base::Unretained(client_),
147 requested_num_of_buffers,
148 dimensions,
149 type));
150 } 129 }
151 130
152 void PlatformVideoDecoderImpl::DismissPictureBuffer(int32 picture_buffer_id) { 131 void PlatformVideoDecoderImpl::DismissPictureBuffer(int32 picture_buffer_id) {
153 DCHECK(message_loop_); 132 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
154 message_loop_-> 133 client_->DismissPictureBuffer(picture_buffer_id);
155 PostTask(FROM_HERE, base::Bind(
156 &VideoDecodeAccelerator::Client::DismissPictureBuffer,
157 base::Unretained(client_),
158 picture_buffer_id));
159 } 134 }
160 135
161 void PlatformVideoDecoderImpl::PictureReady(const media::Picture& picture) { 136 void PlatformVideoDecoderImpl::PictureReady(const media::Picture& picture) {
162 DCHECK(message_loop_); 137 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
163 message_loop_-> 138 client_->PictureReady(picture);
164 PostTask(FROM_HERE, base::Bind(
165 &VideoDecodeAccelerator::Client::PictureReady,
166 base::Unretained(client_),
167 picture));
168 } 139 }
169 140
170 void PlatformVideoDecoderImpl::NotifyInitializeDone() { 141 void PlatformVideoDecoderImpl::NotifyInitializeDone() {
171 DCHECK(message_loop_); 142 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
172 message_loop_-> 143 client_->NotifyInitializeDone();
173 PostTask(FROM_HERE, base::Bind(
174 &VideoDecodeAccelerator::Client::NotifyInitializeDone,
175 base::Unretained(client_)));
176 } 144 }
177 145
178 void PlatformVideoDecoderImpl::NotifyEndOfBitstreamBuffer( 146 void PlatformVideoDecoderImpl::NotifyEndOfBitstreamBuffer(
179 int32 bitstream_buffer_id) { 147 int32 bitstream_buffer_id) {
180 DCHECK(message_loop_); 148 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
181 message_loop_-> 149 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id);
182 PostTask(FROM_HERE, base::Bind(
183 &VideoDecodeAccelerator::Client::NotifyEndOfBitstreamBuffer,
184 base::Unretained(client_),
185 bitstream_buffer_id));
186 } 150 }
187 151
188 void PlatformVideoDecoderImpl::NotifyFlushDone() { 152 void PlatformVideoDecoderImpl::NotifyFlushDone() {
189 DCHECK(message_loop_); 153 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
190 message_loop_-> 154 client_->NotifyFlushDone();
191 PostTask(FROM_HERE, base::Bind(
192 &VideoDecodeAccelerator::Client::NotifyFlushDone,
193 base::Unretained(client_)));
194 } 155 }
195 156
196 void PlatformVideoDecoderImpl::NotifyAbortDone() { 157 void PlatformVideoDecoderImpl::NotifyAbortDone() {
197 DCHECK(message_loop_); 158 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current());
198 message_loop_-> 159 client_->NotifyAbortDone();
199 PostTask(FROM_HERE, base::Bind(
200 &VideoDecodeAccelerator::Client::NotifyAbortDone,
201 base::Unretained(client_)));
202 } 160 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698