Esempio n. 1
0
        /// <summary>
        /// Checks if the current MediaItem contains fps information, if not it tries to get it from
        /// the source filter.
        /// </summary>
        protected virtual void UpdateVideoFps()
        {
            IList <MultipleMediaItemAspect> videoAspects;

            // If there are VideoStreamAspects we don't need to fill it.
            if (_mediaItem == null || MediaItemAspect.TryGetAspects(_mediaItem.Aspects, VideoStreamAspect.Metadata, out videoAspects))
            {
                return;
            }

            using (DSFilter d = new DSFilter((IBaseFilter)_tsReader))
            {
                // Would release the filter which causes errors in later access (like stream enumeration)
                d.ReleaseOnDestroy = false;
                var videoOutPin = d.Pins.FirstOrDefault(p => p.Direction == PinDirection.Output && p.ConnectionMediaType.majorType == MediaType.Video);
                if (videoOutPin != null)
                {
                    const long nTenMillion        = 10000000;
                    long       avgTimePerFrameHns = videoOutPin.ConnectionMediaType.GetFrameRate();
                    if (avgTimePerFrameHns == 0)
                    {
                        return;
                    }

                    float fps = (float)nTenMillion / avgTimePerFrameHns;

                    MultipleMediaItemAspect videoStreamAspects = MediaItemAspect.CreateAspect(_mediaItem.Aspects, VideoStreamAspect.Metadata);
                    videoStreamAspects.SetAttribute(VideoStreamAspect.ATTR_RESOURCE_INDEX, 0);
                    videoStreamAspects.SetAttribute(VideoStreamAspect.ATTR_STREAM_INDEX, 0);
                    videoStreamAspects.SetAttribute(VideoStreamAspect.ATTR_FPS, fps);
                }
            }
        }
Esempio n. 2
0
        /// <summary> create the used COM components and get the interfaces. </summary>
        private bool GetInterfaces()
        {
            Logger.Instance.Debug("AirplayerAudioPlayer: Get interfaces");
            int    iStage = 1;
            string audioDevice;

            using (Settings xmlreader = new MPSettings())
                audioDevice = xmlreader.GetValueAsString("audioplayer", "sounddevice", "Default DirectSound Device");
            //If user has bass as default player the default device is named slightly differently
            if (audioDevice == "Default Sound Device")
            {
                audioDevice = "Default DirectSound Device";
            }

            Logger.Instance.Debug("AirplayerAudioPlayer: Using audio device '{0}'", audioDevice);

            int hr;

            try
            {
                graphBuilder = (IGraphBuilder) new FilterGraph();
                iStage       = 5;
                Utils.AddFilterByName(graphBuilder, DirectShow.FilterCategory.AudioRendererCategory, audioDevice);
                var sourceFilter = new GenericPushSourceFilter(settings.Source, settings.GetMediaType());
                hr = graphBuilder.AddFilter(sourceFilter, sourceFilter.Name);
                new HRESULT(hr).Throw();
                DSFilter source2 = new DSFilter(sourceFilter);
                hr = source2.OutputPin.Render();
                new HRESULT(hr).Throw();

                if (hr != 0)
                {
                    Error.SetError("Unable to play file", "Missing codecs to play this file");
                    return(false);
                }
                iStage     = 6;
                mediaCtrl  = (IMediaControl)graphBuilder;
                iStage     = 7;
                mediaEvt   = (IMediaEventEx)graphBuilder;
                iStage     = 8;
                mediaSeek  = (IMediaSeeking)graphBuilder;
                iStage     = 9;
                mediaPos   = (IMediaPosition)graphBuilder;
                iStage     = 10;
                basicAudio = graphBuilder as IBasicAudio;
                iStage     = 11;
                Logger.Instance.Debug("AirplayerAudioPlayer: Interfaces created");
                return(true);
            }
            catch (Exception ex)
            {
                Logger.Instance.Info("Can not start {0} stage:{1} err:{2} stack:{3}",
                                     m_strCurrentFile, iStage,
                                     ex.Message,
                                     ex.StackTrace);
                return(false);
            }
        }
 protected virtual void RenderSourceFilterPins()
 {
   int hr;
   using (DSFilter source2 = new DSFilter(_streamSourceFilter))
     foreach (DSPin pin in source2.Output)
       using (pin)
       {
         hr = pin.Render();
       }
 }
        protected override void AddSourceFilter()
        {
            var sourceFilter = new GenericPushSourceFilter(settings.Source, settings.GetMediaType());
            int hr           = _graphBuilder.AddFilter(sourceFilter, sourceFilter.Name);

            new HRESULT(hr).Throw();
            DSFilter source2 = new DSFilter(sourceFilter);

            hr = source2.OutputPin.Render();
            new HRESULT(hr).Throw();
            return;
        }
