Ejemplo n.º 1
0
        internal static IRenderer AddRenderer(IDvdGraphBuilder pDVDGraphBuilder,
                                              IGraphBuilder pGraphBuilder,
                                              RendererBase renderer,
                                              IntPtr hMediaWindow)
        {
            // this methods will instruct DVDGraphBuilder to instantiate and use the specified renderer; it will return a wrapper if it was successful
            // it will return null if there were errors instantiating the preferred renderer;
            // in this case the program should fall back on the default renderer by calling GetExistingRenderer after the graph is built
            // it will throw an exception (originating from renderers' Initialize method) if initialization fails (similar behavior when adding renderers to non-DVD graphs)

            try
            {
                if (renderer.Instantiate(pDVDGraphBuilder, pGraphBuilder))
                {
                    if (!renderer.IsDelayedInitialize)
                    {
                        renderer.Initialize(pGraphBuilder, hMediaWindow);
                    }

                    renderer.GraphBuilder      = pGraphBuilder;
                    renderer.MediaWindowHandle = hMediaWindow;
                    renderer._ready            = true;
                    return(renderer);
                }

                return(null);
            }
            finally
            {
                if (renderer != null && !renderer._ready)
                {
                    renderer.Close();
                }
            }
        }
Ejemplo n.º 2
0
        internal static IRenderer AddRenderer(IGraphBuilder pGraphBuilder,
                                              RendererBase renderer,
                                              ThrowExceptionForHRPointer errorFunc,
                                              IntPtr hMediaWindow,
                                              bool fallBackOnVR)
        {
            try
            {
                bool bOk = renderer.InstantiateRenderer();
                if (!bOk)
                {
                    if (fallBackOnVR)
                    {
                        // try default renderer
                        renderer.Close();
                        renderer = GetRenderer(Renderer.VR);
                        renderer.InstantiateRenderer(); // it will throw FilterGraphBuilderException if it can't be instantiated
                    }
                    else
                    {
                        throw new FilterGraphBuilderException(GraphBuilderError.VideoRenderer);
                    }
                }

                renderer.AddToGraph(pGraphBuilder, errorFunc);

                // Windowed renderers should be initialized (parent window is set, etc) _after_ the renderer is connected because a video window is created then
                // On the contrary windowless renderes _must_ be initialized _before_ they are connected
                if (!renderer.IsDelayedInitialize)
                {
                    renderer.Initialize(pGraphBuilder, hMediaWindow);
                }

                renderer.GraphBuilder      = pGraphBuilder;
                renderer.MediaWindowHandle = hMediaWindow;
                renderer._ready            = true;
                return(renderer);
            }
            finally
            {
                if (!renderer._ready)
                {
                    renderer.Close();
                }
            }
        }
Ejemplo n.º 3
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();
                }
            }
        }