protected override void AddToGraph(IGraphBuilder pGraphBuilder, ThrowExceptionForHRPointer errorFunc)
        {
            // add the Video Renderer filter to the graph
            int hr = pGraphBuilder.AddFilter(BaseFilter, "Video Renderer");

            errorFunc(hr, GraphBuilderError.AddVideoRenderer);
        }
示例#2
0
        protected override void AddToGraph(IGraphBuilder pGraphBuilder, ThrowExceptionForHRPointer errorFunc)
        {
            // add the VMR9 to the graph
            int hr = pGraphBuilder.AddFilter(BaseFilter, "VMR9 (Windowless)");

            errorFunc(hr, GraphBuilderError.AddVMR9);
        }
示例#3
0
 internal static IRenderer AddRenderer(IGraphBuilder pGraphBuilder,
                                       Renderer preferredVideoRenderer,
                                       ThrowExceptionForHRPointer errorFunc,
                                       IntPtr hMediaWindow)
 {
     return(AddRenderer(pGraphBuilder, preferredVideoRenderer, errorFunc, hMediaWindow, true));
 }
示例#4
0
        internal static IRenderer AddRenderer(IGraphBuilder pGraphBuilder,
                                              Renderer preferredVideoRenderer,
                                              ThrowExceptionForHRPointer errorFunc,
                                              IntPtr hMediaWindow,
                                              bool fallBackOnVR)
        {
            RendererBase renderer = GetRenderer(preferredVideoRenderer);

            return(AddRenderer(pGraphBuilder, renderer, errorFunc, hMediaWindow, fallBackOnVR));
        }
示例#5
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();
                }
            }
        }
示例#6
0
 protected abstract void AddToGraph(IGraphBuilder pGraphBuilder, ThrowExceptionForHRPointer errorFunc);
示例#7
0
        public override void BuildUp(FilterGraphBuilderParameters parameters)
        {
            // Create filter graph manager
            InitializeGraphBuilder(() =>
            {
                object comobj = null;
                try
                {
                    var type         = Type.GetTypeFromCLSID(Clsid.FilterGraph, true);
                    comobj           = Activator.CreateInstance(type);
                    var graphBuilder = (IGraphBuilder)comobj;
                    comobj           = null;                  // important! (see the finally block)

                    return(graphBuilder);
                }
                catch (Exception e)
                {
                    throw new FilterGraphBuilderException(GraphBuilderError.FilterGraphManager, e);
                }
                finally
                {
                    if (comobj != null)
                    {
                        Marshal.FinalReleaseComObject(comobj);
                    }
                }
            });


            // Adding a source filter for a specific video file
            _sourceFilterHandler = SourceFilterHandlerFactory.AddSourceFilter(GraphBuilder, parameters.Source);

            // QUERY the filter graph interfaces
            InitializeMediaEventEx(parameters.MediaWindowHandle);
            InitializeFilterGraph2();
            InitializeMediaControl();
            InitializeMediaSeeking();
            InitializeBasicAudio();

            // create a renderer
            ThrowExceptionForHRPointer errorFunc = delegate(int hrCode, GraphBuilderError error)
            {
                hrCode.ThrowExceptionForHR(error);
            };

            Renderer = RendererBase.AddRenderer(GraphBuilder, parameters.PreferredVideoRenderer, errorFunc, parameters.MediaWindowHandle);

            DoBuildGraph();

            SeekingCapabilities caps = SeekingCapabilities.CanGetDuration;
            int hr = MediaSeeking.CheckCapabilities(ref caps);

            if (hr == DsHlp.S_OK)
            {
                _isGraphSeekable = true;

                long rtDuration;
                MediaSeeking.GetDuration(out rtDuration);

                _duration = rtDuration;
            }

            // MEDIA SIZE
            int height, arWidth;
            int width, arHeight;

            Renderer.GetNativeVideoSize(out width, out height, out arWidth, out arHeight);

            double w = arWidth;
            double h = arHeight;

            _aspectRatio = w / h;

            _sourceRect = new GDI.RECT {
                left = 0, top = 0, right = width, bottom = height
            };

//            if (FindSplitter(pFilterGraph))
//                ReportUnrenderedPins(pFilterGraph); // then we can raise OnFailedStreamsAvailable
            GatherMediaInfo(parameters.Source);
        }