Exemplo n.º 1
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);
        }