public override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error) { // 删除临时文件 if (File.Exists(_tempFile)) { try { File.Delete(_tempFile); } catch { } } var resp = task.Response as NSHttpUrlResponse; if (error != null || resp == null || (resp.StatusCode != 200 && resp.StatusCode != 201)) { // 暂时简化错误提示 string ex = $"{(resp == null ? "" : "状态码:" + resp.StatusCode.ToString() + "\r\n")}{(error == null ? "" : error.Description)}"; _result.TrySetException(new Exception(ex)); return; } var data = _dataResponse.ToArray(); if (data != null && data.Length > 0) { var reader = new Utf8JsonReader(data); reader.Read(); var ls = JsonRpcSerializer.Deserialize(ref reader) as List <string>; _result.SetResult(ls); } else { _result.SetResult(null); } }
/// <summary> /// Encodes a frame. /// </summary> /// <param name="frame">The frame.</param> /// <returns></returns> public override byte[] Encode(VideoBuffer frame) { if (_Encoder == null) { _Encoder = new CocoaVp8Encoder(); _Encoder.Quality = 0.5; _Encoder.Bitrate = 320; //_Encoder.Scale = 1.0; } if (frame.ResetKeyFrame) { _Encoder.SendKeyframe(); } using (var pool = new NSAutoreleasePool()) { VideoPlane planeY = frame.Planes[0]; VideoPlane planeU = frame.Planes[1]; VideoPlane planeV = frame.Planes[2]; GCHandle planeYDataHandle = GCHandle.Alloc(planeY.Data, GCHandleType.Pinned); GCHandle planeUDataHandle = GCHandle.Alloc(planeU.Data, GCHandleType.Pinned); GCHandle planeVDataHandle = GCHandle.Alloc(planeV.Data, GCHandleType.Pinned); try { IntPtr planeYDataPointer = planeYDataHandle.AddrOfPinnedObject(); IntPtr planeUDataPointer = planeUDataHandle.AddrOfPinnedObject(); IntPtr planeVDataPointer = planeVDataHandle.AddrOfPinnedObject(); //TODO: index/length using (var buffer = new CocoaVp8Buffer { PlaneY = NSData.FromBytesNoCopy(planeYDataPointer, (uint)planeY.Data.Length, false), PlaneU = NSData.FromBytesNoCopy(planeUDataPointer, (uint)planeU.Data.Length, false), PlaneV = NSData.FromBytesNoCopy(planeVDataPointer, (uint)planeV.Data.Length, false), StrideY = planeY.Stride, StrideU = planeU.Stride, StrideV = planeV.Stride, Width = frame.Width, Height = frame.Height }) { using (var encodedFrame = new NSMutableData()) { if (_Encoder.EncodeBuffer(buffer, encodedFrame)) { return(encodedFrame.ToArray()); } return(null); } } } finally { planeYDataHandle.Free(); planeUDataHandle.Free(); planeVDataHandle.Free(); } } }
public void Save(Stream stream, ImageFormat format) { if (stream == null) throw new ArgumentNullException ("stream"); if (NativeCGImage == null) throw new ObjectDisposedException ("cgimage"); // for now we will just default this to png var typeIdentifier = "public.png"; // Get the correct type identifier if (format == ImageFormat.Bmp) typeIdentifier = "com.microsoft.bmp"; // else if (format == ImageFormat.Emf) // typeIdentifier = "image/emf"; // else if (format == ImageFormat.Exif) // typeIdentifier = "image/exif"; else if (format == ImageFormat.Gif) typeIdentifier = "com.compuserve.gif"; else if (format == ImageFormat.Icon) typeIdentifier = "com.microsoft.ico"; else if (format == ImageFormat.Jpeg) typeIdentifier = "public.jpeg"; else if (format == ImageFormat.Png) typeIdentifier = "public.png"; else if (format == ImageFormat.Tiff) typeIdentifier = "public.tiff"; else if (format == ImageFormat.Wmf) typeIdentifier = "com.adobe.pdf"; // Not sure what this is yet else if (format == ImageFormat.MemoryBmp) throw new NotImplementedException("ImageFormat.MemoryBmp not supported"); using (var imageData = new NSMutableData ()) { using (var dest = CGImageDestination.Create (imageData, typeIdentifier, frameCount)) { dest.AddImage (NativeCGImage, (NSDictionary)null); dest.Close (); } using (var ms = new MemoryStream (imageData.ToArray())) { ms.WriteTo (stream); stream.Seek (0,System.IO.SeekOrigin.Begin); } } }
private byte[] GenerateKeyPairCore(string name) { using (var parameters = new SecRecord(SecKind.Key)) { parameters.AccessControl = new SecAccessControl(SecAccessible.WhenPasscodeSetThisDeviceOnly, SecAccessControlCreateFlags.TouchIDCurrentSet | SecAccessControlCreateFlags.PrivateKeyUsage); parameters.KeyType = SecKeyType.EC; parameters.KeySizeInBits = 256; parameters.TokenID = SecTokenID.SecureEnclave; var privateKeyParameters = new NSMutableDictionary(); privateKeyParameters.Add(kSecAttrApplicationTag, new NSString($"{name}_priv")); privateKeyParameters.Add(kSecAttrIsPermanent, NSNumber.FromBoolean(true)); var publicKeyParameters = new NSMutableDictionary(); publicKeyParameters.Add(kSecAttrApplicationTag, new NSString($"{name}_pub")); publicKeyParameters.Add(kSecAttrIsPermanent, NSNumber.FromBoolean(false)); var mutableDictionary = (NSMutableDictionary)parameters.ToDictionary(); mutableDictionary.Add(kSecPrivateKeyAttrs, new NSDictionary(privateKeyParameters)); mutableDictionary.Add(kSecPublicKeyAttrs, new NSDictionary(publicKeyParameters)); var result = SecKey.GenerateKeyPair((NSDictionary)mutableDictionary, out var publicKey, out var privateKey); if (result == SecStatusCode.Success) { privateKey.Dispose(); using (var record = new SecRecord(SecKind.Key)) { record.KeyClass = SecKeyClass.Public; record.KeyType = SecKeyType.EC; record.IsPermanent = false; record.Label = "Public Key"; record.SetValueRef(publicKey); var dict = (NSMutableDictionary)record.ToDictionary(); dict.Add(kSecReturnData, NSNumber.FromBoolean(true)); var status = SecItemAdd(dict.Handle, out var publicKeyDataPtr); publicKey.Dispose(); if (status == SecStatusCode.Success) { var publicKeyData = ObjCRuntime.Runtime.GetINativeObject <NSData>(publicKeyDataPtr, true); if (publicKeyData != null) { // Apple's SecurityFramework uses raw keys which need to be wrapped in proper ASN.1 for outside consumption // See : https://forums.developer.apple.com/thread/8030 var header = NSData.FromArray(new byte[] { 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00 }); var buffer = new NSMutableData(header.Length + publicKeyData.Length); buffer.AppendData(header); buffer.AppendData(publicKeyData); return(buffer.ToArray()); } } return(null); } } else { throw new SecurityException(result); } } }
/// <summary> /// Encodes a frame. /// </summary> /// <param name="frame">The frame.</param> /// <returns></returns> public override byte[] Encode(VideoBuffer frame) { if (_Encoder == null) { _Encoder = new CocoaVp8Encoder(); _Encoder.Quality = 0.5; _Encoder.Bitrate = 320; //_Encoder.Scale = 1.0; } if (frame.ResetKeyFrame) { _Encoder.SendKeyframe(); } using (var pool = new NSAutoreleasePool()) { VideoPlane planeY = frame.Planes[0]; VideoPlane planeU = frame.Planes[1]; VideoPlane planeV = frame.Planes[2]; GCHandle planeYDataHandle = GCHandle.Alloc(planeY.Data, GCHandleType.Pinned); GCHandle planeUDataHandle = GCHandle.Alloc(planeU.Data, GCHandleType.Pinned); GCHandle planeVDataHandle = GCHandle.Alloc(planeV.Data, GCHandleType.Pinned); try { IntPtr planeYDataPointer = planeYDataHandle.AddrOfPinnedObject(); IntPtr planeUDataPointer = planeUDataHandle.AddrOfPinnedObject(); IntPtr planeVDataPointer = planeVDataHandle.AddrOfPinnedObject(); //TODO: index/length using (var buffer = new CocoaVp8Buffer { PlaneY = NSData.FromBytesNoCopy(planeYDataPointer, (uint)planeY.Data.Length, false), PlaneU = NSData.FromBytesNoCopy(planeUDataPointer, (uint)planeU.Data.Length, false), PlaneV = NSData.FromBytesNoCopy(planeVDataPointer, (uint)planeV.Data.Length, false), StrideY = planeY.Stride, StrideU = planeU.Stride, StrideV = planeV.Stride, Width = frame.Width, Height = frame.Height }) { using (var encodedFrame = new NSMutableData()) { if (_Encoder.EncodeBuffer(buffer, encodedFrame)) { return encodedFrame.ToArray(); } return null; } } } finally { planeYDataHandle.Free(); planeUDataHandle.Free(); planeVDataHandle.Free(); } } }