Example #1
0
        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);
            }
        }
Example #2
0
        /// <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();
                }
            }
        }
Example #3
0
        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();
				}
			}
		}