+ var singlePlane = unmanagedStruct.Plane.SinglePlane;
+
+ if (buffers == null)
+ {
+ buffers = new PinnedPreviewBuffer<byte>(singlePlane.DataLength);
+ }
+
+ Marshal.Copy(singlePlane.Data, buffers[0], 0, (int)singlePlane.DataLength);
+ Plane = new SinglePlane(buffers[0]);
+
+ break;
+ case PlaneType.DoublePlane:
+ var doublePlane = unmanagedStruct.Plane.DoublePlane;
+
+ doublePlane.YLength = (uint)(Resolution.Width * Resolution.Height);
+ doublePlane.UVLength = (uint)(Resolution.Width * Resolution.Height) / 2;
+
+ if (buffers == null)
+ {
+ buffers = new PinnedPreviewBuffer<byte>(doublePlane.YLength, doublePlane.UVLength);
+ }
+
+ Marshal.Copy(doublePlane.Y, buffers[0], 0, (int)doublePlane.YLength);
+ Marshal.Copy(doublePlane.UV, buffers[1], 0, (int)doublePlane.UVLength);
+ Plane = new DoublePlane(buffers[0], buffers[1]);
+
+ break;
+ case PlaneType.TriplePlane:
+ var triplePlane = unmanagedStruct.Plane.TriplePlane;
+
+ if (buffers == null)
+ {
+ buffers = new PinnedPreviewBuffer<byte>(triplePlane.YLength, triplePlane.ULength, triplePlane.VLength);
+ }
+
+ Marshal.Copy(triplePlane.Y, buffers[0], 0, (int)triplePlane.YLength);
+ Marshal.Copy(triplePlane.U, buffers[1], 0, (int)triplePlane.ULength);
+ Marshal.Copy(triplePlane.V, buffers[2], 0, (int)triplePlane.VLength);
+ Plane = new TriplePlane(buffers[0], buffers[1], buffers[2]);
+
+ break;
+ case PlaneType.EncodedPlane:
+ var encodedPlane = unmanagedStruct.Plane.EncodedPlane;
+
+ if (buffers == null)
+ {
+ buffers = new PinnedPreviewBuffer<byte>(encodedPlane.DataLength * 2);
+ }
+
+ Marshal.Copy(encodedPlane.Data, buffers[0], 0, (int)encodedPlane.DataLength);
+ Plane = new EncodedPlane(buffers[0], encodedPlane.IsDeltaFrame);
+
+ break;
+ case PlaneType.DepthPlane:
+ var depthPlane = unmanagedStruct.Plane.DepthPlane;
+
+ if (buffers == null)
+ {
+ buffers = new PinnedPreviewBuffer<byte>(depthPlane.DataLength);
+ }
+
+ Marshal.Copy(depthPlane.Data, buffers[0], 0, (int)depthPlane.DataLength);
+ Plane = new DepthPlane(buffers[0]);
+
+ break;
+ case PlaneType.RgbPlane:
+ var rgbPlane = unmanagedStruct.Plane.RgbPlane;
+
+ if (buffers == null)
+ {
+ buffers = new PinnedPreviewBuffer<byte>(rgbPlane.DataLength);
+ }
+ Marshal.Copy(rgbPlane.Data, buffers[0], 0, (int)rgbPlane.DataLength);
+
+ Plane = new RgbPlane(buffers[0]);
+ break;
+ default:
+ Debug.Fail("Unknown preview data!");
+ break;
+ }
+ }
+
+ internal static uint GetMaxPreviewPlaneSize(IntPtr ptr)
+ {
+ uint size = 0;
+ var unmanagedStruct = Marshal.PtrToStructure<CameraPreviewDataStruct>(ptr);
+
+ switch (GetPlaneType(unmanagedStruct))
+ {
+ case PlaneType.SinglePlane:
+ size = unmanagedStruct.Plane.SinglePlane.DataLength;
+ break;