void OnVideoFragmentReady(NikonDevice sender, NikonVideoFragment fragment) { if (_videoFragmentReady != null) { _videoFragmentReady(sender, fragment); } }
unsafe void DataItemGetVideoImage(NikonObject data) { string name = data.GetString(eNkMAIDCapability.kNkMAIDCapability_Name); NkMAIDSize videoDimensions = data.GetSize(eNkMAIDCapability.kNkMAIDCapability_Pixels); NkMAIDGetVideoImage videoImage = new NkMAIDGetVideoImage(); data.GetGeneric(eNkMAIDCapability.kNkMAIDCapability_GetVideoImage, new IntPtr(&videoImage)); // Note: Download 4MB at the time const int chunkSize = 4 * 1024 * 1024; uint totalSize = videoImage.ulDataSize; for (uint offset = 0; offset < totalSize; offset += chunkSize) { uint fragmentSize = Math.Min(chunkSize, totalSize - offset); byte[] buffer = new byte[fragmentSize]; fixed(byte *pBuffer = buffer) { videoImage.ulOffset = offset; videoImage.ulReadSize = (uint)buffer.Length; videoImage.ulDataSize = (uint)buffer.Length; videoImage.pData = new IntPtr(pBuffer); data.GetArrayGeneric(eNkMAIDCapability.kNkMAIDCapability_GetVideoImage, new IntPtr(&videoImage)); } NikonVideoFragment fragment = new NikonVideoFragment( name, totalSize, offset, buffer, videoDimensions.w, videoDimensions.h); Scheduler.Callback(new VideoFragmentReadyDelegate(OnVideoFragmentReady), this, fragment); } }
void device_VideoFragmentReady(NikonDevice sender, NikonVideoFragment fragment) { string path = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), fragment.Filename); if (fragment.IsFirst) { Debug.Assert(_videoFile == null); _videoFile = new FileStream(path, FileMode.Create, FileAccess.Write); Log.GetInstance().WriteLine("Downloading Video..."); } Log.GetInstance().WriteLine(fragment.PercentComplete.ToString(".0") + "%"); Debug.Assert(_videoFile != null); _videoFile.Write(fragment.Buffer, 0, fragment.Buffer.Length); if (fragment.IsLast) { _videoFile.Close(); _videoFile = null; Log.GetInstance().WriteLine("Saved Video: " + path + " (" + fragment.VideoWidth + "x" + fragment.VideoHeight + ")"); } }
unsafe void DataItemGetVideoImage(NikonObject data) { string name = data.GetString(eNkMAIDCapability.kNkMAIDCapability_Name); NkMAIDSize videoDimensions = data.GetSize(eNkMAIDCapability.kNkMAIDCapability_Pixels); NkMAIDGetVideoImage videoImage = new NkMAIDGetVideoImage(); data.GetGeneric(eNkMAIDCapability.kNkMAIDCapability_GetVideoImage, new IntPtr(&videoImage)); // Note: Download 4MB at the time const int chunkSize = 4 * 1024 * 1024; uint totalSize = videoImage.ulDataSize; for (uint offset = 0; offset < totalSize; offset += chunkSize) { uint fragmentSize = Math.Min(chunkSize, totalSize - offset); byte[] buffer = new byte[fragmentSize]; fixed (byte* pBuffer = buffer) { videoImage.ulOffset = offset; videoImage.ulReadSize = (uint)buffer.Length; videoImage.ulDataSize = (uint)buffer.Length; videoImage.pData = new IntPtr(pBuffer); data.GetArrayGeneric(eNkMAIDCapability.kNkMAIDCapability_GetVideoImage, new IntPtr(&videoImage)); } NikonVideoFragment fragment = new NikonVideoFragment( name, totalSize, offset, buffer, videoDimensions.w, videoDimensions.h); Scheduler.Callback(new VideoFragmentReadyDelegate(OnVideoFragmentReady), this, fragment); } }
void _device_VideoFragmentReady(NikonDevice sender, NikonVideoFragment fragment) { // Open the filestream when we receive the first video fragment if (fragment.IsFirst) { _fileStream = new FileStream(fragment.Filename, FileMode.Create, FileAccess.Write); } // Save video fragments to file _fileStream.Write(fragment.Buffer, 0, fragment.Buffer.Length); // When we recive the last fragment, close the file and signal that we're done if (fragment.IsLast) { _fileStream.Close(); _waitForVideoCompleted.Set(); } }