Esempio n. 5
0
        protected virtual void RenderSourceFilterPins()
        {
            int hr;

            using (DSFilter source2 = new DSFilter(_streamSourceFilter))
                foreach (DSPin pin in source2.Output)
                {
                    using (pin)
                    {
                        hr = pin.Render();
                    }
                }
        }
Esempio n. 6
0
        /// <summary>
        /// Adds a source filter to the graph and sets the input.
        /// </summary>
        protected virtual void AddSourceFilter()
        {
            int hr = 0;
            var networkResourceAccessor = _resourceAccessor as INetworkResourceAccessor;

            if (networkResourceAccessor != null)
            {
                ServiceRegistration.Get <ILogger>().Debug("{0}: Initializing for network media item '{1}'", PlayerTitle, networkResourceAccessor.URL);

                // try to render the url and let DirectShow choose the source filter
                hr = _graphBuilder.RenderFile(networkResourceAccessor.URL, null);
                new HRESULT(hr).Throw();

                return;
            }

            var fileSystemResourceAccessor = _resourceAccessor as IFileSystemResourceAccessor;

            if (fileSystemResourceAccessor != null)
            {
                ServiceRegistration.Get <ILogger>().Debug("{0}: Initializing for file system media item '{1}'", PlayerTitle, fileSystemResourceAccessor.Path);

                // For locally accessible files prefer the default filters
                ILocalFsResourceAccessor lfsra = fileSystemResourceAccessor as ILocalFsResourceAccessor;
                if (lfsra != null)
                {
                    // try to render the file and let DirectShow choose the source filter
                    hr = _graphBuilder.RenderFile(lfsra.LocalFileSystemPath, null);
                    new HRESULT(hr).Throw();
                    return;
                }

                // use the DotNetStreamSourceFilter as source filter
                _streamFilter   = new DotNetStreamSourceFilter();
                _resourceStream = fileSystemResourceAccessor.OpenRead();
                _streamFilter.SetSourceStream(_resourceStream, fileSystemResourceAccessor.ResourcePathName);
                hr = _graphBuilder.AddFilter(_streamFilter, _streamFilter.Name);
                new HRESULT(hr).Throw();

                using (DSFilter source2 = new DSFilter(_streamFilter))
                    hr = source2.OutputPin.Render();
                new HRESULT(hr).Throw();

                return;
            }

            throw new IllegalCallException("The VideoPlayer can only play resources of type INetworkResourceAccessor or IFileSystemResourceAccessor");
        }
        private HRESULT InitInterfaces()
        {
            CloseInterfaces();
            HRESULT hr = E_FAIL;

            try
            {
                m_GraphBuilder = (IGraphBuilder) new FilterGraph();
                hr             = OnInitInterfaces();
                hr.Throw();
                return(PreparePlayback());
            }
            catch (Exception _exception)
            {
                if (_exception is COMException)
                {
                    hr = (HRESULT)((COMException)_exception).ErrorCode;
                }
                else
                {
                    hr = E_UNEXPECTED;
                }
            }
            finally
            {
                if (hr.Succeeded)
                {
                    while (m_Filters.Count > 0)
                    {
                        DSFilter _filter = m_Filters[0];
                        m_Filters.RemoveAt(0);
                        _filter.Dispose();
                    }
                    IEnumFilters pEnum;
                    if (SUCCEEDED(m_GraphBuilder.EnumFilters(out pEnum)))
                    {
                        IBaseFilter[] aFilters = new IBaseFilter[1];
                        while (S_OK == pEnum.Next(1, aFilters, IntPtr.Zero))
                        {
                            m_Filters.Add(new DSFilter(aFilters[0]));
                        }
                        Marshal.ReleaseComObject(pEnum);
                    }
                }
            }
            CloseInterfaces();
            return(hr);
        }
