/// <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); } } }
/// <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; }
protected virtual void RenderSourceFilterPins() { int hr; using (DSFilter source2 = new DSFilter(_streamSourceFilter)) foreach (DSPin pin in source2.Output) { using (pin) { hr = pin.Render(); } } }
/// <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); }
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); } } }
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(); }
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); } } }
/// <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"); }