public override bool Build(DirectShowLib.IPin source, IBuild build)
        {
            this.build          = build;
            this.build.OnClose += this.Dispose;
            bool result;

            if (result = base.Build(source, build))
            {
                DirectShowLib.AMMediaType media = new DirectShowLib.AMMediaType();
                Exception.GraphError.Check((this.grabber as  DirectShowLib.ISampleGrabber).GetConnectedMediaType(media));
                DirectShowLib.VideoInfoHeader header = (DirectShowLib.VideoInfoHeader)System.Runtime.InteropServices.Marshal.PtrToStructure(media.formatPtr, typeof(DirectShowLib.VideoInfoHeader));
                this.size     = new Geometry2D.Integer.Size(header.BmiHeader.Width, header.BmiHeader.Height);
                this.lifetime = header.AvgTimePerFrame;
                // NOTE!!!! Here we set a default frame rate if the video does not have such information available.
                if (this.lifetime < 1000 || this.lifetime > 10000000)
                {
                    this.lifetime = 400000;
                }
                if (this.Rate.NotNull())
                {
                    double factor = (double)this.Rate / (1000 / new TimeSpan(this.lifetime).TotalMilliseconds);
                    int    code   = (this.build.Graph as DirectShowLib.IMediaSeeking).SetRate(factor);
                }
            }
            return(result);
        }
        bool SetFormat(DirectShowLib.IBaseFilter filter)
        {
            bool result = false;

            Format.Image wanted = this.Media(filter);
            if (wanted.NotNull())
            {
                if (wanted.Resolution.NotNull())
                {
                    DirectShowLib.AMMediaType[] media = this.GetOutputMediaTypes(filter);
                    if (media.NotNull())
                    {
                        for (int i = 0; i < media.Length; i++)
                        {
                            DirectShowLib.VideoInfoHeader header = Abstract.GetHeader(media[i]);
                            if (media[i].subType == wanted.Type &&
                                header.BmiHeader.Width == wanted.Resolution.Width)
                            {
                                if (header.BmiHeader.Height == wanted.Resolution.Height)
                                {
                                    this.SetOutputMedia(filter, media[i]);
                                    result = true;
                                    break;
                                }
                                else if (wanted.ForceHeight)
                                {
                                    header.BmiHeader.Height    = wanted.Resolution.Height;
                                    header.BmiHeader.ImageSize = header.BmiHeader.Width * header.BmiHeader.Height * header.BmiHeader.BitCount / 8;
                                    header.BitRate             = (int)((10000000 / header.AvgTimePerFrame) * header.BmiHeader.ImageSize * 8);
                                    Abstract.SetHeader(media[i], header);
                                    media[i].sampleSize = header.BmiHeader.ImageSize;
                                    this.SetOutputMedia(filter, media[i]);
                                    result = true;
                                    break;
                                }
                            }
                        }
                    }
                }
                else
                {
                    result = true;
                }
            }
            return(result);
        }
 protected static void SetHeader(DirectShowLib.AMMediaType media, DirectShowLib.VideoInfoHeader header)
 {
     System.Runtime.InteropServices.Marshal.StructureToPtr(header, media.formatPtr, true);
 }