virtual public void Close() { if (_component != null) { //# ensure we free any pools associated with input/output ports foreach (var output in Outputs) { output.Disable(); } foreach (var input in Inputs) { input.Disable(); } MMal.MMAL_STATUS_T status = MMal.mmal_component_destroy(_component); if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS) { throw new Exception(String.Format("Unable to destroy component {0}, status {1}. Is it enabled ?", ComponentType, status)); } _component = null; Inputs = null; Outputs = null; Control = null; } }
public void SetParam(MMal.MMAL_PARAMETER_IDS value, bool param) { MMal.MMAL_STATUS_T status = MMal.mmal_port_parameter_set_boolean(_port, (uint)value, param ? 1 : 0); if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS) { throw new Exception(String.Format("Could not set parameter {0}, value {1}: error {2}", value, param, status)); } }
// Disables the component. public void Disable() { MMal.MMAL_STATUS_T status = MMal.mmal_component_disable(_component); if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS) { throw new Exception(String.Format("Unable to disable component {0}, status {1}. Is it enabled ?", ComponentType, status)); } }
public virtual void Enable(UserCallback callback = null) { if (_logger.IsDebugEnabled) { _logger.Debug("Enabling port : {0}", Name); } MMal.MMAL_STATUS_T status = MMal.mmal_port_enable(_port, null); if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS) { throw new Exception(String.Format("Unable to enable port {0} : {1}", Name, status)); } }
public virtual void Disable() { if (_logger.IsDebugEnabled) { _logger.Debug("Disabling port : {0}", Name); } if (Enabled) { MMal.MMAL_STATUS_T status = MMal.mmal_port_disable(_port); if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS) { throw new Exception(String.Format("Unable to disable port {0} : {1}", Name, status)); } } if (_logger.IsDebugEnabled) { _logger.Debug("Port disabled : {0}", Name); } }
/// <summary> /// Default settings used: /// bitrate=17000000, intra_period=None, profile='high', /// level='4', quantization=0, quality=0, inline_headers=True, /// sei=False, sps_timing=False, motion_output=None, /// intra_refresh=None // Max bitrate we allow for recording /// </summary> public unsafe override void CreateEncoder(ImageFormat format, int resize, params string[] options) { if (_logger.IsDebugEnabled) { _logger.Debug("CreateEncoder {0}", format); } int bitrate = 17000000; bool inlineHeaders = true; bool sei = false; bool sps_timing = false; int quality = 23; uint mmalFormat; if (format == ImageFormat.h264) { mmalFormat = MMal.MMAL_ENCODING_H264; } else if (format == ImageFormat.mpeg) { mmalFormat = MMal.MMAL_ENCODING_MJPEG; } else { throw new Exception(String.Format("Invalid video format {0}", format)); } _outputPort.Format = (uint)mmalFormat; if (format == ImageFormat.h264) { //MMal.MMAL_VIDEO_PROFILE_T _profile = MMal.MMAL_VIDEO_PROFILE_T.MMAL_VIDEO_PROFILE_H264_HIGH; //MMal.MMAL_VIDEO_LEVEL_T _level = MMal.MMAL_VIDEO_LEVEL_T.MMAL_VIDEO_LEVEL_H264_4; MMal.MMAL_VIDEO_PROFILE_T profile = GetProfile(options); MMal.MMAL_VIDEO_LEVEL_T level = GetLevel(options); MMal.MMAL_PARAMETER_VIDEO_PROFILE_T param = new MMal.MMAL_PARAMETER_VIDEO_PROFILE_T(); param.hdr.id = (uint)MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_PROFILE; param.hdr.size = (uint)Marshal.SizeOf(param); param.profile = new MMal.VIDEO_PROFILE(); param.profile.profile = profile; param.profile.level = level; MMal.MMAL_STATUS_T status = MMal.mmal_port_parameter_set(_outputPort.Pointer, ¶m.hdr); if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS) { throw new Exception(String.Format("Cannot set parameter on port {0} {1}", _outputPort.Name, status)); } bitrate = GetBitrate(level, bitrate, options); // We need to set the frame rate on output to 0, to ensure it gets // updated correctly from the input framerate when port connected _outputPort.Framerate = (0, 1); _outputPort.BitRate = (uint)bitrate; _outputPort.Commit(); if (_logger.IsDebugEnabled) { _logger.Debug("Port Commited"); } if (inlineHeaders) { _outputPort.SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER, true); } if (sei) { _outputPort.SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_ENCODE_SEI_ENABLE, true); } if (sps_timing) { _outputPort.SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_ENCODE_SPS_TIMING, true); } // other H264 parameters must be set here } else { _outputPort.BitRate = 1; _outputPort.Commit(); } if (quality != 0) { _outputPort.SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_ENCODE_INITIAL_QUANT, quality); _outputPort.SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_ENCODE_MIN_QUANT, quality); _outputPort.SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_ENCODE_MAX_QUANT, quality); } Encoder.Inputs[0].SetParam(MMal.MMAL_PARAMETER_IDS.MMAL_PARAMETER_VIDEO_IMMUTABLE_INPUT, true); Encoder.Enable(); if (_logger.IsDebugEnabled) { _logger.Debug("PiVideoEncoder.CreateEncoder done Output port {0}", _outputPort.ToString()); } base.CreateEncoder(format, resize, options); }