/* GStreamer * Copyright (C) 2022 Seungha Yang * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * SPDX-License-Identifier: MIT */ #pragma once #include #include G_BEGIN_DECLS /* * Communication Sequence * * +--------+ +--------+ * | client | | server | * +--------+ +--------+ * | | * +--------- NEED-DATA ---------->| * | +-------+ * | | prepare named * | | shared-memory * | +<------+ * +<-- HAVE-DATA (w/ shm name) ---| * +--------+ | * Open named | | * shared-memory | | * +------->+ | * |--------- READ-DONE ---------->| * | | * +--------+ | * release | | * shared-memory | | * +--------| | * |------- RELEASE-Data---------->| */ typedef enum { WIN32_IPC_PKT_UNKNOWN, WIN32_IPC_PKT_NEED_DATA, WIN32_IPC_PKT_HAVE_DATA, WIN32_IPC_PKT_READ_DONE, WIN32_IPC_PKT_RELEASE_DATA, } Win32IpcPktType; /* Same as GstVideoFormat */ typedef enum { WIN32_IPC_VIDEO_FORMAT_UNKNOWN, WIN32_IPC_VIDEO_FORMAT_ENCODED, WIN32_IPC_VIDEO_FORMAT_I420, WIN32_IPC_VIDEO_FORMAT_YV12, WIN32_IPC_VIDEO_FORMAT_YUY2, WIN32_IPC_VIDEO_FORMAT_UYVY, WIN32_IPC_VIDEO_FORMAT_AYUV, WIN32_IPC_VIDEO_FORMAT_RGBx, WIN32_IPC_VIDEO_FORMAT_BGRx, WIN32_IPC_VIDEO_FORMAT_xRGB, WIN32_IPC_VIDEO_FORMAT_xBGR, WIN32_IPC_VIDEO_FORMAT_RGBA, WIN32_IPC_VIDEO_FORMAT_BGRA, WIN32_IPC_VIDEO_FORMAT_ARGB, WIN32_IPC_VIDEO_FORMAT_ABGR, WIN32_IPC_VIDEO_FORMAT_RGB, WIN32_IPC_VIDEO_FORMAT_BGR, WIN32_IPC_VIDEO_FORMAT_Y41B, WIN32_IPC_VIDEO_FORMAT_Y42B, WIN32_IPC_VIDEO_FORMAT_YVYU, WIN32_IPC_VIDEO_FORMAT_Y444, WIN32_IPC_VIDEO_FORMAT_v210, WIN32_IPC_VIDEO_FORMAT_v216, WIN32_IPC_VIDEO_FORMAT_NV12, WIN32_IPC_VIDEO_FORMAT_NV21, WIN32_IPC_VIDEO_FORMAT_GRAY8, WIN32_IPC_VIDEO_FORMAT_GRAY16_BE, WIN32_IPC_VIDEO_FORMAT_GRAY16_LE, WIN32_IPC_VIDEO_FORMAT_v308, WIN32_IPC_VIDEO_FORMAT_RGB16, WIN32_IPC_VIDEO_FORMAT_BGR16, WIN32_IPC_VIDEO_FORMAT_RGB15, WIN32_IPC_VIDEO_FORMAT_BGR15, WIN32_IPC_VIDEO_FORMAT_UYVP, WIN32_IPC_VIDEO_FORMAT_A420, WIN32_IPC_VIDEO_FORMAT_RGB8P, WIN32_IPC_VIDEO_FORMAT_YUV9, WIN32_IPC_VIDEO_FORMAT_YVU9, WIN32_IPC_VIDEO_FORMAT_IYU1, WIN32_IPC_VIDEO_FORMAT_ARGB64, WIN32_IPC_VIDEO_FORMAT_AYUV64, WIN32_IPC_VIDEO_FORMAT_r210, WIN32_IPC_VIDEO_FORMAT_I420_10BE, WIN32_IPC_VIDEO_FORMAT_I420_10LE, WIN32_IPC_VIDEO_FORMAT_I422_10BE, WIN32_IPC_VIDEO_FORMAT_I422_10LE, WIN32_IPC_VIDEO_FORMAT_Y444_10BE, WIN32_IPC_VIDEO_FORMAT_Y444_10LE, WIN32_IPC_VIDEO_FORMAT_GBR, WIN32_IPC_VIDEO_FORMAT_GBR_10BE, WIN32_IPC_VIDEO_FORMAT_GBR_10LE, WIN32_IPC_VIDEO_FORMAT_NV16, WIN32_IPC_VIDEO_FORMAT_NV24, WIN32_IPC_VIDEO_FORMAT_NV12_64Z32, WIN32_IPC_VIDEO_FORMAT_A420_10BE, WIN32_IPC_VIDEO_FORMAT_A420_10LE, WIN32_IPC_VIDEO_FORMAT_A422_10BE, WIN32_IPC_VIDEO_FORMAT_A422_10LE, WIN32_IPC_VIDEO_FORMAT_A444_10BE, WIN32_IPC_VIDEO_FORMAT_A444_10LE, WIN32_IPC_VIDEO_FORMAT_NV61, WIN32_IPC_VIDEO_FORMAT_P010_10BE, WIN32_IPC_VIDEO_FORMAT_P010_10LE, WIN32_IPC_VIDEO_FORMAT_IYU2, WIN32_IPC_VIDEO_FORMAT_VYUY, WIN32_IPC_VIDEO_FORMAT_GBRA, WIN32_IPC_VIDEO_FORMAT_GBRA_10BE, WIN32_IPC_VIDEO_FORMAT_GBRA_10LE, WIN32_IPC_VIDEO_FORMAT_GBR_12BE, WIN32_IPC_VIDEO_FORMAT_GBR_12LE, WIN32_IPC_VIDEO_FORMAT_GBRA_12BE, WIN32_IPC_VIDEO_FORMAT_GBRA_12LE, WIN32_IPC_VIDEO_FORMAT_I420_12BE, WIN32_IPC_VIDEO_FORMAT_I420_12LE, WIN32_IPC_VIDEO_FORMAT_I422_12BE, WIN32_IPC_VIDEO_FORMAT_I422_12LE, WIN32_IPC_VIDEO_FORMAT_Y444_12BE, WIN32_IPC_VIDEO_FORMAT_Y444_12LE, WIN32_IPC_VIDEO_FORMAT_GRAY10_LE32, WIN32_IPC_VIDEO_FORMAT_NV12_10LE32, WIN32_IPC_VIDEO_FORMAT_NV16_10LE32, WIN32_IPC_VIDEO_FORMAT_NV12_10LE40, WIN32_IPC_VIDEO_FORMAT_Y210, WIN32_IPC_VIDEO_FORMAT_Y410, WIN32_IPC_VIDEO_FORMAT_VUYA, WIN32_IPC_VIDEO_FORMAT_BGR10A2_LE, WIN32_IPC_VIDEO_FORMAT_RGB10A2_LE, WIN32_IPC_VIDEO_FORMAT_Y444_16BE, WIN32_IPC_VIDEO_FORMAT_Y444_16LE, WIN32_IPC_VIDEO_FORMAT_P016_BE, WIN32_IPC_VIDEO_FORMAT_P016_LE, WIN32_IPC_VIDEO_FORMAT_P012_BE, WIN32_IPC_VIDEO_FORMAT_P012_LE, WIN32_IPC_VIDEO_FORMAT_Y212_BE, WIN32_IPC_VIDEO_FORMAT_Y212_LE, WIN32_IPC_VIDEO_FORMAT_Y412_BE, WIN32_IPC_VIDEO_FORMAT_Y412_LE, WIN32_IPC_VIDEO_FORMAT_NV12_4L4, WIN32_IPC_VIDEO_FORMAT_NV12_32L32, WIN32_IPC_VIDEO_FORMAT_RGBP, WIN32_IPC_VIDEO_FORMAT_BGRP, WIN32_IPC_VIDEO_FORMAT_AV12, WIN32_IPC_VIDEO_FORMAT_ARGB64_LE, WIN32_IPC_VIDEO_FORMAT_ARGB64_BE, WIN32_IPC_VIDEO_FORMAT_RGBA64_LE, WIN32_IPC_VIDEO_FORMAT_RGBA64_BE, WIN32_IPC_VIDEO_FORMAT_BGRA64_LE, WIN32_IPC_VIDEO_FORMAT_BGRA64_BE, WIN32_IPC_VIDEO_FORMAT_ABGR64_LE, WIN32_IPC_VIDEO_FORMAT_ABGR64_BE, WIN32_IPC_VIDEO_FORMAT_NV12_16L32S, WIN32_IPC_VIDEO_FORMAT_NV12_8L128, WIN32_IPC_VIDEO_FORMAT_NV12_10BE_8L128, } Win32IpcVideoFormat; typedef struct { Win32IpcVideoFormat format; UINT32 width; UINT32 height; UINT32 fps_n; UINT32 fps_d; UINT32 par_n; UINT32 par_d; /* the size of memory */ UINT64 size; /* plane offsets */ UINT64 offset[4]; /* stride of each plane */ UINT32 stride[4]; /* QPC time */ UINT64 qpc; } Win32IpcVideoInfo; /* 1 byte (type) + 8 byte (seq-num) */ #define WIN32_IPC_PKT_NEED_DATA_SIZE 9 /* 1 byte (type) + 8 byte (seq-num) + N bytes (name) + 4 (format) + * 4 (width) + 4 (height) + 4 (fps_n) + 4 (fps_d) + 4 (par_n) + 4 (par_d) + * 8 (size) + 8 * 4 (offset) + 4 * 4 (stride) + 8 (timestamp) */ #define WIN32_IPC_PKT_HAVE_DATA_SIZE 101 /* 1 byte (type) + 8 byte (seq-num) */ #define WIN32_IPC_PKT_READ_DONE_SIZE 5 const char * win32_ipc_pkt_type_to_string (Win32IpcPktType type); Win32IpcPktType win32_ipc_pkt_type_from_raw (UINT8 type); UINT8 win32_ipc_pkt_type_to_raw (Win32IpcPktType type); UINT32 win32_ipc_pkt_build_need_data (UINT8 * pkt, UINT32 pkt_size, UINT64 seq_num); BOOL win32_ipc_pkt_parse_need_data (UINT8 * pkt, UINT32 pkt_size, UINT64 * seq_num); UINT32 win32_ipc_pkt_build_have_data (UINT8 * pkt, UINT32 pkt_size, UINT64 seq_num, const char * mmf_name, const Win32IpcVideoInfo * info); BOOL win32_ipc_pkt_parse_have_data (UINT8 * pkt, UINT32 pkt_size, UINT64 * seq_num, char * mmf_name, Win32IpcVideoInfo * info); UINT32 win32_ipc_pkt_build_read_done (UINT8 * pkt, UINT32 pkt_size, UINT64 seq_num); BOOL win32_ipc_pkt_parse_read_done (UINT8 * pkt, UINT32 pkt_size, UINT64 * seq_num); UINT32 win32_ipc_pkt_build_release_data (UINT8 * pkt, UINT32 pkt_size, UINT64 seq_num, const char * mmf_name); BOOL win32_ipc_pkt_parse_release_data (UINT8 * pkt, UINT32 pkt_size, UINT64 * seq_num, char * mmf_name); G_END_DECLS