OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ppb_video_decoder_impl.h" | 5 #include "content/renderer/pepper/ppb_video_decoder_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 return PP_VIDEODECODERERROR_ILLEGAL_STATE; | 88 return PP_VIDEODECODERERROR_ILLEGAL_STATE; |
89 } | 89 } |
90 } | 90 } |
91 | 91 |
92 } // namespace | 92 } // namespace |
93 | 93 |
94 namespace content { | 94 namespace content { |
95 | 95 |
96 PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PP_Instance instance) | 96 PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PP_Instance instance) |
97 : PPB_VideoDecoder_Shared(instance), ppp_videodecoder_(NULL) { | 97 : PPB_VideoDecoder_Shared(instance), ppp_videodecoder_(NULL) { |
98 PluginModule* plugin_module = | |
99 HostGlobals::Get()->GetInstance(pp_instance())->module(); | |
100 if (plugin_module) { | |
101 ppp_videodecoder_ = static_cast<const PPP_VideoDecoder_Dev*>( | |
102 plugin_module->GetPluginInterface(PPP_VIDEODECODER_DEV_INTERFACE)); | |
103 } | |
104 } | 98 } |
105 | 99 |
106 PPB_VideoDecoder_Impl::~PPB_VideoDecoder_Impl() { Destroy(); } | 100 PPB_VideoDecoder_Impl::~PPB_VideoDecoder_Impl() { Destroy(); } |
107 | 101 |
108 // static | 102 // static |
109 PP_Resource PPB_VideoDecoder_Impl::Create(PP_Instance instance, | 103 PP_Resource PPB_VideoDecoder_Impl::Create(PP_Instance instance, |
110 PP_Resource graphics_context, | 104 PP_Resource graphics_context, |
111 PP_VideoDecoder_Profile profile) { | 105 PP_VideoDecoder_Profile profile) { |
112 scoped_refptr<PPB_VideoDecoder_Impl> decoder( | 106 scoped_refptr<PPB_VideoDecoder_Impl> decoder( |
113 new PPB_VideoDecoder_Impl(instance)); | 107 new PPB_VideoDecoder_Impl(instance)); |
(...skipping 19 matching lines...) Expand all Loading... |
133 FlushCommandBuffer(); | 127 FlushCommandBuffer(); |
134 | 128 |
135 // This is not synchronous, but subsequent IPC messages will be buffered, so | 129 // This is not synchronous, but subsequent IPC messages will be buffered, so |
136 // it is okay to immediately send IPC messages through the returned channel. | 130 // it is okay to immediately send IPC messages through the returned channel. |
137 GpuChannelHost* channel = graphics_3d->channel(); | 131 GpuChannelHost* channel = graphics_3d->channel(); |
138 DCHECK(channel); | 132 DCHECK(channel); |
139 decoder_ = channel->CreateVideoDecoder(command_buffer_route_id); | 133 decoder_ = channel->CreateVideoDecoder(command_buffer_route_id); |
140 return (decoder_ && decoder_->Initialize(PPToMediaProfile(profile), this)); | 134 return (decoder_ && decoder_->Initialize(PPToMediaProfile(profile), this)); |
141 } | 135 } |
142 | 136 |
| 137 const PPP_VideoDecoder_Dev* PPB_VideoDecoder_Impl::GetPPP() { |
| 138 if (!ppp_videodecoder_) { |
| 139 PluginModule* plugin_module = |
| 140 HostGlobals::Get()->GetInstance(pp_instance())->module(); |
| 141 if (plugin_module) { |
| 142 ppp_videodecoder_ = static_cast<const PPP_VideoDecoder_Dev*>( |
| 143 plugin_module->GetPluginInterface(PPP_VIDEODECODER_DEV_INTERFACE)); |
| 144 } |
| 145 } |
| 146 return ppp_videodecoder_; |
| 147 } |
| 148 |
143 int32_t PPB_VideoDecoder_Impl::Decode( | 149 int32_t PPB_VideoDecoder_Impl::Decode( |
144 const PP_VideoBitstreamBuffer_Dev* bitstream_buffer, | 150 const PP_VideoBitstreamBuffer_Dev* bitstream_buffer, |
145 scoped_refptr<TrackedCallback> callback) { | 151 scoped_refptr<TrackedCallback> callback) { |
146 if (!decoder_) | 152 if (!decoder_) |
147 return PP_ERROR_BADRESOURCE; | 153 return PP_ERROR_BADRESOURCE; |
148 | 154 |
149 EnterResourceNoLock<PPB_Buffer_API> enter(bitstream_buffer->data, true); | 155 EnterResourceNoLock<PPB_Buffer_API> enter(bitstream_buffer->data, true); |
150 if (enter.failed()) | 156 if (enter.failed()) |
151 return PP_ERROR_FAILED; | 157 return PP_ERROR_FAILED; |
152 | 158 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 ppp_videodecoder_ = NULL; | 233 ppp_videodecoder_ = NULL; |
228 | 234 |
229 ::ppapi::PPB_VideoDecoder_Shared::Destroy(); | 235 ::ppapi::PPB_VideoDecoder_Shared::Destroy(); |
230 } | 236 } |
231 | 237 |
232 void PPB_VideoDecoder_Impl::ProvidePictureBuffers( | 238 void PPB_VideoDecoder_Impl::ProvidePictureBuffers( |
233 uint32 requested_num_of_buffers, | 239 uint32 requested_num_of_buffers, |
234 const gfx::Size& dimensions, | 240 const gfx::Size& dimensions, |
235 uint32 texture_target) { | 241 uint32 texture_target) { |
236 DCHECK(RenderThreadImpl::current()); | 242 DCHECK(RenderThreadImpl::current()); |
237 if (!ppp_videodecoder_) | 243 if (!GetPPP()) |
238 return; | 244 return; |
239 | 245 |
240 PP_Size out_dim = PP_MakeSize(dimensions.width(), dimensions.height()); | 246 PP_Size out_dim = PP_MakeSize(dimensions.width(), dimensions.height()); |
241 ppp_videodecoder_->ProvidePictureBuffers(pp_instance(), | 247 GetPPP()->ProvidePictureBuffers(pp_instance(), pp_resource(), |
242 pp_resource(), | 248 requested_num_of_buffers, &out_dim, |
243 requested_num_of_buffers, | 249 texture_target); |
244 &out_dim, | |
245 texture_target); | |
246 } | 250 } |
247 | 251 |
248 void PPB_VideoDecoder_Impl::PictureReady(const media::Picture& picture) { | 252 void PPB_VideoDecoder_Impl::PictureReady(const media::Picture& picture) { |
249 // So far picture.visible_rect is not used. If used, visible_rect should | 253 // So far picture.visible_rect is not used. If used, visible_rect should |
250 // be validated since it comes from GPU process and may not be trustworthy. | 254 // be validated since it comes from GPU process and may not be trustworthy. |
251 DCHECK(RenderThreadImpl::current()); | 255 DCHECK(RenderThreadImpl::current()); |
252 if (!ppp_videodecoder_) | 256 if (!GetPPP()) |
253 return; | 257 return; |
254 | 258 |
255 PP_Picture_Dev output; | 259 PP_Picture_Dev output; |
256 output.picture_buffer_id = picture.picture_buffer_id(); | 260 output.picture_buffer_id = picture.picture_buffer_id(); |
257 output.bitstream_buffer_id = picture.bitstream_buffer_id(); | 261 output.bitstream_buffer_id = picture.bitstream_buffer_id(); |
258 ppp_videodecoder_->PictureReady(pp_instance(), pp_resource(), &output); | 262 GetPPP()->PictureReady(pp_instance(), pp_resource(), &output); |
259 } | 263 } |
260 | 264 |
261 void PPB_VideoDecoder_Impl::DismissPictureBuffer(int32 picture_buffer_id) { | 265 void PPB_VideoDecoder_Impl::DismissPictureBuffer(int32 picture_buffer_id) { |
262 DCHECK(RenderThreadImpl::current()); | 266 DCHECK(RenderThreadImpl::current()); |
263 if (!ppp_videodecoder_) | 267 if (!GetPPP()) |
264 return; | 268 return; |
265 ppp_videodecoder_->DismissPictureBuffer( | 269 GetPPP()->DismissPictureBuffer(pp_instance(), pp_resource(), |
266 pp_instance(), pp_resource(), picture_buffer_id); | 270 picture_buffer_id); |
267 } | 271 } |
268 | 272 |
269 void PPB_VideoDecoder_Impl::NotifyError( | 273 void PPB_VideoDecoder_Impl::NotifyError( |
270 media::VideoDecodeAccelerator::Error error) { | 274 media::VideoDecodeAccelerator::Error error) { |
271 DCHECK(RenderThreadImpl::current()); | 275 DCHECK(RenderThreadImpl::current()); |
272 if (!ppp_videodecoder_) | 276 if (!GetPPP()) |
273 return; | 277 return; |
274 | 278 |
275 PP_VideoDecodeError_Dev pp_error = MediaToPPError(error); | 279 PP_VideoDecodeError_Dev pp_error = MediaToPPError(error); |
276 ppp_videodecoder_->NotifyError(pp_instance(), pp_resource(), pp_error); | 280 GetPPP()->NotifyError(pp_instance(), pp_resource(), pp_error); |
277 UMA_HISTOGRAM_ENUMERATION("Media.PepperVideoDecoderError", | 281 UMA_HISTOGRAM_ENUMERATION("Media.PepperVideoDecoderError", |
278 error, | 282 error, |
279 media::VideoDecodeAccelerator::LARGEST_ERROR_ENUM); | 283 media::VideoDecodeAccelerator::LARGEST_ERROR_ENUM); |
280 } | 284 } |
281 | 285 |
282 void PPB_VideoDecoder_Impl::NotifyResetDone() { | 286 void PPB_VideoDecoder_Impl::NotifyResetDone() { |
283 DCHECK(RenderThreadImpl::current()); | 287 DCHECK(RenderThreadImpl::current()); |
284 RunResetCallback(PP_OK); | 288 RunResetCallback(PP_OK); |
285 } | 289 } |
286 | 290 |
287 void PPB_VideoDecoder_Impl::NotifyEndOfBitstreamBuffer( | 291 void PPB_VideoDecoder_Impl::NotifyEndOfBitstreamBuffer( |
288 int32 bitstream_buffer_id) { | 292 int32 bitstream_buffer_id) { |
289 DCHECK(RenderThreadImpl::current()); | 293 DCHECK(RenderThreadImpl::current()); |
290 RunBitstreamBufferCallback(bitstream_buffer_id, PP_OK); | 294 RunBitstreamBufferCallback(bitstream_buffer_id, PP_OK); |
291 } | 295 } |
292 | 296 |
293 void PPB_VideoDecoder_Impl::NotifyFlushDone() { | 297 void PPB_VideoDecoder_Impl::NotifyFlushDone() { |
294 DCHECK(RenderThreadImpl::current()); | 298 DCHECK(RenderThreadImpl::current()); |
295 RunFlushCallback(PP_OK); | 299 RunFlushCallback(PP_OK); |
296 } | 300 } |
297 | 301 |
298 } // namespace content | 302 } // namespace content |
OLD | NEW |