Quantcast
Channel: Media Foundation Development for Windows Desktop forum
Viewing all articles
Browse latest Browse all 1079

[Microsoft Media Foundation]Problem of asynchronous custom media source

$
0
0

I asked about MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS previously and I got an answer. 

  1. My hardware doesn't support it. 
  2. It requires asynchronous.

Based on these problems, I rewrote the program with referring to wavsink sample on Win7 SDK. However, it seems not to process by hardware for the moment. 

I uploaded the VS2013 full project(It generates a 5 seconds blank movie) to OneDrive. I want to know where is the problem.

#include <Windows.h>

#include "MFImage.h"
#pragma comment(lib, "Mf.lib")
#pragma comment(lib, "mfreadwrite")
#pragma comment(lib, "mfplat")
#pragma comment(lib, "mfplay")
#pragma comment(lib, "mfuuid")
#pragma comment(lib, "Shlwapi")

void main()
{
	CoInitializeEx(NULL, 0);
	MFStartup(MF_VERSION);

	HRESULT hr;

	MFT_REGISTER_TYPE_INFO codec;
	codec.guidMajorType = MFMediaType_Video;
	codec.guidSubtype = MFVideoFormat_H264;

	IMFActivate** activate_array = 0;
	IMFTransform* encoder = 0;
	UINT32 count = 0;
	hr = MFTEnumEx(MFT_CATEGORY_VIDEO_ENCODER,
		MFT_ENUM_FLAG_ASYNCMFT | MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SORTANDFILTER,
		NULL, &codec, &activate_array, &count);
	activate_array[0]->ActivateObject(__uuidof(IMFTransform), (LPVOID*)&encoder);


	MFAsyncReader *asr = NULL;
	IMFAttributes *spattr = NULL;
	IMFSourceReader *reader = NULL;
	MFImageSource *isource = NULL;
	IMFMediaType *type = NULL;

	encoder->GetAttributes(&spattr);

	spattr->SetUINT32(MF_TRANSFORM_ASYNC, TRUE);
	spattr->SetUINT32(MF_TRANSFORM_ASYNC_UNLOCK, FALSE);
	spattr->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);
	spattr->SetUINT32(MF_LOW_LATENCY, TRUE);
	spattr->SetGUID(MF_TRANSCODE_CONTAINERTYPE, MFTranscodeContainerType_MPEG4);

	IMFSinkWriter *writer = NULL;
	hr = MFCreateSinkWriterFromURL(L"C:\\data\\test.mp4", NULL, spattr, &writer);
	RELEASE(spattr);
	if(FAILED(hr)) goto EXIT;

	DWORD vindex;

	IMFMediaType *mediaout = NULL;
	MFCreateMediaType(&mediaout);
	mediaout->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
	mediaout->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
	mediaout->SetUINT32(MF_MT_AVG_BITRATE, 1024 *1024);
	mediaout->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
	MFSetAttributeSize(mediaout, MF_MT_FRAME_SIZE, 640, 480);
	MFSetAttributeRatio(mediaout, MF_MT_FRAME_RATE, 30, 1);
	MFSetAttributeRatio(mediaout, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
	hr = writer->AddStream(mediaout, &vindex);
	RELEASE(mediaout);

	asr = new MFAsyncReader(writer);
	IMFAttributes *cpattr = NULL;
	hr = MFCreateAttributes(&cpattr, 1);
	if (SUCCEEDED(hr)){
		hr = cpattr->SetUnknown(MF_SOURCE_READER_ASYNC_CALLBACK, asr);
	}

	if (SUCCEEDED(hr)){
		isource = new MFImageSource(hr);
		hr = MFCreateSourceReaderFromMediaSource(isource, cpattr, &reader);
	}
	RELEASE(cpattr);

	hr = reader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, &type);
	hr = writer->SetInputMediaType(vindex, type, NULL);
	RELEASE(type);


	asr->SetReader(reader);

	hr = writer->BeginWriting();
	hr = reader->ReadSample(MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, NULL, NULL, NULL);

	Sleep(5000);

	writer->Finalize();
	isource->Shutdown();

EXIT:
	RELEASE(asr);

	RELEASE(writer);
	RELEASE(reader);
	RELEASE(isource);

	MFShutdown();
	CoUninitialize();

}


Viewing all articles
Browse latest Browse all 1079

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>