Устройство захвата отключается от пользовательского CTransInPlaceFilter при подключении к средству рендеринга в GraphEdiC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Устройство захвата отключается от пользовательского CTransInPlaceFilter при подключении к средству рендеринга в GraphEdi

Сообщение Anonymous »

Я создал специальный фильтр DirectShow CTransInPlace, предназначенный для репликации фильтра SampleGrabber и связанных с ним интерфейсов с поддержкой VIDEOINFOHEADER2, который называется SampleGrabber2. В настоящее время у меня настроены контакты таким образом, что если VIH2 присутствует, но не предоставлен, контакт будет запрещать любые типы мультимедиа VIH1. Если типов носителей VIH2 нет, будет использован первый предоставленный тип VIH1. После подключения в GraphEdit это работает, как и ожидалось, но когда я пытаюсь подключиться, наблюдается интересное поведение.
У меня на графике 4 фильтра DirectShow:
  • Фильтр захвата для веб-камеры, которая выводит только VIH1
  • Фильтр захвата для платы захвата (CB), которая выводит как VIH1, так и VIH2
  • SampleGrabber2
  • VMR9
Сначала я подключаю CB к SampleGrabber2 без ошибок. Это соединение правильно определяет приоритет VIH2. Затем я подключаю выход SampleGrabber2 к фильтру VMR9. Это действие отключает CB от SampleGrabber2, оставляя соединение между VMR9 и SampleGrabber2 нетронутым. После принудительного отключения я могу повторно подключить CB к SampleGrabber2 и запустить график в обычном режиме. Подключение веб-камеры к SampleGrabber2, а затем SampleGrabber2 к VMR9 не приводит к таким отключениям.
Вот соответствующий код согласования типа носителя. Как я могу провести плавное согласование и предотвратить эти отключения? Я предполагаю, что это как-то связано с согласованием распределителя, но пока мне не удалось это исправить.
HRESULT CSG2InPin::CheckMediaType(const CMediaType* pmt)
{
if (!pmt) return E_POINTER;

if (IsConnected()) {
const CMediaType& cur = CurrentMediaType();
return (*pmt == cur) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED;
}

// One-time probe: does the peer enumerate a VIH2 we would accept?
if (!m_peerHasVIH2Checked && m_spPeer) {
m_peerHasVIH2Checked = true;

CComPtr spEnum;
if (SUCCEEDED(m_spPeer->EnumMediaTypes(&spEnum)) && spEnum) {
AM_MEDIA_TYPE* pTry = nullptr;
while (spEnum->Next(1, &pTry, nullptr) == S_OK) {
CMediaType mt(*pTry);

if (mt.majortype == MEDIATYPE_Video &&
mt.formattype == FORMAT_VideoInfo2 &&
SUCCEEDED(m_pTransformFilter->CheckInputType(&mt))) {
m_peerHasVIH2 = true;
break;
}
}
}
}

// If the peer can do VIH2 and we’re currently being offered VIH1, decline it
// so the search advances to VIH2.
if (pmt->majortype == MEDIATYPE_Video &&
pmt->formattype == FORMAT_VideoInfo &&
m_peerHasVIH2) {
return VFW_E_TYPE_NOT_ACCEPTED; // “Prefer VIH2 if available”
}

// Otherwise, defer to the filter’s policy
return m_pTransformFilter->CheckInputType(pmt);
}

...

HRESULT CSampleGrabber2::CheckInputType(const CMediaType* mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video) ||
(mtIn->formattype != FORMAT_VideoInfo) &&
(mtIn->formattype != FORMAT_VideoInfo2))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}

currentFormat = (mtIn->formattype == FORMAT_VideoInfo2) ? VIH2 : VIH;
return S_OK;
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ting-to-re
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»