Отслеживание источника E_POINTER в IMFMediaSource::ReadSample

#com #c -cli #ms-media-foundation

#com #c -cli #ms-media-foundation

Вопрос:

Я получаю ошибку E_POINTER от вызова ReadSample, и, насколько я могу судить, ни один из указателей не является недопустимым. Смотрите фрагмент ниже (обратите внимание, это приложение на C / CLI):

 IMFSample* sample = NULL;
pin_ptr<IMFSample*> pinnedSample = amp;sample;

LONGLONG timeStamp;

HRESULT hr = mSourceReader->ReadSample(
    (DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
    0,
    NULL,
    NULL,
    amp;timeStamp,
    pinnedSample
    );
  

Я подозреваю, что проблема заключается в создании mSourceReader (экземпляр IMFSourceReader, созданный из IMFMediaSource). Но, увы, я понятия не имею, как вернуться назад и найти источник, поскольку все COM-вызовы в цепочке команд, которые создали mSourceReader, возвращали S_OK .

Большое спасибо за любые советы.

Комментарии:

1. ReadSample не является частью IMFMediaSource интерфейса . Какой тип mSourceReader на самом деле?

Ответ №1:

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

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

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

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

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

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

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

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

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

Комментарии:

1. Вы были правы. Я заполнил остальные параметры (хотя я их не использовал), и это решило проблему. Я думаю, у меня вошло в привычку, что если они вам не нужны, вы можете передать их как null семейство API. Моя ошибка : (