I asked about MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS previously and I got an answer.
- My hardware doesn't support it.
- 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(); }