public override IDownstreamComponent ConfigureOutputPort(int outputPort, IMmalPortConfig config, ICaptureHandler handler) { var bufferSize = Math.Max(Outputs[outputPort].Ptr->BufferSizeRecommended, Outputs[outputPort].Ptr->BufferSizeMin); var bitrate = GetValidBitrate(config); // Force framerate to be 0 in case it was provided by user. config = new MmalPortConfig( config.EncodingType, config.PixelFormat, config.Quality, bitrate, config.Timeout, config.Split, config.StoreMotionVectors, config.Width, config.Height, config.Framerate, config.ZeroCopy, config.BufferNum, bufferSize, config.Crop); base.ConfigureOutputPort(outputPort, config, handler); ConfigureIntraPeriod(outputPort); ConfigureVideoProfile(outputPort); ConfigureInlineHeaderFlag(outputPort); ConfigureInlineVectorsFlag(outputPort); ConfigureIntraRefresh(outputPort); ConfigureQuantisationParameter(outputPort, config.Quality); ConfigureImmutableInput(); return(this); }
static int GetValidBitrate(IMmalPortConfig config) { var bitrate = config.Bitrate; List <VideoLevel> levelList; if (CameraConfig.VideoProfile == MmalParametersVideo.MmalVideoProfileT.MmalVideoProfileH264High) { levelList = GetHighLevelLimits(); } else if (CameraConfig.VideoProfile == MmalParametersVideo.MmalVideoProfileT.MmalVideoProfileH264High10) { levelList = GetHigh10LevelLimits(); } else { levelList = GetNormalLevelLimits(); } var level = levelList.First(c => c.Level == CameraConfig.VideoLevel); if (config.Bitrate > level.Maxbitrate) { throw new PiCameraError("Bitrate requested exceeds maximum for selected Video Level and Profile"); } return(bitrate); }
public virtual IDownstreamComponent ConfigureOutputPort(int outputPort, IMmalPortConfig config, ICaptureHandler handler) { if (ProcessingPorts.ContainsKey(outputPort)) { ProcessingPorts.Remove(outputPort); } ProcessingPorts.Add(outputPort, Outputs[outputPort]); Outputs[outputPort].Configure(config, Inputs[0], handler); return(this); }
public override void Configure(IMmalPortConfig config, IInputPort copyFrom, ICaptureHandler handler) { CallbackHandler = new VideoOutputCallbackHandler(this, handler); if (config == null) { return; } PortConfig = config; copyFrom?.ShallowCopy(this); if (config.EncodingType != null) { NativeEncodingType = config.EncodingType.EncodingVal; } if (config.PixelFormat != null) { NativeEncodingSubformat = config.PixelFormat.EncodingVal; } var tempVid = Ptr->Format->Es->Video; try { Commit(); } catch { // If commit fails using new settings, attempt to reset using old temp MMAL_VIDEO_FORMAT_T. MmalLog.Logger.LogWarning($"{Name}: Commit of output port failed. Attempting to reset values."); Ptr->Format->Es->Video = tempVid; Commit(); } if (config.ZeroCopy) { ZeroCopy = true; this.SetParameter(MmalParametersCommon.MmalParameterZeroCopy, true); } if (CameraConfig.VideoColorSpace != null && CameraConfig.VideoColorSpace.EncType == MmalEncoding.EncodingType.ColorSpace) { VideoColorSpace = CameraConfig.VideoColorSpace; } if (config.Bitrate > 0) { Bitrate = config.Bitrate; } EncodingType = config.EncodingType; PixelFormat = config.PixelFormat; BufferNum = Math.Max(BufferNumMin, config.BufferNum > 0 ? config.BufferNum : BufferNumRecommended); BufferSize = Math.Max(BufferSizeMin, config.BufferSize > 0 ? config.BufferSize : BufferSizeRecommended); Commit(); }
public virtual unsafe IDownstreamComponent ConfigureOutputPort <TPort>(int outputPort, IMmalPortConfig config, ICaptureHandler handler) where TPort : IOutputPort { Outputs[outputPort] = (IOutputPort)Activator.CreateInstance(typeof(TPort), (IntPtr)(&(*Ptr->Output[outputPort])), this, Guid.NewGuid()); return(ConfigureOutputPort(outputPort, config, handler)); }
public virtual IDownstreamComponent ConfigureOutputPort(IMmalPortConfig config, ICaptureHandler handler) => ConfigureOutputPort(0, config, handler);
public override IDownstreamComponent ConfigureOutputPort(int outputPort, IMmalPortConfig config, ICaptureHandler handler) { base.ConfigureOutputPort(outputPort, config, handler); return(this); }