gstreamer/subprojects/gst-plugins-bad/sys/win32ipc/protocol/win32ipcprotocol.h
Seungha Yang c6a6c56cdf win32ipc: Add support for zero-copy rendering
* Extend protocol so that client can notify of releasing shared memory
* Server will hold shared memory object until it's released by client
* Add allocator/buffer pool to reuse shared memory objects and buffers

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3765>
2023-01-27 18:55:13 +00:00

260 lines
9.2 KiB
C

/* GStreamer
* Copyright (C) 2022 Seungha Yang <seungha@centricular.com>
*
* 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 <windows.h>
#include <gst/gst.h>
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