[TTVD] Migrate from V4L2 color format usage 52/315152/3
authorJakub Gajownik <j.gajownik2@samsung.com>
Tue, 23 Jul 2024 18:07:45 +0000 (20:07 +0200)
committerBot Blink <blinkbot@samsung.com>
Fri, 26 Jul 2024 08:35:35 +0000 (08:35 +0000)
Before this change, we were using V4L2 headers for color
format values when converting decoded frame informations.
However, this package is problematic because of limited
access on licensing platforms.
This commit changes usage to platform packages with have
same values as V4L2 original package and are intended to
be used in upper layers.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-540
Change-Id: Ief0bc7ef238dcade5f67d497b35bb5d809dc3d2b
Signed-off-by: Jakub Gajownik <j.gajownik2@samsung.com>
media/filters/BUILD.gn
media/filters/tizen/omx/omx_facade_video.cc
media/filters/tizen/video_utils.cc [new file with mode: 0644]
media/filters/tizen/video_utils.h [new file with mode: 0644]

index 2a71b5e0c6c012ed35fa658f0a608b26d79b1190..64759f602c1b4fbdcc2e31cf741e707cbcda42fb 100644 (file)
@@ -342,6 +342,8 @@ source_set("filters") {
       "tizen/video_decoding_capabilities.h",
       "tizen/video_frame_utils.cc",
       "tizen/video_frame_utils.h",
+      "tizen/video_utils.cc",
+      "tizen/video_utils.h",
     ]
   }
 
index 6a7664905a16cae82bcee6116f0823732dfdfa0f..e2ac243cb6526ef03cf3916762941049640de32f 100644 (file)
@@ -12,6 +12,7 @@
 #include "media/base/tizen/logger/media_logger.h"
 #include "media/filters/tizen/media_video_codec.h"
 #include "media/filters/tizen/omx/omx_utils.h"
