Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions Runtime/Scripts/DataStreams/DataTrack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,27 @@ public class DataTrackSubscribeOptions
public uint? BufferSize { get; set; }
}

/// <summary>
/// Track-level options that configure how the incoming-frame pipeline reassembles packets
/// for a remote data track.
/// </summary>
/// <remarks>
/// Applied via <see cref="RemoteDataTrack.SetPipelineOptions"/>.
/// </remarks>
public class RemoteDataTrackPipelineOptions
{
/// <summary>
/// Maximum number of partial frames the depacketizer will track concurrently for this
/// track.
/// </summary>
/// <remarks>
/// Defaults to 1. Higher values give more out-of-order tolerance for high-frequency
/// senders at the cost of additional buffering. Zero is not a valid value; if a value
/// of zero is provided, it will be clamped to one. Leave unset to keep the current value.
/// </remarks>
public uint? MaxPartialFrames { get; set; }
}

/// <summary>
/// A frame published on a data track, consisting of a payload and optional metadata.
/// </summary>
Expand Down Expand Up @@ -323,6 +344,28 @@ public bool IsPublished()
FfiResponse res = response;
return res.RemoteDataTrackIsPublished.IsPublished;
}

/// <summary>
/// Configures options for the pipeline handling incoming packets for this track.
/// </summary>
/// <remarks>
/// These options apply to all current and future subscriptions of this track, and may be
/// set at any time. New options take effect with the next received packet.
/// </remarks>
/// <param name="options">The pipeline options to apply.</param>
public void SetPipelineOptions(RemoteDataTrackPipelineOptions options)
{
using var request = FFIBridge.Instance.NewRequest<RemoteDataTrackSetPipelineOptionsRequest>();
var pipelineReq = request.request;
pipelineReq.TrackHandle = (ulong)_handle.DangerousGetHandle();

var protoOptions = new Proto.RemoteDataTrackPipelineOptions();
if (options.MaxPartialFrames.HasValue)
protoOptions.MaxPartialFrames = options.MaxPartialFrames.Value;
pipelineReq.Options = protoOptions;

request.Send();
}
}

/// <summary>
Expand Down
3 changes: 3 additions & 0 deletions Runtime/Scripts/Internal/FFI/FfiRequestExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,9 @@ public static void Inject<T>(this FfiRequest ffiRequest, T request)
case DataTrackStreamReadRequest dataTrackStreamReadRequest:
ffiRequest.DataTrackStreamRead = dataTrackStreamReadRequest;
break;
case RemoteDataTrackSetPipelineOptionsRequest remoteDataTrackSetPipelineOptionsRequest:
ffiRequest.RemoteDataTrackSetPipelineOptions = remoteDataTrackSetPipelineOptionsRequest;
break;
default:
throw new Exception($"Unknown request type: {request?.GetType().FullName ?? "null"}");
}
Expand Down
Loading