/* GStreamer * Copyright (C) 2023 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 #include "gstdwrite-utils.h" GType gst_dwrite_subtitle_meta_api_get_type (void) { static GType type = 0; static const gchar *tags[] = { NULL, }; GST_DWRITE_CALL_ONCE_BEGIN { type = gst_meta_api_type_register ("GstDWriteSubtitleMetaAPI", tags); } GST_DWRITE_CALL_ONCE_END; return type; } static gboolean gst_dwrite_subtitle_meta_init (GstMeta * meta, gpointer params, GstBuffer * buffer) { GstDWriteSubtitleMeta *m = (GstDWriteSubtitleMeta *) meta; m->stream = NULL; m->subtitle = NULL; return TRUE; } static void gst_dwrite_subtitle_meta_free (GstMeta * meta, GstBuffer * buffer) { GstDWriteSubtitleMeta *m = (GstDWriteSubtitleMeta *) meta; if (m->stream) gst_object_unref (m->stream); if (m->subtitle) gst_buffer_unref (m->subtitle); } static gboolean gst_dwrite_subtitle_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstDWriteSubtitleMeta *dmeta, *smeta; if (GST_META_TRANSFORM_IS_COPY (type)) { smeta = (GstDWriteSubtitleMeta *) meta; dmeta = gst_buffer_add_dwrite_subtitle_meta (dest, smeta->stream, smeta->subtitle); if (!dmeta) return FALSE; } else { return FALSE; } return TRUE; } const GstMetaInfo * gst_dwrite_subtitle_meta_get_info (void) { static const GstMetaInfo *info = NULL; GST_DWRITE_CALL_ONCE_BEGIN { info = gst_meta_register (GST_DWRITE_SUBTITLE_META_API_TYPE, "GstDWriteSubtitleMeta", sizeof (GstDWriteSubtitleMeta), gst_dwrite_subtitle_meta_init, gst_dwrite_subtitle_meta_free, gst_dwrite_subtitle_meta_transform); } GST_DWRITE_CALL_ONCE_END; return info; } GstDWriteSubtitleMeta * gst_buffer_add_dwrite_subtitle_meta (GstBuffer * buffer, GstStream * stream, GstBuffer * subtitle) { GstDWriteSubtitleMeta *meta; g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL); g_return_val_if_fail (GST_IS_STREAM (stream), NULL); g_return_val_if_fail (GST_IS_BUFFER (subtitle), NULL); meta = (GstDWriteSubtitleMeta *) gst_buffer_add_meta (buffer, GST_DWRITE_SUBTITLE_META_INFO, NULL); if (!meta) return NULL; meta->stream = (GstStream *) gst_object_ref (stream); meta->subtitle = gst_buffer_ref (subtitle); return meta; } gboolean gst_dwrite_is_windows_10_or_greater (void) { static gboolean ret = FALSE; GST_DWRITE_CALL_ONCE_BEGIN { #if (!GST_D3D11_WINAPI_ONLY_APP) OSVERSIONINFOEXW osverinfo; typedef NTSTATUS (WINAPI fRtlGetVersion) (PRTL_OSVERSIONINFOEXW); fRtlGetVersion *RtlGetVersion = NULL; HMODULE hmodule = NULL; memset (&osverinfo, 0, sizeof (OSVERSIONINFOEXW)); osverinfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXW); hmodule = LoadLibraryW (L"ntdll.dll"); if (!hmodule) return; RtlGetVersion = (fRtlGetVersion *) GetProcAddress (hmodule, "RtlGetVersion"); if (RtlGetVersion) { RtlGetVersion (&osverinfo); if (osverinfo.dwMajorVersion > 10 || osverinfo.dwMajorVersion == 10) ret = TRUE; } if (hmodule) FreeLibrary (hmodule); #else ret = TRUE; #endif } GST_DWRITE_CALL_ONCE_END; return ret; }