void IDeckLinkInputCallback.VideoInputFrameArrived(IDeckLinkVideoInputFrame videoFrame, IDeckLinkAudioInputPacket audioPacket) { IntPtr audioData = (IntPtr)0; IntPtr videoData = (IntPtr)0; if (videoFrame != null) { bool inputSignalChange = videoFrame.GetFlags().HasFlag(_BMDFrameFlags.bmdFrameHasNoInputSource); if (inputSignalChange != m_validInputSignal) { m_validInputSignal = inputSignalChange; InputSignalChanged(m_validInputSignal); } if (inputSignalChange == false) //i.e. frame is valid { videoFrame.GetBytes(out videoData); m_mainWindow.callFrameLoop(m_number, videoData); } } if (audioPacket != null) { audioPacket.GetBytes(out audioData); m_mainWindow.handleAudio(m_number, audioData); } System.Runtime.InteropServices.Marshal.ReleaseComObject(audioPacket); System.Runtime.InteropServices.Marshal.ReleaseComObject(videoFrame); }
void IDeckLinkInputCallback.VideoInputFrameArrived(IDeckLinkVideoInputFrame videoFrame, IDeckLinkAudioInputPacket audioPacket) { if (videoFrame != null) { bool inputSignal = videoFrame.GetFlags().HasFlag(_BMDFrameFlags.bmdFrameHasNoInputSource); if (inputSignal != m_validInputSignal) { m_validInputSignal = inputSignal; InputSignalChanged(m_validInputSignal); } } System.Runtime.InteropServices.Marshal.ReleaseComObject(videoFrame); }
void IDeckLinkInputCallback.VideoInputFrameArrived(IDeckLinkVideoInputFrame videoFrame, IDeckLinkAudioInputPacket audioPacket) { if (videoFrame != null) { bool inputSignalAbsent = videoFrame.GetFlags().HasFlag(_BMDFrameFlags.bmdFrameHasNoInputSource); // Detect change in input signal, restart stream when valid stream detected if (!inputSignalAbsent && m_prevInputSignalAbsent) { m_deckLinkInput.StopStreams(); m_deckLinkInput.FlushStreams(); m_deckLinkInput.StartStreams(); } m_prevInputSignalAbsent = inputSignalAbsent; // Register video frame received event var handler = VideoFrameArrivedHandler; // Check whether there are any subscribers to VideoFrameArrivedHandler if (handler != null) { handler(this, new DeckLinkVideoFrameArrivedEventArgs(videoFrame, inputSignalAbsent)); } } if (audioPacket != null) { // Register audio packet received event var handler = AudioPacketArrivedHandler; // Check whether there are any subscribers to AudioPacketArrivedHandler if (handler != null) { handler(this, new DeckLinkAudioPacketArrivedEventArgs(audioPacket)); } } System.Runtime.InteropServices.Marshal.ReleaseComObject(videoFrame); }
void IDeckLinkInputCallback.VideoInputFrameArrived(IDeckLinkVideoInputFrame videoFrame, IDeckLinkAudioInputPacket audioPacket) { if (videoFrame != null) { try { var frameFlags = videoFrame.GetFlags(); bool inputSignal = frameFlags.HasFlag(_BMDFrameFlags.bmdFrameHasNoInputSource); if (inputSignal != validInputSignal) { validInputSignal = inputSignal; InputSignalChanged?.Invoke(validInputSignal); } else { int width = videoFrame.GetWidth(); int height = videoFrame.GetHeight(); int stride = videoFrame.GetRowBytes(); var format = videoFrame.GetPixelFormat(); var bufferLength = stride * height; videoFrame.GetBytes(out IntPtr pBuffer); VideoDataArrived?.Invoke(pBuffer, bufferLength, 0); //var f = File.Create(@"d:\testBMP2\" + DateTime.Now.ToString("HH_mm_ss_fff") + " " + width + "x" + height + "_" + format + ".raw"); //byte[] data = new byte[bufferLength]; //Marshal.Copy(pBuffer, data, 0, data.Length); //f.Write(data, 0, data.Length); //f.Close(); } } finally { Marshal.ReleaseComObject(videoFrame); } } if (audioPacket != null) { try { long packetTime = 0; //audioPacket.GetPacketTime(out packetTime, 30000); int sampleSize = ((int)AudioSampleType / 8); //32bit int samplesCount = audioPacket.GetSampleFrameCount(); int dataLength = sampleSize * AudioChannelsCount * samplesCount; if (dataLength > 0) { audioPacket.GetBytes(out IntPtr pBuffer); if (pBuffer != IntPtr.Zero) { byte[] data = new byte[dataLength]; Marshal.Copy(pBuffer, data, 0, data.Length); AudioDataArrived?.Invoke(data, packetTime); } } } finally { Marshal.ReleaseComObject(audioPacket); } } }