scoped_hardware_buffer_handle.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright 2018 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 "base/android/scoped_hardware_buffer_handle.h"
  5. #include "base/android/android_hardware_buffer_compat.h"
  6. #include "base/logging.h"
  7. #include "base/posix/unix_domain_socket.h"
  8. namespace base {
  9. namespace android {
  10. ScopedHardwareBufferHandle::ScopedHardwareBufferHandle() = default;
  11. ScopedHardwareBufferHandle::ScopedHardwareBufferHandle(
  12. ScopedHardwareBufferHandle&& other) {
  13. *this = std::move(other);
  14. }
  15. ScopedHardwareBufferHandle::~ScopedHardwareBufferHandle() {
  16. reset();
  17. }
  18. // static
  19. ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Adopt(
  20. AHardwareBuffer* buffer) {
  21. return ScopedHardwareBufferHandle(buffer);
  22. }
  23. // static
  24. ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Create(
  25. AHardwareBuffer* buffer) {
  26. AndroidHardwareBufferCompat::GetInstance().Acquire(buffer);
  27. return ScopedHardwareBufferHandle(buffer);
  28. }
  29. ScopedHardwareBufferHandle& ScopedHardwareBufferHandle::operator=(
  30. ScopedHardwareBufferHandle&& other) {
  31. reset();
  32. std::swap(buffer_, other.buffer_);
  33. return *this;
  34. }
  35. bool ScopedHardwareBufferHandle::is_valid() const {
  36. return buffer_ != nullptr;
  37. }
  38. AHardwareBuffer* ScopedHardwareBufferHandle::get() const {
  39. return buffer_;
  40. }
  41. void ScopedHardwareBufferHandle::reset() {
  42. if (buffer_) {
  43. AndroidHardwareBufferCompat::GetInstance().Release(buffer_);
  44. buffer_ = nullptr;
  45. }
  46. }
  47. AHardwareBuffer* ScopedHardwareBufferHandle::Take() {
  48. AHardwareBuffer* buffer = buffer_;
  49. buffer_ = nullptr;
  50. return buffer;
  51. }
  52. ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Clone() const {
  53. DCHECK(buffer_);
  54. AndroidHardwareBufferCompat::GetInstance().Acquire(buffer_);
  55. return ScopedHardwareBufferHandle(buffer_);
  56. }
  57. ScopedFD ScopedHardwareBufferHandle::SerializeAsFileDescriptor() const {
  58. DCHECK(is_valid());
  59. ScopedFD reader, writer;
  60. if (!CreateSocketPair(&reader, &writer)) {
  61. PLOG(ERROR) << "socketpair";
  62. return ScopedFD();
  63. }
  64. // NOTE: SendHandleToUnixSocket does NOT acquire or retain a reference to the
  65. // buffer object. The caller is therefore responsible for ensuring that the
  66. // buffer remains alive through the lifetime of this file descriptor.
  67. int result =
  68. AndroidHardwareBufferCompat::GetInstance().SendHandleToUnixSocket(
  69. buffer_, writer.get());
  70. if (result < 0) {
  71. PLOG(ERROR) << "send";
  72. return ScopedFD();
  73. }
  74. return reader;
  75. }
  76. // static
  77. ScopedHardwareBufferHandle
  78. ScopedHardwareBufferHandle::DeserializeFromFileDescriptor(ScopedFD fd) {
  79. DCHECK(fd.is_valid());
  80. DCHECK(AndroidHardwareBufferCompat::IsSupportAvailable());
  81. AHardwareBuffer* buffer = nullptr;
  82. // NOTE: Upon success, RecvHandleFromUnixSocket acquires a new reference to
  83. // the AHardwareBuffer.
  84. int result =
  85. AndroidHardwareBufferCompat::GetInstance().RecvHandleFromUnixSocket(
  86. fd.get(), &buffer);
  87. if (result < 0) {
  88. PLOG(ERROR) << "recv";
  89. return ScopedHardwareBufferHandle();
  90. }
  91. return ScopedHardwareBufferHandle(buffer);
  92. }
  93. ScopedHardwareBufferHandle::ScopedHardwareBufferHandle(AHardwareBuffer* buffer)
  94. : buffer_(buffer) {
  95. DCHECK(AndroidHardwareBufferCompat::IsSupportAvailable());
  96. }
  97. } // namespace android
  98. } // namespace base