I'll open video file by IMFSourceReader and want to show it on window by IMFMediaSink+EVR. I dont know where to get value for IMFPresentationClock. And i dont know how to start MediaSink. Or maybe i do all wrong? Can u help me? Sorry for my English.)
HRESULT Playback::StartVideo(LPCWSTR fileName) { HRESULT hr; if (SUCCEEDED(hr)) hr = MFCreateSourceReaderFromURL(fileName, NULL, &pReader); IMFMediaType *pType = NULL; if (SUCCEEDED(hr)) hr = pReader->GetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, &pType); if (SUCCEEDED(hr)) LogMediaType(pType); IMFMediaSink *pSink; IMFStreamSink *pStream; IMFGetService *pService; IMFVideoDisplayControl *pDisplayControl; IMFPresentationClock *pClock; hr = MFCreateVideoRenderer( __uuidof(IMFMediaSink), (void**)&pSink ); hr = pSink->AddStreamSink(1, pType, &pStream); hr = pSink->GetPresentationClock(&pClock); //Совсем не пойму что мне сделать с IMFPresentationClock hr = pSink->QueryInterface( __uuidof(IMFGetService), (void**)&pService ); hr = pService->GetService( MR_VIDEO_RENDER_SERVICE, __uuidof(IMFVideoDisplayControl), (void**)&pDisplayControl ); hr = pDisplayControl->SetVideoWindow(hWindow); IMFSample *pSample = NULL; size_t cSamples = 0; bool quit = false; time_t time1, time2; char *t1 = new char[26], *t2 = new char[26]; time(&time1); while (!quit) { DWORD streamIndex, flags; LONGLONG llTimeStamp; hr = pReader->ReadSample( MF_SOURCE_READER_FIRST_VIDEO_STREAM,// Stream index. 0, // Flags.&streamIndex, // Receives the actual stream index. &flags, // Receives status flags.&llTimeStamp, // Receives the time stamp.&pSample // Receives the sample or NULL. ); if (FAILED(hr)) { break; } if (flags & MF_SOURCE_READERF_ENDOFSTREAM) { quit = true; if (!pSample) break; } if (pSample) { ++cSamples; hr = pStream->ProcessSample(pSample); } SafeRelease(&pSample); } time(&time2); ctime_s(t1, 26, &time1); ctime_s(t2, 26, &time2); double sec = difftime(time1, time2); SafeRelease(&pSample); SafeRelease(&pType); return hr; }