Отслеживание источника 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

Другие вопросы по тегам