codec_surface_bundle.cc 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright 2017 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. #include "media/gpu/android/codec_surface_bundle.h"
  5. #include "base/bind.h"
  6. #include "base/threading/sequenced_task_runner_handle.h"
  7. #include "media/base/android/android_overlay.h"
  8. namespace media {
  9. CodecSurfaceBundle::CodecSurfaceBundle()
  10. : RefCountedDeleteOnSequence<CodecSurfaceBundle>(
  11. base::SequencedTaskRunnerHandle::Get()) {}
  12. CodecSurfaceBundle::CodecSurfaceBundle(std::unique_ptr<AndroidOverlay> overlay)
  13. : RefCountedDeleteOnSequence<CodecSurfaceBundle>(
  14. base::SequencedTaskRunnerHandle::Get()),
  15. overlay_(std::move(overlay)) {}
  16. CodecSurfaceBundle::CodecSurfaceBundle(
  17. scoped_refptr<gpu::TextureOwner> texture_owner,
  18. scoped_refptr<gpu::RefCountedLock> drdc_lock)
  19. : RefCountedDeleteOnSequence<CodecSurfaceBundle>(
  20. base::SequencedTaskRunnerHandle::Get()),
  21. codec_buffer_wait_coordinator_(
  22. base::MakeRefCounted<CodecBufferWaitCoordinator>(
  23. std::move(texture_owner),
  24. std::move(drdc_lock))),
  25. texture_owner_surface_(codec_buffer_wait_coordinator_->texture_owner()
  26. ->CreateJavaSurface()) {}
  27. CodecSurfaceBundle::~CodecSurfaceBundle() {
  28. // Explicitly free the surface first, just to be sure that it's deleted before
  29. // the TextureOwner is.
  30. texture_owner_surface_ = gl::ScopedJavaSurface();
  31. // Also release the back buffers.
  32. if (!codec_buffer_wait_coordinator_)
  33. return;
  34. auto task_runner =
  35. codec_buffer_wait_coordinator_->texture_owner()->task_runner();
  36. if (task_runner->RunsTasksInCurrentSequence()) {
  37. codec_buffer_wait_coordinator_->texture_owner()->ReleaseBackBuffers();
  38. } else {
  39. task_runner->PostTask(
  40. FROM_HERE,
  41. base::BindOnce(&gpu::TextureOwner::ReleaseBackBuffers,
  42. codec_buffer_wait_coordinator_->texture_owner()));
  43. }
  44. }
  45. const base::android::JavaRef<jobject>& CodecSurfaceBundle::GetJavaSurface()
  46. const {
  47. return overlay_ ? overlay_->GetJavaSurface()
  48. : texture_owner_surface_.j_surface();
  49. }
  50. CodecSurfaceBundle::ScheduleLayoutCB CodecSurfaceBundle::GetScheduleLayoutCB() {
  51. return base::BindRepeating(&CodecSurfaceBundle::ScheduleLayout,
  52. weak_factory_.GetWeakPtr());
  53. }
  54. void CodecSurfaceBundle::ScheduleLayout(const gfx::Rect& rect) {
  55. if (layout_rect_ == rect)
  56. return;
  57. layout_rect_ = rect;
  58. if (overlay_)
  59. overlay_->ScheduleLayout(rect);
  60. }
  61. } // namespace media