Esempio n. 1
0
        /// <summary>
        /// 任意のインターフェースの取得
        /// </summary>
        /// <param name="graph">対象のグラフ</param>
        /// <returns>
        ///		取得したインターフェースを返します。
        /// </returns>
        public static TI GetInterface <TI>(IGraphBuilder graph)
        {
            if (graph == null)
            {
                return(default(TI));
            }

            IEnumFilters pEnum = null;

            graph.EnumFilters(ref pEnum);
            if (pEnum == null)
            {
                return(default(TI));
            }

            while (true)
            {
                IBaseFilter filter  = null;
                int         fetched = 0;
                int         status  = pEnum.Next(1, ref filter, ref fetched);
                if (status != 0)
                {
                    break;
                }

                if (filter is TI)
                {
                    return((TI)filter);
                }
            }

            return(default(TI));
        }
Esempio n. 2
0
        private void GetBaseFilter(IGraphBuilder pGraphBuilder)
        {
            IEnumFilters pEnum = null;
            IBaseFilter  pFilter;
            int          cFetched;

            int hr = pGraphBuilder.EnumFilters(out pEnum);

            if (DsHlp.SUCCEEDED(hr))
            {
                while (pEnum.Next(1, out pFilter, out cFetched) == DsHlp.S_OK)
                {
                    Guid clsid;
                    if (pFilter.GetClassID(out clsid) == DsHlp.S_OK && clsid == RendererID)
                    {
                        BaseFilter = pFilter;
                        break;
                    }
                    else
                    {
                        Marshal.ReleaseComObject(pFilter);
                    }
                }

                Marshal.ReleaseComObject(pEnum);
            }
        }
Esempio n. 3
0
        private IBaseFilter findFilter(string name)
        {
            int hr = 0;

            IEnumFilters eFilters = null;

            hr = (this.graph as IGraphBuilder).EnumFilters(out eFilters);
            checkHR(hr, "Couldn't enumerate filters in graph");

            IntPtr pFiltersFetched = Marshal.AllocCoTaskMem(4);

            IBaseFilter[] pFilter = new IBaseFilter[1];

            while (eFilters.Next(1, pFilter, pFiltersFetched) == 0)
            {
                FilterInfo pInfo;
                pFilter[0].QueryFilterInfo(out pInfo);
                bool found = (pInfo.achName == name);

                if (found)
                {
                    return(pFilter[0]);
                }
            }

            return(null);
        }
Esempio n. 4
0
        public void TestClone()
        {
            int          hr    = 0;
            IEnumFilters clone = null;

            IBaseFilter[] filters      = new IBaseFilter[1];
            int           filterCount1 = 0;
            int           filterCount2 = 0;

            // Reset enumeration to be sure we are at the begining
            hr = this.enumFilters.Reset();
            DsError.ThrowExceptionForHR(hr);

            // Clone our enumeration object
            hr = this.enumFilters.Clone(out clone);
            DsError.ThrowExceptionForHR(hr);

            // Count how many filters are in this enumearation
            while (this.enumFilters.Next(1, filters, IntPtr.Zero) == 0)
            {
                Marshal.ReleaseComObject(filters[0]);
                filterCount1++;
            }

            // Count how many filters are in this enumearation
            while (clone.Next(1, filters, IntPtr.Zero) == 0)
            {
                Marshal.ReleaseComObject(filters[0]);
                filterCount2++;
            }

            // both enumeration should have equal items number
            // 6 filters for me
            Debug.Assert(filterCount1 == filterCount2, "IEnumFilters.Clone");
        }
Esempio n. 5
0
        /// <summary>
        /// Log the filters in the graph.
        /// </summary>
        protected void LogFilters()
        {
            LogMessage("Logging filters");

            IEnumFilters enumFilters = null;

            IBaseFilter[] filters = new IBaseFilter[1];

            reply = graphBuilder.EnumFilters(out enumFilters);
            DsError.ThrowExceptionForHR(reply);

            while (enumFilters.Next(filters.Length, filters, IntPtr.Zero) == 0)
            {
                FilterInfo filterInfo;

                reply = filters[0].QueryFilterInfo(out filterInfo);
                DsError.ThrowExceptionForHR(reply);

                LogMessage("Filter: " + filterInfo.achName);

                logPins(filters[0]);
                if (filterInfo.pGraph != null)
                {
                    Marshal.ReleaseComObject(filterInfo.pGraph);
                }
                Marshal.ReleaseComObject(filters[0]);
            }

            Marshal.ReleaseComObject(enumFilters);

            LogMessage("All filters logged");
        }
Esempio n. 6
0
        public static IBaseFilter FindFilterByClsid(IGraphBuilder graphBuilder, Guid filterClsid)
        {
            int          hr          = 0;
            IBaseFilter  filter      = null;
            IEnumFilters enumFilters = null;

            if (graphBuilder == null)
            {
                throw new ArgumentNullException("graphBuilder");
            }

            hr = graphBuilder.EnumFilters(out enumFilters);
            if (hr == 0)
            {
                IBaseFilter[] filters = new IBaseFilter[1];

                while (enumFilters.Next(filters.Length, filters, IntPtr.Zero) == 0)
                {
                    Guid clsid;

                    hr = filters[0].GetClassID(out clsid);

                    if ((hr == 0) && (clsid == filterClsid))
                    {
                        filter = filters[0];
                        break;
                    }

                    Marshal.ReleaseComObject(filters[0]);
                }
                Marshal.ReleaseComObject(enumFilters);
            }

            return(filter);
        }
