예제 #1
0
        internal static unsafe void SetFramerateRange(this IPort port, MMAL_RATIONAL_T fpsLow, MMAL_RATIONAL_T fpsHigh)
        {
            var str = new MMAL_PARAMETER_FPS_RANGE_T(
                new MMAL_PARAMETER_HEADER_T(
                    MMALParametersCamera.MMAL_PARAMETER_FPS_RANGE,
                    Marshal.SizeOf <MMAL_PARAMETER_FPS_RANGE_T>()), fpsLow, fpsHigh);

            MMALCheck(MMALPort.mmal_port_parameter_set(port.Ptr, &str.Hdr), "Unable to set framerate range for port.");
        }
예제 #2
0
        /// <summary>
        /// Provides a facility to get data from the port using the native helper functions.
        /// </summary>
        /// <param name="port">The port to get the parameter from.</param>
        /// <param name="key">The unique key for the parameter.</param>
        /// <returns>Dynamic parameter based on key parameter.</returns>
        public static unsafe dynamic GetParameter(this IPort port, int key)
        {
            var t = MMALParameterHelpers.ParameterHelper.Where(c => c.ParamValue == key).FirstOrDefault();

            if (t == null)
            {
                throw new PiCameraError($"Could not find parameter {key}");
            }

            MMALLog.Logger.LogDebug($"Getting parameter {t.ParamName}");

            try
            {
                switch (t.ParamType.Name)
                {
                case "MMAL_PARAMETER_BOOLEAN_T":
                    int boolVal = 0;
                    MMALCheck(MMALUtil.mmal_port_parameter_get_boolean(port.Ptr, (uint)key, ref boolVal), "Unable to get boolean value");
                    return(boolVal == 1);

                case "MMAL_PARAMETER_UINT64_T":
                    ulong ulongVal = 0UL;
                    MMALCheck(MMALUtil.mmal_port_parameter_get_uint64(port.Ptr, (uint)key, ref ulongVal), "Unable to get ulong value");
                    return(ulongVal);

                case "MMAL_PARAMETER_INT64_T":
                    long longVal = 0U;
                    MMALCheck(MMALUtil.mmal_port_parameter_get_int64(port.Ptr, (uint)key, ref longVal), "Unable to get long value");
                    return(longVal);

                case "MMAL_PARAMETER_UINT32_T":
                    uint uintVal = 0U;
                    MMALCheck(MMALUtil.mmal_port_parameter_get_uint32(port.Ptr, (uint)key, ref uintVal), "Unable to get uint value");
                    return(uintVal);

                case "MMAL_PARAMETER_INT32_T":
                    int intVal = 0;
                    MMALCheck(MMALUtil.mmal_port_parameter_get_int32(port.Ptr, (uint)key, ref intVal), "Unable to get int value");
                    return(intVal);

                case "MMAL_PARAMETER_RATIONAL_T":
                    MMAL_RATIONAL_T ratVal = default(MMAL_RATIONAL_T);
                    MMALCheck(MMALUtil.mmal_port_parameter_get_rational(port.Ptr, (uint)key, ref ratVal), "Unable to get rational value");
                    return((double)ratVal.Num / ratVal.Den);

                default:
                    throw new NotSupportedException();
                }
            }
            catch
            {
                MMALLog.Logger.LogWarning($"Unable to get port parameter {t.ParamName}");
                throw;
            }
        }
예제 #3
0
        internal static void SetBrightness(this MMALCameraComponent camera, double brightness)
        {
            MMALLog.Logger.LogDebug($"Setting brightness: {brightness}");

            var value = new MMAL_RATIONAL_T((int)brightness, 100);

            if (brightness >= 0 && brightness <= 100)
            {
                camera.Control.SetParameter(MMAL_PARAMETER_BRIGHTNESS, value);
            }
            else
            {
                throw new Exception("Invalid brightness value");
            }
        }
