Esempio n. 1
0
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;
}