+#include "media/filters/tizen/video_utils.h"
 
 namespace media {
 
@@ -22,38 +23,6 @@ static constexpr uint32_t kAllocationAlignment = 1024 * 1024 * 2 - 1;
 }
 
 namespace {
-MediaVideoPixelFormat ConvertToMediaPixelFormat(
-    uint32_t num_planes,
-    v4l2_drm_colorformat_type colorformat) {
-  switch (colorformat) {
-    case V4L2_DRM_COLORFORMAT_RGB444:
-    case V4L2_DRM_COLORFORMAT_YUV444:
-    case V4L2_DRM_COLORFORMAT_YUV420:
-      if (num_planes == 0) {
-        return MediaVideoPixelFormat::kPixelFormatTiled;
-      }
-      break;
-    case V4L2_DRM_COLORFORMAT_YUV422:
-      if (num_planes == 2) {
-        return MediaVideoPixelFormat::kPixelFormatNV16;
-      }
-      break;
-    case V4L2_DRM_COLORFORMAT_YC:
-      if (num_planes == 2) {
-        return MediaVideoPixelFormat::kPixelFormatNV12;
-      }
-      break;
-#if TIZEN_VERSION_AT_LEAST(8, 0, 0)
-    case V4L2_DRM_COLORFORMAT_RGB444_10:
-      break;
-#endif  // TIZEN_VERSION_AT_LEAST(8, 0, 0)
-  }
-  TIZEN_MEDIA_LOG_NO_INSTANCE(WARNING)
-      << "Cannot convert to pixel format, num planes: " << num_planes
-      << ", colorformat: " << colorformat;
-  return MediaVideoPixelFormat::kPixelFormatUnknown;
-}
-
 uint32_t CountPlanes(const OmxFacadeVideo::OutputData& output_data) {
   uint32_t result = 0;
   if (output_data.nv12_data.y_data == nullptr) {
@@ -383,8 +352,8 @@ void OmxFacadeVideo::HandleOutputData() {
   output_data.eos = (output_buf_hdr_->nFlags & OMX_BUFFERFLAG_EOS);
 
   uint32_t num_planes = CountPlanes(output_data);
-  output_data.pixel_format = ConvertToMediaPixelFormat(
-      num_planes, drm->u.dec_info.pFrame[0].colorformat);
+  output_data.pixel_format = ConvertPlatformToMediaPixelFormat(
+      num_planes, static_cast<uint32_t>(drm->u.dec_info.pFrame[0].colorformat));
 
   TIZEN_MEDIA_LOG(VERBOSE) << "Output cb: " << output_data.timestamp;
   output_cb_.Run(output_data);
diff --git a/media/filters/tizen/video_utils.cc b/media/filters/tizen/video_utils.cc
new file mode 100644 (file)
index 0000000..6d5d4ec
--- /dev/null
@@ -0,0 +1,103 @@
+// 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/filters/tizen/video_utils.h"
+
+#include "absl/types/optional.h"
+#include "build/tizen_version.h"
+#include "media/base/tizen/logger/media_logger.h"
+
+#if TIZEN_VERSION_AT_LEAST(8, 0, 0)
+#include <video-common-defs.h>
+#else
+#include <ivideo-renderer.hpp>
+#endif  // TIZEN_VERSION_AT_LEAST(8, 0, 0)
+
+namespace media {
+
+namespace {
+// For internal usage only. We cannot use any existing struct for this, as
+// packages changes between Tizen versions. Instead, treat this as internal
+// intermediate enum with following conversion:
+// platform -> internal -> MediaVideoPixelFormat
+enum class PixelFormat {
+  kRGB444,
+  kYUV444,
+  kYUV422,
+  kYUV420,
+  kNV12,
+  kYUV444_10BIT,
+};
+
+absl::optional<PixelFormat> PlatformToPixelFormat(uint32_t color_format) {
+#if TIZEN_VERSION_AT_LEAST(8, 0, 0)
+  switch (color_format) {
+    case VIDEORCTRL_COLORFORMAT_RGB444:
+      return PixelFormat::kRGB444;
+    case VIDEORCTRL_COLORFORMAT_YUV444:
+      return PixelFormat::kYUV444;
+    case VIDEORCTRL_COLORFORMAT_YUV422:
+      return PixelFormat::kYUV422;
+    case VIDEORCTRL_COLORFORMAT_YUV420:
+      return PixelFormat::kYUV420;
+    case VIDEORCTRL_COLORFORMAT_YC:
+      return PixelFormat::kNV12;
+    case VIDEORCTRL_COLORFORMAT_RGB444_10:
+      return PixelFormat::kYUV444_10BIT;
+  }
+#else
+  switch (color_format) {
+    case IVideoRenderer::ColorFormatType::COLORFORMAT_RGB444:
+      return PixelFormat::kRGB444;
+    case IVideoRenderer::ColorFormatType::COLORFORMAT_YUV444:
+      return PixelFormat::kYUV444;
+    case IVideoRenderer::ColorFormatType::COLORFORMAT_YUV420:
+      return PixelFormat::kYUV420;
+    case IVideoRenderer::ColorFormatType::COLORFORMAT_YUV422:
+      return PixelFormat::kYUV422;
+    case IVideoRenderer::ColorFormatType::COLORFORMAT_YC:
+      return PixelFormat::kNV12;
+  }
+#endif  // TIZEN_VERSION_AT_LEAST(8, 0, 0)
+  return absl::nullopt;
+}
+}  // namespace
+
+MediaVideoPixelFormat ConvertPlatformToMediaPixelFormat(uint32_t num_planes,
+                                                        uint32_t color_format) {
+  const auto pixel_format = PlatformToPixelFormat(color_format);
+  if (!pixel_format) {
+    TIZEN_MEDIA_LOG_NO_INSTANCE(WARNING)
+        << "Unknown color format: " << color_format;
+    return MediaVideoPixelFormat::kPixelFormatUnknown;
+  }
+
+  switch (*pixel_format) {
+    case PixelFormat::kRGB444:
+    case PixelFormat::kYUV444:
+    case PixelFormat::kYUV420:
+      if (num_planes == 0) {
+        return MediaVideoPixelFormat::kPixelFormatTiled;
+      }
+      break;
+    case PixelFormat::kYUV422:
+      if (num_planes == 2) {
+        return MediaVideoPixelFormat::kPixelFormatNV16;
+      }
+      break;
+    case PixelFormat::kNV12:
+      if (num_planes == 2) {
+        return MediaVideoPixelFormat::kPixelFormatNV12;
+      }
+      break;
+    case PixelFormat::kYUV444_10BIT:
+      break;
+  }
+  TIZEN_MEDIA_LOG_NO_INSTANCE(WARNING)
+      << "Cannot convert to pixel format, num planes: " << num_planes
+      << ", colorformat: " << color_format;
+  return MediaVideoPixelFormat::kPixelFormatUnknown;
+}
+
+}  // namespace media
diff --git a/media/filters/tizen/video_utils.h b/media/filters/tizen/video_utils.h
new file mode 100644 (file)
index 0000000..3957fde
--- /dev/null
@@ -0,0 +1,17 @@
+// 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_FILTERS_TIZEN_VIDEO_UTILS_H_
+#define MEDIA_FILTERS_TIZEN_VIDEO_UTILS_H_
+
+#include "media/filters/tizen/media_video_codec.h"
+
+namespace media {
+
+MediaVideoPixelFormat ConvertPlatformToMediaPixelFormat(uint32_t num_planes,
+                                                        uint32_t color_format);
+
+}  // namespace media
+
+#endif  // MEDIA_FILTERS_TIZEN_VIDEO_UTILS_H_