Chromium Code Reviews| 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. | |
|
dshwang
2014/07/10 21:44:25
danakj@, use WeakPtr<VideoResourceUpdater> and add
| |
| 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 |