#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. Моя ошибка : (