Пример #1
0
        /// <summary> Populate the collection by looking for commonly implemented property pages. </summary>
        protected static IEnumerable <PropertyPage> addFromGraph(ICaptureGraphBuilder2 graphBuilder,
                                                                 IBaseFilter videoDeviceFilter,
                                                                 IBaseFilter audioDeviceFilter,
                                                                 IBaseFilter videoCompressorFilter,
                                                                 IBaseFilter audioCompressorFilter,
                                                                 SourceCollection videoSources,
                                                                 SourceCollection audioSources)
        {
            var result = new List <PropertyPage>();

            object filter = null;

            Trace.Assert(graphBuilder != null);

            // 1. the video capture filter
            addIfSupported(result, videoDeviceFilter, "Video Capture Device");

            // 2. the video capture pin
            DsGuid cat = DsGuid.FromGuid(PinCategory.Capture);
            DsGuid med = DsGuid.FromGuid(MediaType.Interleaved);
            Guid   iid = typeof(IAMStreamConfig).GUID;
            int    hr  = graphBuilder.FindInterface(cat, med, videoDeviceFilter, iid, out filter);

            //int hr = graphBuilder.FindInterface(ref cat, ref med, videoDeviceFilter, ref iid, out filter);
            if (hr != 0)
            {
                med = DsGuid.FromGuid(MediaType.Video);
                hr  = graphBuilder.FindInterface(cat, med, videoDeviceFilter, iid, out filter);
                if (hr != 0)
                {
                    filter = null;
                }
            }
            addIfSupported(result, filter, "Video Capture Pin");

            // 3. the video preview pin
            cat = DsGuid.FromGuid(PinCategory.Preview);
            med = DsGuid.FromGuid(MediaType.Interleaved);
            iid = typeof(IAMStreamConfig).GUID;
            hr  = graphBuilder.FindInterface(cat, med, videoDeviceFilter, iid, out filter);
            if (hr != 0)
            {
                med = DsGuid.FromGuid(MediaType.Video);
                hr  = graphBuilder.FindInterface(cat, med, videoDeviceFilter, iid, out filter);
                if (hr != 0)
                {
                    filter = null;
                }
            }
            addIfSupported(result, filter, "Video Preview Pin");

            // 4. the video crossbar(s)
            var crossbars = new List <IAMCrossbar>();
            int num       = 1;

            for (int c = 0; c < videoSources.Count; c++)
            {
                CrossbarSource s = videoSources[c] as CrossbarSource;
                if (s != null)
                {
                    if (crossbars.IndexOf(s.Crossbar) < 0)
                    {
                        crossbars.Add(s.Crossbar);
                        if (addIfSupported(result, s.Crossbar, "Video Crossbar " + (num == 1 ? "" : num.ToString())))
                        {
                            num++;
                        }
                    }
                }
            }
            crossbars.Clear();

            // 5. the video compressor
            addIfSupported(result, videoCompressorFilter, "Video Compressor");

            // 6. the video TV tuner
            cat = DsGuid.FromGuid(PinCategory.Capture);
            med = DsGuid.FromGuid(MediaType.Interleaved);
            iid = typeof(IAMTVTuner).GUID;
            hr  = graphBuilder.FindInterface(cat, med, videoDeviceFilter, iid, out filter);
            if (hr != 0)
            {
                med = DsGuid.FromGuid(MediaType.Video);
                hr  = graphBuilder.FindInterface(cat, med, videoDeviceFilter, iid, out filter);
                if (hr != 0)
                {
                    filter = null;
                }
            }
            addIfSupported(result, filter, "TV Tuner");

            // 7. the video compressor (VFW)
            IAMVfwCompressDialogs compressDialog = videoCompressorFilter as IAMVfwCompressDialogs;

            if (compressDialog != null)
            {
                VfwCompressorPropertyPage page = new VfwCompressorPropertyPage("Video Compressor", compressDialog);
                result.Add(page);
            }

            // 8. the audio capture filter
            addIfSupported(result, audioDeviceFilter, "Audio Capture Device");

            // 9. the audio capture pin
            cat = DsGuid.FromGuid(PinCategory.Capture);
            med = DsGuid.FromGuid(MediaType.Audio);
            iid = typeof(IAMStreamConfig).GUID;
            hr  = graphBuilder.FindInterface(cat, med, audioDeviceFilter, iid, out filter);
            if (hr != 0)
            {
                filter = null;
            }
            addIfSupported(result, filter, "Audio Capture Pin");

            // 9. the audio preview pin
            cat = DsGuid.FromGuid(PinCategory.Preview);
            med = DsGuid.FromGuid(MediaType.Audio);
            iid = typeof(IAMStreamConfig).GUID;
            hr  = graphBuilder.FindInterface(cat, med, audioDeviceFilter, iid, out filter);
            if (hr != 0)
            {
                filter = null;
            }
            addIfSupported(result, filter, "Audio Preview Pin");

            // 10. the audio crossbar(s)
            num = 1;
            for (int c = 0; c < audioSources.Count; c++)
            {
                CrossbarSource s = audioSources[c] as CrossbarSource;
                if (s != null)
                {
                    if (crossbars.IndexOf(s.Crossbar) < 0)
                    {
                        crossbars.Add(s.Crossbar);
                        if (addIfSupported(result, s.Crossbar, "Audio Crossbar " + (num == 1 ? "" : num.ToString())))
                        {
                            num++;
                        }
                    }
                }
            }
            crossbars.Clear();

            // 11. the audio compressor
            addIfSupported(result, audioCompressorFilter, "Audio Compressor");

            return(result);
        }
