コード例 #1
0
ファイル: Channels.cs プロジェクト: dgis/CodeTV
        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;
        }