video_buffer_adapters.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright 2022 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 "services/video_capture/lacros/video_buffer_adapters.h"
  5. #include "base/notreached.h"
  6. #include "mojo/public/cpp/system/platform_handle.h"
  7. #include "ui/gfx/gpu_memory_buffer.h"
  8. #include "ui/gfx/mojom/buffer_types.mojom.h"
  9. #include "ui/gfx/mojom/native_handle_types.mojom.h"
  10. namespace video_capture {
  11. namespace {
  12. gfx::GpuMemoryBufferHandle ToGfxGpuMemoryBufferHandle(
  13. crosapi::mojom::GpuMemoryBufferHandlePtr buffer_handle) {
  14. gfx::GpuMemoryBufferHandle gfx_buffer_handle;
  15. gfx_buffer_handle.id = gfx::GpuMemoryBufferId(buffer_handle->id);
  16. gfx_buffer_handle.offset = buffer_handle->offset;
  17. gfx_buffer_handle.stride = buffer_handle->stride;
  18. if (buffer_handle->platform_handle) {
  19. auto& platform_handle = buffer_handle->platform_handle;
  20. if (platform_handle->is_shared_memory_handle()) {
  21. gfx_buffer_handle.type = gfx::GpuMemoryBufferType::SHARED_MEMORY_BUFFER;
  22. gfx_buffer_handle.region =
  23. std::move(platform_handle->get_shared_memory_handle());
  24. } else if (platform_handle->is_native_pixmap_handle()) {
  25. gfx_buffer_handle.type = gfx::GpuMemoryBufferType::NATIVE_PIXMAP;
  26. auto& native_pixmap_handle = platform_handle->get_native_pixmap_handle();
  27. gfx::NativePixmapHandle gfx_native_pixmap_handle;
  28. gfx_native_pixmap_handle.planes = std::move(native_pixmap_handle->planes);
  29. gfx_native_pixmap_handle.modifier = native_pixmap_handle->modifier;
  30. gfx_buffer_handle.native_pixmap_handle =
  31. std::move(gfx_native_pixmap_handle);
  32. } else {
  33. NOTREACHED() << "Unexpected new buffer type";
  34. }
  35. }
  36. return gfx_buffer_handle;
  37. }
  38. } // namespace
  39. media::mojom::VideoBufferHandlePtr ConvertToMediaVideoBuffer(
  40. crosapi::mojom::VideoBufferHandlePtr buffer_handle) {
  41. if (buffer_handle->is_shared_buffer_handle()) {
  42. // TODO(https://crbug.com/1307959): The LaCrOS interface should be migrated
  43. // to use base::UnsafeSharedMemoryRegion as well.
  44. return media::mojom::VideoBufferHandle::NewUnsafeShmemRegion(
  45. base::UnsafeSharedMemoryRegion::Deserialize(
  46. mojo::UnwrapPlatformSharedMemoryRegion(
  47. std::move(buffer_handle->get_shared_buffer_handle()))));
  48. } else if (buffer_handle->is_gpu_memory_buffer_handle()) {
  49. return media::mojom::VideoBufferHandle::NewGpuMemoryBufferHandle(
  50. ToGfxGpuMemoryBufferHandle(
  51. std::move(buffer_handle->get_gpu_memory_buffer_handle())));
  52. } else if (buffer_handle->is_read_only_shmem_region()) {
  53. return media::mojom::VideoBufferHandle::NewReadOnlyShmemRegion(
  54. std::move(buffer_handle->get_read_only_shmem_region()));
  55. } else {
  56. NOTREACHED() << "Unexpected new buffer type";
  57. }
  58. return nullptr;
  59. }
  60. media::mojom::VideoFrameInfoPtr ConvertToMediaVideoFrameInfo(
  61. crosapi::mojom::VideoFrameInfoPtr buffer_info) {
  62. auto video_capture_buffer_info = media::mojom::VideoFrameInfo::New();
  63. video_capture_buffer_info->timestamp = buffer_info->timestamp;
  64. video_capture_buffer_info->pixel_format = buffer_info->pixel_format;
  65. video_capture_buffer_info->coded_size = buffer_info->coded_size;
  66. video_capture_buffer_info->visible_rect = buffer_info->visible_rect;
  67. video_capture_buffer_info->color_space.emplace();
  68. media::VideoFrameMetadata media_frame_metadata;
  69. switch (buffer_info->rotation) {
  70. case crosapi::mojom::VideoRotation::kVideoRotation0:
  71. media_frame_metadata.transformation =
  72. media::VideoTransformation(media::VideoRotation::VIDEO_ROTATION_0);
  73. break;
  74. case crosapi::mojom::VideoRotation::kVideoRotation90:
  75. media_frame_metadata.transformation =
  76. media::VideoTransformation(media::VideoRotation::VIDEO_ROTATION_90);
  77. break;
  78. case crosapi::mojom::VideoRotation::kVideoRotation180:
  79. media_frame_metadata.transformation =
  80. media::VideoTransformation(media::VideoRotation::VIDEO_ROTATION_180);
  81. break;
  82. case crosapi::mojom::VideoRotation::kVideoRotation270:
  83. media_frame_metadata.transformation =
  84. media::VideoTransformation(media::VideoRotation::VIDEO_ROTATION_270);
  85. break;
  86. }
  87. media_frame_metadata.reference_time = buffer_info->reference_time;
  88. video_capture_buffer_info->metadata = std::move(media_frame_metadata);
  89. return video_capture_buffer_info;
  90. }
  91. } // namespace video_capture