Пример #2
0
        /// <summary>
        ///  Populate the internal InnerList with sources/physical connectors
        ///  found on the crossbars. Each instance of this class is limited
        ///  to video only or audio only sources ( specified by the isVideoDevice
        ///  parameter on the constructor) so we check each source before adding
        ///  it to the list.
        /// </summary>
        protected static IEnumerable <CrossbarSource> findCrossbarSources(ICaptureGraphBuilder2 graphBuilder, IAMCrossbar crossbar, bool isVideoDevice)
        {
            //ArrayList sources = new ArrayList();
            var sources = new List <CrossbarSource>();
            int numOutPins;
            int numInPins;
            int hr = crossbar.get_PinCounts(out numOutPins, out numInPins);

            Marshal.ThrowExceptionForHR(hr);

            // We loop through every combination of output and input pin
            // to see which combinations match.

            // Loop through output pins
            for (int cOut = 0; cOut < numOutPins; cOut++)
            {
                // Loop through input pins
                for (int cIn = 0; cIn < numInPins; cIn++)
                {
                    // Can this combination be routed?
                    hr = crossbar.CanRoute(cOut, cIn);
                    if (hr == 0)
                    {
                        // Yes, this can be routed
                        int relatedPin;
                        PhysicalConnectorType connectorType;
                        hr = crossbar.get_CrossbarPinInfo(true, cIn, out relatedPin, out connectorType);
                        if (hr < 0)
                        {
                            Marshal.ThrowExceptionForHR(hr);
                        }

                        // Is this the correct type?, If so add to the InnerList
                        CrossbarSource source = new CrossbarSource(crossbar, cOut, cIn, connectorType);
                        if (connectorType < PhysicalConnectorType.Audio_Tuner)
                        {
                            if (isVideoDevice)
                            {
                                sources.Add(source);
                            }
                            else
                            if (!isVideoDevice)
                            {
                                sources.Add(source);
                            }
                        }
                    }
                }
            }

            // Some silly drivers (*cough* Nvidia *cough*) add crossbars
            // with no real choices. Every input can only be routed to
            // one output. Loop through every Source and see if there
            // at least one other Source with the same output pin.
            int refIndex = 0;

            while (refIndex < sources.Count)
            {
                bool           found     = false;
                CrossbarSource refSource = (CrossbarSource)sources[refIndex];
                for (int c = 0; c < sources.Count; c++)
                {
                    CrossbarSource s = (CrossbarSource)sources[c];
                    if ((refSource.OutputPin == s.OutputPin) && (refIndex != c))
                    {
                        found = true;
                        break;
                    }
                }
                if (found)
                {
                    refIndex++;
                }
                else
                {
                    sources.RemoveAt(refIndex);
                }
            }

            return(sources);
        }