/// <summary> /// The native callback MMAL passes buffer headers to /// </summary> /// <param name="port">The port the buffer is sent to</param> /// <param name="buffer">The buffer header</param> internal override void NativeOutputPortCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { lock (MMALPortBase.OutputLock) { var bufferImpl = new MMALBufferImpl(buffer); if (MMALCameraConfig.Debug) { bufferImpl.PrintProperties(); } if (bufferImpl.Length > 0) { this.ManagedOutputCallback(bufferImpl, this); } //Ensure we release the buffer before any signalling or we will cause a memory leak due to there still being a reference count on the buffer. this.ReleaseOutputBuffer(bufferImpl); //If this buffer signals the end of data stream, allow waiting thread to continue. if (bufferImpl.Properties.Any(c => c == MMALBufferProperties.MMAL_BUFFER_HEADER_FLAG_FRAME_END || c == MMALBufferProperties.MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED)) { MMALLog.Logger.Debug("End of stream. Signaling completion..."); if (this.Trigger != null && this.Trigger.CurrentCount > 0) { this.Trigger.Signal(); } } } }
internal override void NativeInputPortCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { lock (MMALPortBase.InputLock) { var bufferImpl = new MMALBufferImpl(buffer); if (MMALCameraConfig.Debug) { bufferImpl.PrintProperties(); } this.ReleaseInputBuffer(bufferImpl); } }
/// <summary> /// The native callback MMAL passes buffer headers to. /// </summary> /// <param name="port">The port the buffer is sent to.</param> /// <param name="buffer">The buffer header.</param> internal override void NativeOutputPortCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { lock (MMALPortBase.OutputLock) { if (MMALCameraConfig.Debug) { MMALLog.Logger.Debug("In native output callback"); } var bufferImpl = new MMALBufferImpl(buffer); if (MMALCameraConfig.Debug) { bufferImpl.PrintProperties(); } var triggered = this.Trigger != null && this.Trigger.CurrentCount == 0; var failed = bufferImpl.Properties.Any(c => c == MMALBufferProperties.MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED); var eos = bufferImpl.Properties.Any(c => c == MMALBufferProperties.MMAL_BUFFER_HEADER_FLAG_FRAME_END || c == MMALBufferProperties.MMAL_BUFFER_HEADER_FLAG_EOS) || this.ComponentReference.ForceStopProcessing; if ((bufferImpl.CheckState() && bufferImpl.Length > 0 && !eos && !failed && !triggered) || (eos && !triggered)) { this.ManagedOutputCallback.Callback(bufferImpl); } // Ensure we release the buffer before any signalling or we will cause a memory leak due to there still being a reference count on the buffer. this.ReleaseOutputBuffer(bufferImpl); // If this buffer signals the end of data stream, allow waiting thread to continue. if (eos || failed) { if (this.Trigger != null && this.Trigger.CurrentCount > 0) { MMALLog.Logger.Debug("End of stream. Signaling completion..."); this.Trigger.Signal(); } } } }