Skip to content

api/api/buffer.h

Namespaces

Name
cvedia
cvedia::rt
API for controlling the server and lifecycle management of runtime instances.
cvedia::rt::iface
cvedia::rt::api
cvedia::rt::api::buffer

Functions

Name
cbuffer allocate(int width, int height, BufferDataType type, std::string const & transportUri ="cpu://")
Allocate new empty buffer (replaces createBuffer, clearer naming)
expected< cbuffer > fromData(int width, int height, BufferDataType type, void * data, size_t stride, std::string const & transportUri, BufferOwnership ownership, std::shared_ptr< void > const & keepAlive =nullptr)
Create buffer from raw data pointer - UNIFIED FUNCTION.
expected< cbuffer > fromInterop(void * nativeHandle, std::string const & sourceUri, std::string const & targetScheme, std::optional< cv::Rect2i > crop =std::nullopt)
Create buffer from hardware decoder interop (D3D11/VAAPI → OpenCL)
expected< cbuffer > fromInterop(void * nativeHandle, std::string const & sourceUri, std::string const & targetScheme, std::optional< cv::Rect2i > crop, std::shared_ptr< void > const & keepAlive)
Create buffer from hardware decoder interop with external lifecycle token.
expected< cbuffer > fromInterop(void * nativeHandle, std::string const & sourceUri, std::string const & targetScheme, std::optional< cv::Rect2i > crop, std::shared_ptr< void > const & keepAlive, void * sourceContext)
Create buffer from hardware decoder interop with explicit native display context.
expected< cbuffer > decodeImage(void const * compressedData, size_t dataSize, std::string const & transportUri ="cpu://")
Decode compressed image from memory (JPEG, PNG, etc.)
cbuffer mergeChannels(cbuffer const & r, cbuffer const & g, cbuffer const & b)
NODISCARD expected< cbuffer > createMotionBuffer(cbuffer const & source1, Rect const & region1, cbuffer const & source2, Rect const & region2, Size outputSize)
Create motion buffer from two grayscale/NV12 sources (fused operation)
cbuffer createBufferFromHorizontalConcat(cbuffer const & left, cbuffer const & right, std::string const & transportUri ="cpu://")
NODISCARD expected< cbuffer > loadImage(std::string const & imagePath, std::string const & transportUri ="cpu://")
cbuffer downloadAsGrayscale(cbuffer const & buffer)
NODISCARD expected< std::vector< uint8_t > > toJpeg(cbuffer const & buffer, int quality =85)
Encode buffer to JPEG format.

Functions Documentation

function allocate

cbuffer allocate(
    int width,
    int height,
    BufferDataType type,
    std::string const & transportUri ="cpu://"
)

Allocate new empty buffer (replaces createBuffer, clearer naming)

Creates buffer with newly allocated, managed memory. Buffer owns memory and frees on destruction.

function fromData

expected< cbuffer > fromData(
    int width,
    int height,
    BufferDataType type,
    void * data,
    size_t stride,
    std::string const & transportUri,
    BufferOwnership ownership,
    std::shared_ptr< void > const & keepAlive =nullptr
)

Create buffer from raw data pointer - UNIFIED FUNCTION.

Parameters:

  • ownership COPY=copies data, BORROW=zero-copy view, ADOPT=transfer ownership
  • keepAlive RAII token to keep external resource alive (optional)

Replaces: createFromData(), createFromBlob(), wrapBuffer(), adoptBuffer() Ownership parameter determines copy vs wrap vs adopt behavior.

COPY: Buffer allocates new memory, copies data, standard cleanup BORROW: Buffer references data directly, caller manages lifetime (or use keepAlive) ADOPT: Buffer takes ownership of data, releases when destroyed

keepAlive: shared_ptr to any RAII object. Buffer retains a copy and releases it only when fully destroyed. Use for decoder surfaces, mapped frames, etc.

function fromInterop

expected< cbuffer > fromInterop(
    void * nativeHandle,
    std::string const & sourceUri,
    std::string const & targetScheme,
    std::optional< cv::Rect2i > crop =std::nullopt
)

Create buffer from hardware decoder interop (D3D11/VAAPI → OpenCL)

