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.
152 lines
4.8 KiB
152 lines
4.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.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
|
|
public class VideoFrame : Frame
|
|
{
|
|
public VideoFrame(IntPtr ptr)
|
|
: base(ptr)
|
|
{
|
|
object error;
|
|
Debug.Assert(NativeMethods.rs2_is_frame_extendable_to(ptr, Extension.VideoFrame, out error) > 0);
|
|
}
|
|
|
|
/// <summary>Gets the frame width in pixels</summary>
|
|
/// <value>frame width in pixels</value>
|
|
public int Width
|
|
{
|
|
get
|
|
{
|
|
object error;
|
|
var w = NativeMethods.rs2_get_frame_width(Handle, out error);
|
|
return w;
|
|
}
|
|
}
|
|
|
|
/// <summary>Gets the frame height in pixels</summary>
|
|
/// <value>frame height in pixels</value>
|
|
public int Height
|
|
{
|
|
get
|
|
{
|
|
object error;
|
|
var h = NativeMethods.rs2_get_frame_height(Handle, out error);
|
|
return h;
|
|
}
|
|
}
|
|
|
|
/// <summary>Gets the frame stride, meaning the actual line width in memory in bytes (not the logical image width)</summary>
|
|
/// <value>stride in bytes</value>
|
|
public int Stride
|
|
{
|
|
get
|
|
{
|
|
object error;
|
|
var stride = NativeMethods.rs2_get_frame_stride_in_bytes(Handle, out error);
|
|
return stride;
|
|
}
|
|
}
|
|
|
|
/// <summary>Gets the bits per pixels in the frame image</summary>
|
|
/// <remarks>
|
|
/// (note that bits per pixel is not necessarily divided by 8, as in 12bpp)
|
|
/// </remarks>
|
|
/// <value>bits per pixel</value>
|
|
public int BitsPerPixel
|
|
{
|
|
get
|
|
{
|
|
object error;
|
|
var bpp = NativeMethods.rs2_get_frame_bits_per_pixel(Handle, out error);
|
|
return bpp;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copy frame data to managed typed array
|
|
/// </summary>
|
|
/// <typeparam name="T">array element type</typeparam>
|
|
/// <param name="array">array to copy to</param>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="array"/> is null</exception>
|
|
public void CopyTo<T>(T[] array)
|
|
{
|
|
if (array == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(array));
|
|
}
|
|
|
|
var handle = GCHandle.Alloc(array, GCHandleType.Pinned);
|
|
try
|
|
{
|
|
// System.Diagnostics.Debug.Assert((array.Length * Marshal.SizeOf(typeof(T))) == (Stride * Height));
|
|
CopyTo(handle.AddrOfPinnedObject());
|
|
}
|
|
finally
|
|
{
|
|
handle.Free();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copy frame data to pointer
|
|
/// </summary>
|
|
/// <param name="ptr">destination pointer</param>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="ptr"/> is null</exception>
|
|
public void CopyTo(IntPtr ptr)
|
|
{
|
|
if (ptr == IntPtr.Zero)
|
|
{
|
|
throw new ArgumentNullException(nameof(ptr));
|
|
}
|
|
|
|
NativeMethods.Memcpy(ptr, Data, Stride * Height);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copy data from managed array
|
|
/// </summary>
|
|
/// <typeparam name="T">array element type</typeparam>
|
|
/// <param name="array">array to copy from</param>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="array"/> is null</exception>
|
|
public void CopyFrom<T>(T[] array)
|
|
{
|
|
if (array == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(array));
|
|
}
|
|
|
|
var handle = GCHandle.Alloc(array, GCHandleType.Pinned);
|
|
try
|
|
{
|
|
// System.Diagnostics.Debug.Assert((array.Length * Marshal.SizeOf(typeof(T))) == (Stride * Height));
|
|
CopyFrom(handle.AddrOfPinnedObject());
|
|
}
|
|
finally
|
|
{
|
|
handle.Free();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copy data from pointer
|
|
/// </summary>
|
|
/// <param name="ptr">source pointer</param>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="ptr"/> is null</exception>
|
|
public void CopyFrom(IntPtr ptr)
|
|
{
|
|
if (ptr == IntPtr.Zero)
|
|
{
|
|
throw new ArgumentNullException(nameof(ptr));
|
|
}
|
|
|
|
NativeMethods.Memcpy(Data, ptr, Stride * Height);
|
|
}
|
|
}
|
|
}
|