mirror of
https://gitee.com/csharpui/CPF.git
synced 2025-04-05 17:37:51 +08:00
180 lines
5.4 KiB
C#
180 lines
5.4 KiB
C#
//
|
|
// CVPixelBufferPool.cs: Implements the managed CVPixelBufferPool
|
|
//
|
|
// Authors: Mono Team
|
|
// Marek Safar (marek.safar@gmail.com)
|
|
//
|
|
// Copyright 2010 Novell, Inc
|
|
// Copyright 2012, Xamarin Inc.
|
|
//
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Runtime.InteropServices;
|
|
using CPF.Mac.CoreFoundation;
|
|
using CPF.Mac.ObjCRuntime;
|
|
using CPF.Mac.Foundation;
|
|
|
|
namespace CPF.Mac.CoreVideo {
|
|
|
|
[Since (4,0)]
|
|
public class CVPixelBufferPool : INativeObject, IDisposable {
|
|
public static readonly NSString MinimumBufferCountKey;
|
|
public static readonly NSString MaximumBufferAgeKey;
|
|
|
|
static CVPixelBufferPool ()
|
|
{
|
|
var handle = Dlfcn.dlopen (Constants.CoreVideoLibrary, 0);
|
|
if (handle == IntPtr.Zero)
|
|
return;
|
|
try {
|
|
MinimumBufferCountKey = Dlfcn.GetStringConstant (handle, "kCVPixelBufferPoolMinimumBufferCountKey");
|
|
MaximumBufferAgeKey = Dlfcn.GetStringConstant (handle, "kCVPixelBufferPoolMaximumBufferAgeKey");
|
|
}
|
|
finally {
|
|
Dlfcn.dlclose (handle);
|
|
}
|
|
}
|
|
|
|
IntPtr handle;
|
|
|
|
internal CVPixelBufferPool (IntPtr handle)
|
|
{
|
|
if (handle == IntPtr.Zero)
|
|
throw new ArgumentException ("Invalid parameters to context creation");
|
|
|
|
CVPixelBufferPoolRetain (handle);
|
|
this.handle = handle;
|
|
}
|
|
|
|
[Preserve (Conditional=true)]
|
|
internal CVPixelBufferPool (IntPtr handle, bool owns)
|
|
{
|
|
if (!owns)
|
|
CVPixelBufferPoolRetain (handle);
|
|
|
|
this.handle = handle;
|
|
}
|
|
|
|
~CVPixelBufferPool ()
|
|
{
|
|
Dispose (false);
|
|
}
|
|
|
|
public void Dispose ()
|
|
{
|
|
Dispose (true);
|
|
GC.SuppressFinalize (this);
|
|
}
|
|
|
|
public IntPtr Handle {
|
|
get { return handle; }
|
|
}
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static void CVPixelBufferPoolRelease (IntPtr handle);
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static void CVPixelBufferPoolRetain (IntPtr handle);
|
|
|
|
protected virtual void Dispose (bool disposing)
|
|
{
|
|
if (handle != IntPtr.Zero){
|
|
CVPixelBufferPoolRelease (handle);
|
|
handle = IntPtr.Zero;
|
|
}
|
|
}
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static int CVPixelBufferPoolGetTypeID ();
|
|
public int TypeID {
|
|
get {
|
|
return CVPixelBufferPoolGetTypeID ();
|
|
}
|
|
}
|
|
|
|
#if !COREBUILD
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static IntPtr CVPixelBufferPoolGetPixelBufferAttributes (IntPtr pool);
|
|
|
|
// TODO: Return type is CVPixelBufferAttributes but need different name when this one is not WeakXXXX
|
|
public NSDictionary PixelBufferAttributes {
|
|
get {
|
|
return (NSDictionary) Runtime.GetNSObject (CVPixelBufferPoolGetPixelBufferAttributes (handle));
|
|
}
|
|
}
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static IntPtr CVPixelBufferPoolGetAttributes (IntPtr pool);
|
|
|
|
public NSDictionary Attributes {
|
|
get {
|
|
return (NSDictionary) Runtime.GetNSObject (CVPixelBufferPoolGetAttributes (handle));
|
|
}
|
|
}
|
|
|
|
public CVPixelBufferPoolSettings Settings {
|
|
get {
|
|
var attr = Attributes;
|
|
return attr == null ? null : new CVPixelBufferPoolSettings (attr);
|
|
}
|
|
}
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static CVReturn CVPixelBufferPoolCreatePixelBuffer (IntPtr allocator, IntPtr pixelBufferPool, IntPtr pixelBufferOut);
|
|
public CVPixelBuffer CreatePixelBuffer ()
|
|
{
|
|
IntPtr pixelBufferOut = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (IntPtr)));
|
|
CVReturn ret = CVPixelBufferPoolCreatePixelBuffer (IntPtr.Zero, handle, pixelBufferOut);
|
|
|
|
if (ret != CVReturn.Success) {
|
|
Marshal.FreeHGlobal (pixelBufferOut);
|
|
throw new Exception ("CVPixelBufferPoolCreatePixelBuffer returned " + ret.ToString ());
|
|
}
|
|
|
|
CVPixelBuffer pixelBuffer = new CVPixelBuffer (Marshal.ReadIntPtr (pixelBufferOut));
|
|
Marshal.FreeHGlobal (pixelBufferOut);
|
|
return pixelBuffer;
|
|
}
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static CVReturn CVPixelBufferPoolCreatePixelBufferWithAuxAttributes (IntPtr allocator, IntPtr pixelBufferPool, IntPtr auxAttributes, out IntPtr pixelBufferOut);
|
|
|
|
public CVPixelBuffer CreatePixelBuffer (CVPixelBufferPoolAllocationSettings allocationSettings, out CVReturn error)
|
|
{
|
|
IntPtr pb;
|
|
error = CVPixelBufferPoolCreatePixelBufferWithAuxAttributes (IntPtr.Zero, handle, allocationSettings == null ? IntPtr.Zero : allocationSettings.Dictionary.Handle, out pb);
|
|
if (error != CVReturn.Success)
|
|
return null;
|
|
|
|
return new CVPixelBuffer (pb);
|
|
}
|
|
|
|
[DllImport (Constants.CoreVideoLibrary)]
|
|
extern static CVReturn CVPixelBufferPoolCreate (IntPtr allocator, IntPtr poolAttributes, IntPtr pixelBufferAttributes, IntPtr poolOut);
|
|
|
|
[Advice ("Use overload with CVPixelBufferPoolSettings")]
|
|
public CVPixelBufferPool (NSDictionary poolAttributes, NSDictionary pixelBufferAttributes)
|
|
{
|
|
if (pixelBufferAttributes == null)
|
|
throw new ArgumentNullException ("pixelBufferAttributes");
|
|
|
|
IntPtr poolOut = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (IntPtr)));
|
|
CVReturn ret = CVPixelBufferPoolCreate (IntPtr.Zero, poolAttributes == null ? IntPtr.Zero : poolAttributes.Handle, pixelBufferAttributes.Handle, poolOut);
|
|
|
|
if (ret != CVReturn.Success) {
|
|
Marshal.FreeHGlobal (poolOut);
|
|
throw new Exception ("CVPixelBufferPoolCreate returned " + ret.ToString ());
|
|
}
|
|
|
|
this.handle = Marshal.ReadIntPtr (poolOut);
|
|
Marshal.FreeHGlobal (poolOut);
|
|
}
|
|
|
|
public CVPixelBufferPool (CVPixelBufferPoolSettings settings, CVPixelBufferAttributes pixelBufferAttributes)
|
|
: this (settings == null ? null : settings.Dictionary, pixelBufferAttributes == null ? null : pixelBufferAttributes.Dictionary)
|
|
{
|
|
}
|
|
#endif
|
|
}
|
|
}
|