mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 08:17:01 +00:00
199 lines
4.8 KiB
Text
199 lines
4.8 KiB
Text
[DllImport ("gstreamer-0.10.dll") ]
|
|
static extern IntPtr gst_buffer_try_new_and_alloc (uint size);
|
|
|
|
public Buffer (GLib.Value val) : base (val) { }
|
|
|
|
public Buffer (uint size) {
|
|
IntPtr raw = gst_buffer_try_new_and_alloc (size);
|
|
if (raw == IntPtr.Zero)
|
|
throw new OutOfMemoryException ();
|
|
Raw = raw;
|
|
}
|
|
|
|
public Buffer (byte[] data) : this () {
|
|
Data = data;
|
|
}
|
|
|
|
[DllImport ("gstreamersharpglue-0.10") ]
|
|
extern static uint gstsharp_gst_buffer_get_data_offset ();
|
|
[DllImport ("gstreamersharpglue-0.10") ]
|
|
extern static void gstsharp_gst_buffer_set_data (IntPtr handle, IntPtr data, uint size);
|
|
[DllImport ("libglib-2.0-0.dll") ]
|
|
extern static IntPtr g_try_malloc (int size);
|
|
|
|
static uint data_offset = gstsharp_gst_buffer_get_data_offset ();
|
|
public byte[] Data {
|
|
get {
|
|
IntPtr raw_ptr;
|
|
unsafe {
|
|
raw_ptr = * ( (IntPtr *) ( ( (byte*) Handle) + data_offset));
|
|
}
|
|
|
|
byte[] data = new byte[Size];
|
|
Marshal.Copy (raw_ptr, data, 0, (int) Size);
|
|
|
|
return data;
|
|
}
|
|
|
|
set {
|
|
if (!IsWritable)
|
|
throw new ApplicationException ();
|
|
|
|
IntPtr raw_ptr = g_try_malloc (value.Length);
|
|
if (raw_ptr == IntPtr.Zero)
|
|
throw new OutOfMemoryException ();
|
|
|
|
Marshal.Copy (value, 0, raw_ptr, value.Length);
|
|
gstsharp_gst_buffer_set_data (Handle, raw_ptr, (uint) value.Length);
|
|
}
|
|
}
|
|
|
|
public byte this [uint index] {
|
|
get {
|
|
if (index >= Size)
|
|
throw new ArgumentOutOfRangeException ();
|
|
|
|
unsafe {
|
|
byte **raw_ptr = (byte **) ( ( (byte*) Handle) + data_offset);
|
|
return * ( (*raw_ptr) + index);
|
|
}
|
|
}
|
|
set {
|
|
if (index >= Size)
|
|
throw new ArgumentOutOfRangeException ();
|
|
if (!IsWritable)
|
|
throw new ApplicationException ();
|
|
|
|
unsafe {
|
|
byte **raw_ptr = (byte **) ( ( (byte*) Handle) + data_offset);
|
|
* ( (*raw_ptr) + index) = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* FIXME: This is not optimal */
|
|
public void MakeMetadataWritable() {
|
|
if (IsMetadataWritable)
|
|
return;
|
|
|
|
IntPtr sub = gst_buffer_create_sub (Raw, 0, Size);
|
|
Raw = sub;
|
|
/* ^--- Takes a second ref, not good */
|
|
Unref (Raw);
|
|
/* ^--- Sets Owned = false, wrong! */
|
|
Owned = true;
|
|
}
|
|
|
|
[DllImport ("gstreamer-0.10.dll") ]
|
|
static extern IntPtr gst_buffer_get_caps (IntPtr raw);
|
|
[DllImport ("gstreamer-0.10.dll") ]
|
|
static extern void gst_buffer_set_caps (IntPtr raw, IntPtr caps);
|
|
|
|
public Gst.Caps Caps {
|
|
get {
|
|
IntPtr raw_ret = gst_buffer_get_caps (Handle);
|
|
Gst.Caps ret = raw_ret == IntPtr.Zero ? null : (Gst.Caps) GLib.Opaque.GetOpaque (raw_ret, typeof (Gst.Caps), true);
|
|
return ret;
|
|
}
|
|
set {
|
|
if (!IsMetadataWritable)
|
|
throw new ApplicationException ();
|
|
gst_buffer_set_caps (Handle, value == null ? IntPtr.Zero : value.Handle);
|
|
}
|
|
}
|
|
|
|
[DllImport ("gstreamersharpglue-0.10") ]
|
|
extern static uint gstsharp_gst_buffer_get_timestamp_offset ();
|
|
static uint timestamp_offset = gstsharp_gst_buffer_get_timestamp_offset ();
|
|
|
|
public ulong Timestamp {
|
|
get {
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + timestamp_offset));
|
|
return *raw_ptr;
|
|
}
|
|
}
|
|
|
|
set {
|
|
if (!IsMetadataWritable)
|
|
throw new ApplicationException ();
|
|
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + timestamp_offset));
|
|
*raw_ptr = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
[DllImport ("gstreamersharpglue-0.10") ]
|
|
extern static uint gstsharp_gst_buffer_get_duration_offset ();
|
|
static uint duration_offset = gstsharp_gst_buffer_get_duration_offset ();
|
|
|
|
public ulong Duration {
|
|
get {
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + duration_offset));
|
|
return *raw_ptr;
|
|
}
|
|
}
|
|
|
|
set {
|
|
if (!IsMetadataWritable)
|
|
throw new ApplicationException ();
|
|
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + duration_offset));
|
|
*raw_ptr = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
[DllImport ("gstreamersharpglue-0.10") ]
|
|
extern static uint gstsharp_gst_buffer_get_offset_offset ();
|
|
static uint offset_offset = gstsharp_gst_buffer_get_offset_offset ();
|
|
|
|
public ulong Offset {
|
|
get {
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + offset_offset));
|
|
return *raw_ptr;
|
|
}
|
|
}
|
|
|
|
set {
|
|
if (!IsMetadataWritable)
|
|
throw new ApplicationException ();
|
|
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + offset_offset));
|
|
*raw_ptr = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
[DllImport ("gstreamersharpglue-0.10") ]
|
|
extern static uint gstsharp_gst_buffer_get_offset_end_offset ();
|
|
static uint offset_end_offset = gstsharp_gst_buffer_get_offset_end_offset ();
|
|
|
|
public ulong OffsetEnd {
|
|
get {
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + offset_end_offset));
|
|
return *raw_ptr;
|
|
}
|
|
}
|
|
|
|
set {
|
|
if (!IsMetadataWritable)
|
|
throw new ApplicationException ();
|
|
|
|
unsafe {
|
|
ulong *raw_ptr = ( (ulong*) ( ( (byte*) Handle) + offset_end_offset));
|
|
*raw_ptr = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
static Buffer () {
|
|
GLib.GType.Register (Buffer.GType, typeof (Buffer));
|
|
}
|