/// <summary> create the used COM components and get the interfaces. </summary> protected virtual bool GetInterfaces(string filename) { Log.Info("StreambufferPlayer:GetInterfaces()"); //Type comtype = null; object comobj = null; try { _graphBuilder = (IGraphBuilder)new FilterGraph(); _bufferSource = (IStreamBufferSource)new StreamBufferSource(); int hr; m_StreamBufferConfig = new StreamBufferConfig(); streamConfig2 = m_StreamBufferConfig as IStreamBufferConfigure2; if (streamConfig2 != null) { // setting the StreamBufferEngine registry key IntPtr HKEY = (IntPtr)unchecked((int)0x80000002L); IStreamBufferInitialize pTemp = (IStreamBufferInitialize)streamConfig2; IntPtr subKey = IntPtr.Zero; RegOpenKeyEx(HKEY, "SOFTWARE\\MediaPortal", 0, 0x3f, out subKey); hr = pTemp.SetHKEY(subKey); hr = streamConfig2.SetFFTransitionRates(8, 32); //Log.Info("set FFTransitionRates:{0:X}",hr); int max, maxnon; hr = streamConfig2.GetFFTransitionRates(out max, out maxnon); //Log.Info("get FFTransitionRates:{0} {1} {2:X}",max,maxnon,hr); streamConfig2.GetBackingFileCount(out _minBackingFiles, out _maxBackingFiles); streamConfig2.GetBackingFileDuration(out _backingFileDuration); } IBaseFilter filter = (IBaseFilter)_bufferSource; _graphBuilder.AddFilter(filter, "SBE SOURCE"); IFileSourceFilter fileSource = (IFileSourceFilter)_bufferSource; hr = fileSource.Load(filename, null); // add preferred video & audio codecs string strVideoCodec = ""; string strAudioCodec = ""; string strAudiorenderer = ""; int intFilters = 0; // FlipGer: count custom filters string strFilters = ""; // FlipGer: collect custom filters using (Settings xmlreader = new MPSettings()) { _CodecSupportsFastSeeking = xmlreader.GetValueAsBool("debug", "CodecSupportsFastSeeking", false); Log.Debug("BaseStreamBufferPlayer: Codec supports fast seeking = {0}", _CodecSupportsFastSeeking); // FlipGer: load infos for custom filters int intCount = 0; while (xmlreader.GetValueAsString("mytv", "filter" + intCount.ToString(), "undefined") != "undefined") { if (xmlreader.GetValueAsBool("mytv", "usefilter" + intCount.ToString(), false)) { strFilters += xmlreader.GetValueAsString("mytv", "filter" + intCount.ToString(), "undefined") + ";"; intFilters++; } intCount++; } strVideoCodec = xmlreader.GetValueAsString("mytv", "videocodec", ""); strAudioCodec = xmlreader.GetValueAsString("mytv", "audiocodec", ""); strAudiorenderer = xmlreader.GetValueAsString("mytv", "audiorenderer", "Default DirectSound Device"); string strValue = xmlreader.GetValueAsString("mytv", "defaultar", "Normal"); GUIGraphicsContext.ARType = Util.Utils.GetAspectRatio(strValue); } if (strVideoCodec.Length > 0) { _videoCodecFilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, strVideoCodec); } if (strAudioCodec.Length > 0) { _audioCodecFilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, strAudioCodec); } if (strAudiorenderer.Length > 0) { _audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(_graphBuilder, strAudiorenderer, true); } // FlipGer: add custom filters to graph customFilters = new IBaseFilter[intFilters]; string[] arrFilters = strFilters.Split(';'); for (int i = 0; i < intFilters; i++) { customFilters[i] = DirectShowUtil.AddFilterToGraph(_graphBuilder, arrFilters[i]); } //render outputpins of SBE DirectShowUtil.RenderOutputPins(_graphBuilder, (IBaseFilter)fileSource); _mediaCtrl = (IMediaControl)_graphBuilder; _videoWin = _graphBuilder as IVideoWindow; _mediaEvt = (IMediaEventEx)_graphBuilder; _mediaSeeking = _bufferSource as IStreamBufferMediaSeeking; _mediaSeeking2 = _bufferSource as IStreamBufferMediaSeeking2; if (_mediaSeeking == null) { Log.Error("Unable to get IMediaSeeking interface#1"); } if (_mediaSeeking2 == null) { Log.Error("Unable to get IMediaSeeking interface#2"); } if (_audioRendererFilter != null) { IMediaFilter mp = _graphBuilder as IMediaFilter; IReferenceClock clock = _audioRendererFilter as IReferenceClock; hr = mp.SetSyncSource(clock); } _basicVideo = _graphBuilder as IBasicVideo2; _basicAudio = _graphBuilder as IBasicAudio; //Log.Info("StreamBufferPlayer:SetARMode"); DirectShowUtil.SetARMode(_graphBuilder, AspectRatioMode.Stretched); _graphBuilder.SetDefaultSyncSource(); //Log.Info("StreamBufferPlayer: set Deinterlace"); //Log.Info("StreamBufferPlayer: done"); return true; } catch (Exception ex) { Log.Error("StreamBufferPlayer:exception while creating DShow graph {0} {1}", ex.Message, ex.StackTrace); return false; } finally { if (comobj != null) { DirectShowUtil.ReleaseComObject(comobj); } comobj = null; } }
private void loadVideo(String videoPath) { videoFilepath = videoPath; videoFileName.Text = getDisplayVideoName(); if (graph != null) { graph = null; } if (mediaControl != null) { // Stop media playback this.mediaControl.Stop(); mediaControl = null; } if (videoWindow != null) { videoWindow.put_Owner(IntPtr.Zero); videoWindow = null; } if (mediaSeeking != null) { mediaSeeking = null; } if (basicAudio != null) { basicAudio = null; } GC.Collect(); /* if (mediaPosition != null) { mediaPosition = null; }*/ graph = (IGraphBuilder)new FilterGraph(); mediaControl = (IMediaControl)graph; //mediaPosition = (IMediaPosition)graph; videoWindow = (IVideoWindow)graph; mediaSeeking = (IMediaSeeking)graph; basicAudio = (IBasicAudio)graph; AviSplitter spliter = new AviSplitter(); graph.AddFilter((IBaseFilter)spliter, null); graph.RenderFile(videoPath, null); graph.SetDefaultSyncSource(); /* * AMSeekingSeekingCapabilities cap = AMSeekingSeekingCapabilities.CanGetCurrentPos; if (mediaSeeking.CheckCapabilities(ref cap) > 0) { this.consoleErreur.AppendText("Impossible de recuperer la position de la frame"); } * */ videoWindow.put_Owner(videoPanel.Handle); videoWindow.put_MessageDrain(videoPanel.Handle); videoWindow.put_WindowStyle(WindowStyle.Child); videoWindow.put_WindowStyleEx(WindowStyleEx.ControlParent); videoWindow.put_Left(0); videoWindow.put_Top(0); videoWindow.put_Width(videoPanel.Width); videoWindow.put_Height(videoPanel.Height); //positionTrackbar.Enabled = true; speedTrackBar.Enabled = true; mediaSeeking.SetTimeFormat(TimeFormat.Frame); double rate; mediaSeeking.GetRate(out rate); rateText.Text = rate.ToString(); speedTrackBar.Value = (int)(speedTrackBar.Maximum * rate / 2); trackBar1.Value = trackBar1.Maximum / 2; this.basicAudio.put_Volume(-5000 + 5000 * trackBar1.Value / trackBar1.Maximum); //mediaPosition.put_Rate(0.5); running = false; frameChanged = false; }
/// <summary> create the used COM components and get the interfaces. </summary> protected virtual bool GetInterfaces(string filename) { int hr; Log.Info("TSReaderPlayer:GetInterfaces()"); //Type comtype = null; object comobj = null; try { _graphBuilder = (IGraphBuilder)new FilterGraph(); TsReader reader = new TsReader(); _fileSource = (IBaseFilter)reader; ((ITSReader)reader).SetTsReaderCallback(this); ((ITSReader)reader).SetRequestAudioChangeCallback(this); IBaseFilter filter = (IBaseFilter)_fileSource; _graphBuilder.AddFilter(filter, "TsReader"); IFileSourceFilter interFaceFile = (IFileSourceFilter)_fileSource; interFaceFile.Load(filename, null); // add preferred video & audio codecs string strVideoCodec = ""; string strH264VideoCodec = ""; string strAudioCodec = ""; string strAACAudioCodec = ""; string strDDPLUSAudioCodec = ""; string strAudiorenderer = ""; int intFilters = 0; // FlipGer: count custom filters string strFilters = ""; // FlipGer: collect custom filters using (Settings xmlreader = new MPSettings()) { _CodecSupportsFastSeeking = xmlreader.GetValueAsBool("debug", "CodecSupportsFastSeeking", true); Log.Debug("BaseTSReaderPlayer: Codec supports fast seeking = {0}", _CodecSupportsFastSeeking); // FlipGer: load infos for custom filters int intCount = 0; while (xmlreader.GetValueAsString("mytv", "filter" + intCount.ToString(), "undefined") != "undefined") { if (xmlreader.GetValueAsBool("mytv", "usefilter" + intCount.ToString(), false)) { strFilters += xmlreader.GetValueAsString("mytv", "filter" + intCount.ToString(), "undefined") + ";"; intFilters++; } intCount++; } strVideoCodec = xmlreader.GetValueAsString("mytv", "videocodec", ""); strH264VideoCodec = xmlreader.GetValueAsString("mytv", "h264videocodec", ""); strAudioCodec = xmlreader.GetValueAsString("mytv", "audiocodec", ""); strAACAudioCodec = xmlreader.GetValueAsString("mytv", "aacaudiocodec", ""); strDDPLUSAudioCodec = xmlreader.GetValueAsString("mytv", "ddplusaudiocodec", ""); strAudiorenderer = xmlreader.GetValueAsString("mytv", "audiorenderer", "Default DirectSound Device"); string strValue = xmlreader.GetValueAsString("mytv", "defaultar", "Normal"); GUIGraphicsContext.ARType = Util.Utils.GetAspectRatio(strValue); } if (strVideoCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(_graphBuilder, strVideoCodec); } if (strH264VideoCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(_graphBuilder, strH264VideoCodec); } if (strAudioCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(_graphBuilder, strAudioCodec); } if (strAACAudioCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(_graphBuilder, strAACAudioCodec); } if (strDDPLUSAudioCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(_graphBuilder, strDDPLUSAudioCodec); } if (strAudiorenderer.Length > 0) { _audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(_graphBuilder, strAudiorenderer, false); } // FlipGer: add custom filters to graph string[] arrFilters = strFilters.Split(';'); for (int i = 0; i < intFilters; i++) { DirectShowUtil.AddFilterToGraph(_graphBuilder, arrFilters[i]); } DirectShowUtil.RenderOutputPins(_graphBuilder, (IBaseFilter)_fileSource); _mediaCtrl = (IMediaControl)_graphBuilder; _videoWin = _graphBuilder as IVideoWindow; _mediaEvt = (IMediaEventEx)_graphBuilder; _mediaSeeking = _graphBuilder as IMediaSeeking; if (_mediaSeeking == null) { Log.Error("Unable to get IMediaSeeking interface#1"); } if (_audioRendererFilter != null) { IMediaFilter mp = _graphBuilder as IMediaFilter; IReferenceClock clock = _audioRendererFilter as IReferenceClock; hr = mp.SetSyncSource(clock); } _basicVideo = _graphBuilder as IBasicVideo2; _basicAudio = _graphBuilder as IBasicAudio; //Log.Info("TSReaderPlayer:SetARMode"); DirectShowUtil.SetARMode(_graphBuilder, AspectRatioMode.Stretched); _graphBuilder.SetDefaultSyncSource(); //Log.Info("TSReaderPlayer: set Deinterlace"); //Log.Info("TSReaderPlayer: done"); return true; } catch (Exception ex) { Log.Error("TSReaderPlayer:exception while creating DShow graph {0} {1}", ex.Message, ex.StackTrace); return false; } finally { if (comobj != null) { DirectShowUtil.ReleaseComObject(comobj); } comobj = null; } }