コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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));
        }
コード例 #6
0
 public virtual IDownstreamComponent ConfigureOutputPort(IMmalPortConfig config, ICaptureHandler handler) => ConfigureOutputPort(0, config, handler);
コード例 #7
0
        public override IDownstreamComponent ConfigureOutputPort(int outputPort, IMmalPortConfig config, ICaptureHandler handler)
        {
            base.ConfigureOutputPort(outputPort, config, handler);

            return(this);
        }