public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value) { if (context != null && context.Instance != null && provider != null) { edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (edSvc != null) { System.Windows.Forms.ListBox vListBox = new ListBox(); vListBox.BorderStyle = BorderStyle.None; vListBox.Click += new EventHandler(List_Click); //vListBox.Items.Add(""); ChannelAnalogic.CaptureFormat currentCaptureFormat = value as ChannelAnalogic.CaptureFormat; string captureDeviceName = ""; if (context.Instance is ChannelAnalogic) { captureDeviceName = (context.Instance as ChannelAnalogic).VideoCaptureDeviceName; } else if (context.Instance is Array) { object[] array = context.Instance as object[]; if (array.Length > 0) { ChannelAnalogic channelAnalogic = array[0] as ChannelAnalogic; if (channelAnalogic != null) { bool sameChannelAndVideoCaptureDevice = true; foreach (Channel channel in array) { if (!(channel is ChannelAnalogic) || (channel as ChannelAnalogic).VideoCaptureDeviceName != channelAnalogic.VideoCaptureDeviceName) { sameChannelAndVideoCaptureDevice = false; break; } } if (sameChannelAndVideoCaptureDevice) captureDeviceName = channelAnalogic.VideoCaptureDeviceName; } } } DsDevice[] tunDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); foreach (DirectShowLib.DsDevice captureDevice in tunDevices) { if (captureDevice.Name == captureDeviceName) { Guid baseFilterIID = typeof(IBaseFilter).GUID; object captureFilterObject; captureDevice.Mon.BindToObject(null, null, ref baseFilterIID, out captureFilterObject); IBaseFilter captureFilter = captureFilterObject as IBaseFilter; if (captureFilter != null) { IPin pin = null; //pin = DsFindPin.ByCategory(captureFilter, PinCategory.Preview, 0); //if(pin == null) pin = DsFindPin.ByCategory(captureFilter, PinCategory.Capture, 0); if (pin != null) { IEnumMediaTypes enumMediaTypes = null; int hr = pin.EnumMediaTypes(out enumMediaTypes); if (enumMediaTypes != null) { try { AMMediaType[] mediaTypes = new AMMediaType[1]; //22 int cFetched = 0; //22 while ((enumMediaTypes.Next(1, mediaTypes, out cFetched) == 0)) while ((enumMediaTypes.Next(1, mediaTypes, IntPtr.Zero) == 0)) { AMMediaType mediaType = mediaTypes[0]; if (mediaType != null && mediaType.majorType == MediaType.Video && mediaType.formatType == FormatType.VideoInfo && mediaType.formatSize >= Marshal.SizeOf(typeof(VideoInfoHeader)) && mediaType.formatPtr != IntPtr.Zero) { VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader)); string mediaSubType = (string)DeviceEnumerator.MediaSubTypeByGUID[mediaType.subType]; Trace.WriteLineIf(GraphBuilderBase.trace.TraceVerbose, string.Format("{0}x{1}, {2}, {3}", videoInfoHeader.BmiHeader.Width, videoInfoHeader.BmiHeader.Height, (int)10000000.0 / videoInfoHeader.AvgTimePerFrame, mediaSubType)); ChannelAnalogic.CaptureFormat newCaptureFormat = new ChannelAnalogic.CaptureFormat(); newCaptureFormat.Resolution = new Size(videoInfoHeader.BmiHeader.Width, videoInfoHeader.BmiHeader.Height); newCaptureFormat.FramePerSecond = (int)(10000000.0 / videoInfoHeader.AvgTimePerFrame); newCaptureFormat.MediaSubType = mediaSubType; vListBox.Items.Add(newCaptureFormat); } DsUtils.FreeAMMediaType(mediaType); } } finally { Marshal.ReleaseComObject(enumMediaTypes); } } Marshal.ReleaseComObject(pin); } foreach (ChannelAnalogic.CaptureFormat cf in vListBox.Items) { if (cf.Equals(currentCaptureFormat)) { vListBox.SelectedItem = cf; break; } } Marshal.ReleaseComObject(captureFilter); } break; } } edSvc.DropDownControl(vListBox); return vListBox.SelectedItem; } } return null; }