Как отправить IMFSample в EVR Media Sink

Я хочу использовать автономный EVR, но мне не удалось отправить на него IMFSample. список кодов ниже,

//create the video render 
IMFActivate* pActive = NULL;
hr = MFCreateVideoRendererActivate(m_hWnd, &pActive);
CHECK_HR(hr);
hr = pActive->ActivateObject(IID_IMFMediaSink,(void**)&m_pVideoSink) ;
CHECK_HR(hr);
hr = m_pVideoSink->GetStreamSinkByIndex(0,&m_pVideoStreamSink) ;
CHECK_HR(hr);

//on Sample ready from a custom mft
hr = m_pVideoStreamSink->ProcessSample(pSample) ;

затем я получил ошибку E_NOTIMPL. После нескольких часов борьбы я реализовал IMFVideoSampleAllocator:

//get IMFVideoSampleAllocator service
hr =    MFGetService(m_pVideoStreamSink,MR_VIDEO_ACCELERATION_SERVICE,IID_PPV_ARGS(&m_pAllocator)) ;
    CHECK_HR(hr);

//init IMFVideoSampleAllocator,pType is the negotiated type 
hr = m_pAllocator->InitializeSampleAllocator(20,pType) ;

//On sample ready,pSample is the IMFSample from mft
IMFSample* pVideoSample = NULL ;
IMFMediaBuffer* pBuffer = NULL ;
LONGLONG hnsTimeStamp = 0 ;

//copy sample data from pSample to pVideoSample
CHECK_HR(hr = m_pAllocator->AllocateSample(&pVideoSample)) ;
CHECK_HR(hr = pSample->GetSampleTime(&hnsTimeStamp)) ;
CHECK_HR(hr = pVideoSample->SetSampleTime(hnsTimeStamp)) ;
CHECK_HR(hr = pSample->GetBufferByIndex(0,&pBuffer)) ;
CHECK_HR(hr = pVideoSample->AddBuffer(pBuffer)) ;

hr = m_pVideoStreamSink->ProcessSample(pVideoSample) ;

теперь все работает отлично, но у меня только черный экран без нарисованного на нем изображения фильма!

кроме того, я добавил SAR в свой код, и это сработало очень хорошо.

любая помощь, спасибо!


person user2118486    schedule 21.07.2014    source источник


Ответы (2)


Может быть, немного поздно отвечать на ваш вопрос, но в любом случае... У меня была похожая ситуация, и я решил ее с помощью Stream Reader, настроенного с помощью MF_SOURCE_READER_D3D_MANAGER. Я взял IDirect3DDeviceManager9 из Stream Sink так же, как вы взяли распределитель: hr = MFGetService(m_pVideoStreamSink,MR_VIDEO_ACCELERATION_SERVICE,IID_PPV_ARGS(&pD3DManager);

и установите его как IUnknown для атрибута MF_SOURCE_READER_D3D_MANAGER выше.

Если вы не можете использовать IMFSourceReader, возможно, вам будет полезна эта ссылка: https://code.google.com/p/webrtc4all/source/browse/trunk/gotham/MFT_WebRTC4All/test/test_evr.cc?r=15

person VuVirt    schedule 07.07.2015

Когда pVideoSample выделен, у него уже есть буфер для вашего использования; вам не нужно добавлять какие-либо другие буферы. В вашем случае я предполагаю, что первоначально выделенный буфер использовался для рендеринга вывода - в этом случае он пуст, и, следовательно, нет изображения.

person rcky    schedule 07.12.2018
comment
Всегда приятно предоставить небольшую демонстрацию; а не просто описание. Это может помочь другим лучше понять. - person Mahib; 07.12.2018