[WebRTC][Camera] Add dedicated buffer accessors 95/318995/2 submit/tizen/20241013.160017
authorJakub Gajownik <j.gajownik2@samsung.com>
Tue, 8 Oct 2024 07:08:46 +0000 (09:08 +0200)
committerBot Blink <blinkbot@samsung.com>
Fri, 11 Oct 2024 19:59:16 +0000 (19:59 +0000)
Keep I420/NV12 buffer helpers in dedicated file as it
might be reused from other camera-related sources.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-595
Change-Id: I0268a6045030d25aaf489769b61cc0a5a7a78d14
Signed-off-by: Jakub Gajownik <j.gajownik2@samsung.com>
media/capture/BUILD.gn
media/capture/video/tizen/buffer_helper.cc [new file with mode: 0644]
media/capture/video/tizen/buffer_helper.h [new file with mode: 0644]
media/capture/video/tizen/video_capture_device_tizen_tv.cc

index 987a9e3bf9adb2d53aec6f2e8a8aecfffb8d3b75..9b77856459679d1644d7e45aab5a707c82f38f15 100644 (file)
@@ -189,6 +189,8 @@ component("capture_lib") {
       sources += [
         "video/tizen/ai_zoom_helper.cc",
         "video/tizen/ai_zoom_helper.h",
+        "video/tizen/buffer_helper.cc",
+        "video/tizen/buffer_helper.h",
         "video/tizen/camera.cc",
         "video/tizen/camera.h",
         "video/tizen/camera_utils.cc",
diff --git a/media/capture/video/tizen/buffer_helper.cc b/media/capture/video/tizen/buffer_helper.cc
new file mode 100644 (file)
index 0000000..9808eca
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright 2024 Samsung Electronics Inc. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/capture/video/tizen/buffer_helper.h"
+
+namespace media {
+
+I420BufferAccess GetI420BufferAccess(base::span<uint8_t> data,
+                                     const gfx::Size& dimensions) {
+  I420BufferAccess result;
+  result.y_plane_data = data.data();
+  result.u_plane_data =
+      result.y_plane_data +
+      media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
+                                   media::VideoFrame::kYPlane, dimensions)
+          .GetArea();
+  result.v_plane_data =
+      result.u_plane_data +
+      media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
+                                   media::VideoFrame::kUPlane, dimensions)
+          .GetArea();
+  result.y_plane_stride = VideoFrame::RowBytes(
+      VideoFrame::kYPlane, PIXEL_FORMAT_I420, dimensions.width());
+  result.uv_plane_stride = VideoFrame::RowBytes(
+      VideoFrame::kUVPlane, PIXEL_FORMAT_I420, dimensions.width());
+  return result;
+}
+
+I420BufferAccessStorage GetI420BufferAccess(
+    const media::VideoCaptureDevice::Client::Buffer& buffer,
+    const gfx::Size& dimensions) {
+  auto storage = buffer.handle_provider->GetHandleForInProcessAccess();
+  I420BufferAccessStorage result{GetI420BufferAccess(
+      base::span(storage->data(), storage->mapped_size()), dimensions)};
+  result.storage = std::move(storage);
+  return result;
+}
+
+NV12BufferAccess GetNV12BufferAccess(base::span<uint8_t> data,
+                                     const gfx::Size& dimensions) {
+  NV12BufferAccess result;
+  result.y_plane_data = data.data();
+  result.uv_plane_data =
+      result.y_plane_data +
+      media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_NV12,
+                                   media::VideoFrame::kYPlane, dimensions)
+          .GetArea();
+  result.y_plane_stride = VideoFrame::RowBytes(
+      VideoFrame::kYPlane, PIXEL_FORMAT_NV12, dimensions.width());
+  result.uv_plane_stride = VideoFrame::RowBytes(
+      VideoFrame::kUVPlane, PIXEL_FORMAT_NV12, dimensions.width());
+  return result;
+}
+
+NV12BufferAccessStorage GetNV12BufferAccess(
+    const media::VideoCaptureDevice::Client::Buffer& buffer,
+    const gfx::Size& dimensions) {
+  auto storage = buffer.handle_provider->GetHandleForInProcessAccess();
+  NV12BufferAccessStorage result{GetNV12BufferAccess(
+      base::span(storage->data(), storage->mapped_size()), dimensions)};
+  result.storage = std::move(storage);
+  return result;
+}
+
+}  // namespace media
diff --git a/media/capture/video/tizen/buffer_helper.h b/media/capture/video/tizen/buffer_helper.h
new file mode 100644 (file)
index 0000000..dc8317d
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright 2024 Samsung Electronics Inc. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_CAPTURE_VIDEO_TIZEN_BUFFER_HELPER_H_
+#define MEDIA_CAPTURE_VIDEO_TIZEN_BUFFER_HELPER_H_
+
+#include <memory>
+
+#include "base/containers/span.h"
+#include "media/capture/video/video_capture_buffer_handle.h"
+#include "media/capture/video/video_capture_device.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace media {
+
+struct I420BufferAccess {
+  uint8_t* y_plane_data;
+  uint8_t* u_plane_data;
+  uint8_t* v_plane_data;
+  int y_plane_stride;
+  int uv_plane_stride;
+};
+
+struct I420BufferAccessStorage : public I420BufferAccess {
+  std::unique_ptr<media::VideoCaptureBufferHandle> storage;
+};
+
+struct NV12BufferAccess {
+  uint8_t* y_plane_data;
+  uint8_t* uv_plane_data;
+  int y_plane_stride;
+  int uv_plane_stride;
+};
+
+struct NV12BufferAccessStorage : public NV12BufferAccess {
+  std::unique_ptr<media::VideoCaptureBufferHandle> storage;
+};
+
+I420BufferAccess GetI420BufferAccess(base::span<uint8_t> data,
+                                     const gfx::Size& dimensions);
+I420BufferAccessStorage GetI420BufferAccess(
+    const media::VideoCaptureDevice::Client::Buffer& buffer,
+    const gfx::Size& dimensions);
+
+NV12BufferAccess GetNV12BufferAccess(base::span<uint8_t> data,
+                                     const gfx::Size& dimensions);
+NV12BufferAccessStorage GetNV12BufferAccess(
+    const media::VideoCaptureDevice::Client::Buffer& buffer,
+    const gfx::Size& dimensions);
+
+}  // namespace media
+
+#endif  // MEDIA_CAPTURE_VIDEO_TIZEN_BUFFER_HELPER_H_
index 62090f13c3d5e4bb847194c1fbcb5d8386e685ce..9da9d70ecf68ae86f2385f711f5e8b8427586ab0 100644 (file)
@@ -30,6 +30,7 @@
 #include "media/base/video_types.h"
 #include "media/capture/capture_switches.h"
 #include "media/capture/video/tizen/ai_zoom_helper.h"
