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 MMalBaseComponent()
        {
            //	mmal_check(
            //	mmal.mmal_component_create(self.component_type, self._component),
            //	prefix = "Failed to create MMAL component %s" % self.component_type)

            //if self._component[0].input_num != len(self.opaque_input_subformats):
            //          raise PiCameraRuntimeError(

            //		'Expected %d inputs but found %d on component %s' % (
            //			len(self.opaque_input_subformats),
            //			self._component[0].input_num,
            //			self.component_type))
            //      if self._component[0].output_num != len(self.opaque_output_subformats):
            //          raise PiCameraRuntimeError(

            //		'Expected %d outputs but found %d on component %s' % (
            //			len(self.opaque_output_subformats),
            //			self._component[0].output_num,
            //			self.component_type))
            MMal.MMAL_STATUS_T     status;
            MMal.MMAL_COMPONENT_T *component = null;

            status = MMal.mmal_component_create(ComponentType, &component);
            if (status != MMal.MMAL_STATUS_T.MMAL_SUCCESS)
            {
                throw new Exception(String.Format("Unable to create component {0}, status {1}. Is it enabled ?", ComponentType, status));
            }
            _component = component;
#if !_WIN32_
            if (_component->input_num != OpaqueInputSubformats.Length)
            {
                throw new Exception(String.Format("Expected {0} inputs but found {1} on component {2}",
                                                  OpaqueInputSubformats.Length,
                                                  _component->input_num,
                                                  ComponentType));
            }
            if (_component->output_num != OpaqueOutputSubformats.Length)
            {
                throw new Exception(String.Format("Expected {0} outputs but found {1} on component {2}",
                                                  OpaqueOutputSubformats.Length,
                                                  _component->output_num,
                                                  ComponentType));
            }
#endif
            Control = new MMalControlPort(_component->control);

            MMal.MMAL_PORT_T **ports = _component->output;
            Outputs = CreatePorts(ports, _component->output_num, OpaqueOutputSubformats);
            ports   = _component->input;
            Inputs  = CreatePorts(ports, _component->input_num, OpaqueInputSubformats);

            //port_class = {
            //	mmal.MMAL_ES_TYPE_UNKNOWN:    MMALPort,
            //         mmal.MMAL_ES_TYPE_CONTROL:    MMALControlPort,
            //         mmal.MMAL_ES_TYPE_VIDEO:      MMALVideoPort,
            //         mmal.MMAL_ES_TYPE_AUDIO:      MMALAudioPort,
            //         mmal.MMAL_ES_TYPE_SUBPICTURE: MMALSubPicturePort,
            //         }
            //self._inputs = tuple(
            //	port_class[self._component[0].input[n][0].format[0].type](
            //		self._component[0].input[n], opaque_subformat)

            //for n, opaque_subformat in enumerate(self.opaque_input_subformats))
            //	self._outputs = tuple(
            //		port_class[self._component[0].output[n][0].format[0].type](
            //			self._component[0].output[n], opaque_subformat)

            //for n, opaque_subformat in enumerate(self.opaque_output_subformats))


            //Outputs = new MMalPort[_component->output_num];
            //MMal.MMAL_PORT_T** ports = _component->output;
            //for (int i = 0; i < _component->output_num; i++)
            //	Outputs[i] = new MMalPort(ports[i]);

            //Inputs = new MMalPort[_component->input_num];
            //ports = _component->input;
            //for (int i = 0; i < _component->input_num; i++)
            //	Inputs[i] = new MMalPort(ports[i]);
        }