MediaSource* MediaSource::Open(PCWSTR url) { MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID; IMFSourceResolver* mfSourceResolver = nullptr; IMFMediaSource* mfMediaSource = nullptr; IUnknown* pSource = nullptr; // Create the source resolver. HRESULT hr = MFCreateSourceResolver(&mfSourceResolver); // Use the source resolver to create the media source. hr = mfSourceResolver->CreateObjectFromURL( url, // URL of the source. MF_RESOLUTION_MEDIASOURCE, // Create a source object. nullptr, // Optional property store. &ObjectType, // Receives the created object type. &pSource // Receives a pointer to the media source. ); // Get the IMFMediaSource interface from the media source. hr = pSource->QueryInterface(IID_PPV_ARGS(&mfMediaSource)); if (pSource) pSource->Release(); if (mfSourceResolver) mfSourceResolver->Release(); return new MediaSource(mfMediaSource); }
/** Opens file from memory */ FIntPoint FImfVideoPlayer::OpenFile( void* FileSource, int32 Size, ECodecMovie::Type CodecType, FImfSampleGrabberCallback* SampleGrabberCallback ) { FIntPoint OutDimensions = FIntPoint::ZeroValue; HRESULT HResult = S_OK; /* Create Media Session */ HResult = MFCreateMediaSession( NULL, &MediaSession ); check( SUCCEEDED( HResult ) ); /* Begin Get Event */ HResult = MediaSession->BeginGetEvent( this, NULL ); check( SUCCEEDED( HResult ) ); IMFSourceResolver* SourceResolver = NULL; IUnknown* Source = NULL; /* Create Source Resolver */ HResult = MFCreateSourceResolver( &SourceResolver ); check( SUCCEEDED( HResult ) ); /* Determine codec type */ FString Ext = ".null"; switch( CodecType ) { case ECodecMovie::CodecMovie_Wmv: Ext = ".wmv"; break; /* Currently not working */ case ECodecMovie::CodecMovie_Mp4: Ext = ".mp4"; break; case ECodecMovie::CodecMovie_Avi: Ext = ".avi"; break; } /* Create custom ByteStream */ FImfByteStream* NewByteStream = new FImfByteStream( FileSource, Size ); /* Create Media Source */ MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID; HResult = SourceResolver->CreateObjectFromByteStream( NewByteStream, *Ext, MF_RESOLUTION_MEDIASOURCE, NULL, &ObjectType, &Source ); SourceResolver->Release( ); if( SUCCEEDED( HResult ) ) { HResult = Source->QueryInterface( IID_PPV_ARGS( &MediaSource ) ); Source->Release( ); /* Set Playback Topology */ OutDimensions = SetPlaybackTopology( SampleGrabberCallback ); } else { /* Failed */ MovieIsFinished.Set( 1 ); } return OutDimensions; }