Esempio n. 8
0
        protected override void AddSourceFilter()
        {
            base.AddSourceFilter();
            //var muxer = new CodecInfo { CLSID = "{E4B7FAF9-9CFF-4FD5-AC16-0F250F5F97B7}", Name = "SolveigMM Matroska Muxer" };
            var muxer = new CodecInfo {
                CLSID = "{A28F324B-DDC5-4999-AA25-D3A7E25EF7A8}", Name = "Haali Matroska Muxer"
            };
            IBaseFilter muxerFilter = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, muxer.Name);

            // FileSink can be supported by muxer directly (Haali), or we need an additional file sink
            var fileSink = muxerFilter as IFileSinkFilter;

            if (fileSink == null)
            {
                var writer = new CodecInfo {
                    CLSID = "{8596E5F0-0DA5-11D0-BD21-00A0C911CE86}", Name = "File writer"
                };
                fileSink = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, writer.Name) as IFileSinkFilter;
            }

            if (fileSink != null)
            {
                fileSink.SetFileName(_targetFilename, null);
            }

            using (DSFilter sourceFilter = new DSFilter(_streamSourceFilter))
                using (DSFilter muxerF = new DSFilter(muxerFilter))
                {
                    for (int index = 0; index < sourceFilter.Output.Count; index++)
                    {
                        DSPin pin = sourceFilter.Output[index];
                        using (pin)
                        {
                            if (index < muxerF.Input.Count)
                            {
                                pin.Connect(muxerF.Input[index]);
                            }
                        }
                    }

                    if (muxerF.OutputPin != null)
                    {
                        using (DSFilter writerF = new DSFilter((IBaseFilter)fileSink))
                            muxerF.OutputPin.Connect(writerF.InputPin);
                    }
                }
        }
Esempio n. 9
0
        public void Initialize()
        {
            _graphBuilder = (IGraphBuilder) new FilterGraph();

            _filterCamera = new DSFilter(new VirtualCamFilter());
            _graphBuilder.AddFilter(_filterCamera.Value, "Virtual Camera");

            _filterRenderer = new DSFilter(new Guid("51B4ABF3-748F-4E3B-A276-C828330E926A"));
            _graphBuilder.AddFilter(_filterRenderer.Value, "Renderer");

            _filterCamera.OutputPin.ConnectDirect(_filterRenderer.InputPin);

            m_MediaControl = (IMediaControl)_graphBuilder;
            m_VideoWindow  = (IVideoWindow)_graphBuilder;

            m_VideoWindow.put_Visible(1);
        }
        public void Start()
        {
            _graphBuilder = (IFilterGraph2) new FilterGraph();
            _rot          = new DsROTEntry(_graphBuilder);

            var sourceFilter = new GenericPushSourceFilter(source, GetMediaType());
            int hr           = _graphBuilder.AddFilter(sourceFilter, sourceFilter.Name);

            new HRESULT(hr).Throw();
            DSFilter source2 = new DSFilter(sourceFilter);

            hr = source2.OutputPin.Render();
            new HRESULT(hr).Throw();

            IMediaControl mc = (IMediaControl)_graphBuilder;

            hr = mc.Run();
            new HRESULT(hr).Throw();
        }
