Streaming Server Operators#
Authors: Holoscan Team (NVIDIA)
Supported platforms: x86_64, aarch64
Language: C++, Python
Last modified: November 7, 2025
Latest version: 1.1.0
Minimum Holoscan SDK version: 3.5.0
Tested Holoscan SDK versions: 3.5.0
Contribution metric: Level 2 - Trusted
The video_streaming_server operator provides a modular streaming server implementation with separate upstream, downstream, and resource components. This split architecture allows for better separation of concerns and more flexible streaming pipeline configurations.
π Related Documentation:
- Main Operators README - Setup, dependencies, NGC downloads, and Python examples
- Server Application README - Complete server application with usage examples
- Client Operator README - Companion client operator documentation
- Testing Documentation - Integration testing and verification
Architecture Overview#
The Streaming Server operators integrate with the Holoscan Server Cloud Streaming library to provide comprehensive multi-client streaming capabilities:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Holoscan Application β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β StreamingServerResource β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Holoscan Server Cloud Streaming β β β
β β β β β β
β β β βββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β StreamingServer β β Network Protocol Stack β β β β
β β β β β β β β β β
β β β β β’ Multi-client βββββΆβ β’ Media Transport & Encoding β β β β
β β β β Management β β β’ Connection Management β β β β
β β β β β’ Frame Routing β β β’ Security & Authentication β β β β
β β β β β’ Callbacks β β β β β β
β β β βββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β ββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Processing Pipeline β β
β β β β
β β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββββββββββ β β
β β βStreamingServer β β Processing β βStreamingServer β β β
β β βUpstreamOp β β Operators β βDownstreamOp β β β
β β β β β β β β β β
β β β β’ Frame Receive βββββΆβ β’ Format Conv βββββΆβ β’ Frame Processing β β β
β β β β’ Client Frames β β β’ AI/ML Ops β β β’ Tensor β VideoFrame β β β
β β β β’ Tensor Output β β β’ Filtering β β β’ Multi-client Send β β β
β β β β’ Validation β β β’ Enhancement β β β’ Optional Processing β β β
β β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββββββββββ β β
β β β β β β β
β βββββββββββββΌββββββββββββββββββββββββΌβββββββββββββββββββββββββββββΌβββββββββββββ β
β β β β β
β βΌ β β² β
β βββββββββββββββββββ β βββββββββββββββββββββββββββ β
β β Input Sources β β β Output Sinks β β
β β β β β β β
β β β’ Client Frames β β β β’ Client Connections β β
β β β’ Network Data β β β β’ Processed Frames β β
β β β’ Remote Cams β β β β’ Multi-cast Streams β β
β βββββββββββββββββββ β βββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββ β
β β Optional Processing β β
β β β β
β β β’ AI/ML Inference β β
β β β’ Computer Vision β β
β β β’ Frame Enhancement β β
β β β’ Analytics β β
β βββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
β Network β
β β
β ββββββββββββββββββββββββββββ΄βββββββββββββββββββββββ β
β β Multiple Clients β β
β β β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββ β
β β β Client 1 β β Client 2 β β Client N ββ β
β β β β β β β ββ β
β β β β’ Holoscan β β β’ Holoscan β ββ’ Holoscanββ β
β β β Client β β Client β β Client ββ β
β β β Streaming β β Streaming β β Streamingββ β
β β βββββββββββββββ βββββββββββββββ βββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Component Interactions#
-
Multi-Client Management: The StreamingServerResource manages multiple simultaneous client connections through the Holoscan Server Cloud Streaming library
-
Upstream Processing: StreamingServerUpstreamOp receives frames from connected clients and converts them to Holoscan tensors for processing
-
Pipeline Integration: Frames flow through the standard Holoscan processing pipeline (AI/ML, computer vision, analytics, etc.)
-
Downstream Distribution: StreamingServerDownstreamOp takes processed tensors and distributes them to all connected clients
-
Network Protocol Handling: The cloud streaming library manages:
- Multi-client signaling and negotiation
- Media encoding/decoding and transport
- Load balancing and connection management
-
Security and authentication
-
Bidirectional Communication: Supports simultaneous receiving from clients (upstream) and sending to clients (downstream)
Architecture Components#
holoscan::ops::StreamingServerResource#
A shared resource that manages the underlying StreamingServer instance and provides:
- Centralized server lifecycle management
- Event handling and callback management
- Configuration management for server parameters
- Frame sending and receiving coordination between operators
holoscan::ops::StreamingServerUpstreamOp#
An operator that receives video frames from streaming clients and outputs them as Holoscan tensors:
- Receives frames from connected clients via the StreamingServerResource
- Converts received frames to
holoscan::Tensorformat - Provides duplicate frame detection to ensure unique frame processing
- Outputs tensors to the Holoscan processing pipeline
holoscan::ops::StreamingServerDownstreamOp#
An operator that receives Holoscan tensors and sends them to streaming clients:
- Takes
holoscan::Tensorinput from the processing pipeline - Converts tensors back to video frame format
- Sends processed frames to connected clients via the StreamingServerResource
- Supports optional frame processing (mirroring, rotation, etc.)
Benefits of Split Architecture#
- Modularity: Each component has a single responsibility (resource management, receiving, or sending)
- Flexibility: You can use only upstream, only downstream, or both depending on your pipeline needs
- Shared Resource: Multiple operators can share the same StreamingServerResource instance
- Better Testing: Each component can be tested independently
- Clear Data Flow: Explicit tensor-based input/output ports make data flow obvious
- Processing Integration: Seamless integration with Holoscan's tensor processing pipeline
Parameters#
StreamingServerResource Parameters#
port: Port used for streaming server- type:
uint16_t -
default: 48010
-
is_multi_instance: Allow multiple server instances - type:
bool -
default: false
-
server_name: Name identifier for the server - type:
std::string -
default: "HoloscanStreamingServer"
-
width: Width of the video frames in pixels - type:
uint32_t -
default: 854
-
height: Height of the video frames in pixels - type:
uint32_t -
default: 480
-
fps: Frame rate of the video - type:
uint16_t -
default: 30
-
enable_upstream: Enable upstream (receiving) functionality - type:
bool -
default: true
-
enable_downstream: Enable downstream (sending) functionality - type:
bool - default: true
StreamingServerUpstreamOp Parameters#
width: Frame width (inherits from resource if not specified)- type:
uint32_t -
default: 854
-
height: Frame height (inherits from resource if not specified) - type:
uint32_t -
default: 480
-
fps: Frame rate (inherits from resource if not specified) - type:
uint32_t -
default: 30
-
allocator: Memory allocator for tensor data -
type:
std::shared_ptr<Allocator> -
video_streaming_server_resource: Reference to StreamingServerResource - type:
std::shared_ptr<StreamingServerResource>
StreamingServerDownstreamOp Parameters#
width: Frame width (inherits from resource if not specified)- type:
uint32_t -
default: 854
-
height: Frame height (inherits from resource if not specified) - type:
uint32_t -
default: 480
-
fps: Frame rate (inherits from resource if not specified) - type:
uint32_t -
default: 30
-
enable_processing: Enable frame processing (mirroring, etc.) - type:
bool -
default: false
-
processing_type: Type of processing to apply - type:
std::string - default: "none"
-
options: "none", "mirror", "rotate"
-
allocator: Memory allocator for tensor data -
type:
std::shared_ptr<Allocator> -
video_streaming_server_resource: Reference to StreamingServerResource - type:
std::shared_ptr<StreamingServerResource>
Input/Output Ports#
StreamingServerUpstreamOp Ports#
Output Ports:
output_frames: Output port for frames received from clients- type:
holoscan::Tensor
StreamingServerDownstreamOp Ports#
Input Ports:
input_frames: Input port for frames to be sent to clients- type:
holoscan::Tensor
Example Usage#
Complete Pipeline Setup#
// Create allocator resource
auto allocator = make_resource<UnboundedAllocator>("allocator");
// Create the shared StreamingServerResource
auto video_streaming_server_resource = make_resource<ops::StreamingServerResource>(
"video_streaming_server_resource",
Arg("port") = 48010,
Arg("server_name") = "MyStreamingServer",
Arg("width") = 854,
Arg("height") = 480,
Arg("fps") = 30,
Arg("enable_upstream") = true,
Arg("enable_downstream") = true,
Arg("is_multi_instance") = false
);
// Create upstream operator (receives frames from clients)
auto upstream_op = make_operator<ops::StreamingServerUpstreamOp>(
"streaming_upstream",
Arg("allocator") = allocator,
Arg("video_streaming_server_resource") = video_streaming_server_resource
);
// Create downstream operator (sends frames to clients)
auto downstream_op = make_operator<ops::StreamingServerDownstreamOp>(
"streaming_downstream",
Arg("enable_processing") = false,
Arg("processing_type") = "none",
Arg("allocator") = allocator,
Arg("video_streaming_server_resource") = video_streaming_server_resource
);
Requirements & Setup#
For complete setup instructions including:
- Holoscan SDK 3.5.0 or higher and CUDA 12.x requirements
- NGC binary downloads (server streaming binaries)
- Build troubleshooting
See the Main Operators README for detailed setup instructions.
Deployment on NVCF#
The Holoscan cloud streaming stack provides plugins with endpoints required to deploy the server docker container as a streaming function. You can push the container and create/update/deploy the streaming function from the web portal.
Push Container#
Note: You first must docker login to the NGC Container Registry before you can push containers to it: https://docs.nvidia.com/ngc/gpu-cloud/ngc-private-registry-user-guide/index.html#accessing-ngc-registry Tag the container and push it to the container registry:
docker tag simple-streamer:latest {registry}/{org-id}/{container-name}:{version}
docker push {registry}/{org-id}/{container-name}:{version}
For example, if your organization name/id is 0494839893562652 and you want to push a container to the prod container registry using the name my-simple-streamer at version 0.1.0 then run:
docker tag simple-streamer:latest nvcr.io/0494839893562652/my-simple-streamer:0.1.0
docker push nvcr.io/0494839893562652/my-simple-streamer:0.1.0
Set Variables#
All the helper scripts below depend on the following environment variables being set:
# Required variables
export NGC_PERSONAL_API_KEY=<get from https://nvcf.ngc.nvidia.com/functions -> Generate Personal API Key>
export STREAMING_CONTAINER_IMAGE=<registry>/<org-id>/<container-name>:<version>
export STREAMING_FUNCTION_NAME=<my-simple-streamer-function-name>
# Optional variables (shown with default values)
export NGC_DOMAIN=api.ngc.nvidia.com
export NVCF_SERVER=grpc.nvcf.nvidia.com
export STREAMING_SERVER_PORT=49100
export HTTP_SERVER_PORT=8011
Create the Cloud Streaming Function#
Create the streaming function by running the provided script after setting all the required variables:
./nvcf/create_streaming_function.sh
Once the function is created, export the FUNCTION_ID as a variable:
export STREAMING_FUNCTION_ID={my-simple-streamer-function-id}
Update Function#
Update an existing streaming function by running the provided script after setting all the required variables:
./nvcf/update_streaming_function.sh
Deploy Function#
Deploy the streaming function from the web portal: https://nvcf.ngc.nvidia.com/functions
Test Function#
Start the test intermediate haproxy by running the provided script after setting all the required variables:
./nvcf/start_test_intermediate_haproxy.sh
Please note that the test haproxy server should be running on a separate machine, either on the client machine or a separate one.
Note: If the test haproxy is still running, and you wish to test the executable or docker file again you must first stop it:
./nvcf/stop_test_intermediate_haproxy.sh
Python Bindings & Applications#
For Python usage, application examples, and testing:
- Main Operators README - Python bindings overview and setup
- Server Application README - Complete Python server implementation
- Testing Documentation - Integration testing guide
Additional Resources#
For more information on NVCF Cloud functions, please refer to NVIDIA Cloud Functions documentation.