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); }