Esempio n. 11
0
 private HRESULT CloseInterfaces()
 {
     try
     {
         OnCloseInterfaces();
         if (m_MediaEventEx != null)
         {
             m_MediaEventEx.SetNotifyWindow(IntPtr.Zero, 0, IntPtr.Zero);
             m_MediaEventEx = null;
         }
         if (m_VideoWindow != null)
         {
             m_VideoWindow.put_Visible(0);
             m_VideoWindow.put_Owner(IntPtr.Zero);
             m_VideoWindow = null;
         }
         m_MediaSeeking  = null;
         m_MediaPosition = null;
         m_BasicVideo    = null;
         m_BasicAudio    = null;
         m_MediaControl  = null;
         while (m_Filters.Count > 0)
         {
             DSFilter _filter = m_Filters[0];
             m_Filters.RemoveAt(0);
             _filter.Dispose();
         }
         if (m_GraphBuilder != null)
         {
             Marshal.ReleaseComObject(m_GraphBuilder);
             m_GraphBuilder = null;
         }
         GC.Collect();
         return((HRESULT)NOERROR);
     }
     catch
     {
         return((HRESULT)E_FAIL);
     }
 }
    protected override void AddSourceFilter()
    {
      base.AddSourceFilter();
      //var muxer = new CodecInfo { CLSID = "{E4B7FAF9-9CFF-4FD5-AC16-0F250F5F97B7}", Name = "SolveigMM Matroska Muxer" };
      var muxer = new CodecInfo { CLSID = "{A28F324B-DDC5-4999-AA25-D3A7E25EF7A8}", Name = "Haali Matroska Muxer" };
      IBaseFilter muxerFilter = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, muxer.Name);

      // FileSink can be supported by muxer directly (Haali), or we need an additional file sink
      var fileSink = muxerFilter as IFileSinkFilter;
      if (fileSink == null)
      {
        var writer = new CodecInfo { CLSID = "{8596E5F0-0DA5-11D0-BD21-00A0C911CE86}", Name = "File writer" };
        fileSink = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, writer.Name) as IFileSinkFilter;
      }

      if (fileSink != null)
        fileSink.SetFileName(_targetFilename, null);

      using (DSFilter sourceFilter = new DSFilter(_streamSourceFilter))
      using (DSFilter muxerF = new DSFilter(muxerFilter))
      {
        for (int index = 0; index < sourceFilter.Output.Count; index++)
        {
          DSPin pin = sourceFilter.Output[index];
          using (pin)
          {
            if (index < muxerF.Input.Count)
              pin.Connect(muxerF.Input[index]);
          }
        }

        if (muxerF.OutputPin != null)
        {
          using (DSFilter writerF = new DSFilter((IBaseFilter)fileSink))
            muxerF.OutputPin.Connect(writerF.InputPin);
        }
      }
    }
Esempio n. 13
0
    /// <summary>
    /// Adds a source filter to the graph and sets the input.
    /// </summary>
    protected virtual void AddSourceFilter()
    {
      var networkResourceAccessor = _resourceAccessor as INetworkResourceAccessor;
      if (networkResourceAccessor != null)
      {
        ServiceRegistration.Get<ILogger>().Debug("{0}: Initializing for network media item '{1}'", PlayerTitle, networkResourceAccessor.URL);

        // try to render the url and let DirectShow choose the source filter
        int hr = _graphBuilder.RenderFile(networkResourceAccessor.URL, null);
        new HRESULT(hr).Throw();

        return;
      }

      var fileSystemResourceAccessor = _resourceAccessor as IFileSystemResourceAccessor;
      if (fileSystemResourceAccessor != null)
      {
        ServiceRegistration.Get<ILogger>().Debug("{0}: Initializing for file system media item '{1}'", PlayerTitle, fileSystemResourceAccessor.Path);

        // use the DotNetStreamSourceFilter as source filter
        var sourceFilter = new DotNetStreamSourceFilter();
        _resourceStream = fileSystemResourceAccessor.OpenRead();
        sourceFilter.SetSourceStream(_resourceStream, fileSystemResourceAccessor.ResourcePathName);
        int hr = _graphBuilder.AddFilter(sourceFilter, sourceFilter.Name);
        new HRESULT(hr).Throw();
        using(DSFilter source2 = new DSFilter(sourceFilter))
          hr = source2.OutputPin.Render();
        new HRESULT(hr).Throw();

        return;
      }

      throw new IllegalCallException("The VideoPlayer can only play resources of type INetworkResourceAccessor or IFileSystemResourceAccessor");
    }