Отслеживание источника E_POINTER в IMFMediaSource::ReadSample
Я получаю ошибку E_POINTER от вызова ReadSample, и, насколько я могу судить, ни один из указателей недействителен. Смотрите фрагмент ниже (обратите внимание, это приложение на C++/CLI):
IMFSample* sample = NULL;
pin_ptr<IMFSample*> pinnedSample = &sample;
LONGLONG timeStamp;
HRESULT hr = mSourceReader->ReadSample(
(DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
0,
NULL,
NULL,
&timeStamp,
pinnedSample
);
Я подозреваю, что проблема заключается в создании mSourceReader (экземпляр IMFSourceReader, созданный из IMFMediaSource). Но, увы, я не знаю, как отследить и найти источник, так как все COM-вызовы в цепочке команд, которые создали mSourceReader, возвращали S_OK.
Большое спасибо за любые советы.
1 ответ
Вам не нужно pin_ptr
когда берется адрес локальной переменной, так как сборщик мусора никогда не перемещает локальные переменные в любом случае.
Я предполагаю, что один из трех других параметров, которым вы передаете NULL, не является обязательным, но мне нужно знать, какую функцию вы вызываете, чтобы знать наверняка.
Вы создали IMFSourceReader
в синхронном или асинхронном режиме? Документы говорят:
Этот метод может выполняться синхронно или асинхронно. Если вы предоставляете указатель обратного вызова при создании программы чтения исходного кода, метод является асинхронным. В противном случае метод является синхронным.
Я думаю, что это ваша проблема
В синхронном режиме:
- Параметры pdwStreamFlags и ppSample не могут быть NULL. В противном случае метод возвращает E_POINTER.
Вы прошли NULL для pdwStreamFlags
, что не допускается.
Ссылка на документ: http://msdn.microsoft.com/en-us/library/dd374665.aspx