mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-21 07:46:38 +00:00
4f846540cb
Windows supports various IPC methods but that's completely different form that of *nix from implementation point of view. So, instead of adding shared memory functionality to existing shm plugin, new WIN32 shared memory source/sink elements are implemented in this commit. Each videosink (server) and videosrc (client) pair will communicate using WIN32 named pipe and thus user should configure unique/proper pipe name to them (e.g., \\.\pipe\MyPipeName). Once connection is established, videosink will create named shared memory object per frame and client will be able to consume the object (i.e., memory mapped file handle) without additional copy operation. Note that implementations under "protocol" directory are almost pure C/C++ with WIN32 APIs except for a few defines and debug functions. So, applications can take only the protocol part so that the application can send/receive shared-memory object from/to the other end even if it's not an actual GStreamer element. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3441>
71 lines
1.9 KiB
C++
71 lines
1.9 KiB
C++
/* GStreamer
|
|
* Copyright (C) 2022 Seungha Yang <seungha@centricular.com>
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#include "gstwin32ipcutils.h"
|
|
#include <windows.h>
|
|
#include <string>
|
|
#include <mutex>
|
|
|
|
static ULONG global_index = 0;
|
|
|
|
static DWORD
|
|
gst_win32_ipc_get_pid (void)
|
|
{
|
|
static std::once_flag once_flag;
|
|
static DWORD pid = 0;
|
|
|
|
std::call_once (once_flag,[&]() {
|
|
pid = GetCurrentProcessId ();
|
|
});
|
|
|
|
return pid;
|
|
}
|
|
|
|
/* Create unique prefix for named shared memory */
|
|
gchar *
|
|
gst_win32_ipc_get_mmf_prefix (void)
|
|
{
|
|
std::string prefix = "Local\\gst.win32.ipc." +
|
|
std::to_string (gst_win32_ipc_get_pid ()) + std::string (".") +
|
|
std::to_string (InterlockedIncrement (&global_index)) + std::string (".");
|
|
|
|
return g_strdup (prefix.c_str ());
|
|
}
|
|
|
|
gboolean
|
|
gst_win32_ipc_clock_is_qpc (GstClock * clock)
|
|
{
|
|
GstClockType clock_type = GST_CLOCK_TYPE_MONOTONIC;
|
|
GstClock *mclock;
|
|
|
|
if (G_OBJECT_TYPE (clock) != GST_TYPE_SYSTEM_CLOCK)
|
|
return FALSE;
|
|
|
|
g_object_get (clock, "clock-type", &clock_type, nullptr);
|
|
if (clock_type != GST_CLOCK_TYPE_MONOTONIC)
|
|
return FALSE;
|
|
|
|
mclock = gst_clock_get_master (clock);
|
|
if (!mclock)
|
|
return TRUE;
|
|
|
|
gst_object_unref (mclock);
|
|
|
|
return FALSE;
|
|
}
|