/////////////////////////////////////////////////////////////////////// // Name: CreateOutputNode // Description: Creates an output node for a stream sink. // // pSink: The media sink. // iStream: Index of the stream sink on the media sink. // ppNode: Receives a pointer to the topology node. /////////////////////////////////////////////////////////////////////// static void CreateOutputNode(IMFMediaSinkAlt pSink, int iStream, out IMFTopologyNode ppNode) { HResult hr; IMFStreamSinkAlt pStream = null; hr = pSink.GetStreamSinkByIndex(iStream, out pStream); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFCreateTopologyNode(MFTopologyType.OutputNode, out ppNode); MFError.ThrowExceptionForHR(hr); hr = ppNode.SetObject(pStream); MFError.ThrowExceptionForHR(hr); //Marshal.ReleaseComObject(pStream); }
public HResult GetStreamSinkByIndex(int dwIndex, out IMFStreamSinkAlt ppStreamSink) { Debug.WriteLine("MediaSink:GetStreamSinkByIndex"); ppStreamSink = null; if (dwIndex != 0) { return(MF_E_INVALIDINDEX); } lock (this) { if (IsShutdown) { return(MF_E_SHUTDOWN); } ppStreamSink = StreamSink; } return(S_OK); }
public HResult GetStreamSinkById(int dwStreamSinkIdentifier, out IMFStreamSinkAlt ppStreamSink) { Debug.WriteLine("MediaSink:GetStreamSinkById"); ppStreamSink = null; if (dwStreamSinkIdentifier != 0) { return(MF_E_INVALIDSTREAMNUMBER); } lock (this) { if (IsShutdown) { return(MF_E_SHUTDOWN); } ppStreamSink = StreamSink; } return(S_OK); }
//------------------------------------------------------------------- // Name: GetStreamSinkByIndex // Description: Retrieves a stream by index. //------------------------------------------------------------------- public int GetStreamSinkByIndex( int dwIndex, out IMFStreamSinkAlt ppStreamSink) { // Make sure we *never* leave this entry point with an exception try { TRACE("CWavSink::GetStreamSinkByIndex"); lock (this) { // Fixed stream: Index 0. if (dwIndex > 0) { throw new COMException("Invalid index", MFError.MF_E_INVALIDINDEX); } CheckShutdown(); ppStreamSink = m_pStream; } return S_Ok; } catch (Exception e) { ppStreamSink = null; return Marshal.GetHRForException(e); } }
//------------------------------------------------------------------- // Name: GetStreamSinkById // Description: Retrieves a stream by ID. //------------------------------------------------------------------- public int GetStreamSinkById( int dwStreamSinkIdentifier, out IMFStreamSinkAlt ppStreamSink) { // Make sure we *never* leave this entry point with an exception try { TRACE("CWavSink::GetStreamSinkById"); lock (this) { // Fixed stream ID. if (dwStreamSinkIdentifier != WAV_SINK_STREAM_ID) { throw new COMException("Stream id not valid", MFError.MF_E_INVALIDSTREAMNUMBER); } CheckShutdown(); ppStreamSink = m_pStream; } return S_Ok; } catch (Exception e) { ppStreamSink = null; return Marshal.GetHRForException(e); } }
//------------------------------------------------------------------- // Name: AddStreamSink // Description: Adds a new stream to the sink. // // Note: This sink has a fixed number of streams, so this method // always returns MF_E_STREAMSINKS_FIXED. //------------------------------------------------------------------- public int AddStreamSink( int dwStreamSinkIdentifier, IMFMediaType pMediaType, out IMFStreamSinkAlt ppStreamSink) { // Make sure we *never* leave this entry point with an exception try { TRACE("CWavSink::AddStreamSink"); throw new COMException("Fixed streams", MFError.MF_E_STREAMSINKS_FIXED); } catch (Exception e) { ppStreamSink = null; return Marshal.GetHRForException(e); } }
private static HResult CreateOutputNode(IMFStreamDescriptor streamDescriptor, out IMFMediaSinkAlt mediaSink, out IMFTopologyNode node) { HResult hr = S_OK; mediaSink = null; node = null; IMFMediaTypeHandler mediaTypeHandler = null; IMFActivate activate = null; IMFStreamSinkAlt streamSink = null; Guid majorType = Guid.Empty; int streamSinkCount = 0; hr = streamDescriptor.GetMediaTypeHandler(out mediaTypeHandler); if (Failed(hr)) { return(hr); } hr = mediaTypeHandler.GetMajorType(out majorType); if (Failed(hr)) { SafeRelease(mediaTypeHandler); return(hr); } hr = MF.CreateTopologyNode(MFTopologyType.OutputNode, out node); if (Failed(hr)) { SafeRelease(mediaTypeHandler); return(hr); } if (majorType == MFMediaType.Video) { ExternalMediaSink extMediaSink = new ExternalMediaSink(); mediaSink = (IMFMediaSinkAlt)extMediaSink; hr = mediaSink.GetStreamSinkCount(out streamSinkCount); if (Failed(hr)) { mediaSink = null; return(hr); } hr = mediaSink.GetStreamSinkByIndex(0, out streamSink); if (Failed(hr)) { mediaSink = null; return(hr); } hr = node.SetObject(streamSink); if (Failed(hr)) { mediaSink = null; return(hr); } } else if (majorType == MFMediaType.Audio) { hr = MF.CreateAudioRendererActivate(out activate); if (Failed(hr)) { return(hr); } hr = node.SetObject(activate); if (Failed(hr)) { return(hr); } } mediaTypeHandler = null; activate = null; streamSink = null; return(hr); }
public HResult AddStreamSink(int dwStreamSinkIdentifier, IMFMediaType pMediaType, out IMFStreamSinkAlt ppStreamSink) { Debug.WriteLine("MediaSink:AddStreamSink"); ppStreamSink = null; return(MF_E_STREAMSINKS_FIXED); }