mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-04 23:46:43 +00:00
188 lines
5.6 KiB
Text
188 lines
5.6 KiB
Text
|
[DllImport ("libgstcontroller-0.10.dll") ]
|
||
|
static extern IntPtr gst_controller_new_list (IntPtr objekt, IntPtr list);
|
||
|
|
||
|
public Controller (GLib.Object objekt, string[] properties) : base (IntPtr.Zero) {
|
||
|
if (GetType () != typeof (Controller)) {
|
||
|
throw new InvalidOperationException ("Can't override this constructor.");
|
||
|
}
|
||
|
GLib.List list = new GLib.List (properties, typeof (string), true, true);
|
||
|
|
||
|
Raw = gst_controller_new_list (objekt == null ? IntPtr.Zero : objekt.Handle, list == null ? IntPtr.Zero : list.Handle);
|
||
|
}
|
||
|
|
||
|
public Controller (GLib.Object objekt, string property) : this (objekt, new string[] {property}) { }
|
||
|
|
||
|
[DllImport ("libgstcontroller-0.10.dll") ]
|
||
|
static extern bool gst_controller_remove_properties_list (IntPtr raw, IntPtr list);
|
||
|
|
||
|
public bool RemoveProperties (string[] properties) {
|
||
|
GLib.List list = new GLib.List (properties, typeof (string), true, true);
|
||
|
|
||
|
bool raw_ret = gst_controller_remove_properties_list (Handle, list == null ? IntPtr.Zero : list.Handle);
|
||
|
bool ret = raw_ret;
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
public bool RemoveProperty (string property) {
|
||
|
return RemoveProperties (new string[] {property});
|
||
|
}
|
||
|
|
||
|
|
||
|
[DllImport ("gstreamersharpglue-0.10.dll") ]
|
||
|
extern static uint gst__controllersharp_gst__controller_controller_get_properties_offset ();
|
||
|
|
||
|
static uint properties_offset = gst__controllersharp_gst__controller_controller_get_properties_offset ();
|
||
|
public string[] Properties {
|
||
|
get {
|
||
|
GLib.List properties_list;
|
||
|
|
||
|
unsafe {
|
||
|
IntPtr* raw_ptr = (IntPtr*) ( ( (byte*) Handle) + properties_offset);
|
||
|
properties_list = new GLib.List ( (*raw_ptr), typeof (string));
|
||
|
}
|
||
|
|
||
|
string[] properties = new string[properties_list.Count];
|
||
|
for (int i = 0; i < properties_list.Count; i++)
|
||
|
properties[i] = (string) properties_list[i];
|
||
|
|
||
|
return properties;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[DllImport ("gstreamersharpglue-0.10.dll") ]
|
||
|
extern static uint gst__controllersharp_gst__controller_controller_get_object_offset ();
|
||
|
|
||
|
static uint object_offset = gst__controllersharp_gst__controller_controller_get_object_offset ();
|
||
|
public GLib.Object Object {
|
||
|
get {
|
||
|
unsafe {
|
||
|
IntPtr* raw_ptr = (IntPtr*) ( ( (byte*) Handle) + object_offset);
|
||
|
return GLib.Object.GetObject ( (*raw_ptr));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[StructLayout (LayoutKind.Sequential) ]
|
||
|
struct GstValueArray {
|
||
|
public IntPtr property_name;
|
||
|
public int nbsamples;
|
||
|
public ulong sample_interval;
|
||
|
public IntPtr values;
|
||
|
}
|
||
|
|
||
|
[DllImport ("libgstcontroller-0.10.dll") ]
|
||
|
static extern bool gst_controller_get_value_array (IntPtr raw, ulong timestamp, ref GstValueArray value_array);
|
||
|
|
||
|
[DllImport ("libglib-2.0-0.dll") ]
|
||
|
static extern IntPtr g_try_malloc (int size);
|
||
|
|
||
|
static readonly Type[] supported_types = new Type[] {
|
||
|
typeof (string),
|
||
|
typeof (short),
|
||
|
typeof (ushort),
|
||
|
typeof (int),
|
||
|
typeof (uint),
|
||
|
typeof (long),
|
||
|
typeof (ulong),
|
||
|
typeof (float),
|
||
|
typeof (double),
|
||
|
typeof (bool)
|
||
|
};
|
||
|
|
||
|
public System.Array GetValueArray (string property, ulong timestamp, int nsamples, ulong interval) {
|
||
|
GstValueArray va = new GstValueArray ();
|
||
|
|
||
|
Gst.Object ob = (Gst.Object) this.Object;
|
||
|
Gst.PropertyInfo pi = ob.GetPropertyInfo (property);
|
||
|
System.Type t = (System.Type) pi.GType;
|
||
|
|
||
|
bool supported = false;
|
||
|
foreach (System.Type tmp in supported_types)
|
||
|
if (tmp == t)
|
||
|
supported = true;
|
||
|
if (!supported)
|
||
|
throw new Exception ("Unsupported type '" + t + "'");
|
||
|
|
||
|
int eltsize = Marshal.SizeOf (t);
|
||
|
va.values = g_try_malloc (eltsize * nsamples);
|
||
|
if (va.values == IntPtr.Zero)
|
||
|
throw new OutOfMemoryException ();
|
||
|
|
||
|
va.property_name = GLib.Marshaller.StringToPtrGStrdup (property);
|
||
|
va.nbsamples = nsamples;
|
||
|
va.sample_interval = interval;
|
||
|
|
||
|
bool raw_ret = gst_controller_get_value_array (Handle, timestamp, ref va);
|
||
|
|
||
|
if (!raw_ret) {
|
||
|
GLib.Marshaller.Free (va.property_name);
|
||
|
GLib.Marshaller.Free (va.values);
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
System.Array values = Array.CreateInstance (t, nsamples);
|
||
|
|
||
|
if (t == typeof (string)) {
|
||
|
string[] ret = (string[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
IntPtr str = Marshal.ReadIntPtr (va.values, i * IntPtr.Size);
|
||
|
ret[i] = GLib.Marshaller.PtrToStringGFree (str);
|
||
|
}
|
||
|
} else if (t == typeof (short)) {
|
||
|
short[] ret = (short[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = Marshal.ReadInt16 (va.values, i * 2);
|
||
|
}
|
||
|
} else if (t == typeof (ushort)) {
|
||
|
ushort[] ret = (ushort[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = (ushort) Marshal.ReadInt16 (va.values, i * 2);
|
||
|
}
|
||
|
} else if (t == typeof (int)) {
|
||
|
int[] ret = (int[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = Marshal.ReadInt32 (va.values, i * 4);
|
||
|
}
|
||
|
} else if (t == typeof (uint)) {
|
||
|
uint[] ret = (uint[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = (uint) Marshal.ReadInt32 (va.values, i * 4);
|
||
|
}
|
||
|
} else if (t == typeof (long)) {
|
||
|
long[] ret = (long[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = Marshal.ReadInt64 (va.values, i * 8);
|
||
|
}
|
||
|
} else if (t == typeof (ulong)) {
|
||
|
ulong[] ret = (ulong[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = (ulong) Marshal.ReadInt64 (va.values, i * 8);
|
||
|
}
|
||
|
} else if (t == typeof (float)) {
|
||
|
float[] ret = (float[]) values;
|
||
|
Marshal.Copy (va.values, ret, 0, nsamples);
|
||
|
} else if (t == typeof (double)) {
|
||
|
double[] ret = (double[]) values;
|
||
|
Marshal.Copy (va.values, ret, 0, nsamples);
|
||
|
} else if (t == typeof (bool)) {
|
||
|
bool[] ret = (bool[]) values;
|
||
|
|
||
|
for (int i = 0; i < nsamples; i++) {
|
||
|
ret[i] = Marshal.ReadInt32 (va.values, i * 4) != 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GLib.Marshaller.Free (va.property_name);
|
||
|
GLib.Marshaller.Free (va.values);
|
||
|
|
||
|
return values;
|
||
|
}
|
||
|
|