Parameters:

  • nativeHandle ID3D11Texture2D* or VASurfaceID
  • sourceUri Source device transport URI (from decoder)
  • targetScheme Target backend scheme ("opencl")
  • crop Optional logical crop rectangle

Return: cbuffer with zero-copy interop, or error

function fromInterop

expected< cbuffer > fromInterop(
    void * nativeHandle,
    std::string const & sourceUri,
    std::string const & targetScheme,
    std::optional< cv::Rect2i > crop,
    std::shared_ptr< void > const & keepAlive
)

Create buffer from hardware decoder interop with external lifecycle token.

The keepAlive token is a shared_ptr to any RAII object that controls the lifetime of the native resource (e.g., a DX11 decoder surface). The backend will retain a copy of this token and only release it once it has fully released all interop resources, ensuring correct destruction order across derived buffers.

function fromInterop

expected< cbuffer > fromInterop(
    void * nativeHandle,
    std::string const & sourceUri,
    std::string const & targetScheme,
    std::optional< cv::Rect2i > crop,
    std::shared_ptr< void > const & keepAlive,
    void * sourceContext
)

Create buffer from hardware decoder interop with explicit native display context.

Parameters:

  • nativeHandle ID3D11Texture2D* or VASurfaceID
  • sourceUri Source device transport URI (from decoder)
  • targetScheme Target backend scheme ("opencl")
  • crop Optional logical crop rectangle
  • keepAlive RAII token to keep native resource alive
  • sourceContext Native display handle (VaapiInteropSourceContext* on Linux, ID3D11Device on Windows). On Linux, may include a per-decoder OpenCL command queue for parallel interop operations. If nullptr, the backend will look up the display from sourceUri.

Return: cbuffer with zero-copy interop, or error

This overload allows passing an explicit native display context (VADisplay on Linux, ID3D11Device on Windows) that the backend should use for interop. This is necessary when the decoder (e.g., VPL) creates its own display driver instance that differs from the one in the transport registry.

function decodeImage

expected< cbuffer > decodeImage(
    void const * compressedData,
    size_t dataSize,
    std::string const & transportUri ="cpu://"
)

Decode compressed image from memory (JPEG, PNG, etc.)

Replaces: loadImage(void*, int, ...) - renamed for clarity

function mergeChannels

cbuffer mergeChannels(
    cbuffer const & r,
    cbuffer const & g,
    cbuffer const & b
)

function createMotionBuffer

NODISCARD expected< cbuffer > createMotionBuffer(
    cbuffer const & source1,
    Rect const & region1,
    cbuffer const & source2,
    Rect const & region2,
    Size outputSize
)

Create motion buffer from two grayscale/NV12 sources (fused operation)

Parameters:

  • source1 First source buffer (GRAY or NV12)
  • region1 Absolute pixel region in source1
  • source2 Second source buffer (GRAY or NV12)
  • region2 Absolute pixel region in source2
  • outputSize Target dimensions for output buffer

Return: New BGR buffer with fused operation result

Extracts Y-plane from GRAY or NV12 sources, resizes regions to outputSize, and merges into BGR buffer where B=source1, G=source2, R=black. Transport is auto-selected (prefers GPU over CPU).

function createBufferFromHorizontalConcat

cbuffer createBufferFromHorizontalConcat(
    cbuffer const & left,
    cbuffer const & right,
    std::string const & transportUri ="cpu://"
)

function loadImage

NODISCARD expected< cbuffer > loadImage(
    std::string const & imagePath,
    std::string const & transportUri ="cpu://"
)

function downloadAsGrayscale

cbuffer downloadAsGrayscale(
    cbuffer const & buffer
)

function toJpeg

NODISCARD expected< std::vector< uint8_t > > toJpeg(
    cbuffer const & buffer,
    int quality =85
)

Encode buffer to JPEG format.

Parameters:

  • buffer Input buffer to encode (NV12 format preferred for hardware)
  • quality JPEG quality (1-100, default 85)

Return: JPEG-encoded bytes on success, error code on failure

Uses the JpegEncoderRegistry to find the best encoder for the buffer's transport URI. Automatically selects hardware encoding when available for zero-copy encoding, with fallback to software encoding.

Example:

auto jpeg = api::buffer::toJpeg(buffer, 90);
if (jpeg) {
    // Write to file, send over network, etc.
}