Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
 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));
     }
 }
Ejemplo n.º 3
0
 // 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));
     }
 }
Ejemplo n.º 4
0
 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));
     }
 }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        /// <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, &param.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);
        }