+#include "media/capture/video/tizen/buffer_helper.h"
 #include "media/capture/video/tizen/camera.h"
 #include "media/capture/video/tizen/camera_utils.h"
 #include "media/capture/video/video_capture_device.h"
@@ -479,39 +480,6 @@ void VideoCaptureDeviceTizenTv::Impl::ProcessEncodedCameraCapture(
 }
 
 namespace {
-
-struct I420BufferAccess {
-  uint8_t* y_plane_data;
-  uint8_t* u_plane_data;
-  uint8_t* v_plane_data;
-  int y_plane_stride;
-  int uv_plane_stride;
-  std::unique_ptr<media::VideoCaptureBufferHandle> storage;
-};
-
-I420BufferAccess GetI420BufferAccess(
-    const media::VideoCaptureDevice::Client::Buffer& buffer,
-    const gfx::Size& dimensions) {
-  I420BufferAccess result;
-  result.storage = buffer.handle_provider->GetHandleForInProcessAccess();
-  result.y_plane_data = result.storage->data();
-  result.u_plane_data =
-      result.y_plane_data +
-      media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
-                                   media::VideoFrame::kYPlane, dimensions)
-          .GetArea();
-  result.v_plane_data =
-      result.u_plane_data +
-      media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
-                                   media::VideoFrame::kUPlane, dimensions)
-          .GetArea();
-  result.y_plane_stride = VideoFrame::RowBytes(
-      VideoFrame::kYPlane, PIXEL_FORMAT_I420, dimensions.width());
-  result.uv_plane_stride = VideoFrame::RowBytes(
-      VideoFrame::kUVPlane, PIXEL_FORMAT_I420, dimensions.width());
-  return result;
-}
-
 libyuv::FourCC GetFourccFromPixelFormat(
     const media::VideoCaptureFormat& format) {
   switch (format.pixel_format) {