private async Task <object> getSourceNode( XmlNode aSourceNode, XmlNode aStreamNode, XmlNode aMediaTypeNode, object MixerNode) { object lresult = null; do { if (aSourceNode == null) { break; } if (aStreamNode == null) { break; } if (aMediaTypeNode == null) { break; } var lNode = aSourceNode.SelectSingleNode( "Source.Attributes/Attribute" + "[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK' or @Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']" + "/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; if (aStreamNode == null) { break; } lNode = aStreamNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lStreamIndex = 0; if (!uint.TryParse(lNode.Value, out lStreamIndex)) { break; } if (aMediaTypeNode == null) { break; } lNode = aMediaTypeNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } string lextendSymbolicLink = lSymbolicLink + " --options=" + "<?xml version='1.0' encoding='UTF-8'?>" + "<Options>" + "<Option Type='Cursor' Visiblity='True'>" + "<Option.Extensions>" + "<Extension Type='BackImage' Height='100' Width='100' Fill='0x7055ff55' />" + "</Option.Extensions>" + "</Option>" + "</Options>"; object lSourceNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lextendSymbolicLink, lStreamIndex, lMediaTypeIndex, MixerNode); lresult = lSourceNode; } while (false); return(lresult); }
private async void mDo_Click(object sender, EventArgs e) { mDo.Enabled = false; do { if (mSession != null) { await mSession.closeSessionAsync(); mSession = null; mDo.Text = "Stopped"; break; } if (mSink == null) { break; } var lSelectedSourceItem = (ContainerItem)sourceComboBox.SelectedItem; if (lSelectedSourceItem == null) { break; } var lSourceNode = lSelectedSourceItem.mXmlNode; if (lSourceNode == null) { break; } var lNode = lSourceNode.SelectSingleNode( "Source.Attributes/Attribute" + "[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK' or @Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']" + "/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; uint lStreamIndex = 0; var lSelectedMediaTypeItem = (ContainerItem)mediaTypeComboBox.SelectedItem; if (lSelectedMediaTypeItem == null) { break; } lSourceNode = lSelectedMediaTypeItem.mXmlNode; if (lSourceNode == null) { break; } lNode = lSourceNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } object lOutputMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); var lSelectedEncoderItem = (ContainerItem)encoderComboBox.SelectedItem; if (lSelectedEncoderItem == null) { break; } var lselectedNode = lSelectedEncoderItem.mXmlNode; if (lselectedNode == null) { break; } var lEncoderNameAttr = lselectedNode.Attributes["Title"]; if (lEncoderNameAttr == null) { break; } var lCLSIDEncoderAttr = lselectedNode.Attributes["CLSID"]; if (lCLSIDEncoderAttr == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lCLSIDEncoderAttr.Value, out lCLSIDEncoder)) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); var lSelectedEncoderModeItem = (ContainerItem)encoderModeComboBox.SelectedItem; if (lSelectedEncoderModeItem == null) { break; } lselectedNode = lSelectedEncoderModeItem.mXmlNode; if (lselectedNode == null) { break; } var lGUIDEncodingModeAttr = lselectedNode.Attributes["GUID"]; if (lGUIDEncodingModeAttr == null) { break; } Guid lGUIDEncodingMode; if (!Guid.TryParse(lGUIDEncodingModeAttr.Value, out lGUIDEncodingMode)) { break; } if (compressedMediaTypeComboBox.SelectedIndex < 0) { break; } object lCompressedMediaType = await lEncoderNodeFactory.createCompressedMediaTypeAsync( lOutputMediaType, lGUIDEncodingMode, 70, (uint)compressedMediaTypeComboBox.SelectedIndex); var lOutputNode = await mSink.getOutputNodeAsync(lCompressedMediaType); var lIEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); object lEncoderNode = await lIEncoderNodeFactory.createEncoderNodeAsync( lOutputMediaType, lGUIDEncodingMode, 70, (uint)compressedMediaTypeComboBox.SelectedIndex, lOutputNode); object lSourceMediaNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex, lEncoderNode); List <object> lSourcesList = new List <object>(); lSourcesList.Add(lSourceMediaNode); mSession = await mISessionControl.createSessionAsync(lSourcesList.ToArray()); if (mSession == null) { break; } if (mSession != null) { await mSession.startSessionAsync(0, Guid.Empty); } mDo.Text = "Record is executed!!!"; } while (false); mDo.Enabled = true; }
private async Task <Tuple <object, string, int> > createVideoStream(ISampleGrabberCallbackSinkFactoryAsync aISampleGrabberCallbackSinkFactory, int aIndexCount) { object result = null; int index = 0; string lMediaType = ""; do { var lSourceNode = mSourcesComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } var lNode = lSourceNode.SelectSingleNode("Source.Attributes/Attribute[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK']/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; uint lStreamIndex = 0; lSourceNode = mMediaTypesComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } lNode = lSourceNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } var lSinkControl = await mCaptureManager.createSinkControlAsync(); var lSinkFactory = await lSinkControl.createEVRSinkFactoryAsync( Guid.Empty); object lEVROutputNode = await lSinkFactory.createOutputNodeAsync( mVideoPanel.Handle); if (lEVROutputNode == null) { break; } ISampleGrabberCallback lH264SampleGrabberCallback = await aISampleGrabberCallbackSinkFactory.createOutputNodeAsync( MFMediaType_Video, MFVideoFormat_H264); object lOutputNode = lEVROutputNode; if (lH264SampleGrabberCallback != null) { lH264SampleGrabberCallback.mUpdateNativeFullEvent += delegate (uint aSampleFlags, long aSampleTime, long aSampleDuration, IntPtr aData, uint aSize) { if (s != null) { lock (s) { Console.WriteLine("aSampleFlags: {0}", aSampleFlags); currentmillisecond += 1; s.sendVideoData(currentmillisecond, aData, (int)aSize, aSampleFlags, aIndexCount); currentmillisecond += 33; } } }; var lSampleGrabberCallNode = lH264SampleGrabberCallback.getTopologyNode(); if (lSampleGrabberCallNode != null) { var streamControl = await mCaptureManager.createStreamControlAsync(); object spreaderNode = null; List <object> outputNodeList = new List <object>(); var mEncoderControl = await mCaptureManager.createEncoderControlAsync(); XmlDocument doc = new XmlDocument(); string lxmldoc = await mCaptureManager.getCollectionOfEncodersAsync(); doc.LoadXml(lxmldoc); var l_VideoEncoderNode = doc.SelectSingleNode("EncoderFactories/Group[@GUID='{73646976-0000-0010-8000-00AA00389B71}']/EncoderFactory[@IsStreaming='TRUE'][1]/@CLSID"); if (l_VideoEncoderNode == null) { break; } Guid lCLSIDVideoEncoder; if (!Guid.TryParse(l_VideoEncoderNode.Value, out lCLSIDVideoEncoder)) { break; } var lIEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync(lCLSIDVideoEncoder); if (lIEncoderNodeFactory != null) { if (mSourceControl == null) { break; } object lVideoSourceOutputMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); string lxmlDoc = await mEncoderControl.getMediaTypeCollectionOfEncoderAsync( lVideoSourceOutputMediaType, lCLSIDVideoEncoder); doc = new System.Xml.XmlDocument(); doc.LoadXml(lxmlDoc); var lGroup = doc.SelectSingleNode("EncoderMediaTypes/Group[@GUID='{8F6FF1B6-534E-49C0-B2A8-16D534EAF135}']"); uint lMaxBitRate = 0; if (lGroup != null) { var lAttr = lGroup.SelectSingleNode("@MaxBitRate"); if (lAttr != null) { uint.TryParse(lAttr.Value, out lMaxBitRate); } } lMaxBitRate = 1000000; object lVideoEncoderNode = await lIEncoderNodeFactory.createEncoderNodeAsync( lVideoSourceOutputMediaType, StreamingCBR, lMaxBitRate, 0, lSampleGrabberCallNode); object lCompressedMediaType = await lIEncoderNodeFactory.createCompressedMediaTypeAsync( lVideoSourceOutputMediaType, StreamingCBR, lMaxBitRate, 0); var spreaderNodeFactory = await streamControl.createSpreaderNodeFactoryAsync(); outputNodeList.Add(lEVROutputNode); outputNodeList.Add(lVideoEncoderNode); spreaderNode = await spreaderNodeFactory.createSpreaderNodeAsync(outputNodeList); if (spreaderNode != null) { lOutputNode = spreaderNode; } lMediaType = await mCaptureManager.parseMediaTypeAsync(lCompressedMediaType); } } } string lextendSymbolicLink = lSymbolicLink + " --options=" + "<?xml version='1.0' encoding='UTF-8'?>" + "<Options>" + "<Option Type='Cursor' Visiblity='True'>" + "<Option.Extensions>" + "<Extension Type='BackImage' Height='100' Width='100' Fill='0x7055ff55' />" + "</Option.Extensions>" + "</Option>" + "</Options>"; lextendSymbolicLink += " --normalize=Landscape"; result = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lextendSymbolicLink, lStreamIndex, lMediaTypeIndex, lOutputNode); if (result != null) { index = aIndexCount; } }while (false); return(Tuple.Create <object, string, int>(result, lMediaType, index)); }
private async Task <object> getSourceNode( XmlNode aSourceNode, XmlNode aStreamNode, XmlNode aMediaTypeNode, XmlNode aEncoderNode, XmlNode aEncoderModeNode, int aCompressedMediaTypeIndex, object PreviewRenderNode, object aOutputNode) { object lresult = null; do { if (aCompressedMediaTypeIndex < 0) { break; } if (aSourceNode == null) { break; } if (aStreamNode == null) { break; } if (aMediaTypeNode == null) { break; } if (aEncoderNode == null) { break; } if (aEncoderModeNode == null) { break; } var lEncoderGuidAttr = aEncoderNode.Attributes["CLSID"]; if (lEncoderGuidAttr == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lEncoderGuidAttr.Value, out lCLSIDEncoder)) { break; } var lEncoderModeGuidAttr = aEncoderModeNode.Attributes["GUID"]; if (lEncoderModeGuidAttr == null) { break; } Guid lCLSIDEncoderMode; if (!Guid.TryParse(lEncoderModeGuidAttr.Value, out lCLSIDEncoderMode)) { break; } if (aSourceNode == null) { break; } var lNode = aSourceNode.SelectSingleNode( "Source.Attributes/Attribute" + "[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK' or @Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']" + "/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; if (aStreamNode == null) { break; } lNode = aStreamNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lStreamIndex = 0; if (!uint.TryParse(lNode.Value, out lStreamIndex)) { break; } if (aMediaTypeNode == null) { break; } lNode = aMediaTypeNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } lSymbolicLink = getScreenCaptureSymbolicLink(lSymbolicLink); object lSourceMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); if (lSourceMediaType == null) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); if (lEncoderNodeFactory == null) { break; } object lEncoderNode = await lEncoderNodeFactory.createEncoderNodeAsync( lSourceMediaType, lCLSIDEncoderMode, 50, (uint)aCompressedMediaTypeIndex, aOutputNode); object SpreaderNode = lEncoderNode; if (PreviewRenderNode != null) { List <object> lOutputNodeList = new List <object>(); lOutputNodeList.Add(PreviewRenderNode); lOutputNodeList.Add(lEncoderNode); SpreaderNode = await mSpreaderNodeFactory.createSpreaderNodeAsync( lOutputNodeList); } object lSourceNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex, SpreaderNode); lresult = lSourceNode; } while (false); return(lresult); }
public async Task <object> getSourceNode(object aOutputNode) { object lresult = null; do { var lselectedNode = m_EncodersComboBox.SelectedItem as XmlNode; if (lselectedNode == null) { break; } var lEncoderGuidAttr = lselectedNode.Attributes["CLSID"]; if (lEncoderGuidAttr == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lEncoderGuidAttr.Value, out lCLSIDEncoder)) { break; } lselectedNode = m_EncodingModeComboBox.SelectedItem as XmlNode; if (lselectedNode == null) { break; } var lEncoderModeGuidAttr = lselectedNode.Attributes["GUID"]; if (lEncoderModeGuidAttr == null) { break; } Guid lCLSIDEncoderMode; if (!Guid.TryParse(lEncoderModeGuidAttr.Value, out lCLSIDEncoderMode)) { break; } string lSymbolicLink = SymbolicLink; if (m_StreamComboBox.SelectedIndex < 0) { break; } uint lStreamIndex = (uint)m_StreamComboBox.SelectedIndex; if (m_MediaTypeComboBox.SelectedIndex < 0) { break; } uint lMediaTypeIndex = (uint)m_MediaTypeComboBox.SelectedIndex; object lSourceMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); if (lSourceMediaType == null) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); if (lEncoderNodeFactory == null) { break; } object lEncoderNode = await lEncoderNodeFactory.createEncoderNodeAsync( lSourceMediaType, lCLSIDEncoderMode, 50, (uint)m_CompressedMediaTypesComboBox.SelectedIndex, aOutputNode); object SpreaderNode = lEncoderNode; if (TypeSource == "Video") { object PreviewRenderNode = null; // if ((bool)m_VideoStreamPreviewChkBtn.IsChecked) { List <object> lRenderOutputNodesList = new List <object>(); if (mEVRMultiSinkFactory != null) { lRenderOutputNodesList = await mEVRMultiSinkFactory.createOutputNodesAsync( IntPtr.Zero, m_EVRDisplay.Surface.texture, 1); } if (lRenderOutputNodesList.Count == 1) { PreviewRenderNode = lRenderOutputNodesList[0]; } } List <object> lOutputNodeList = new List <object>(); lOutputNodeList.Add(PreviewRenderNode); lOutputNodeList.Add(lEncoderNode); SpreaderNode = await mSpreaderNodeFactory.createSpreaderNodeAsync( lOutputNodeList); } object lSourceNode; string lextendSymbolicLink = lSymbolicLink + " --options=" + "<?xml version='1.0' encoding='UTF-8'?>" + "<Options>" + "<Option Type='Cursor' Visiblity='True'>" + "<Option.Extensions>" + "<Extension Type='BackImage' Height='100' Width='100' Fill='0x7055ff55' />" + "</Option.Extensions>" + "</Option>" + "</Options>"; lSourceNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lextendSymbolicLink, lStreamIndex, lMediaTypeIndex, SpreaderNode); lresult = lSourceNode; } while (false); return(lresult); }
private async void Button_Click(object sender, RoutedEventArgs e) { mTitleTxtBlk.IsEnabled = false; do { if (mISession != null) { await mISession.stopSessionAsync(); await mISession.closeSessionAsync(); mISession = null; mTitleTxtBlk.Text = "Start playing"; break; } List <object> lSourceNodes = new List <object>(); object lSARSinkOutputNode = await mSARSinkFactory.createOutputNodeAsync(); if (lSARSinkOutputNode == null) { break; } var l_AudioSourceXmlNode = m_AudioSourceComboBox.SelectedItem as XmlNode; if (l_AudioSourceXmlNode == null) { break; } var lNode = l_AudioSourceXmlNode.SelectSingleNode( "Source.Attributes/Attribute" + "[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']" + "/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; object lSourceNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lSymbolicLink, 0, 0, lSARSinkOutputNode); if (lSourceNode == null) { break; } lSourceNodes.Add(lSourceNode); mISession = await mISessionControl.createSessionAsync(lSourceNodes.ToArray()); if (mISession == null) { break; } if (await mISession.startSessionAsync(0, Guid.Empty)) { mTitleTxtBlk.Text = "Stop playing"; uint lChannelCount = 0; lChannelCount = await mISARVolumeControl.getChannelCountAsync(lSARSinkOutputNode); if (lChannelCount > 0) { float lLevel = await mISARVolumeControl.getChannelVolumeAsync(lSARSinkOutputNode, 0); mRVolume.ValueChanged += async(s, ev) => { await mISARVolumeControl.setChannelVolumeAsync(lSARSinkOutputNode, 0, (float)ev.NewValue); }; mRVolume.Value = lLevel; if (lChannelCount > 1) { lLevel = await mISARVolumeControl.getChannelVolumeAsync(lSARSinkOutputNode, 1); mLVolume.ValueChanged += async(s, ev) => { await mISARVolumeControl.setChannelVolumeAsync(lSARSinkOutputNode, 1, (float)ev.NewValue); }; mLVolume.Value = lLevel; } } } } while (false); mTitleTxtBlk.IsEnabled = true; }
private async Task <object> getSourceNode( XmlNode aSourceNode, XmlNode aStreamNode, XmlNode aMediaTypeNode, XmlNode aEncoderNode, XmlNode aEncoderModeNode, int aCompressedMediaTypeIndex, object PreviewRenderNode, object aSwitcherNode) { object lresult = null; do { if (aCompressedMediaTypeIndex < 0) { break; } if (aSourceNode == null) { break; } if (aMediaTypeNode == null) { break; } if (aEncoderNode == null) { break; } if (aEncoderModeNode == null) { break; } var lEncoderGuidAttr = aEncoderNode.Attributes["CLSID"]; if (lEncoderGuidAttr == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lEncoderGuidAttr.Value, out lCLSIDEncoder)) { break; } var lEncoderModeGuidAttr = aEncoderModeNode.Attributes["GUID"]; if (lEncoderModeGuidAttr == null) { break; } Guid lCLSIDEncoderMode; if (!Guid.TryParse(lEncoderModeGuidAttr.Value, out lCLSIDEncoderMode)) { break; } if (aSourceNode == null) { break; } var lNode = aSourceNode.SelectSingleNode( "Source.Attributes/Attribute" + "[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK' or @Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']" + "/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; uint lStreamIndex = 0; if (aMediaTypeNode == null) { break; } lNode = aMediaTypeNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } object lSourceMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); if (lSourceMediaType == null) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); if (lEncoderNodeFactory == null) { break; } object SpreaderNode = aSwitcherNode; if (PreviewRenderNode != null) { List <object> lOutputNodeList = new List <object>(); lOutputNodeList.Add(PreviewRenderNode); lOutputNodeList.Add(aSwitcherNode); SpreaderNode = await mSpreaderNodeFactory.createSpreaderNodeAsync( lOutputNodeList); } string lextendSymbolicLink = lSymbolicLink + " --options=" + "<?xml version='1.0' encoding='UTF-8'?>" + "<Options>" + "<Option Type='Cursor' Visiblity='True'>" + "<Option.Extensions>" + "<Extension Type='BackImage' Height='100' Width='100' Fill='0x7055ff55' />" + "</Option.Extensions>" + "</Option>" + "</Options>"; lresult = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lextendSymbolicLink, lStreamIndex, lMediaTypeIndex, SpreaderNode); } while (false); return(lresult); }
private async Task <Tuple <object, RtspServer.StreamType, int, string> > createVideoStream(ISampleGrabberCallbackSinkFactoryAsync aISampleGrabberCallbackSinkFactory, int aIndexCount) { object result = null; RtspServer.StreamType type = RtspServer.StreamType.Video; int index = 0; string format = ""; do { var lSourceNode = mSourcesComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } var lNode = lSourceNode.SelectSingleNode("Source.Attributes/Attribute[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK']/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; lSourceNode = mStreamsComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } lNode = lSourceNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lStreamIndex = 0; if (!uint.TryParse(lNode.Value, out lStreamIndex)) { break; } lSourceNode = mMediaTypesComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } lNode = lSourceNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } var lSinkControl = await mCaptureManager.createSinkControlAsync(); var lSinkFactory = await lSinkControl.createEVRSinkFactoryAsync( Guid.Empty); object lEVROutputNode = await lSinkFactory.createOutputNodeAsync( mVideoPanel.Handle); if (lEVROutputNode == null) { break; } Guid lVideoFormat = Guid.Empty; var lVideoCompressedNode = mVideoMediaTypeComboBox.SelectedItem as XmlNode; if (lVideoCompressedNode != null) { var lGUID = lVideoCompressedNode.SelectSingleNode("MediaTypeItem[@Name='MF_MT_SUBTYPE']/SingleValue/@GUID"); if (lGUID != null) { Guid.TryParse(lGUID.Value, out lVideoFormat); } var lvalue = lVideoCompressedNode.SelectSingleNode("MediaTypeItem[@Name='MF_MT_SUBTYPE']/SingleValue/@Value"); if (lvalue != null && lvalue.Value != null) { var lsplit = lvalue.Value.Split(new char[] { '_' }); if (lsplit != null && lsplit.Length == 2) { format = lsplit[1]; } if (format == "HEVC") { format = "H265"; } } } var lSampleGrabberCallback = await aISampleGrabberCallbackSinkFactory.createOutputNodeAsync( MFMediaType_Video, lVideoFormat); object lOutputNode = lEVROutputNode; if (lSampleGrabberCallback != null) { lSampleGrabberCallback.mUpdateFullEvent += delegate (uint aSampleFlags, long aSampleTime, long aSampleDuration, byte[] aData, uint aLength) { if (s != null) { lock (s) { currentmillisecond += 1; s.sendData(aIndexCount, (int)type, currentmillisecond * 90, aData); currentmillisecond += 20; } } }; var lSampleGrabberCallNode = lSampleGrabberCallback.getTopologyNode(); if (lSampleGrabberCallNode != null) { IStreamControl streamControl = mCaptureManager.createStreamControl(); ISpreaderNodeFactory spreaderNodeFactory = null; object spreaderNode = null; List <object> outputNodeList = new List <object>(); var mEncoderControl = await mCaptureManager.createEncoderControlAsync(); var lEncoderNode = mVideoEncoderComboBox.SelectedItem as XmlNode; if (lEncoderNode == null) { break; } lNode = lEncoderNode.SelectSingleNode("@CLSID"); if (lNode == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lNode.Value, out lCLSIDEncoder)) { break; } var lBitRate = (uint)mBitRateComboBox.SelectedItem; var lIEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync(lCLSIDEncoder); if (lIEncoderNodeFactory != null) { if (mSourceControl == null) { break; } object lVideoSourceOutputMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); object lVideoEncoderNode = await lIEncoderNodeFactory.createEncoderNodeAsync(lVideoSourceOutputMediaType, StreamingCBR, lBitRate, 0, lSampleGrabberCallNode); streamControl.createStreamControlNodeFactory(ref spreaderNodeFactory); outputNodeList.Add(lEVROutputNode); outputNodeList.Add(lVideoEncoderNode); spreaderNodeFactory.createSpreaderNode(outputNodeList, out spreaderNode); if (spreaderNode != null) { lOutputNode = spreaderNode; } } } } string lextendSymbolicLink = lSymbolicLink + " --options=" + "<?xml version='1.0' encoding='UTF-8'?>" + "<Options>" + "<Option Type='Cursor' Visiblity='True'>" + "<Option.Extensions>" + "<Extension Type='BackImage' Height='100' Width='100' Fill='0x7055ff55' />" + "</Option.Extensions>" + "</Option>" + "</Options>"; lextendSymbolicLink += " --normalize=Landscape"; result = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lextendSymbolicLink, lStreamIndex, lMediaTypeIndex, lOutputNode); if (result != null) { index = aIndexCount; } }while (false); return(Tuple.Create <object, RtspServer.StreamType, int, string>(result, type, index, format)); }
private async Task <object> getSourceNode( string a_SymbolicLink, int a_StreamIndex, int a_MediaTypeIndex, XmlNode aEncoderNode, XmlNode aEncoderModeNode, int aCompressedMediaTypeIndex, object PreviewRenderNode, object aOutputNode) { object lresult = null; do { if (aCompressedMediaTypeIndex < 0) { break; } if (a_StreamIndex < 0) { break; } if (a_MediaTypeIndex < 0) { break; } if (aEncoderNode == null) { break; } if (aEncoderModeNode == null) { break; } var lEncoderGuidAttr = aEncoderNode.Attributes["CLSID"]; if (lEncoderGuidAttr == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lEncoderGuidAttr.Value, out lCLSIDEncoder)) { break; } var lEncoderModeGuidAttr = aEncoderModeNode.Attributes["GUID"]; if (lEncoderModeGuidAttr == null) { break; } Guid lCLSIDEncoderMode; if (!Guid.TryParse(lEncoderModeGuidAttr.Value, out lCLSIDEncoderMode)) { break; } uint lStreamIndex = (uint)a_StreamIndex; uint lMediaTypeIndex = (uint)a_MediaTypeIndex; object lSourceMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( a_SymbolicLink, lStreamIndex, lMediaTypeIndex); if (lSourceMediaType == null) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync(lCLSIDEncoder); if (lEncoderNodeFactory == null) { break; } object lEncoderNode = await lEncoderNodeFactory.createEncoderNodeAsync( lSourceMediaType, lCLSIDEncoderMode, 50, (uint)aCompressedMediaTypeIndex, aOutputNode); if (lEncoderNode == null) { break; } object SpreaderNode = lEncoderNode; if (PreviewRenderNode != null) { List <object> lOutputNodeList = new List <object>(); lOutputNodeList.Add(PreviewRenderNode); lOutputNodeList.Add(lEncoderNode); SpreaderNode = await mSpreaderNodeFactory.createSpreaderNodeAsync( lOutputNodeList); } lresult = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( a_SymbolicLink, lStreamIndex, lMediaTypeIndex, SpreaderNode); } while (false); return(lresult); }
private async Task <object> getVideoSourceNode( object PreviewRenderNode, object aOutputNode) { object lresult = null; do { Guid lCLSIDEncoderMode = await getVideoEncoderMode(); uint lStreamIndex = Settings.Default.VideoSourceStream; uint lMediaTypeIndex = Settings.Default.VideoSourceMediaType; var lSymbolicLink = getScreenCaptureSymbolicLink(m_VideoSymbolicLink); object lSourceMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); if (lSourceMediaType == null) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync(mCLSIDVideoEncoder); if (lEncoderNodeFactory == null) { break; } object lEncoderNode = await lEncoderNodeFactory.createEncoderNodeAsync( lSourceMediaType, lCLSIDEncoderMode, (uint)Settings.Default.VideoCompressionQuality, Settings.Default.VideoEncoderMediaType, aOutputNode); object SpreaderNode = lEncoderNode; if (PreviewRenderNode != null) { List <object> lOutputNodeList = new List <object>(); lOutputNodeList.Add(PreviewRenderNode); lOutputNodeList.Add(lEncoderNode); SpreaderNode = await mSpreaderNodeFactory.createSpreaderNodeAsync(lOutputNodeList); } object lSourceNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex, SpreaderNode); lresult = lSourceNode; } while (false); return(lresult); }
private async void mDo_Click(object sender, RoutedEventArgs e) { mDo.IsEnabled = false; do { if (mSession != null) { await mSession.closeSessionAsync(); mSession = null; mDo.Content = "Stopped"; break; } if (mSink == null) { break; } var lSourceNode = mSourcesComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } var lNode = lSourceNode.SelectSingleNode( "Source.Attributes/Attribute" + "[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK' or @Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']" + "/SingleValue/@Value"); if (lNode == null) { break; } string lSymbolicLink = lNode.Value; lSourceNode = mStreamsComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } lNode = lSourceNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lStreamIndex = 0; if (!uint.TryParse(lNode.Value, out lStreamIndex)) { break; } lSourceNode = mMediaTypesComboBox.SelectedItem as XmlNode; if (lSourceNode == null) { break; } lNode = lSourceNode.SelectSingleNode("@Index"); if (lNode == null) { break; } uint lMediaTypeIndex = 0; if (!uint.TryParse(lNode.Value, out lMediaTypeIndex)) { break; } object lOutputMediaType = await mSourceControl.getSourceOutputMediaTypeAsync( lSymbolicLink, lStreamIndex, lMediaTypeIndex); var lselectedNode = mEncodersComboBox.SelectedItem as XmlNode; if (lselectedNode == null) { break; } var lEncoderNameAttr = lselectedNode.Attributes["Title"]; if (lEncoderNameAttr == null) { break; } var lCLSIDEncoderAttr = lselectedNode.Attributes["CLSID"]; if (lCLSIDEncoderAttr == null) { break; } Guid lCLSIDEncoder; if (!Guid.TryParse(lCLSIDEncoderAttr.Value, out lCLSIDEncoder)) { break; } var lEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); lselectedNode = mEncodingModeComboBox.SelectedItem as XmlNode; if (lselectedNode == null) { break; } var lGUIDEncodingModeAttr = lselectedNode.Attributes["GUID"]; if (lGUIDEncodingModeAttr == null) { break; } Guid lGUIDEncodingMode; if (!Guid.TryParse(lGUIDEncodingModeAttr.Value, out lGUIDEncodingMode)) { break; } if (mCompressedMediaTypesComboBox.SelectedIndex < 0) { break; } object lCompressedMediaType = await lEncoderNodeFactory.createCompressedMediaTypeAsync( lOutputMediaType, lGUIDEncodingMode, 70, (uint)mCompressedMediaTypesComboBox.SelectedIndex); var lOutputNode = await mSink.getOutputNode(lCompressedMediaType); var lIEncoderNodeFactory = await mEncoderControl.createEncoderNodeFactoryAsync( lCLSIDEncoder); object lEncoderNode = await lIEncoderNodeFactory.createEncoderNodeAsync( lOutputMediaType, lGUIDEncodingMode, 70, (uint)mCompressedMediaTypesComboBox.SelectedIndex, lOutputNode); string lextendSymbolicLink = lSymbolicLink + " --options=" + "<?xml version='1.0' encoding='UTF-8'?>" + "<Options>" + "<Option Type='Cursor' Visiblity='True'>" + "<Option.Extensions>" + "<Extension Type='BackImage' Height='100' Width='100' Fill='0x7000ff55' />" + "</Option.Extensions>" + "</Option>" + "</Options>"; object lSourceMediaNode = await mSourceControl.createSourceNodeWithDownStreamConnectionAsync( lextendSymbolicLink, lStreamIndex, lMediaTypeIndex, lEncoderNode); List <object> lSourcesList = new List <object>(); lSourcesList.Add(lSourceMediaNode); mSession = await mISessionControl.createSessionAsync(lSourcesList.ToArray()); if (mSession != null && await mSession.startSessionAsync(0, Guid.Empty)) { mDo.Content = "Record is executed!!!"; } } while (false); mDo.IsEnabled = true; }