Esempio n. 7
0
        public void TestEnumFilters()
        {
            int          hr          = 0;
            IEnumFilters enumFilters = null;

            hr = this.filterGraph.EnumFilters(out enumFilters);
            Marshal.ThrowExceptionForHR(hr);

            Debug.Assert(enumFilters != null, "IFilterGraph.EnumFilters");

            Marshal.ReleaseComObject(enumFilters);
        }
Esempio n. 8
0
        private static IPin GetPinByMediaType(IGraphBuilder pGraph, PinDirection pinDir, bool bConnected, Guid type, bool isSubType)
        {
            IEnumFilters pEnumFilters = null;
            IBaseFilter  pFilter      = null;
            int          cFetched;

            int hr = pGraph.EnumFilters(out pEnumFilters);

            if (DsHlp.FAILED(hr))
            {
                return(null);
            }

            IPin pPin  = null;
            var  found = false;

            while ((pEnumFilters.Next(1, out pFilter, out cFetched) == DsHlp.S_OK))
            {
                pPin = GetPin(pFilter, pinDir, bConnected, 0);
                if (pPin != null)
                {
                    if (isSubType && IsSubTypeSupported(pPin, type) == 0)
                    {
                        found = true;
                    }
                    else if (!isSubType && IsMediaTypeSupported(pPin, type) == 0)
                    {
                        found = true;
                    }

                    if (!found)
                    {
                        Marshal.ReleaseComObject(pPin);
                        pPin = null;
                    }
                }

                Marshal.ReleaseComObject(pFilter);

                if (found)
                {
                    break;
                }
            }

            Marshal.ReleaseComObject(pEnumFilters);

            return(pPin);
        }
