OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "cc/resources/video_resource_updater.h" | 5 #include "cc/resources/video_resource_updater.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "cc/output/gl_renderer.h" | 9 #include "cc/output/gl_renderer.h" |
10 #include "cc/resources/resource_provider.h" | 10 #include "cc/resources/resource_provider.h" |
11 #include "gpu/GLES2/gl2extchromium.h" | 11 #include "gpu/GLES2/gl2extchromium.h" |
12 #include "gpu/command_buffer/client/gles2_interface.h" | 12 #include "gpu/command_buffer/client/gles2_interface.h" |
13 #include "media/base/video_frame.h" | 13 #include "media/base/video_frame.h" |
14 #include "media/filters/skcanvas_video_renderer.h" | 14 #include "media/filters/skcanvas_video_renderer.h" |
15 #include "third_party/khronos/GLES2/gl2.h" | 15 #include "third_party/khronos/GLES2/gl2.h" |
16 #include "third_party/khronos/GLES2/gl2ext.h" | 16 #include "third_party/khronos/GLES2/gl2ext.h" |
17 #include "ui/gfx/size_conversions.h" | 17 #include "ui/gfx/size_conversions.h" |
18 | 18 |
19 namespace cc { | 19 namespace cc { |
20 | 20 |
| 21 namespace { |
| 22 |
21 const ResourceFormat kYUVResourceFormat = LUMINANCE_8; | 23 const ResourceFormat kYUVResourceFormat = LUMINANCE_8; |
22 const ResourceFormat kRGBResourceFormat = RGBA_8888; | 24 const ResourceFormat kRGBResourceFormat = RGBA_8888; |
23 | 25 |
| 26 class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { |
| 27 public: |
| 28 explicit SyncPointClientImpl(gpu::gles2::GLES2Interface* gl) : gl_(gl) {} |
| 29 virtual ~SyncPointClientImpl() {} |
| 30 virtual uint32 InsertSyncPoint() OVERRIDE { |
| 31 return GLC(gl_, gl_->InsertSyncPointCHROMIUM()); |
| 32 } |
| 33 virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE { |
| 34 GLC(gl_, gl_->WaitSyncPointCHROMIUM(sync_point)); |
| 35 } |
| 36 |
| 37 private: |
| 38 gpu::gles2::GLES2Interface* gl_; |
| 39 }; |
| 40 |
| 41 } // namespace |
| 42 |
24 VideoFrameExternalResources::VideoFrameExternalResources() : type(NONE) {} | 43 VideoFrameExternalResources::VideoFrameExternalResources() : type(NONE) {} |
25 | 44 |
26 VideoFrameExternalResources::~VideoFrameExternalResources() {} | 45 VideoFrameExternalResources::~VideoFrameExternalResources() {} |
27 | 46 |
28 VideoResourceUpdater::VideoResourceUpdater(ContextProvider* context_provider, | 47 VideoResourceUpdater::VideoResourceUpdater(ContextProvider* context_provider, |
29 ResourceProvider* resource_provider) | 48 ResourceProvider* resource_provider) |
30 : context_provider_(context_provider), | 49 : context_provider_(context_provider), |
31 resource_provider_(resource_provider) { | 50 resource_provider_(resource_provider) { |
32 } | 51 } |
33 | 52 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 external_resources.mailboxes.push_back( | 297 external_resources.mailboxes.push_back( |
279 TextureMailbox(plane_resources[i].mailbox, GL_TEXTURE_2D, 0)); | 298 TextureMailbox(plane_resources[i].mailbox, GL_TEXTURE_2D, 0)); |
280 external_resources.release_callbacks.push_back( | 299 external_resources.release_callbacks.push_back( |
281 base::Bind(&RecycleResource, AsWeakPtr(), recycle_data)); | 300 base::Bind(&RecycleResource, AsWeakPtr(), recycle_data)); |
282 } | 301 } |
283 | 302 |
284 external_resources.type = VideoFrameExternalResources::YUV_RESOURCE; | 303 external_resources.type = VideoFrameExternalResources::YUV_RESOURCE; |
285 return external_resources; | 304 return external_resources; |
286 } | 305 } |
287 | 306 |
288 static void ReturnTexture(const scoped_refptr<media::VideoFrame>& frame, | 307 // static |
289 uint32 sync_point, | 308 void VideoResourceUpdater::ReturnTexture( |
290 bool lost_resource) { | 309 base::WeakPtr<VideoResourceUpdater> updater, |
291 frame->AppendReleaseSyncPoint(sync_point); | 310 const scoped_refptr<media::VideoFrame>& video_frame, |
| 311 uint32 sync_point, |
| 312 bool lost_resource) { |
| 313 // TODO(dshwang) this case should be forwarded to the decoder as lost |
| 314 // resource. |
| 315 if (lost_resource || !updater.get()) |
| 316 return; |
| 317 // VideoFrame::UpdateReleaseSyncPoint() creates new sync point using the same |
| 318 // GL context which created the given |sync_point|, so discard the |
| 319 // |sync_point|. |
| 320 SyncPointClientImpl client(updater->context_provider_->ContextGL()); |
| 321 video_frame->UpdateReleaseSyncPoint(&client); |
292 } | 322 } |
293 | 323 |
294 VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( | 324 VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
295 const scoped_refptr<media::VideoFrame>& video_frame) { | 325 const scoped_refptr<media::VideoFrame>& video_frame) { |
296 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForHardwarePlanes"); | 326 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForHardwarePlanes"); |
297 media::VideoFrame::Format frame_format = video_frame->format(); | 327 media::VideoFrame::Format frame_format = video_frame->format(); |
298 | 328 |
299 DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE); | 329 DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE); |
300 if (frame_format != media::VideoFrame::NATIVE_TEXTURE) | 330 if (frame_format != media::VideoFrame::NATIVE_TEXTURE) |
301 return VideoFrameExternalResources(); | 331 return VideoFrameExternalResources(); |
(...skipping 17 matching lines...) Expand all Loading... |
319 default: | 349 default: |
320 NOTREACHED(); | 350 NOTREACHED(); |
321 return VideoFrameExternalResources(); | 351 return VideoFrameExternalResources(); |
322 } | 352 } |
323 | 353 |
324 external_resources.mailboxes.push_back( | 354 external_resources.mailboxes.push_back( |
325 TextureMailbox(mailbox_holder->mailbox, | 355 TextureMailbox(mailbox_holder->mailbox, |
326 mailbox_holder->texture_target, | 356 mailbox_holder->texture_target, |
327 mailbox_holder->sync_point)); | 357 mailbox_holder->sync_point)); |
328 external_resources.release_callbacks.push_back( | 358 external_resources.release_callbacks.push_back( |
329 base::Bind(&ReturnTexture, video_frame)); | 359 base::Bind(&ReturnTexture, AsWeakPtr(), video_frame)); |
330 return external_resources; | 360 return external_resources; |
331 } | 361 } |
332 | 362 |
333 // static | 363 // static |
334 void VideoResourceUpdater::RecycleResource( | 364 void VideoResourceUpdater::RecycleResource( |
335 base::WeakPtr<VideoResourceUpdater> updater, | 365 base::WeakPtr<VideoResourceUpdater> updater, |
336 RecycleResourceData data, | 366 RecycleResourceData data, |
337 uint32 sync_point, | 367 uint32 sync_point, |
338 bool lost_resource) { | 368 bool lost_resource) { |
339 if (!updater.get()) { | 369 if (!updater.get()) { |
(...skipping 21 matching lines...) Expand all Loading... |
361 } | 391 } |
362 | 392 |
363 PlaneResource recycled_resource(data.resource_id, | 393 PlaneResource recycled_resource(data.resource_id, |
364 data.resource_size, | 394 data.resource_size, |
365 data.resource_format, | 395 data.resource_format, |
366 data.mailbox); | 396 data.mailbox); |
367 updater->recycled_resources_.push_back(recycled_resource); | 397 updater->recycled_resources_.push_back(recycled_resource); |
368 } | 398 } |
369 | 399 |
370 } // namespace cc | 400 } // namespace cc |
OLD | NEW |