internal void ConfigureVideoProfile(int outputPort) { var macroblocks = (MMALCameraConfig.VideoResolution.Width >> 4) * (MMALCameraConfig.VideoResolution.Height >> 4); var macroblocksPSec = macroblocks * this.Framerate; List <VideoLevel> videoLevels = H264VideoLevel.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); MMALCheck(MMALPort.mmal_port_parameter_set(this.Outputs[outputPort].Ptr, (MMAL_PARAMETER_HEADER_T *)ptr), "Unable to set video profile."); Marshal.FreeHGlobal(ptr); }
internal void ConfigureBitrate(int outputPort) { if (this.Outputs[outputPort].EncodingType == MMALEncoding.H264) { List <VideoLevel> levelList = null; if (MMALCameraConfig.VideoProfile == MMALParametersVideo.MMAL_VIDEO_PROFILE_T.MMAL_VIDEO_PROFILE_H264_HIGH) { levelList = H264VideoLevel.GetHighLevelLimits(); } else if (MMALCameraConfig.VideoProfile == MMALParametersVideo.MMAL_VIDEO_PROFILE_T.MMAL_VIDEO_PROFILE_H264_HIGH10) { levelList = H264VideoLevel.GetHigh10LevelLimits(); } else { levelList = H264VideoLevel.GetNormalLevelLimits(); } var level = levelList.Where(c => c.Level == MMALCameraConfig.VideoLevel).First(); if (this.Bitrate > level.Maxbitrate) { throw new PiCameraError("Bitrate requested exceeds maximum for selected Video Level and Profile"); } } else if (this.Outputs[outputPort].EncodingType == MMALEncoding.MJPEG) { if (this.Bitrate > MaxBitrateMJPEG) { MMALLog.Logger.Warn("Bitrate too high: Reducing to 25MBit/s"); this.Bitrate = MaxBitrateMJPEG; } } }