/* GStreamer * Copyright (C) 2020 Seungha Yang * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstd3d11format.h" #include "gstd3d11utils.h" #include "gstd3d11device.h" #include "gstd3d11memory.h" #include #ifndef GST_DISABLE_GST_DEBUG #define GST_CAT_DEFAULT ensure_debug_category() static GstDebugCategory * ensure_debug_category (void) { static gsize cat_gonce = 0; if (g_once_init_enter (&cat_gonce)) { gsize cat_done; cat_done = (gsize) _gst_debug_category_new ("d3d11format", 0, "d3d11 specific formats"); g_once_init_leave (&cat_gonce, cat_done); } return (GstDebugCategory *) cat_gonce; } #else #define ensure_debug_category() /* NOOP */ #endif /* GST_DISABLE_GST_DEBUG */ /** * gst_d3d11_dxgi_format_n_planes: * @format: a DXGI_FORMAT * * Returns: the number of planes for @format * * Since: 1.20 */ guint gst_d3d11_dxgi_format_n_planes (DXGI_FORMAT format) { switch (format) { case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R10G10B10A2_UNORM: case DXGI_FORMAT_AYUV: case DXGI_FORMAT_YUY2: case DXGI_FORMAT_R8_UNORM: case DXGI_FORMAT_R8G8_UNORM: case DXGI_FORMAT_R16_UNORM: case DXGI_FORMAT_R16G16_UNORM: case DXGI_FORMAT_G8R8_G8B8_UNORM: case DXGI_FORMAT_R8G8_B8G8_UNORM: case DXGI_FORMAT_Y210: case DXGI_FORMAT_Y410: case DXGI_FORMAT_R16G16B16A16_UNORM: return 1; case DXGI_FORMAT_NV12: case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: return 2; default: break; } return 0; } /** * gst_d3d11_dxgi_format_get_size: * @format: a DXGI_FORMAT * @width: a texture width * @height: a texture height * @pitch: a pitch of texture * @offset: offset for each plane * @stride: stride for each plane * @size: (out): required memory size for given format * * Calculate required memory size and per plane stride with * based on information * * Returns: %TRUE if @size can be calculated with given information * * Since: 1.20 */ gboolean gst_d3d11_dxgi_format_get_size (DXGI_FORMAT format, guint width, guint height, guint pitch, gsize offset[GST_VIDEO_MAX_PLANES], gint stride[GST_VIDEO_MAX_PLANES], gsize * size) { g_return_val_if_fail (format != DXGI_FORMAT_UNKNOWN, FALSE); switch (format) { case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R10G10B10A2_UNORM: case DXGI_FORMAT_AYUV: case DXGI_FORMAT_YUY2: case DXGI_FORMAT_R8_UNORM: case DXGI_FORMAT_R8G8_UNORM: case DXGI_FORMAT_R16_UNORM: case DXGI_FORMAT_R16G16_UNORM: case DXGI_FORMAT_G8R8_G8B8_UNORM: case DXGI_FORMAT_R8G8_B8G8_UNORM: case DXGI_FORMAT_Y210: case DXGI_FORMAT_Y410: case DXGI_FORMAT_R16G16B16A16_UNORM: offset[0] = 0; stride[0] = pitch; *size = pitch * height; break; case DXGI_FORMAT_NV12: case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: offset[0] = 0; stride[0] = pitch; offset[1] = offset[0] + stride[0] * height; stride[1] = pitch; *size = offset[1] + stride[1] * GST_ROUND_UP_2 (height / 2); break; default: return FALSE; } GST_LOG ("Calculated buffer size: %" G_GSIZE_FORMAT " (dxgi format:%d, %dx%d, Pitch %d)", *size, format, width, height, pitch); return TRUE; } /** * gst_d3d11_dxgi_format_to_gst: * @format: a DXGI_FORMAT * * Converts the @format to its #GstVideoFormat representation. * * Returns: a #GstVideoFormat equivalent to @format * * Since: 1.20 */ GstVideoFormat gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format) { switch (format) { case DXGI_FORMAT_B8G8R8A8_UNORM: return GST_VIDEO_FORMAT_BGRA; case DXGI_FORMAT_R8G8B8A8_UNORM: return GST_VIDEO_FORMAT_RGBA; case DXGI_FORMAT_R10G10B10A2_UNORM: return GST_VIDEO_FORMAT_RGB10A2_LE; case DXGI_FORMAT_AYUV: return GST_VIDEO_FORMAT_VUYA; case DXGI_FORMAT_YUY2: return GST_VIDEO_FORMAT_YUY2; case DXGI_FORMAT_Y210: return GST_VIDEO_FORMAT_Y210; case DXGI_FORMAT_Y410: return GST_VIDEO_FORMAT_Y410; case DXGI_FORMAT_NV12: return GST_VIDEO_FORMAT_NV12; case DXGI_FORMAT_P010: return GST_VIDEO_FORMAT_P010_10LE; case DXGI_FORMAT_P016: return GST_VIDEO_FORMAT_P016_LE; default: break; } return GST_VIDEO_FORMAT_UNKNOWN; }