Esempio n. 9
0
        public static IBaseFilter FindFilterByName(IGraphBuilder graphBuilder, string filterName)
        {
            int          hr          = 0;
            IBaseFilter  filter      = null;
            IEnumFilters enumFilters = null;

            if (graphBuilder == null)
            {
                throw new ArgumentNullException("graphBuilder");
            }

            hr = graphBuilder.EnumFilters(out enumFilters);
            if (hr == 0)
            {
                IBaseFilter[] filters = new IBaseFilter[1];
                IntPtr        fetched = Marshal.AllocCoTaskMem(4);
                try
                {
                    while (enumFilters.Next(filters.Length, filters, fetched) == 0)
                    {
                        FilterInfo filterInfo;

                        hr = filters[0].QueryFilterInfo(out filterInfo);
                        if (hr == 0)
                        {
                            if (filterInfo.pGraph != null)
                            {
                                Marshal.ReleaseComObject(filterInfo.pGraph);
                            }

                            if (filterInfo.achName.Equals(filterName))
                            {
                                filter = filters[0];
                                break;
                            }
                        }

                        Marshal.ReleaseComObject(filters[0]);
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(enumFilters);
                    Marshal.FreeCoTaskMem(fetched);
                }
            }

            return(filter);
        }
Esempio n. 10
0
        public static int TraceFilterGraph(IGraphBuilder pGraph)
        {
            IEnumFilters pEnum = null;
            IBaseFilter  pFilter;
            int          cFetched;

            int hr = pGraph.EnumFilters(out pEnum);

            if (DsHlp.FAILED(hr))
            {
                return(hr);
            }
            Trace.WriteLine("Tracing filter graph...");
            while (pEnum.Next(1, out pFilter, out cFetched) == DsHlp.S_OK)
            {
                string     filterName;
                FilterInfo fInfo = new FilterInfo();
                hr = pFilter.QueryFilterInfo(out fInfo);
                if (DsHlp.FAILED(hr))
                {
                    filterName = "Unknown filter";
                }
                else
                {
                    filterName = fInfo.achName;
                }

                // The FILTER_INFO structure holds a pointer to the Filter Graph
                // Manager, with a reference count that must be released.
                if (fInfo.pGraph != null)
                {
                    Marshal.ReleaseComObject(fInfo.pGraph);
                }

                Trace.WriteLine(String.Format("Filter: {0}", filterName));
                Trace.Indent();
                TraceFilter(pFilter);
                Trace.Unindent();
                Marshal.ReleaseComObject(pFilter);
            }
            Marshal.ReleaseComObject(pEnum);
            return(DsHlp.S_OK);
        }
Esempio n. 11
0
        public static IBaseFilter FindFilterByClsid(IGraphBuilder graphBuilder, Guid filterClsid)
        {
            int          hr          = 0;
            IBaseFilter  filter      = null;
            IEnumFilters enumFilters = null;

            if (graphBuilder == null)
            {
                throw new ArgumentNullException("graphBuilder");
            }

            hr = graphBuilder.EnumFilters(out enumFilters);
            if (hr == 0)
            {
                IBaseFilter[] filters = new IBaseFilter[1];

                IntPtr fetched = Marshal.AllocCoTaskMem(4);
                try
                {
                    while (enumFilters.Next(filters.Length, filters, fetched) == 0)
                    {
                        Guid clsid;

                        hr = filters[0].GetClassID(out clsid);

                        if ((hr == 0) && (clsid == filterClsid))
                        {
                            filter = filters[0];
                            break;
                        }

                        Marshal.ReleaseComObject(filters[0]);
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(fetched);
                    Marshal.ReleaseComObject(enumFilters);
                }
            }

            return(filter);
        }
Esempio n. 12
0
        public static IBaseFilter FindFilterByName(IGraphBuilder graphBuilder, string filterName)
        {
            int          hr          = 0;
            IBaseFilter  filter      = null;
            IEnumFilters enumFilters = null;

            if (graphBuilder == null)
            {
                throw new ArgumentNullException("graphBuilder");
            }

            hr = graphBuilder.EnumFilters(out enumFilters);
            if (hr == 0)
            {
                IBaseFilter[] filters = new IBaseFilter[1];
                //22 int fetched;
                //22 while(enumFilters.Next(filters.Length, filters, out fetched) == 0)
                while (enumFilters.Next(filters.Length, filters, IntPtr.Zero) == 0)
                {
                    FilterInfo filterInfo;

                    hr = filters[0].QueryFilterInfo(out filterInfo);
                    if (hr == 0)
                    {
                        if (filterInfo.pGraph != null)
                        {
                            Marshal.ReleaseComObject(filterInfo.pGraph);
                        }

                        if (filterInfo.achName.Equals(filterName))
                        {
                            filter = filters[0];
                            break;
                        }
                    }

                    Marshal.ReleaseComObject(filters[0]);
                }
                Marshal.ReleaseComObject(enumFilters);
            }

            return(filter);
        }
Esempio n. 13
0
        private void CleanUpGraph(IGraphBuilder graphBuilder)
        {
            int          hr          = 0;
            IEnumFilters enumFilters = null;

            IBaseFilter[] filters = new IBaseFilter[1];

            hr = graphBuilder.EnumFilters(out enumFilters);
            Marshal.ThrowExceptionForHR(hr);

            while (enumFilters.Next(1, filters, IntPtr.Zero) == 0)
            {
                hr = graphBuilder.RemoveFilter(filters[0]);
                Marshal.ThrowExceptionForHR(hr);
                Marshal.ReleaseComObject(filters[0]);
                enumFilters.Reset();
            }

            Marshal.ReleaseComObject(enumFilters);
        }
Esempio n. 14
0
        public static int EnumFilters(IGraphBuilder pGraph, out IEnumerable <string> aFilters) // just getting their names here
        {
            aFilters = null;
            IEnumFilters pEnum = null;
            IBaseFilter  pFilter;
            int          cFetched;

            int hr = pGraph.EnumFilters(out pEnum);

            if (DsHlp.FAILED(hr))
            {
                return(hr);
            }

            var result = new List <string>();

            while (pEnum.Next(1, out pFilter, out cFetched) == DsHlp.S_OK)
            {
                FilterInfo fInfo = new FilterInfo();
                hr = pFilter.QueryFilterInfo(out fInfo);
                if (DsHlp.FAILED(hr))
                {
                    result.Add("Could not get the filter info");
                    continue;  // Maybe the next one will work.
                }

                result.Add(fInfo.achName);

                // The FILTER_INFO structure holds a pointer to the Filter Graph
                // Manager, with a reference count that must be released.
                if (fInfo.pGraph != null)
                {
                    Marshal.ReleaseComObject(fInfo.pGraph);
                }
                Marshal.ReleaseComObject(pFilter);
            }
            Marshal.ReleaseComObject(pEnum);

            aFilters = result;
            return(DsHlp.S_OK);
        }
Esempio n. 15
0
        /// <summary>
        /// 指定されたフィルタグラフから IAMVideoControl インターフェースを取得します。
        /// </summary>
        /// <param name="graph">検査対象のフィルタグラフ</param>
        /// <returns>
        ///		指定されたグラフに含まれるソースフィルタを IAMVideoControl にキャストして返します。
        ///		サポートしていない場合は null を返します。
        /// </returns>
        internal static IAMVideoControl GetInterface(IxDSGraphBuilderProvider graph)
        {
            if (graph == null)
            {
                return(null);
            }
            if (graph.GraphBuilder == null)
            {
                return(null);
            }

            IEnumFilters pEnum = null;

            graph.GraphBuilder.EnumFilters(ref pEnum);
            if (pEnum == null)
            {
                return(null);
            }

            while (true)
            {
                IBaseFilter filter  = null;
                int         fetched = 0;
                int         status  = pEnum.Next(1, ref filter, ref fetched);
                if (status != 0)
                {
                    break;
                }

                if (filter is IAMVideoControl)
                {
                    return((IAMVideoControl)filter);
                }
            }

            return(null);
        }
        protected override void DoStopInternal(object state)
        {
            IFilterGraph graph = mediaControl as IFilterGraph;

            if (graph != null)
            {
                if (mediaControl != null)
                {
                    int hr = mediaControl.Stop();
                    DsError.ThrowExceptionForHR(hr);
                    mediaControl = null;
                }

                IEnumFilters pEnum = null;
                if (COMHelper.SUCCEEDED(graph.EnumFilters(out pEnum)) && pEnum != null)
                {
                    List <IBaseFilter> allFilters = new List <IBaseFilter>();

                    IBaseFilter[] aFilters = new IBaseFilter[1];
                    while (COMHelper.S_OK == pEnum.Next(1, aFilters, IntPtr.Zero))
                    {
                        allFilters.Add(aFilters[0]);
                    }
                    Marshal.ReleaseComObject(pEnum);

                    foreach (var f in allFilters)
                    {
                        if (f != null)
                        {
                            graph.RemoveFilter(f);
                        }
                    }
                }
            }

            base.DoStopInternal(state);
        }
Esempio n. 17
0
        //The following is called for building the PREVIEW graph
        #region PREVIEW ONLY
        public void Init()
        {
            Debug.WriteLine("VIDEO FOR PREVIEW");
            pGraph = graph;
            int hr = 0;

            hr = pGraphBuilder.SetFiltergraph(pGraph);
            DsError.ThrowExceptionForHR(hr);

            pUSB = FindCaptureDevice();

            hr = pGraph.AddFilter(pUSB, "WebCamControl Video");
            DsError.ThrowExceptionForHR(hr);

            hr = pGraph.AddFilter(pSampleGrabber as IBaseFilter, "SampleGrabber");
            checkHR(hr, "Can't add SampleGrabber to graph");
            i_grabber = (ISampleGrabber)pSampleGrabber;
            i_grabber.SetBufferSamples(true);

            IVMRAspectRatioControl9 ratioControl9 = (IVMRAspectRatioControl9)renderFilter;

            hr = ratioControl9.SetAspectRatioMode(VMRAspectRatioMode.LetterBox);
            DsError.ThrowExceptionForHR(hr);

            hr = pGraph.AddFilter(renderFilter, "My Render Filter");
            DsError.ThrowExceptionForHR(hr);
            //SetFormat();

            hr = pGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, pUSB, (IBaseFilter)pSampleGrabber, renderFilter);
            DsError.ThrowExceptionForHR(hr);
            Debug.WriteLine(DsError.GetErrorText(hr) + " is error in rendering");

            IEnumFilters enumFilters = null;

            IBaseFilter[] baseFilters = { null };
            IntPtr        fetched     = IntPtr.Zero;

            hr = pGraph.EnumFilters(out enumFilters);
            int r = 0;

            while (r == 0)
            {
                try
                {
                    r = enumFilters.Next(baseFilters.Length, baseFilters, fetched);
                    DsError.ThrowExceptionForHR(hr);
                    baseFilters[0].QueryFilterInfo(out FilterInfo filterInfo);
                    Debug.WriteLine(filterInfo.achName + " -filtername");
                }
                catch
                {
                    r = 1;
                    continue;
                }
            }

            SafeReleaseComObject(pUSB);
            SafeReleaseComObject(pAVIMux);
            SafeReleaseComObject(pGraph);
            SafeReleaseComObject(pGraphBuilder);
            SafeReleaseComObject(pSampleGrabber);
            //SafeReleaseComObject(sampleGrabber);
            SafeReleaseComObject(pSmartTee);
            SafeReleaseComObject(renderFilter);
            SafeReleaseComObject(nullRender);
            SafeReleaseComObject(mediaEventEx);
            SafeReleaseComObject(ratioControl9);
            SafeReleaseComObject(streamConfig);
            SafeReleaseComObject(mediaControl);
            //SafeReleaseComObject(format);
            //SafeReleaseComObject(i_grabber);
            SafeReleaseComObject(graph);

            SetupVideoWindow();
        }
        // this function should be called AFTER the video stream has been rendered
        // but before rendering the audio streams
        // however, it will try to find the splitter even if video wasn't rendered
        private bool FindSplitter(IGraphBuilder pGraphBuilder)
        {
            if (_splitterFilter != null)
            {
                DsUtils.RemoveRedundantFilters(_sourceFilter, pGraphBuilder);
                return(true);
            }

            IEnumFilters pEnumFilters = null;
            IBaseFilter  pFilter      = null;
            int          cFetched;
            bool         bSplitterFound = false;

            int hr = pGraphBuilder.EnumFilters(out pEnumFilters);

            if (DsHlp.FAILED(hr))
            {
                return(false);
            }

            IPin pPin;
            int  nFilters = 0;
            bool bCanRelease;

            while ((pEnumFilters.Next(1, out pFilter, out cFetched) == DsHlp.S_OK))
            {
                nFilters++;
                bCanRelease = true;
                pPin        = DsUtils.GetPin(pFilter, PinDirection.Output, false, 0);
                if (pPin != null)
                {
                    if (DsUtils.IsMediaTypeSupported(pPin, MediaType.Audio) == 0 ||
                        DsUtils.IsMediaTypeSupported(pPin, MediaType.Subtitle) == 0)
                    {
                        //this unconnected pin supports audio or subpicture type!
                        bSplitterFound  = true;
                        bCanRelease     = false;
                        _splitterFilter = pFilter;
                    }
                    Marshal.ReleaseComObject(pPin);
                }

                //let's have a look at another filter
                if (bCanRelease)
                {
                    Marshal.ReleaseComObject(pFilter);
                }

                if (bSplitterFound)
                {
                    break;
                }
            }

            Marshal.ReleaseComObject(pEnumFilters);

            if (!bSplitterFound)
            {
                if (nFilters > 3)
                {
                    pPin = DsUtils.GetPin(_sourceFilter, PinDirection.Output, true, 0);
                    if (pPin != null)
                    {
                        IPin pInputPin;
                        hr = pPin.ConnectedTo(out pInputPin);
                        if (hr == DsHlp.S_OK)
                        {
                            PinInfo info = new PinInfo();
                            hr = pInputPin.QueryPinInfo(out info);
                            if (hr == DsHlp.S_OK)
                            {
                                _splitterFilter = info.pFilter;
                                bSplitterFound  = true;
                            }
                            Marshal.ReleaseComObject(pInputPin);
                        }
                        Marshal.ReleaseComObject(pPin);
                    }
                }
                else
                {
                    _splitterFilter = _sourceFilter;
                    bSplitterFound  = true;
                }
            }

            StripSplitter(pGraphBuilder);
            return(bSplitterFound);
        }
Esempio n. 19
0
        //private void EnablePlaybackMenu(bool bEnable, MediaType nMediaType)
        //{
        //  // Enable/disable menu items related to playback (pause, stop, mute)
        //  menuFilePause.Enabled = bEnable;
        //  menuFileStop.Enabled = bEnable;
        //  menuFileMute.Enabled = bEnable;
        //  menuRateIncrease.Enabled = bEnable;
        //  menuRateDecrease.Enabled = bEnable;
        //  menuRateNormal.Enabled = bEnable;
        //  menuRateHalf.Enabled = bEnable;
        //  menuRateDouble.Enabled = bEnable;

        //  // Enable/disable menu items related to video size
        //  bool isVideo = (nMediaType == MediaType.Video) ? true : false;

        //  menuSingleStep.Enabled = isVideo;
        //  menuFileSizeHalf.Enabled = isVideo;
        //  menuFileSizeDouble.Enabled = isVideo;
        //  menuFileSizeNormal.Enabled = isVideo;
        //  menuFileSizeThreeQuarter.Enabled = isVideo;
        //  menuFileFullScreen.Enabled = isVideo;
        //}

        #endregion //PRIVATEMETHODS


        ///////////////////////////////////////////////////////////////////////////////
        // Small helping Methods                                                     //
        ///////////////////////////////////////////////////////////////////////////////
        #region HELPER

        private void EnableAudio(bool enable)
        {
            try
            {
                if (this.isAudioOnly)
                {
                    return;
                }

                if (this.mediaControl == null)
                {
                    return;
                }

                //Need to stop replay, otherwise removing of filters will crash
                this.mediaControl.Stop();

                int  hr      = 0;
                bool isAudio = false;

                if (!enable)
                {
                    // All audio filters should be removed,
                    // so iterate through all filters, find each with a audio pin
                    // and remove it from the graph

                    IEnumFilters enumFilters = null;

                    if (graphBuilder == null)
                    {
                        throw new ArgumentNullException("graphBuilder");
                    }

                    hr = graphBuilder.EnumFilters(out enumFilters);
                    if (hr == 0)
                    {
                        IBaseFilter[] filters = new IBaseFilter[1];

                        while (enumFilters.Next(filters.Length, filters, IntPtr.Zero) == 0)
                        {
                            FilterInfo filterInfo;

                            hr = filters[0].QueryFilterInfo(out filterInfo);
                            if (hr == 0)
                            {
                                if (filterInfo.pGraph != null)
                                {
                                    Marshal.ReleaseComObject(filterInfo.pGraph);
                                }

                                IEnumPins pins;
                                filters[0].EnumPins(out pins);
                                IPin[] pin = new IPin[1];
                                while (pins.Next(1, pin, IntPtr.Zero) == 0)
                                {
                                    AMMediaType media = new AMMediaType();
                                    pin[0].ConnectionMediaType(media);
                                    if (media.majorType == MediaType.Audio)
                                    {
                                        isAudio = true;
                                        break;
                                    }
                                }
                                if (isAudio)
                                {
                                    hr = this.graphBuilder.RemoveFilter(filters[0]);
                                    DsError.ThrowExceptionForHR(hr);
                                }
                            }
                        }

                        if (filters[0] != null)
                        {
                            Marshal.ReleaseComObject(filters[0]);
                        }
                    }
                    Marshal.ReleaseComObject(enumFilters);
                }
                else
                {
                    //Recreate whole replay graph, disposing any old values first.
                    LoadMovie(this.filename);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Esempio n. 20
0
        private static RendererBase TryGetUnknownRenderer(IGraphBuilder pGraphBuilder)
        {
            // this is the last resort
            RendererBase renderer = null;

            IEnumFilters pEnum = null;
            IBaseFilter  pFilter;
            int          cFetched;

            int hr = pGraphBuilder.EnumFilters(out pEnum);

            if (DsHlp.SUCCEEDED(hr))
            {
                bool bFound = false;
                while (!bFound && pEnum.Next(1, out pFilter, out cFetched) == DsHlp.S_OK)
                {
                    IPin pPin = null;
                    // there should be no output pins
                    if ((pPin = DsUtils.GetPin(pFilter, PinDirection.Output, false)) != null)
                    {
                        // there is an unconnected output pin, this is not a renderer
                        Marshal.ReleaseComObject(pPin);
                    }
                    else if ((pPin = DsUtils.GetPin(pFilter, PinDirection.Output, true)) != null)
                    {
                        // there is a connected output pin, this is not a renderer
                        Marshal.ReleaseComObject(pPin);
                    }
                    else
                    {
                        // let's check the input pins: there must be at least one connected of type 'video'
                        int nSkip = 0;
                        while ((pPin = DsUtils.GetPin(pFilter, PinDirection.Input, true, nSkip)) != null)
                        {
                            if (DsUtils.IsMediaTypeSupported(pPin, MediaType.Video) == 0)
                            {
                                // there is connected input pin of type 'video'; this looks like a renderer
                                Marshal.ReleaseComObject(pPin);
                                renderer            = GetRenderer(Renderer.VR); // let's just default it VR
                                renderer.BaseFilter = pFilter;
                                bFound = true;
                                break;
                            }
                            else
                            {
                                nSkip++;
                                Marshal.ReleaseComObject(pPin);
                            }
                        }
                    }

                    if (!bFound)
                    {
                        Marshal.ReleaseComObject(pFilter);
                    }
                }

                Marshal.ReleaseComObject(pEnum);
            }

            return(renderer);
        }
Esempio n. 21
0
        public static void RemoveRedundantFilters(IBaseFilter sourceFilter, IGraphBuilder graphBuilder)
        {
            IEnumFilters pEnumFilters = null;
            IBaseFilter  pFilter      = null;
            int          cFetched;
            int          hr;

            bool bCallAgain = false;

            // get information about the source filter (its name)
            FilterInfo fSourceInfo = new FilterInfo();

            if (sourceFilter != null)
            {
                hr = sourceFilter.QueryFilterInfo(out fSourceInfo);
                if (DsHlp.SUCCEEDED(hr))
                {
                    if (fSourceInfo.pGraph != null)
                    {
                        Marshal.ReleaseComObject(fSourceInfo.pGraph);
                    }
                }
                else
                {
                    fSourceInfo.achName = null;
                }
            }

            // let's start enumerating filters
            hr = graphBuilder.EnumFilters(out pEnumFilters);
            if (DsHlp.FAILED(hr))
            {
                return;
            }

            while ((pEnumFilters.Next(1, out pFilter, out cFetched) == DsHlp.S_OK))
            {
                FilterInfo fInfo = new FilterInfo();
                hr = pFilter.QueryFilterInfo(out fInfo);
                if (DsHlp.FAILED(hr))
                {
                    Marshal.ReleaseComObject(pFilter);
                    continue;  // don't touch this one
                }

                // The FILTER_INFO structure holds a pointer to the Filter Graph
                // Manager, with a reference count that must be released.
                if (fInfo.pGraph != null)
                {
                    Marshal.ReleaseComObject(fInfo.pGraph);
                }

                if (fInfo.achName == null || fSourceInfo.achName == null)
                {
                    Marshal.ReleaseComObject(pFilter);
                    continue;
                }

                if (fInfo.achName == fSourceInfo.achName) // source filter
                {
                    Marshal.ReleaseComObject(pFilter);
                    continue;
                }

                IPin pPin = DsUtils.GetPin(pFilter, PinDirection.Input, true, 0);
                if (pPin == null)
                {
                    // this filter does not have connected input pins
                    graphBuilder.RemoveFilter(pFilter);
                    Marshal.ReleaseComObject(pFilter);
                    bCallAgain = true;
                    break;
                }
                else
                {
                    // this filter is connected, let's try another one
                    Marshal.ReleaseComObject(pPin);
                    Marshal.ReleaseComObject(pFilter);
                }
            }

            Marshal.ReleaseComObject(pEnumFilters);
            if (bCallAgain)
            {
                RemoveRedundantFilters(sourceFilter, graphBuilder);
            }
        }
Esempio n. 22
0
        internal static IRenderer GetExistingRenderer(IGraphBuilder pGraphBuilder, IntPtr hMediaWindow)
        {
            // this method is to be called to create a wrapper for a renderer that is already in the graph (added by intelligent connect)
            // at the momemnt it is assumed that this is a Windowed Renderer (compatability assumption)
            RendererBase renderer = null;

            try
            {
                IEnumFilters pEnum = null;
                IBaseFilter  pFilter;
                int          cFetched;

                int hr = pGraphBuilder.EnumFilters(out pEnum);
                if (DsHlp.SUCCEEDED(hr))
                {
                    while (pEnum.Next(1, out pFilter, out cFetched) == DsHlp.S_OK)
                    {
                        Guid clsid;
                        if (pFilter.GetClassID(out clsid) == DsHlp.S_OK)
                        {
                            renderer = GetRenderer(clsid);
                            if (renderer != null)
                            {
                                renderer.BaseFilter = pFilter;
                                break;
                            }
                            else
                            {
                                Marshal.ReleaseComObject(pFilter);
                            }
                        }
                        else
                        {
                            Marshal.ReleaseComObject(pFilter);
                        }
                    }

                    Marshal.ReleaseComObject(pEnum);
                }

                if (renderer == null)
                {
                    renderer = TryGetUnknownRenderer(pGraphBuilder); // last resort
                }
                if (renderer == null)
                {
                    throw new FilterGraphBuilderException(GraphBuilderError.VideoRenderer); // we've tried hard enough, there is no point to continue
                }
                if (!renderer.IsDelayedInitialize)
                {
                    renderer.Initialize(pGraphBuilder, hMediaWindow);
                }

                renderer.GraphBuilder      = pGraphBuilder;
                renderer.MediaWindowHandle = hMediaWindow;
                renderer._ready            = true;
                return(renderer);
            }
            finally
            {
                if (renderer != null && !renderer._ready)
                {
                    renderer.Close();
                }
            }
        }
Esempio n. 23
0
        public static void RemoveFilters(IGraphBuilder graphBuilder, string filterName)
        {
            if (graphBuilder == null)
            {
                return;
            }

            int          hr           = 0;
            IEnumFilters enumFilters  = null;
            ArrayList    filtersArray = new ArrayList();

            try
            {
                hr = graphBuilder.EnumFilters(out enumFilters);
                DsError.ThrowExceptionForHR(hr);

                IBaseFilter[] filters = new IBaseFilter[1];
                IntPtr        fetched = IntPtr.Zero;

                while (enumFilters.Next(filters.Length, filters, fetched) == 0)
                {
                    filtersArray.Add(filters[0]);
                }

                foreach (IBaseFilter filter in filtersArray)
                {
                    FilterInfo info;
                    filter.QueryFilterInfo(out info);
                    Marshal.ReleaseComObject(info.pGraph);

                    try
                    {
                        if (!String.IsNullOrEmpty(filterName))
                        {
                            if (String.Equals(info.achName, filterName))
                            {
                                DisconnectAllPins(graphBuilder, filter);
                                hr = graphBuilder.RemoveFilter(filter);
                                DsError.ThrowExceptionForHR(hr);
                                Marshal.ReleaseComObject(filter);
                                log.Debug("Remove filter from graph: {0}", info.achName);
                            }
                        }
                        else
                        {
                            DisconnectAllPins(graphBuilder, filter);
                            hr = graphBuilder.RemoveFilter(filter);
                            DsError.ThrowExceptionForHR(hr);
                            int i = Marshal.ReleaseComObject(filter);
                            log.Debug(string.Format("Remove filter from graph: {0} {1}", info.achName, i));
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Error(ex, "Remove of filter failed with code (HR): {0}, explanation: {1}", info.achName, hr.ToString());
                    }
                }
            }
            catch (Exception)
            {
                return;
            }
            finally
            {
                if (enumFilters != null)
                {
                    Marshal.ReleaseComObject(enumFilters);
                }
            }
        }
Esempio n. 24
0
        /// <summary>
        /// デバッグ
        /// </summary>
        /// <param name="graph"></param>
        private void DebugPrint(IGraphBuilder graph)
        {
            IEnumFilters filters = null;
            IBaseFilter  filter  = null;
            int          fetched = 0;

            int hr = graph.EnumFilters(ref filters);

            while (filters.Next(1, ref filter, ref fetched) == (int)DSLab.HRESULT.S_OK)
            {
                if (fetched == 0)
                {
                    break;
                }

                FILTER_INFO info = new FILTER_INFO();
                hr = filter.QueryFilterInfo(info);
                Console.WriteLine("{0}", info.achName);

                // フィルタ解放.
                Marshal.ReleaseComObject(filter);
                filter = null;
            }

            // 解放.
            Marshal.ReleaseComObject(filters);

            // サンプルグラバフィルタの入力形式設定.
            // majortype: http://msdn.microsoft.com/ja-jp/library/cc370108.aspx
            // subtype  : http://msdn.microsoft.com/ja-jp/library/cc371040.aspx
            AM_MEDIA_TYPE media_type = new AM_MEDIA_TYPE();

            SampleGrabber.GetConnectedMediaType(media_type);

            Debug.WriteLine("{0}:{1}", "majortype", media_type.majortype);
            Debug.WriteLine("{0}:{1}", "subtype", media_type.subtype);
            Debug.WriteLine("{0}:{1}", "formattype", media_type.formattype);
            Debug.WriteLine("{0}:{1}", "bFixedSizeSamples", media_type.bFixedSizeSamples);
            Debug.WriteLine("{0}:{1}", "bTemporalCompression", media_type.bTemporalCompression);
            Debug.WriteLine("{0}:{1}", "cbFormat", media_type.cbFormat);
            Debug.WriteLine("{0}:{1}", "lSampleSize", media_type.lSampleSize);
            Debug.WriteLine("{0}:{1}", "pbFormat", media_type.pbFormat);
            Debug.WriteLine("{0}:{1}", "pUnk", media_type.pUnk);

            // 映像形式の場合、サイズを取得する.
            if (GUID.Compare(media_type.formattype.ToString(), GUID.FORMAT_VideoInfo))
            {
                VIDEOINFOHEADER vinfo = new VIDEOINFOHEADER();
                vinfo = (VIDEOINFOHEADER)Marshal.PtrToStructure(media_type.pbFormat, typeof(VIDEOINFOHEADER));

                Debug.WriteLine("{0}:{1}", "Width", vinfo.bmiHeader.biWidth);
                Debug.WriteLine("{0}:{1}", "Height", vinfo.bmiHeader.biHeight);
                Debug.WriteLine("{0}:{1}", "BitCount", vinfo.bmiHeader.biBitCount);
                Debug.WriteLine("{0}:{1}", "Size", vinfo.bmiHeader.biSize);
                Debug.WriteLine("{0}:{1}", "ImageSize", vinfo.bmiHeader.biSizeImage);
                Debug.WriteLine("{0}:{1}", "ClrImportant", vinfo.bmiHeader.biClrImportant);
                Debug.WriteLine("{0}:{1}", "ClrUsed", vinfo.bmiHeader.biClrUsed);
                Debug.WriteLine("{0}:{1}", "Compression", vinfo.bmiHeader.biCompression);
                Debug.WriteLine("{0}:{1}", "Planes", vinfo.bmiHeader.biPlanes);
                Debug.WriteLine("{0}:{1}", "XPelsPerMeter", vinfo.bmiHeader.biXPelsPerMeter);
                Debug.WriteLine("{0}:{1}", "YPelsPerMeter", vinfo.bmiHeader.biYPelsPerMeter);
            }
        }
Esempio n. 25
0
        /// <summary>
        /// Build the graph and connect filters
        /// </summary>
        private void BuildGraph()
        {
            ///Create a graph builder.
            this._graphBuilder = (IGraphBuilder) new FilterGraph();

            ///Create a sample grabber filter. Sample grabber filter provides callback
            ///for application to grab video frames on the fly.
            this._sampleGrabber = (ISampleGrabber) new SampleGrabber();
            ///Configure the sample grabber
            this.ConfigureSampleGrabber(this._sampleGrabber);


            ///Create the file reader filter.
            this._fileReaderFilter = ComGuids.GetFilterFromGuid(ComGuids.FileReaderFilterGuid);
            ///Add the filter to graph. This function only adds filter to graph but
            ///do not connect it
            this._graphBuilder.AddFilter(this._fileReaderFilter, "File Source");

            ///Get source filter, this will let you load an AVI file
            IFileSourceFilter sourceFilter = this._fileReaderFilter as IFileSourceFilter;

            ///Load the file
            sourceFilter.Load(this._srcFile, null);


            ///Create AVI splitter. This filter splits the AVI file into video and audio or other
            ///components that form the video (e.g text)
            this._aviSplitter = ComGuids.GetFilterFromGuid(ComGuids.AviSplitterGuid);
            ///Add the filter to graph
            this._graphBuilder.AddFilter(this._aviSplitter, "AVI Splitter");


            ///Add the sample grabber filter to graph
            this._graphBuilder.AddFilter((IBaseFilter)this._sampleGrabber, "SampleGrabber");


            ///Create AVI mux filter. This filter will combine the audio and video in one stream.
            ///We will use this filter to combine audio and video streams after hiding
            ///data in ISampleGrabber's BufferCB callback.
            this._aviMultiplexer = ComGuids.GetFilterFromGuid(ComGuids.AviMultiplexerGuid);
            ///Add filter to graph
            this._graphBuilder.AddFilter(this._aviMultiplexer, "AVI multiplexer");


            ///Create a file writer filter. This filter will be used to write the AVI stream
            ///to a file
            this._rendererFilter = ComGuids.GetFilterFromGuid(ComGuids.FileWriterFilterGuid);

            ///Add renderer filter to graph
            this._graphBuilder.AddFilter(this._rendererFilter, "File writer");

            ///Get the file sink filter
            IFileSinkFilter sinkFilter = this._rendererFilter as IFileSinkFilter;

            ///Set the output file name
            sinkFilter.SetFileName(this._dcFile, null);


            ///Connect the filter that are added to graph
            DirectShowUtil.ConnectFilters(this._graphBuilder, this._fileReaderFilter, this._aviSplitter);
            DirectShowUtil.ConnectFilters(this._graphBuilder, this._aviSplitter, (IBaseFilter)this._sampleGrabber);
            DirectShowUtil.ConnectFilters(this._graphBuilder, (IBaseFilter)this._sampleGrabber, this._aviMultiplexer);
            DirectShowUtil.ConnectFilters(this._graphBuilder, this._aviMultiplexer, this._rendererFilter);

            IEnumFilters enu = null;

            _graphBuilder.EnumFilters(out enu);

            if (enu != null)
            {
                IBaseFilter[] filters = new IBaseFilter[1];
                while (enu.Next(1, filters, IntPtr.Zero) == 0)
                {
                    FilterInfo info;
                    filters[0].QueryFilterInfo(out info);

                    if (info.achName.Equals("AVI multiplexer", StringComparison.OrdinalIgnoreCase))
                    {
                        IBaseFilter temp = filters[0];
                        IEnumPins   penum;
                        IPin[]      pins = new IPin[1];
                        temp.EnumPins(out penum);
                        while (penum.Next(1, pins, IntPtr.Zero) == 0)
                        {
                            PinDirection    direction;
                            PinInfo         pinfo;
                            FilterInfo      finfo;
                            IEnumMediaTypes enuM;
                            AMMediaType[]   types = new AMMediaType[1];
                            pins[0].QueryDirection(out direction);
                            pins[0].EnumMediaTypes(out enuM);
                            while (enuM.Next(1, types, IntPtr.Zero) == 0)
                            {
                            }
                            pins[0].QueryPinInfo(out pinfo);
                            IBaseFilter pinFilter = pinfo.filter;
                            pinFilter.QueryFilterInfo(out finfo);
                        }
                    }

                    string name = info.achName;
                }
            }
        }