2016-07-15 4 views
0

Будучи новичком в DS Мне нужен SampleGrabber, который может обрабатывать VIDEOINFOHEADER2, который IMediaDet не может.Образец DirectShowGrabber извлекает ошибочный образец

Итак, я взял SampleGrabber из образцов DX8.1, которые, в отличие от захватчиков, позволяют использовать все виды носителей. я использовал образец кода достаточно, как есть, и захватывая один единственный кадр все, кажется, работает хорошо: график построен без возврата errorcodes и т.д. Затем вызова

hr = pSeeking->SetPositions( 
     &Seek, 
     AM_SEEKING_AbsolutePositioning, 
     NULL, 
     AM_SEEKING_NoPositioning); 

с Seek = 2

обратного вызова называются:

HRESULT Обратного вызов (IMediaSample * pSample, REFERENCE_TIME * время_запуск, REFERENCE_TIME * конечный момент время, BOOL TypeChanged)

проблема с буфером: Он имеет нужный размер (GetSize() == 691200 = 3 байт * 640 * 320) , но его содержимое - все «205», которого не может быть (в каком формате когда-либо).

Подозрительные об этом: Параметры "Обратный звонок" являются время_запуска = 834168, 1251251 = конечным моментом и TypeChanged = 1.

Я попытался показывая график на GraphEdit https://msdn.microsoft.com/en-us/library/windows/desktop/dd390650%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 , но не был успешным ("приложение занят "из GraphEdit).

Где может быть проблема?

ответ

0

Нашел (наконец).

В обратном вызове я скопировал доставленный буфер с memcpy и запутанным источником и пунктом назначения. Очень неловко.

Спасибо за помощь. (Попробует удалить этот вопрос через несколько дней после того, как все прочтут, поскольку это очень ограниченное использование).

+0

Я ничего не знаю о DirectShow, кроме некоторых вопросов, как 20 лет назад. Единственное, что я увидел, это ключ 0xCD. Да, согласен, удаляю вопрос, поскольку он не имеет ничего общего с DirectShow. –

+0

Я буду. Но - еще раз указать - ваш намек был действительно полезен. Спасибо! :-) – nji9

1

В Windows память имеет различные шаблоны, которые помогают отлаживать неверные ссылки на память. 205 равен 0xCD в гексагоне, и это означает uninitialized heap memory. Таким образом, вы не получаете «ошибочные» данные, данные никогда не записываются.

Возможно, вам не удастся найти. Вы попробовали позвонить IsFormatSupported

+0

Да, где-то там должна быть проблема. GetTimeFormat возвращает TIME_FORMAT_MEDIA_TIME. IsFormatSupported, который возвращает false. Итак, я попробовал SetTimeFormat (TIME_FORMAT_FRAME) - который возвращает S_OK, , но IsFormatSupported все еще сообщает false. Пробовал SetTimeFormat (TIME_FORMAT_SAMPLE), затем возвращает E_FAIL. IsFormatSupported теперь сообщает, что все еще ложно, но - сядьте сейчас - , если я делаю GetTimeFormat раньше (говорит еще TIME_FORMAT_FRAME) , после чего IsFormatSupported сообщает true. Boing! CheckCapabilities после этого (зависит от установленного TimeFormat?) говорит ... (продолжение) – nji9

+0

(продолжение) ... говорит AM_SEEKING_CanSeekAbsolute. Я делаю это перед выполнением поиска (pSeeking-> SetPositions). Я подозреваю, что только это работает график? Ну, полностью запутано ... – nji9

+0

В еще одной попытке визуализировать построенный граф фильтров с помощью GraphEdit я снова включил AddRot-код из MSDN и чтобы сообщение «сервер занято» во время отладки моего приложения включал бесконечный цикл вокруг a :: Sleep (100) после построения графика перед командой Seek. Затем GraphEdit отвечает и показывает ... ничего ... пустого (красноватого) листа. Что все это значит? Разве фильтр не был построен вообще? Но на рабочем столе Windows появляется значок из LAV-кодека. Пожалуйста, помогите, я застрял. – nji9

Смежные вопросы