예제 #4
0
        internal static void SetContrast(this MMALCameraComponent camera, double contrast)
        {
            MMALLog.Logger.LogDebug($"Setting contrast: {contrast}");

            var value = new MMAL_RATIONAL_T((int)contrast, 100);

            if (contrast >= -100 && contrast <= 100)
            {
                camera.Control.SetParameter(MMAL_PARAMETER_CONTRAST, value);
            }
            else
            {
                throw new Exception("Invalid contrast value");
            }
        }
예제 #5
0
        internal static void SetSharpness(this MMALCameraComponent camera, double sharpness)
        {
            MMALLog.Logger.LogDebug($"Setting sharpness: {sharpness}");

            var value = new MMAL_RATIONAL_T((int)sharpness, 100);

            if (sharpness >= -100 && sharpness <= 100)
            {
                camera.Control.SetParameter(MMAL_PARAMETER_SHARPNESS, value);
            }
            else
            {
                throw new Exception("Invalid sharpness value");
            }
        }
예제 #6
0
        internal static void SetSaturation(this MMALCameraComponent camera, double saturation)
        {
            MMALLog.Logger.LogDebug($"Setting saturation: {saturation}");

            var value = new MMAL_RATIONAL_T((int)saturation, 100);

            if (saturation >= -100 && saturation <= 100)
            {
                camera.Control.SetParameter(MMAL_PARAMETER_SATURATION, value);
            }
            else
            {
                throw new Exception("Invalid saturation value");
            }
        }
예제 #7
0
        private void ConfigureVideoProfile(int outputPort)
        {
            var rational        = new MMAL_RATIONAL_T(MMALCameraConfig.Framerate);
            var macroblocks     = (MMALCameraConfig.Resolution.Width >> 4) * (MMALCameraConfig.Resolution.Height >> 4);
            var macroblocksPSec = macroblocks * (rational.Num / rational.Den);

            List <VideoLevel> videoLevels = GetNormalLevelLimits();

            var level = videoLevels.Where(c => c.Level == MMALCameraConfig.VideoLevel).First();

            if (macroblocks > level.MacroblocksLimit)
            {
                throw new PiCameraError("Resolution exceeds macroblock limit for selected profile and level.");
            }

            if (macroblocksPSec > level.MacroblocksPerSecLimit)
            {
                throw new PiCameraError("Resolution exceeds macroblocks/s limit for selected profile and level.");
            }

            MMAL_PARAMETER_VIDEO_PROFILE_S p = new MMAL_PARAMETER_VIDEO_PROFILE_S(MMALCameraConfig.VideoProfile, MMALCameraConfig.VideoLevel);

            MMAL_PARAMETER_VIDEO_PROFILE_S[] arr = new MMAL_PARAMETER_VIDEO_PROFILE_S[1] {
                p
            };

            MMAL_PARAMETER_VIDEO_PROFILE_T param = new MMAL_PARAMETER_VIDEO_PROFILE_T(new MMAL_PARAMETER_HEADER_T(MMALParametersVideo.MMAL_PARAMETER_PROFILE, Marshal.SizeOf <MMAL_PARAMETER_VIDEO_PROFILE_T>()), arr);

            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(param));

            Marshal.StructureToPtr(param, ptr, false);

            try
            {
                MMALCheck(
                    MMALPort.mmal_port_parameter_set(this.Outputs[outputPort].Ptr, (MMAL_PARAMETER_HEADER_T *)ptr),
                    "Unable to set video profile.");
            }
            finally
            {
                Marshal.FreeHGlobal(ptr);
            }
        }
예제 #8
0
 public MMALVideoEncoder(ICaptureHandler handler, MMAL_RATIONAL_T framerate, DateTime?timeout = null, Split split = null) : base(MMALParameters.MMAL_COMPONENT_DEFAULT_VIDEO_ENCODER, handler)
 {
     this.Framerate = framerate.Num / framerate.Den;
     this.Split     = split;
     this.Timeout   = timeout;
 }