Отслеживание источника E_POINTER в IMFMediaSource :: ReadSample - PullRequest
1 голос
/ 09 мая 2011

Я получаю ошибку 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 Ответ

1 голос
/ 09 мая 2011

Вам не нужно pin_ptr при получении адреса локальной переменной, так как сборщик мусора никогда не перемещает локальные переменные в любом случае.

Я думаю, что один из трех других параметров вы 'передача значения NULL не является обязательной, но мне нужно знать, какую функцию вы вызываете, чтобы знать наверняка.

Вы создали IMFSourceReader в синхронном или асинхронном режиме?Документы говорят:

Этот метод может выполняться синхронно или асинхронно.Если вы предоставляете указатель обратного вызова при создании программы чтения исходного кода, метод является асинхронным.В противном случае метод является синхронным.

Я думаю, что это ваша проблема:

В синхронном режиме:

  • Параметры pdwStreamFlags и ppSampleне может быть NULL.В противном случае метод возвращает E_POINTER.

Вы передали NULL для pdwStreamFlags, что недопустимо.

Ссылка на документ: http://msdn.microsoft.com/en-us/library/dd374665.aspx

...