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

// 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);
}
}
}