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.

102 lines
3.8 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.Generic;
using System.Linq;
using System.Runtime.InteropServices;
public struct FrameSource
{
internal readonly HandleRef m_instance;
internal FrameSource(HandleRef instance)
{
m_instance = instance;
}
public T AllocateVideoFrame<T>(StreamProfile profile, Frame original, int bpp, int width, int height, int stride, Extension extension = Extension.VideoFrame)
where T : Frame
{
object error;
var fref = NativeMethods.rs2_allocate_synthetic_video_frame(m_instance.Handle, profile.Handle, original.Handle, bpp, width, height, stride, extension, out error);
return Frame.Create<T>(fref);
}
public T AllocateMotionFrame<T>(StreamProfile profile, Frame original, Extension extension = Extension.VideoFrame)
where T : Frame
{
object error;
var fref = NativeMethods.rs2_allocate_synthetic_motion_frame(m_instance.Handle, profile.Handle, original.Handle, extension, out error);
return Frame.Create<T>(fref);
}
[Obsolete("This method is obsolete. Use AllocateCompositeFrame with DisposeWith method instead")]
public FrameSet AllocateCompositeFrame(FramesReleaser releaser, params Frame[] frames)
{
return AllocateCompositeFrame((IList<Frame>)frames).DisposeWith(releaser);
}
/// <summary>
/// Allocate new composite frame, aggregating a set of existing frames
/// </summary>
/// <param name="frames">array of frames</param>
/// <returns>a newly allocated frame</returns>
public FrameSet AllocateCompositeFrame(params Frame[] frames)
{
return AllocateCompositeFrame((IList<Frame>)frames);
}
/// <summary>
/// Allocate new composite frame, aggregating a set of existing frames
/// </summary>
/// <param name="frames">list of frames</param>
/// <returns>a newly allocated frame</returns>
/// <exception cref="ArgumentNullException">Thrown when <paramref name="frames"/> is null</exception>
public FrameSet AllocateCompositeFrame(IList<Frame> frames)
{
if (frames == null)
{
throw new ArgumentNullException(nameof(frames));
}
IntPtr frame_refs = IntPtr.Zero;
try
{
object error;
int fl = frames.Count;
frame_refs = Marshal.AllocHGlobal(fl * IntPtr.Size);
for (int i = 0; i < fl; i++)
{
var fr = frames[i].Handle;
Marshal.WriteIntPtr(frame_refs, i * IntPtr.Size, fr);
NativeMethods.rs2_frame_add_ref(fr, out error);
}
var frame_ref = NativeMethods.rs2_allocate_composite_frame(m_instance.Handle, frame_refs, fl, out error);
return FrameSet.Create(frame_ref);
}
finally
{
if (frame_refs != IntPtr.Zero)
{
Marshal.FreeHGlobal(frame_refs);
}
}
}
/// <summary>
/// This method will dispatch frame callback on a frame
/// </summary>
/// <param name="f">frame to dispatch</param>
public void FrameReady(Frame f)
{
object error;
NativeMethods.rs2_frame_add_ref(f.Handle, out error);
NativeMethods.rs2_synthetic_frame_ready(m_instance.Handle, f.Handle, out error);
}
}
}