public void ResizeWindowToVideo() { IVideoWindow pVW = m_pRenderGraph as IVideoWindow; IBasicVideo pBV = m_pRenderGraph as IBasicVideo; if ((pVW != null) && (pBV != null)) { // size of new video int cx, cy; pBV.GetVideoSize(out cx, out cy); DsRect rcVideo = new DsRect(0, 0, cx, cy); // adjust from client size to window size WindowStyle style; pVW.get_WindowStyle(out style); //AdjustWindowRect(rcVideo, style, false); // get current window top/left int cxWindow, cyWindow; DsRect rc = new DsRect(); pVW.GetWindowPosition(out rc.left, out rc.top, out cxWindow, out cyWindow); // reposition video window with old top/left position and new size pVW.SetWindowPosition(rc.left, rc.top, rcVideo.right - rcVideo.left, rcVideo.bottom - rcVideo.top); } }
private void ResizeMoveHandler(object sender, EventArgs e) { if (_videoRender != null) { _vmrWindowlessControl.SetVideoPosition(null, DsRect.FromRectangle(_hostControl.ClientRectangle)); } }
private void MainForm_ResizeMove(object sender, EventArgs e) { if (windowlessCtrl != null) { int hr = windowlessCtrl.SetVideoPosition(null, DsRect.FromRectangle(this.ClientRectangle)); } }
/// <summary> /// 指定时间来截取视频中的图片 /// </summary> /// <param name="FileName"></param> /// <param name="ImgFormat"></param> /// <param name="lTime"></param> public Image GetImage(double lTime) { Image img = null; int MaxCount = lTime <= 0 ? DESConsts.BitCount : (int)lTime * DESConsts.BitCount; try { Panel pnl = new Panel(); pVideo = new DESVideoCallBack(); pnl.Width = this.hWin.Width; pnl.Height = this.hWin.Height; des.RenderToFrame(pnl, pVideo, null, DynamicTextDS, DsRect.FromRectangle(hWin.ClientRectangle), 0, ds.PlayLength); des.StartRendering(); des.put_CurrentPosition(lTime); while (pVideo.m_FrameCount < MaxCount) { Thread.Sleep(100); } des.Pause(); img = des.GetImage(); des.Cancel(); } catch { des.Cancel(); des = null; } return(img); }
private void TestSetDrawRegion() { int hr; DsRect r1 = new DsRect(1, 1, 2, 2); DsRect r2 = new DsRect(0, 0, 319, 239); hr = m_mo.SetDrawRegion(IntPtr.Zero, r1, r2); DsError.ThrowExceptionForHR(hr); }
private void SetSize() { var srcRect = new DsRect(); var dstRect = new DsRect(ClientRectangle); int arWidth, arHeight; _windowlessControl.GetNativeVideoSize(out srcRect.right, out srcRect.bottom, out arWidth, out arHeight); _windowlessControl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); _windowlessControl.SetVideoPosition(srcRect, dstRect); }
public void TestOnDraw() { int hr; //Graphics g; //IntPtr hdc = g.GetHdc(); DsRect r = new DsRect(0, 0, 640, 480); hr = m_mo.OnDraw(IntPtr.Zero, r); DsError.ThrowExceptionForHR(hr); }
/// <summary> /// Handler of Resize and Move events of HostingControl. /// </summary> private void HostingControl_ResizeMove ( object sender, EventArgs e ) { if (_bGraphIsBuilt) { WindowlessCtrl.SetVideoPosition(null, DsRect.FromRectangle(_DisplayPanel.ClientRectangle)); } return; }
public int InitializeDevice(System.IntPtr dwUserID, ref VMR9AllocationInfo lpAllocInfo, ref int lpNumBuffers) { int hr = 0; int width = 1; int height = 1; Debug.Assert(dwUserID == cookie, "IVMRSurfaceAllocatorEx9.InitializeDevice"); InitializeDeviceCount++; dstRect = new DsRect(0, 0, lpAllocInfo.dwWidth, lpAllocInfo.dwHeight); try { if (device.DeviceCaps.TextureCaps.SupportsPower2) { while (width < lpAllocInfo.dwWidth) { width = width << 1; } while (height < lpAllocInfo.dwHeight) { height = height << 1; } lpAllocInfo.dwWidth = width; lpAllocInfo.dwHeight = height; } lpAllocInfo.dwFlags |= VMR9SurfaceAllocationFlags.TextureSurface; unmanagedSurfaces = new IntPtr[lpNumBuffers]; hr = surfaceAllocatorNotify.AllocateSurfaceHelper(ref lpAllocInfo, ref lpNumBuffers, unmanagedSurfaces); DsError.ThrowExceptionForHR(hr); // Assume this call works (ie Hardware new enough to create a TextureSurface : dx7 video board or better) // This test also doesn't support YUV surfaces creation } //catch (DirectXException dxe) //{ // return dxe.ErrorCode; //} catch (COMException e) { return(e.ErrorCode); } return(0); }
private void HostingControl_ResizeMove(object sender, EventArgs e) { if ((this.DX.WindowlessCtrl != null) && (this._HostingControl != null)) { this.DX.WindowlessCtrl.SetVideoPosition(null, DsRect.FromRectangle(this._HostingControl.ClientRectangle)); if (this._bGraphIsBuilt) { this.UpdateOutputVideoSize(); if (this.OutputVideoSizeChanged != null) { this.OutputVideoSizeChanged(sender, e); } } } }
private void SetupRenderWindow(IVMRFilterConfig9 renderer, Control target) { IVMRFilterConfig9 config = renderer; // Not really needed for VMR9 but don't forget calling it with VMR7 config.SetNumberOfStreams(1); // Change VMR9 mode to Windowless config.SetRenderingMode(VMR9Mode.Windowless); IVMRWindowlessControl9 winless_ctrl = (IVMRWindowlessControl9)renderer; // Set "Parent" window winless_ctrl.SetVideoClippingWindow(target.Handle); // Set Aspect-Ratio winless_ctrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); winless_ctrl.SetVideoPosition(null, DsRect.FromRectangle(target.ClientRectangle)); winless_ctrl = null; }
private void ResizeMoveHandler(object sender, EventArgs e) { try { lock (instanceMutex) { Log("ResizeMoveHandler"); if (_windowlessControl != null) { _windowlessControl.SetVideoPosition(null, DsRect.FromRectangle(_hostControl.ClientRectangle)); } } } catch (Exception ex) { ErrorLogger.DumpToDebug(ex); } }
private void MainForm_ResizeMove(object sender, EventArgs e) { try { if (windowlessCtrl != null) { FilterState fs;// wait for pause to complete mediaControl.GetState(2000, out fs); // if (fs == FilterState.Running) { int hr = windowlessCtrl.SetVideoPosition(null, DsRect.FromRectangle(this.m_ParentPanel.ClientRectangle)); } } } catch (Exception ex) { m_Log.Log("sourceVideoFile MainForm_ResizeMove: ex: " + ex.Message, ErrorLog.LOG_TYPE.FATAL); } }
void TestButton() { int hr; int pulButtonIndex; IDvdCmd ppCmd = null; hr = m_idc2.ShowMenu(DvdMenuId.Title, DvdCmdFlags.Flush, out ppCmd); DsError.ThrowExceptionForHR(hr); DsRect pRect = new DsRect(); hr = m_idi2.GetButtonRect(1, pRect); //ThrowExceptionForHR(hr); hr = m_idi2.GetButtonAtPosition(new Point(130, 130), out pulButtonIndex); DsError.ThrowExceptionForHR(hr); Debug.Assert(pulButtonIndex == 1, "TestButton"); }
private void IVMRWindowlessControl9Test_Resize(object sender, EventArgs e) { int hr = 0; DsRect src = new DsRect(); DsRect dst = new DsRect(); if (isPlaying) { if (this.vmrWndConfig != null) { hr = this.vmrWndConfig.GetVideoPosition(src, dst); Debug.Assert(hr == 0, "GetVideoPosition"); dst.right = this.ClientSize.Width; dst.bottom = this.ClientSize.Height; hr = this.vmrWndConfig.SetVideoPosition(src, dst); Debug.Assert(hr == 0, "SetVideoPosition"); } } }
/// <summary> create the used COM components and get the interfaces. </summary> protected bool GetInterfaces() { VMR9Util.g_vmr9 = null; if (IsRadio == false) { Vmr9 = VMR9Util.g_vmr9 = new VMR9Util(); // switch back to directx fullscreen mode Log.Info("RTSPPlayer: Enabling DX9 exclusive mode"); GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 1, 0, null); GUIWindowManager.SendMessage(msg); } //Type comtype = null; //object comobj = null; DsRect rect = new DsRect(); rect.top = 0; rect.bottom = GUIGraphicsContext.form.Height; rect.left = 0; rect.right = GUIGraphicsContext.form.Width; try { graphBuilder = (IGraphBuilder) new FilterGraph(); Log.Info("RTSPPlayer: add source filter"); if (IsRadio == false) { bool AddVMR9 = VMR9Util.g_vmr9 != null && VMR9Util.g_vmr9.AddVMR9(graphBuilder); if (!AddVMR9) { Log.Error("RTSPPlayer:Failed to add VMR9 to graph"); return(false); } VMR9Util.g_vmr9.Enable(false); } _mpegDemux = (IBaseFilter) new MPEG2Demultiplexer(); graphBuilder.AddFilter(_mpegDemux, "MPEG-2 Demultiplexer"); _rtspSource = (IBaseFilter) new RtpSourceFilter(); int hr = graphBuilder.AddFilter((IBaseFilter)_rtspSource, "RTSP Source Filter"); if (hr != 0) { Log.Error("RTSPPlayer:unable to add RTSP source filter:{0:X}", hr); return(false); } // add preferred video & audio codecs Log.Info("RTSPPlayer: add video/audio codecs"); string strVideoCodec = ""; string strAudioCodec = ""; string strAudiorenderer = ""; int intFilters = 0; // FlipGer: count custom filters string strFilters = ""; // FlipGer: collect custom filters string postProcessingFilterSection = "mytv"; using (Settings xmlreader = new MPSettings()) { if (_mediaType == g_Player.MediaType.Video) { strVideoCodec = xmlreader.GetValueAsString("movieplayer", "mpeg2videocodec", ""); strAudioCodec = xmlreader.GetValueAsString("movieplayer", "mpeg2audiocodec", ""); strAudiorenderer = xmlreader.GetValueAsString("movieplayer", "audiorenderer", "Default DirectSound Device"); postProcessingFilterSection = "movieplayer"; } else { strVideoCodec = xmlreader.GetValueAsString("mytv", "videocodec", ""); strAudioCodec = xmlreader.GetValueAsString("mytv", "audiocodec", ""); strAudiorenderer = xmlreader.GetValueAsString("mytv", "audiorenderer", "Default DirectSound Device"); postProcessingFilterSection = "mytv"; } enableDvbSubtitles = xmlreader.GetValueAsBool("tvservice", "dvbsubtitles", false); // FlipGer: load infos for custom filters int intCount = 0; while (xmlreader.GetValueAsString(postProcessingFilterSection, "filter" + intCount.ToString(), "undefined") != "undefined") { if (xmlreader.GetValueAsBool(postProcessingFilterSection, "usefilter" + intCount.ToString(), false)) { strFilters += xmlreader.GetValueAsString(postProcessingFilterSection, "filter" + intCount.ToString(), "undefined") + ";"; intFilters++; } intCount++; } } string extension = Path.GetExtension(m_strCurrentFile).ToLowerInvariant(); if (IsRadio == false) { if (strVideoCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(graphBuilder, strVideoCodec); } } if (strAudioCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(graphBuilder, strAudioCodec); } if (enableDvbSubtitles == true) { try { _subtitleFilter = SubtitleRenderer.GetInstance().AddSubtitleFilter(graphBuilder); SubtitleRenderer.GetInstance().SetPlayer(this); dvbSubRenderer = SubtitleRenderer.GetInstance(); } catch (Exception e) { Log.Error(e); } } Log.Debug("Is subtitle fitler null? {0}", (_subtitleFilter == null)); // FlipGer: add custom filters to graph string[] arrFilters = strFilters.Split(';'); for (int i = 0; i < intFilters; i++) { DirectShowUtil.AddFilterToGraph(graphBuilder, arrFilters[i]); } if (strAudiorenderer.Length > 0) { audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(graphBuilder, strAudiorenderer, false); } Log.Info("RTSPPlayer: load:{0}", m_strCurrentFile); IFileSourceFilter interfaceFile = (IFileSourceFilter)_rtspSource; if (interfaceFile == null) { Log.Error("RTSPPlayer:Failed to get IFileSourceFilter"); return(false); } //Log.Info("RTSPPlayer: open file:{0}",filename); hr = interfaceFile.Load(m_strCurrentFile, null); if (hr != 0) { Log.Error("RTSPPlayer:Failed to open file:{0} :0x{1:x}", m_strCurrentFile, hr); return(false); } #region connect rtspsource->demux Log.Info("RTSPPlayer:connect rtspsource->mpeg2 demux"); IPin pinTsOut = DsFindPin.ByDirection((IBaseFilter)_rtspSource, PinDirection.Output, 0); if (pinTsOut == null) { Log.Info("RTSPPlayer:failed to find output pin of tsfilesource"); return(false); } IPin pinDemuxIn = DsFindPin.ByDirection(_mpegDemux, PinDirection.Input, 0); if (pinDemuxIn == null) { Log.Info("RTSPPlayer:failed to find output pin of tsfilesource"); return(false); } hr = graphBuilder.Connect(pinTsOut, pinDemuxIn); if (hr != 0) { Log.Info("RTSPPlayer:failed to connect rtspsource->mpeg2 demux:{0:X}", hr); return(false); } DirectShowUtil.ReleaseComObject(pinTsOut); DirectShowUtil.ReleaseComObject(pinDemuxIn); #endregion #region render demux output pins if (IsRadio) { Log.Info("RTSPPlayer:render audio demux outputs"); IEnumPins enumPins; _mpegDemux.EnumPins(out enumPins); IPin[] pins = new IPin[2]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Input) { continue; } IEnumMediaTypes enumMediaTypes; pins[0].EnumMediaTypes(out enumMediaTypes); AMMediaType[] mediaTypes = new AMMediaType[20]; int fetchedTypes; enumMediaTypes.Next(20, mediaTypes, out fetchedTypes); for (int i = 0; i < fetchedTypes; ++i) { if (mediaTypes[i].majorType == MediaType.Audio) { graphBuilder.Render(pins[0]); break; } } } } else { Log.Info("RTSPPlayer:render audio/video demux outputs"); IEnumPins enumPins; _mpegDemux.EnumPins(out enumPins); IPin[] pins = new IPin[2]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Input) { continue; } graphBuilder.Render(pins[0]); } } #endregion // Connect DVB subtitle filter pins in the graph if (_mpegDemux != null && enableDvbSubtitles == true) { IMpeg2Demultiplexer demuxer = _mpegDemux as IMpeg2Demultiplexer; hr = demuxer.CreateOutputPin(GetTSMedia(), "Pcr", out _pinPcr); if (hr == 0) { Log.Info("RTSPPlayer:_pinPcr OK"); IPin pDemuxerPcr = DsFindPin.ByName(_mpegDemux, "Pcr"); IPin pSubtitlePcr = DsFindPin.ByName(_subtitleFilter, "Pcr"); hr = graphBuilder.Connect(pDemuxerPcr, pSubtitlePcr); } else { Log.Info("RTSPPlayer:Failed to create _pinPcr in demuxer:{0:X}", hr); } hr = demuxer.CreateOutputPin(GetTSMedia(), "Subtitle", out _pinSubtitle); if (hr == 0) { Log.Info("RTSPPlayer:_pinSubtitle OK"); IPin pDemuxerSubtitle = DsFindPin.ByName(_mpegDemux, "Subtitle"); IPin pSubtitle = DsFindPin.ByName(_subtitleFilter, "In"); hr = graphBuilder.Connect(pDemuxerSubtitle, pSubtitle); } else { Log.Info("RTSPPlayer:Failed to create _pinSubtitle in demuxer:{0:X}", hr); } hr = demuxer.CreateOutputPin(GetTSMedia(), "PMT", out _pinPMT); if (hr == 0) { Log.Info("RTSPPlayer:_pinPMT OK"); IPin pDemuxerSubtitle = DsFindPin.ByName(_mpegDemux, "PMT"); IPin pSubtitle = DsFindPin.ByName(_subtitleFilter, "PMT"); hr = graphBuilder.Connect(pDemuxerSubtitle, pSubtitle); } else { Log.Info("RTSPPlayer:Failed to create _pinPMT in demuxer:{0:X}", hr); } } if (IsRadio == false) { if (!VMR9Util.g_vmr9.IsVMR9Connected) { //VMR9 is not supported, switch to overlay Log.Info("RTSPPlayer: vmr9 not connected"); _mediaCtrl = null; Cleanup(); return(false); } VMR9Util.g_vmr9.SetDeinterlaceMode(); } _mediaCtrl = (IMediaControl)graphBuilder; mediaEvt = (IMediaEventEx)graphBuilder; _mediaSeeking = (IMediaSeeking)graphBuilder; mediaPos = (IMediaPosition)graphBuilder; basicAudio = graphBuilder as IBasicAudio; //DirectShowUtil.SetARMode(graphBuilder,AspectRatioMode.Stretched); DirectShowUtil.EnableDeInterlace(graphBuilder); if (VMR9Util.g_vmr9 != null) { m_iVideoWidth = VMR9Util.g_vmr9.VideoWidth; m_iVideoHeight = VMR9Util.g_vmr9.VideoHeight; } if (audioRendererFilter != null) { Log.Info("RTSPPlayer9:set reference clock"); IMediaFilter mp = graphBuilder as IMediaFilter; IReferenceClock clock = audioRendererFilter as IReferenceClock; hr = mp.SetSyncSource(null); hr = mp.SetSyncSource(clock); Log.Info("RTSPPlayer9:set reference clock:{0:X}", hr); } Log.Info("RTSPPlayer: graph build successfull"); return(true); } catch (Exception ex) { Error.SetError("Unable to play movie", "Unable build graph for VMR9"); Log.Error("RTSPPlayer:exception while creating DShow graph {0} {1}", ex.Message, ex.StackTrace); CloseInterfaces(); return(false); } }
/// <summary> create the used COM components and get the interfaces. </summary> protected bool GetInterfaces() { VMR9Util.g_vmr9 = null; if (IsRadio == false) { Vmr9 = VMR9Util.g_vmr9 = new VMR9Util(); // switch back to directx fullscreen mode Log.Info("RTSPPlayer: Enabling DX9 exclusive mode"); GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 1, 0, null); GUIWindowManager.SendMessage(msg); } //Type comtype = null; //object comobj = null; DsRect rect = new DsRect(); rect.top = 0; rect.bottom = GUIGraphicsContext.form.Height; rect.left = 0; rect.right = GUIGraphicsContext.form.Width; try { graphBuilder = (IGraphBuilder)new FilterGraph(); Log.Info("RTSPPlayer: add source filter"); if (IsRadio == false) { bool AddVMR9 = VMR9Util.g_vmr9 != null && VMR9Util.g_vmr9.AddVMR9(graphBuilder); if (!AddVMR9) { Log.Error("RTSPPlayer:Failed to add VMR9 to graph"); return false; } VMR9Util.g_vmr9.Enable(false); } _mpegDemux = (IBaseFilter)new MPEG2Demultiplexer(); graphBuilder.AddFilter(_mpegDemux, "MPEG-2 Demultiplexer"); _rtspSource = (IBaseFilter)new RtpSourceFilter(); int hr = graphBuilder.AddFilter((IBaseFilter)_rtspSource, "RTSP Source Filter"); if (hr != 0) { Log.Error("RTSPPlayer:unable to add RTSP source filter:{0:X}", hr); return false; } // add preferred video & audio codecs Log.Info("RTSPPlayer: add video/audio codecs"); string strVideoCodec = ""; string strAudioCodec = ""; string strAudiorenderer = ""; int intFilters = 0; // FlipGer: count custom filters string strFilters = ""; // FlipGer: collect custom filters string postProcessingFilterSection = "mytv"; using (Settings xmlreader = new MPSettings()) { if (_mediaType == g_Player.MediaType.Video) { strVideoCodec = xmlreader.GetValueAsString("movieplayer", "mpeg2videocodec", ""); strAudioCodec = xmlreader.GetValueAsString("movieplayer", "mpeg2audiocodec", ""); strAudiorenderer = xmlreader.GetValueAsString("movieplayer", "audiorenderer", "Default DirectSound Device"); postProcessingFilterSection = "movieplayer"; } else { strVideoCodec = xmlreader.GetValueAsString("mytv", "videocodec", ""); strAudioCodec = xmlreader.GetValueAsString("mytv", "audiocodec", ""); strAudiorenderer = xmlreader.GetValueAsString("mytv", "audiorenderer", "Default DirectSound Device"); postProcessingFilterSection = "mytv"; } enableDvbSubtitles = xmlreader.GetValueAsBool("tvservice", "dvbsubtitles", false); // FlipGer: load infos for custom filters int intCount = 0; while (xmlreader.GetValueAsString(postProcessingFilterSection, "filter" + intCount.ToString(), "undefined") != "undefined") { if (xmlreader.GetValueAsBool(postProcessingFilterSection, "usefilter" + intCount.ToString(), false)) { strFilters += xmlreader.GetValueAsString(postProcessingFilterSection, "filter" + intCount.ToString(), "undefined") + ";"; intFilters++; } intCount++; } } string extension = Path.GetExtension(m_strCurrentFile).ToLowerInvariant(); if (IsRadio == false) { if (strVideoCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(graphBuilder, strVideoCodec); } } if (strAudioCodec.Length > 0) { DirectShowUtil.AddFilterToGraph(graphBuilder, strAudioCodec); } if (enableDvbSubtitles == true) { try { _subtitleFilter = SubtitleRenderer.GetInstance().AddSubtitleFilter(graphBuilder); SubtitleRenderer.GetInstance().SetPlayer(this); dvbSubRenderer = SubtitleRenderer.GetInstance(); } catch (Exception e) { Log.Error(e); } } Log.Debug("Is subtitle fitler null? {0}", (_subtitleFilter == null)); // FlipGer: add custom filters to graph string[] arrFilters = strFilters.Split(';'); for (int i = 0; i < intFilters; i++) { DirectShowUtil.AddFilterToGraph(graphBuilder, arrFilters[i]); } if (strAudiorenderer.Length > 0) { audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(graphBuilder, strAudiorenderer, false); } Log.Info("RTSPPlayer: load:{0}", m_strCurrentFile); IFileSourceFilter interfaceFile = (IFileSourceFilter)_rtspSource; if (interfaceFile == null) { Log.Error("RTSPPlayer:Failed to get IFileSourceFilter"); return false; } //Log.Info("RTSPPlayer: open file:{0}",filename); hr = interfaceFile.Load(m_strCurrentFile, null); if (hr != 0) { Log.Error("RTSPPlayer:Failed to open file:{0} :0x{1:x}", m_strCurrentFile, hr); return false; } #region connect rtspsource->demux Log.Info("RTSPPlayer:connect rtspsource->mpeg2 demux"); IPin pinTsOut = DsFindPin.ByDirection((IBaseFilter)_rtspSource, PinDirection.Output, 0); if (pinTsOut == null) { Log.Info("RTSPPlayer:failed to find output pin of tsfilesource"); return false; } IPin pinDemuxIn = DsFindPin.ByDirection(_mpegDemux, PinDirection.Input, 0); if (pinDemuxIn == null) { Log.Info("RTSPPlayer:failed to find output pin of tsfilesource"); return false; } hr = graphBuilder.Connect(pinTsOut, pinDemuxIn); if (hr != 0) { Log.Info("RTSPPlayer:failed to connect rtspsource->mpeg2 demux:{0:X}", hr); return false; } DirectShowUtil.ReleaseComObject(pinTsOut); DirectShowUtil.ReleaseComObject(pinDemuxIn); #endregion #region render demux output pins if (IsRadio) { Log.Info("RTSPPlayer:render audio demux outputs"); IEnumPins enumPins; _mpegDemux.EnumPins(out enumPins); IPin[] pins = new IPin[2]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Input) { continue; } IEnumMediaTypes enumMediaTypes; pins[0].EnumMediaTypes(out enumMediaTypes); AMMediaType[] mediaTypes = new AMMediaType[20]; int fetchedTypes; enumMediaTypes.Next(20, mediaTypes, out fetchedTypes); for (int i = 0; i < fetchedTypes; ++i) { if (mediaTypes[i].majorType == MediaType.Audio) { graphBuilder.Render(pins[0]); break; } } } } else { Log.Info("RTSPPlayer:render audio/video demux outputs"); IEnumPins enumPins; _mpegDemux.EnumPins(out enumPins); IPin[] pins = new IPin[2]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Input) { continue; } graphBuilder.Render(pins[0]); } } #endregion // Connect DVB subtitle filter pins in the graph if (_mpegDemux != null && enableDvbSubtitles == true) { IMpeg2Demultiplexer demuxer = _mpegDemux as IMpeg2Demultiplexer; hr = demuxer.CreateOutputPin(GetTSMedia(), "Pcr", out _pinPcr); if (hr == 0) { Log.Info("RTSPPlayer:_pinPcr OK"); IPin pDemuxerPcr = DsFindPin.ByName(_mpegDemux, "Pcr"); IPin pSubtitlePcr = DsFindPin.ByName(_subtitleFilter, "Pcr"); hr = graphBuilder.Connect(pDemuxerPcr, pSubtitlePcr); } else { Log.Info("RTSPPlayer:Failed to create _pinPcr in demuxer:{0:X}", hr); } hr = demuxer.CreateOutputPin(GetTSMedia(), "Subtitle", out _pinSubtitle); if (hr == 0) { Log.Info("RTSPPlayer:_pinSubtitle OK"); IPin pDemuxerSubtitle = DsFindPin.ByName(_mpegDemux, "Subtitle"); IPin pSubtitle = DsFindPin.ByName(_subtitleFilter, "In"); hr = graphBuilder.Connect(pDemuxerSubtitle, pSubtitle); } else { Log.Info("RTSPPlayer:Failed to create _pinSubtitle in demuxer:{0:X}", hr); } hr = demuxer.CreateOutputPin(GetTSMedia(), "PMT", out _pinPMT); if (hr == 0) { Log.Info("RTSPPlayer:_pinPMT OK"); IPin pDemuxerSubtitle = DsFindPin.ByName(_mpegDemux, "PMT"); IPin pSubtitle = DsFindPin.ByName(_subtitleFilter, "PMT"); hr = graphBuilder.Connect(pDemuxerSubtitle, pSubtitle); } else { Log.Info("RTSPPlayer:Failed to create _pinPMT in demuxer:{0:X}", hr); } } if (IsRadio == false) { if (!VMR9Util.g_vmr9.IsVMR9Connected) { //VMR9 is not supported, switch to overlay Log.Info("RTSPPlayer: vmr9 not connected"); _mediaCtrl = null; Cleanup(); return false; } VMR9Util.g_vmr9.SetDeinterlaceMode(); } _mediaCtrl = (IMediaControl)graphBuilder; mediaEvt = (IMediaEventEx)graphBuilder; _mediaSeeking = (IMediaSeeking)graphBuilder; mediaPos = (IMediaPosition)graphBuilder; basicAudio = graphBuilder as IBasicAudio; //DirectShowUtil.SetARMode(graphBuilder,AspectRatioMode.Stretched); DirectShowUtil.EnableDeInterlace(graphBuilder); if (VMR9Util.g_vmr9 != null) { m_iVideoWidth = VMR9Util.g_vmr9.VideoWidth; m_iVideoHeight = VMR9Util.g_vmr9.VideoHeight; } if (audioRendererFilter != null) { Log.Info("RTSPPlayer9:set reference clock"); IMediaFilter mp = graphBuilder as IMediaFilter; IReferenceClock clock = audioRendererFilter as IReferenceClock; hr = mp.SetSyncSource(null); hr = mp.SetSyncSource(clock); Log.Info("RTSPPlayer9:set reference clock:{0:X}", hr); } Log.Info("RTSPPlayer: graph build successfull"); return true; } catch (Exception ex) { Error.SetError("Unable to play movie", "Unable build graph for VMR9"); Log.Error("RTSPPlayer:exception while creating DShow graph {0} {1}", ex.Message, ex.StackTrace); CloseInterfaces(); return false; } }
public void Generate() { Check.Require(Layers, "Layers", Check.NotNull); Check.Require(Layers.Count, "Layers.Count", Check.GreaterThan <int>(0)); Check.Require(Tick, "Tick", Check.GreaterThanOrEqual <int>(0)); ILog _log = LogManager.GetLogger(typeof(IOHelper)); Layers.Sort(new SortComparer <Layer>("Level", false)); var DynamicTextDS = Layers.FindAll(item => item.LayerType == LayerType.DynamicText); if (Layers.Count == 0) { //TODO: var img = new Bitmap(Layers.VideoSize.Width, Layers.VideoSize.Height); using (var g = Graphics.FromImage(img)) { g.Clear(Layers.BackColor); } NailImage = img; return; } var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, Layers.VideoSize.Width, Layers.VideoSize.Height, Layers); { int MaxCount = Tick <= 0 ? DESConsts.BitCount : (int)Tick * DESConsts.BitCount; ManualResetEvent mre = new ManualResetEvent(false); bool hasSign = false; try { Control.CheckForIllegalCrossThreadCalls = false; Panel pnl = new Panel(); var callback = new DESVideoCallBack(); EventHandler onCompleted = delegate { if (des != null) { des.Dispose(); } Control.CheckForIllegalCrossThreadCalls = true; if (!hasSign) { hasSign = true; mre.Set(); } }; callback.OnCallBack = () => { try { if (callback.m_FrameCount == 5) { des.Pause(); hasSign = true; mre.Set(); } } catch (Exception e) { _log.Error("Generale ThumNail Exception on callBack.", e); _log.Error(e); } }; des.Completed += onCompleted; pnl.Width = Layers.VideoSize.Width; pnl.Height = Layers.VideoSize.Height; des.RenderToFrame(pnl, callback, null, DynamicTextDS, DsRect.FromRectangle(ClientRectangle), 0, Layers.PlayLength); des.StartRendering(); des.put_CurrentPosition(Tick); mre.WaitOne(); mre.Close(); if (des != null && !des.IsDisposed) { NailImage = des.GetImage(); des.Cancel(); } } catch (Exception e) { _log.Error("Generale ThumNail Exception on general.", e); _log.Error(e); des.Cancel(); } } }
private void ResizeMoveHandler(object sender, EventArgs e) { if (this.videoRenderer != null) { int hr = (this.videoRenderer as IVMRWindowlessControl9).SetVideoPosition(null, DsRect.FromRectangle(this.hostingControl.ClientRectangle)); } }
void initGraph(Rectangle rect, IntPtr hwnd) { log.writeLog("Init Graph"); pGB = (IGraphBuilder) new FilterGraph(); pVmr = (IBaseFilter) new VideoMixingRenderer9(); compressVideo = CreateFilter(FilterCategory.VideoCompressorCategory, lstCompressor[3]); pGB.AddFilter(pVmr, "Video"); pGB.AddFilter(captureVideo, "VideoCapture"); //pGB.AddFilter(compressVideo, "Encoder"); pConfig = (IVMRFilterConfig9)pVmr; pConfig.SetRenderingMode(VMR9Mode.Windowless); pWC = (IVMRWindowlessControl9)pVmr; pWC.SetVideoPosition(null, DsRect.FromRectangle(rect)); pWC.SetVideoClippingWindow(hwnd); pMix = (IVMRMixerControl9)pVmr; pMs = (IMediaSeeking)pGB; pMC = (IMediaControl)pGB; ICaptureGraphBuilder2 cc = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); cc.SetFiltergraph(pGB); pGB.AddFilter(devices[0], "Camera-1"); if (devices[1] != null) { pGB.AddFilter(devices[1], "Camera-2"); } pGB.AddFilter(audioCapture, "Audio Capture"); Rectangle win = rect; float _w = win.Width; float _H = win.Height; NormalizedRect _0rect = new NormalizedRect(); _0rect.top = win.Top; _0rect.left = win.Left; _0rect.right = (win.Left + win.Width / 2) / _w; _0rect.bottom = (win.Bottom / _H); NormalizedRect _1rect = new NormalizedRect(); _1rect.top = win.Top; _1rect.left = (win.Left + win.Width / 2) / _w;; _1rect.right = win.Right / _w; _1rect.bottom = win.Bottom / _H; pMix.SetOutputRect(0, _0rect); pMix.SetOutputRect(1, _1rect); int hr = 0; IFileSinkFilter sink = null; log.writeLog("SetOutputFileName create"); hr = cc.SetOutputFileName(MediaSubType.Avi, "VideoCaptured.avi", out captureVideo, out sink); DsError.ThrowExceptionForHR(hr); log.writeLog("SetOutputFileName success"); log.writeLog("Start create cam-1 to preview"); hr = cc.RenderStream(PinCategory.Preview, MediaType.Video, devices[0], null, pVmr); DsError.ThrowExceptionForHR(hr); log.writeLog("Start cam-1 to preview success"); if (devices[1] != null) { log.writeLog("Start create cam-2 to preview"); hr = cc.RenderStream(PinCategory.Preview, MediaType.Video, devices[1], null, pVmr); DsError.ThrowExceptionForHR(hr); log.writeLog("Create cam-2 to preview success"); } log.writeLog("Start capture video from cam-1"); hr = cc.RenderStream(PinCategory.Capture, MediaType.Video, devices[0], null, captureVideo); DsError.ThrowExceptionForHR(hr); log.writeLog("success create capture from cam-1"); log.writeLog("Start capture audio"); hr = cc.RenderStream(PinCategory.Capture, MediaType.Audio, audioCapture, null, captureVideo); DsError.ThrowExceptionForHR(hr); log.writeLog("Success to capture audio"); Marshal.ReleaseComObject(cc); }
//protected virtual Rectangle GetInnerRectangle(Rectangle outerRectangle, double innerRatio) //{ // Rectangle innerRectangle = outerRectangle; // double outerRatio = (double)outerRectangle.Width / (double)outerRectangle.Height; // if (outerRatio >= innerRatio) // { // innerRectangle.Width = (int)((double)outerRectangle.Height * innerRatio); // innerRectangle.X = (int)((outerRectangle.Width - innerRectangle.Width) / 2.0); // } // else // { // innerRectangle.Height = (int)((double)outerRectangle.Width / innerRatio); // innerRectangle.Y = (int)((outerRectangle.Height - innerRectangle.Height) / 2.0); // } // return innerRectangle; //} protected Rectangle[] GetBlackBands() { Rectangle outerRectangle = this.hostingControl.ClientRectangle; DsRect innerDsRect = new DsRect(); int hr; if (useEVR) { MFVideoNormalizedRect pnrcSource = new MFVideoNormalizedRect(); MediaFoundation.Misc.MFRect prcDest = new MediaFoundation.Misc.MFRect(); hr = evrVideoDisplayControl.GetVideoPosition(pnrcSource, prcDest); innerDsRect = DsRect.FromRectangle((Rectangle)prcDest); } else { IVMRWindowlessControl9 vmrWindowlessControl9 = this.videoRenderer as IVMRWindowlessControl9; hr = vmrWindowlessControl9.GetVideoPosition(null, innerDsRect); } Rectangle innerRectangle = innerDsRect.ToRectangle(); //Trace.WriteLineIf(trace.TraceVerbose, string.Format(("\tvideoRenderer.GetVideoPosition({0})"), innerRectangle.ToString())); //Trace.WriteLineIf(trace.TraceVerbose, string.Format(("\thostingControl.ClientRectangle({0})"), outerRectangle.ToString())); List<Rectangle> alRectangles = new List<Rectangle>(); if (innerRectangle.Top > outerRectangle.Top) alRectangles.Add(new Rectangle(outerRectangle.Left, outerRectangle.Top, outerRectangle.Width - 1, innerRectangle.Top - 1)); if (innerRectangle.Bottom < outerRectangle.Bottom) alRectangles.Add(new Rectangle(outerRectangle.Left, innerRectangle.Bottom, outerRectangle.Width - 1, outerRectangle.Height - (innerRectangle.Bottom + 1))); if (innerRectangle.Left > outerRectangle.Left) { Rectangle rectangleLeft = new Rectangle(outerRectangle.Left, innerRectangle.Top, innerRectangle.Left - 1, innerRectangle.Height - 1); rectangleLeft.Intersect(outerRectangle); alRectangles.Add(rectangleLeft); } if (innerRectangle.Right < outerRectangle.Right) { Rectangle rectangleLeft = new Rectangle(innerRectangle.Right, innerRectangle.Top, outerRectangle.Width - (innerRectangle.Right + 1), innerRectangle.Height - 1); rectangleLeft.Intersect(outerRectangle); alRectangles.Add(rectangleLeft); } return alRectangles.ToArray(); }
public void Generate() { Check.Require(Layers, "Layers", Check.NotNull); Check.Require(Layers.Length, "Layers.Length", Check.GreaterThan <int>(0)); Check.Require(HWnd, "HWnd", Check.NotNull); Check.Require(Tick, "Tick", Check.GreaterThanOrEqual <int>(0)); var layers = helper.PopulateDataBatchLoad(Layers); layers.BackColor = HWnd.BackColor; //layers.VideoSize = new Size(ControlService.SignCombo.Current.Width, ControlService.SignCombo.Current.Height); layers.VideoSize = HWnd.Size; layers.Sort(new SortComparer <Layer>("Level", false)); var DynamicTextDS = layers.FindAll(item => { return(item.LayerType == LayerType.DynamicText); }); if (layers.Count == 0) { //TODO: var img = new Bitmap(HWnd.Width, HWnd.Height); using (var g = Graphics.FromImage(img)) { g.Clear(HWnd.BackColor); } NailImage = img; return; } //using (var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, HWnd.Width, HWnd.Height, layers)) var des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, layers.VideoSize.Width, layers.VideoSize.Height, layers); { int MaxCount = Tick <= 0 ? DESConsts.BitCount : (int)Tick * DESConsts.BitCount; ManualResetEvent mre = new ManualResetEvent(false); bool hasSign = false; try { Control.CheckForIllegalCrossThreadCalls = false; Panel pnl = new Panel(); var callback = new DESVideoCallBack(); EventHandler onCompleted = delegate { if (des != null) { des.Dispose(); } Control.CheckForIllegalCrossThreadCalls = true; if (!hasSign) { hasSign = true; mre.Set(); } }; callback.OnCallBack = () => { try { if (callback.m_FrameCount == 5) { des.Pause(); hasSign = true; mre.Set(); } } catch { } }; des.Completed += onCompleted; pnl.Width = layers.VideoSize.Width; pnl.Height = layers.VideoSize.Height; des.RenderToFrame(pnl, callback, null, DynamicTextDS, DsRect.FromRectangle(HWnd.ClientRectangle), 0, layers.PlayLength); des.StartRendering(); des.put_CurrentPosition(Tick); mre.WaitOne(); mre.Close(); if (des != null && !des.IsDisposed) { NailImage = des.GetImage(); des.Cancel(); } } catch { des.Cancel(); } } }
/// <summary> /// Start PlayList /// </summary> private void StartPlay() { EventArgs ca = new EventArgs(); int RunTime = 0; curNum = 0; PlayState = PlayState.Next; while (curNum >= 0 && curNum < dsArr.Length) { if (PlayState == PlayState.Stop) { if (des != null) { des.Cancel(); } break; } if (PlayState == PlayState.Next) { dsArr[curNum].Sort(new SortComparer <Layer>("Level", false)); des = new DESCombine(DESConsts.FPS, DESConsts.BitCount, hWin.Width, hWin.Height, dsArr[curNum]); DynamicTextDS = dsArr[curNum].FindAll(DynamicTextLayer); des.Completed += new EventHandler(Completed); pVideo = new DESVideoCallBack(RunTime, m_PlayBar, m_MediaTime); des.RenderToFrame(hWin, pVideo, null, DynamicTextDS, DsRect.FromRectangle(hWin.ClientRectangle), 0, dsArr[curNum].PlayLength); des.StartRendering(); PlayState = PlayState.Run; PlayLength = DESHelper.FormatTime(dsArr[curNum].PlayLength); } else { if (PlayState == PlayState.Run) { curLength += 1000000; } if (curLength >= PlayLength) { RunTime += (int)dsArr[curNum].PlayLength; curNum++; curLength = 0; PlayState = PlayState.Next; if (curNum == dsArr.Length) { PlayState = PlayState.Stop; } if (des != null) { des.Stop(); } } Thread.Sleep(100); } } if (des != null) { des.Cancel(); } hWin.Refresh(); if (PlayListCompleted != null) { PlayListCompleted(this, ca); } }
public int OnInvalidateRect(DsRect lpcRect) { m_ir = true; return(0); }
// return the surface created in InitializeDevice and a dsRect with the video size public int GetSurfaceEx(System.IntPtr dwUserID, int SurfaceIndex, int SurfaceFlags, out System.IntPtr lplpSurface, out DsRect lprcDst) { Debug.Assert(dwUserID == cookie, "IVMRSurfaceAllocatorEx9.GetSurfaceEx"); GetSurfaceExCount++; lplpSurface = unmanagedSurfaces[SurfaceIndex]; lprcDst = dstRect; return(0); }