You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
5.0 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
namespace Intel.RealSense
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
public class FrameQueue : Base.Object
{
/// <summary>
/// Initializes a new instance of the <see cref="FrameQueue"/> class.
/// <para>
/// Frame queues are the simplest x-platform synchronization primitive provided by librealsense
/// to help developers who are not using async APIs
/// </para>
/// </summary>
/// <param name="capacity">max number of frames to allow to be stored in the queue before older frames will start to get dropped</param>
public FrameQueue(int capacity = 1)
: base(Create(capacity), NativeMethods.rs2_delete_frame_queue)
{
Capacity = capacity;
}
/// <summary>
/// Gets the max number of frames to allow to be stored in the queue before older frames will start to get dropped
/// </summary>
public int Capacity { get; private set; }
/// <summary>
/// Poll if a new frame is available and dequeue if it is
/// </summary>
/// <typeparam name="T"><see cref="Frame"/> type or subclass</typeparam>
/// <param name="frame">dequeued frame</param>
/// <returns>true if new frame was stored to <paramref name="frame"/></returns>
public bool PollForFrame<T>(out T frame)
where T : Frame
{
object error;
IntPtr ptr;
if (NativeMethods.rs2_poll_for_frame(Handle, out ptr, out error) > 0)
{
frame = Frame.Create<T>(ptr);
return true;
}
frame = null;
return false;
}
/// <summary>
/// Wait until new frame becomes available in the queue and dequeue it
/// </summary>
/// <param name="timeout_ms">max time in milliseconds to wait until an exception will be thrown</param>
/// <returns>dequeued frame</returns>
public Frame WaitForFrame(uint timeout_ms = 5000u)
{
return WaitForFrame<Frame>(timeout_ms);
}
/// <summary>
/// Wait until new frame becomes available in the queue and dequeue it
/// </summary>
/// <typeparam name="T"><see cref="Frame"/> type or subclass</typeparam>
/// <param name="timeout_ms">max time in milliseconds to wait until an exception will be thrown</param>
/// <returns>dequeued frame</returns>
public T WaitForFrame<T>(uint timeout_ms = 5000u)
where T : Frame
{
object error;
var ptr = NativeMethods.rs2_wait_for_frame(Handle, timeout_ms, out error);
return Frame.Create<T>(ptr);
}
/// <summary>
/// Wait until new frame becomes available in the queue and dequeue it
/// </summary>
/// <typeparam name="T"><see cref="Frame"/> type or subclass</typeparam>
/// <param name="frame">dequeued frame</param>
/// <param name="timeout_ms">max time in milliseconds to wait until a frame becomes available</param>
/// <returns>true if new frame was stored to <paramref name="frame"/></returns>
public bool TryWaitForFrame<T>(out T frame, uint timeout_ms = 5000u)
where T : Frame
{
object error;
IntPtr ptr;
bool res = NativeMethods.rs2_try_wait_for_frame(Handle, timeout_ms, out ptr, out error) > 0;
frame = res ? Frame.Create<T>(ptr) : null;
return res;
}
/// <summary>
/// Wait until new frame becomes available in the queue and dequeue it
/// </summary>
/// <param name="timeout_ms">max time in milliseconds to wait until a frame becomes available</param>
/// <returns>dequeued frame</returns>
public FrameSet WaitForFrames(uint timeout_ms = 5000u)
{
object error;
var ptr = NativeMethods.rs2_wait_for_frame(Handle, timeout_ms, out error);
return FrameSet.Create(ptr);
}
/// <summary>
/// Enqueue new frame into a queue
/// </summary>
/// <param name="f">frame to enqueue</param>
public void Enqueue(Frame f)
{
object error;
NativeMethods.rs2_frame_add_ref(f.Handle, out error);
NativeMethods.rs2_enqueue_frame(f.Handle, Handle);
}
/// <summary>
/// Number of frames hold by the queue
/// </summary>
public int QueueSize()
{
object error;
return NativeMethods.rs2_frame_queue_size(this.Handle, out error);
}
internal static IntPtr Create(int capacity = 1)
{
object error;
return NativeMethods.rs2_create_frame_queue(capacity, out error);
}
}
}