AForge.Video.DirectShow.VideoCaptureDevice.SetFrameSizeAndRate C# (CSharp) Method

SetFrameSizeAndRate() private method

private SetFrameSizeAndRate ( IAMStreamConfig streamConfig, Size size, int frameRate ) : void
streamConfig IAMStreamConfig
size Size
frameRate int
return void
        private void SetFrameSizeAndRate( IAMStreamConfig streamConfig, Size size, int frameRate )
        {
            bool sizeSet = false;
            AMMediaType mediaType;

            // get current format
            streamConfig.GetFormat( out mediaType );

            // change frame size if required
            if ( ( size.Width != 0 ) && ( size.Height != 0 ) )
            {
                // iterate through device's capabilities to find mediaType for desired resolution
                int capabilitiesCount = 0, capabilitySize = 0;
                AMMediaType newMediaType = null;
                VideoStreamConfigCaps caps = new VideoStreamConfigCaps( );

                streamConfig.GetNumberOfCapabilities( out capabilitiesCount, out capabilitySize );

                for ( int i = 0; i < capabilitiesCount; i++ )
                {
                    if ( streamConfig.GetStreamCaps( i, out newMediaType, caps ) == 0 )
                    {
                        if ( caps.InputSize == size )
                        {
                            mediaType.Dispose( );
                            mediaType = newMediaType;
                            sizeSet = true;
                            break;
                        }
                        else
                        {
                            newMediaType.Dispose( );
                        }
                    }
                }
            }

            VideoInfoHeader infoHeader = (VideoInfoHeader) Marshal.PtrToStructure( mediaType.FormatPtr, typeof( VideoInfoHeader ) );

            // try changing size manually if failed finding mediaType before
            if ( ( size.Width != 0 ) && ( size.Height != 0 ) && ( !sizeSet ) )
            {
                infoHeader.BmiHeader.Width  = size.Width;
                infoHeader.BmiHeader.Height = size.Height;
            }
            // change frame rate if required
            if ( frameRate != 0 )
            {
                infoHeader.AverageTimePerFrame = 10000000 / frameRate;
            }

            // copy the media structure back
            Marshal.StructureToPtr( infoHeader, mediaType.FormatPtr, false );

            // set the new format
            streamConfig.SetFormat( mediaType );

            mediaType.Dispose( );
        }