Всем привет!
Я бодался с DShow несколько дней и обнаружил, что Sample Grabber filter не поддерживает цветоразностные форматы (YV12 и т.п.) ...
Короче, вопрос: как культурно выдрать себе картинку в память, используя стандартные средства DX? Или придется фильтр писать/искать??? Нужна именно Y компонента.
Здравствуйте, Аноним, Вы писали:
А>Всем привет! А>Я бодался с DShow несколько дней и обнаружил, что Sample Grabber filter не поддерживает цветоразностные форматы (YV12 и т.п.) ... А>Короче, вопрос: как культурно выдрать себе картинку в память, используя стандартные средства DX? Или придется фильтр писать/искать??? Нужна именно Y компонента.
Да все он поддерживает. Опиши по-подробнее, откуда грабишь картинку, если с камеры, то убедись, что Capture Pin имеет в
списке поддерживаемых Media Types YV12 формат.
Re[2]: Sample Grabber + YUV формат????
От:
Аноним
Дата:
26.08.03 10:41
Оценка:
Здравствуйте, B_A_D, Вы писали:
B_A>Да все он поддерживает. Опиши по-подробнее, откуда грабишь картинку, если с камеры, то убедись, что Capture Pin имеет в B_A>списке поддерживаемых Media Types YV12 формат.
Грабим картинку с TV-тюнера. Дрова — WHQL, так что дело в SampleGrabber.
Я в GraphEdit пытался все делать. Pin имеет YV12 формат, и VideoRenderer его прекрасно рисует. Как только присоединяем SampleGrabber, так сразу начинаются вопли (ош. 0х80040217). Ставим RGB формат — соединяется на ура.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, B_A_D, Вы писали:
B_A>>Да все он поддерживает. Опиши по-подробнее, откуда грабишь картинку, если с камеры, то убедись, что Capture Pin имеет в B_A>>списке поддерживаемых Media Types YV12 формат.
А>Грабим картинку с TV-тюнера. Дрова — WHQL, так что дело в SampleGrabber.
А>Я в GraphEdit пытался все делать. Pin имеет YV12 формат, и VideoRenderer его прекрасно рисует. Как только присоединяем SampleGrabber, так сразу начинаются вопли (ош. 0х80040217). Ставим RGB формат — соединяется на ура.
А>Вообще, в MSDN сказано, it rejects any video type where the surface stride does not match the video width. Я вот ща пытаюсь понять, этот ли случай я имею???
А что на выходе SampleGrabberа у тебя подключено ? Не NullRenderer ?
И вообще , нарисуй схему твоего графа.
Re[4]: Sample Grabber + YUV формат????
От:
Аноним
Дата:
26.08.03 11:15
Оценка:
Здравствуйте, B_A_D, Вы писали:
B_A>А что на выходе SampleGrabberа у тебя подключено ? Не NullRenderer ? B_A>И вообще , нарисуй схему твоего графа
Граф: CrossBar->WDM Video Capture->SampleGrabber->NullRenderer
Соединяем слева направо по очереди; если пытаемся менять формат на YUV на пине WDM Capture после коннекта — пишет, что "This format is not currently available", если до — то не соединяется.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, B_A_D, Вы писали:
B_A>>А что на выходе SampleGrabberа у тебя подключено ? Не NullRenderer ? B_A>>И вообще , нарисуй схему твоего графа
А>Граф: CrossBar->WDM Video Capture->SampleGrabber->NullRenderer А>Соединяем слева направо по очереди; если пытаемся менять формат на YUV на пине WDM Capture после коннекта — пишет, что "This format is not currently available", если до — то не соединяется.
Ну, во первых, для изменения формата надо остановить граф и отDisconnect-ить capture out pin.
Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?
Да, и еще, если в RGB все "соединяется на ура", то почему его не поюзать ? Какие-то рассовые предрассудки или я что не понял ?
Здравствуйте, CyberDemon, Вы писали:
CD>Ну, во первых, для изменения формата надо остановить граф и отDisconnect-ить capture out pin.
Само собой, медиа формат пина задается до его(пина) подключения.
CD>Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а CD>Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?
Что, прямо так неподключенный в графе и болтается ? И при этом умудряется получать приходящие сэмплы ?
CD>Да, и еще, если в RGB все "соединяется на ура", то почему его не поюзать ? Какие-то рассовые предрассудки или я что не понял ?
Логично, только может он с двойной переконвертацией не хочет связываться.
Здравствуйте, B_A_D, Вы писали:
B_A>Само собой, медиа формат пина задается до его(пина) подключения.
Гмм... Действительно...
CD>>Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а CD>Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ? B_A>Что, прямо так неподключенный в графе и болтается ? И при этом умудряется получать приходящие сэмплы ?
CD>>Да, и еще, если в RGB все "соединяется на ура", то почему его не поюзать ? Какие-то рассовые предрассудки или я что не понял ? B_A>Логично, только может он с двойной переконвертацией не хочет связываться.
Именно так... Но, видимо, придется... Хотя нет: наверно я переведу камеру в ч.б. режим и буду в каждом канале иметь Y компоненту
Короче, трабл был прост и незатейлив: в формате изображения, оказывается, biHeight был отрицательным... А в MSDN сказано, что The filter does not support video types with top-down orientation (negative biHeight)...
Здравствуйте, B_A_D, Вы писали:
CD>>Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а CD>Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?
B_A>Что, прямо так неподключенный в графе и болтается ? И при этом умудряется получать приходящие сэмплы ?
Здравствуйте, CyberDemon, Вы писали:
CD>Вот таким образом SampleGrabber замечательно работает, будучи не включенным в цепочку фильтров, однако в графе он есть
Угу , а после всего этого в конце вызываешь что-то типа
И при рендеринге графа этот SampleGrabber подключается между Capture Device и Video Renderer.
Проверь после запуска графа, к чему подключены входной и выходной пины этого SampleGrabber.
Или все-таки они из воздуха информацию черпают...
Здравствуйте, B_A_D, Вы писали:
B_A>Здравствуйте, CyberDemon, Вы писали:
B_A>Угу , а после всего этого в конце вызываешь что-то типа
B_A>И при рендеринге графа этот SampleGrabber подключается между Capture Device и Video Renderer. B_A>Проверь после запуска графа, к чему подключены входной и выходной пины этого SampleGrabber. B_A>Или все-таки они из воздуха информацию черпают...
Ну, во-первых, ICaptureGraphBuilder2 я не создаю, все делается через IGraphBuilder.
Во-вторых, понятное дело, RenderStream не вызывается, а просто делается запуск графа — Run().
Ну и в третьих, есть такая утилитка GraphEdit, в ней можно прицепиться к удаленному графу. (Справедливости ради надо сказать, что к своему я прицепиться не смог ). Так вот, есть у меня программа одна, которая капчурит видео. Структура проста и там тоже используется SampleGrabber. Каково же было мое удивление, когда я увидел, что он в графе есть, но ни с чем явно не соединен !!! После этого я у себя попробовал туже ерунду — выход девайса зацепил на вход рендера и система продолжала работать — граббер получал свой "паек" так же, как и раньше...
Вот такие вот дела. Знаете ли, практика иногда преподносит сюрпризы
Здравствуйте, CyberDemon, Вы писали:
CD>Ну и в третьих, есть такая утилитка GraphEdit, в ней можно прицепиться к удаленному графу. (Справедливости ради надо сказать, что к своему я прицепиться не смог ).
CD>Ну, во-первых, ICaptureGraphBuilder2 я не создаю, все делается через IGraphBuilder. CD>Во-вторых, понятное дело, RenderStream не вызывается, а просто делается запуск графа — Run().
Блин, совсем забыл! Предлагаю вам вынести ваш код в студию А мы его заценим
Здравствуйте, Edge, Вы писали:
E>Здравствуйте, CyberDemon, Вы писали:
CD>>Ну, во-первых, ICaptureGraphBuilder2 я не создаю, все делается через IGraphBuilder. CD>>Во-вторых, понятное дело, RenderStream не вызывается, а просто делается запуск графа — Run().
E>Блин, совсем забыл! Предлагаю вам вынести ваш код в студию А мы его заценим
Часть его я уже вынес. Вторую сегодня вечерком — он у меня дома, а добуквенно я его по памяти не помню
Спасибо за ссылочку
E>Хмм... Ща проверим... Не верю я этому.
Выходы и входы SampleGrabber-а не проверял — только по исходным текстам и показаниям GraphEdit-а... может, он врет все ?
Че-то странное... По идее, на вызов GetCurrentBuffer нам должно вываливаться VFW_E_NOT_CONNECTED, если мы не присоединили граф. Но мне вываливается VFW_E_WRONG_STATE Граф находится в состоянии Run.
Пишем так:
Добавляем все нужные фильтры в граф.
Затем соединяем все это хозяйство:
CD>/* CD> * CD> * Как оказывается, работает все без далее закомментареного блока... CD> * CD> */
CD> // find pins & connect them CD> ASSERT(pCap); CD> IPin * pCapOut = GetOutPin(pCap, 0); CD>/* IPin * pGrabIn = GetInPin (pGrabBase, 0); CD> hr = pGraph->Connect(pCapOut, pGrabIn); CD> if (FAILED(hr)) CD> return hr;
CD> // get preview window CD> IPin *pGrabOut = GetOutPin(pGrabBase, 0); CD> hr = pGraph->Render(pGrabOut); CD> if (FAILED(hr)) CD> return hr; CD>*/
CD> hr = pGraph->Render(pCapOut); // это замена предыдущего блока...
CD>[...skipped...]
CD> m_Grabber->SetBufferSamples(false); CD> m_Grabber->SetOneShot(false); CD> m_Grabber->SetCallback( this, 1 );
CD> return hr; CD>} CD>[/ccode]
CD>Так вот, метод BufferCB исправно получает данные
CD>Да, кстати, pCap — это IBaseFilter, получается путем enum-ерации video capture device-ов.
Логично , вот именно то , что и требовалось, вместо ручного соединения пинов
они соединяются автоматом:
hr = pGraph->Render(pCapOut); // это замена предыдущего блока...
Если теперь провести небольшой тест
IPin *pGrabOut = GetOutPin(pGrabBase, 0);
IPin *pGrabIn = GetInPin(pGrabBase, 0);
IPin *pPinIn,*pPinOut;
pGrabOut->ConnectedTo(&pPinOut); //<--- вот здесь проверь,
pGrabIn->ConnectedTo(&pPinIn); //<--- к чему он подключен и все станет ясно
то выяснится, к чему этот граббер подключается при рендеринге.
А чтоб в воздухе висел ......