예제 #1
0
 public override void SetRate(double rate)
 {
     if (IsGraphSeekable)
     {
         var hr = MediaSeeking.SetRate(rate);
         if (hr == DsHlp.S_OK)
         {
             _rate = rate;
         }
     }
 }
예제 #2
0
        public override long GetCurrentPosition()
        {
            var result = 0L;

            if (IsGraphSeekable)
            {
                MediaSeeking.GetCurrentPosition(out result);
            }

            return(result);
        }
예제 #3
0
파일: GraphBase.cs 프로젝트: ttsuki/ttsuki
        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            CheckAlive();
            Status = GraphState.Stopped;
            MediaControl.Stop();
            long pos = 0;

            MediaSeeking.SetPositions(ref pos, AMSeekingSeekingFlags.AbsolutePositioning, ref pos, AMSeekingSeekingFlags.NoPositioning);
            MediaControl.StopWhenReady();
            if (MediaStop != null)
            {
                MediaStop(this, EventArgs.Empty);
            }
        }
예제 #4
0
        public override void SetCurrentPosition(long time)
        {
            if (IsGraphSeekable)
            {
                var state = GraphState;
                PauseGraph();
                long pStop = 0;
                MediaSeeking.SetPositions(ref time, SeekingFlags.AbsolutePositioning, ref pStop, SeekingFlags.NoPositioning);

                switch (state)
                {
                case GraphState.Running:
                    ResumeGraph();
                    break;

                case GraphState.Stopped:
                    MediaControl.Stop();
                    GraphState = GraphState.Stopped;
                    break;
                }
            }
        }
예제 #5
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);
        }