mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
c6a6c56cdf
* 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>
260 lines
9.2 KiB
C
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
|
|
|