private void UpdateImageContainer() { CameraDeviceImpl instance = (CameraDeviceImpl)CameraDevice.Instance; if ((this.mNumImageHeaders != instance.GetAllImages().Count) || ((instance.GetAllImages().Count > 0) && (this.mImageHeaderData == IntPtr.Zero))) { this.mNumImageHeaders = instance.GetAllImages().Count; Marshal.FreeHGlobal(this.mImageHeaderData); this.mImageHeaderData = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(ImageHeaderData)) * this.mNumImageHeaders)); } int num = 0; foreach (ImageImpl impl2 in instance.GetAllImages().Values) { IntPtr ptr = new IntPtr(this.mImageHeaderData.ToInt32() + (num * Marshal.SizeOf(typeof(ImageHeaderData)))); ImageHeaderData structure = new ImageHeaderData { width = impl2.Width, height = impl2.Height, stride = impl2.Stride, bufferWidth = impl2.BufferWidth, bufferHeight = impl2.BufferHeight, format = (int)impl2.PixelFormat, reallocate = 0, updated = 0, data = impl2.UnmanagedData }; Marshal.StructureToPtr(structure, ptr, false); num++; } }
private void UpdateCameraFrame() { int num = 0; CameraDeviceImpl instance = (CameraDeviceImpl)CameraDevice.Instance; foreach (ImageImpl impl2 in instance.GetAllImages().Values) { IntPtr ptr = new IntPtr(this.mImageHeaderData.ToInt32() + (num * Marshal.SizeOf(typeof(ImageHeaderData)))); ImageHeaderData data = (ImageHeaderData)Marshal.PtrToStructure(ptr, typeof(ImageHeaderData)); impl2.Width = data.width; impl2.Height = data.height; impl2.Stride = data.stride; impl2.BufferWidth = data.bufferWidth; impl2.BufferHeight = data.bufferHeight; impl2.PixelFormat = (Image.PIXEL_FORMAT)data.format; if (data.reallocate == 1) { impl2.Pixels = new byte[QCARWrapper.Instance.QcarGetBufferSize(impl2.BufferWidth, impl2.BufferHeight, (int)impl2.PixelFormat)]; Marshal.FreeHGlobal(impl2.UnmanagedData); impl2.UnmanagedData = Marshal.AllocHGlobal(QCARWrapper.Instance.QcarGetBufferSize(impl2.BufferWidth, impl2.BufferHeight, (int)impl2.PixelFormat)); } else if (data.updated == 1) { impl2.CopyPixelsFromUnmanagedBuffer(); } num++; } }
// Unmarshal the camera images for this frame private void UpdateCameraFrame() { // Unmarshal the image data: int i = 0; CameraDeviceImpl cameraDeviceImpl = (CameraDeviceImpl)CameraDevice.Instance; foreach (ImageImpl image in cameraDeviceImpl.GetAllImages().Values) { IntPtr imagePtr = new IntPtr(mImageHeaderData.ToInt32() + i * Marshal.SizeOf(typeof(ImageHeaderData))); ImageHeaderData imageHeader = (ImageHeaderData) Marshal.PtrToStructure(imagePtr, typeof(ImageHeaderData)); // Copy info back to managed Image instance: image.Width = imageHeader.width; image.Height = imageHeader.height; image.Stride = imageHeader.stride; image.BufferWidth = imageHeader.bufferWidth; image.BufferHeight = imageHeader.bufferHeight; image.PixelFormat = (Image.PIXEL_FORMAT)imageHeader.format; // Reallocate if required: if (imageHeader.reallocate == 1) { image.Pixels = new byte[QCARWrapper.Instance.QcarGetBufferSize(image.BufferWidth, image.BufferHeight, (int)image.PixelFormat)]; Marshal.FreeHGlobal(image.UnmanagedData); image.UnmanagedData = Marshal.AllocHGlobal(QCARWrapper.Instance.QcarGetBufferSize(image.BufferWidth, image.BufferHeight, (int)image.PixelFormat)); // Note we don't copy the data this frame as the unmanagedVirtualButtonBehaviour // buffer was not filled. } else if (imageHeader.updated == 1) { // Copy data: image.CopyPixelsFromUnmanagedBuffer(); } ++i; } }
// Update the image container for the currently registered formats private void UpdateImageContainer() { CameraDeviceImpl cameraDeviceImpl = (CameraDeviceImpl)CameraDevice.Instance; // Reallocate the data container if the number of requested images has // changed, or if the container is not allocated if (mNumImageHeaders != cameraDeviceImpl.GetAllImages().Count || (cameraDeviceImpl.GetAllImages().Count > 0 && mImageHeaderData == IntPtr.Zero)) { mNumImageHeaders = cameraDeviceImpl.GetAllImages().Count; Marshal.FreeHGlobal(mImageHeaderData); mImageHeaderData = Marshal.AllocHGlobal(Marshal.SizeOf( typeof(ImageHeaderData)) * mNumImageHeaders); } // Update the image info: int i = 0; foreach (ImageImpl image in cameraDeviceImpl.GetAllImages().Values) { IntPtr imagePtr = new IntPtr(mImageHeaderData.ToInt32() + i * Marshal.SizeOf(typeof(ImageHeaderData))); ImageHeaderData imageHeader = new ImageHeaderData(); imageHeader.width = image.Width; imageHeader.height = image.Height; imageHeader.stride = image.Stride; imageHeader.bufferWidth = image.BufferWidth; imageHeader.bufferHeight = image.BufferHeight; imageHeader.format = (int)image.PixelFormat; imageHeader.reallocate = 0; imageHeader.updated = 0; imageHeader.data = image.UnmanagedData; Marshal.StructureToPtr(imageHeader, imagePtr, false); ++i; } }