Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема directshow |
Автор: vdm 15.2.2008, 18:49 |
хочу воспользеватся интерфейсом, но при присваивании графу, указатель не инициализируется, почему? hr = m_pGraph->QueryInterface(IID_IAMCameraControl, (void **)&pAMCameraControl); pAMCameraControl = 0x00000000 в чём дело? Может нужно какой нибудь фильтр вызвать перед этим? |
Автор: Greeen 16.2.2008, 17:41 |
IAMCameraControl интерфейс нужно запрашивать не у графа, а у фильтра - источника, т.е. у фильтра твоего захватываемого девайса. |
Автор: vdm 16.2.2008, 18:11 |
//Вот фильтр: hr = AddFilterByName(m_pGraph, m_ChipNames[i], CLSID_VideoInputDeviceCategory, &pFilter); //pFilter получил значение hr = pFilter->QueryInterface(IID_IAMAnalogVideoDecoder, (void**)&pAMAnalogVideoDecoder); hr = pAMAnalogVideoDecoder->put_TVFormat(AnalogVideo_PAL_B); //Здесь, пока всё нормально, при запуске устанавливает PAL_B hr = pFilter->QueryInterface(IID_IAMVideoControl, (void**)&pAMVideoControl); //Уже здесь при включеном дебугере фиксирую, что переменная pAMVideoControl не //инициализирована (0x00000000), дальше кидает ошибку directshow конструктора... В чём дело? ![]() |
Автор: Greeen 16.2.2008, 18:20 |
А ты уверен что фильтр поддерживает данный интерфейс? У тебя ведь тв-тюнер? |
Автор: vdm 16.2.2008, 18:35 | ||
Ты задал очень хороший вопрос ![]() У меня "Video Capture from camera" тюнер. То-есть поддерживает подключение нескольких камер и передают захваченое изображение. Я не уверен поддерживает ли он этот интерфейс, но и не знаю, как проверить... Может ты знаешь? |
Автор: Greeen 16.2.2008, 20:33 |
Посмотри что возвращает QueryInterface. Повторюсь, скорее всего фильтр не поддерживает данный интерфейс. Прочитав некоторые твои посты, я догадываюсь что тебя заинтересовала настройка CameraControl_Roll, т.е. ты хочешь повернуть изображение. Так? |
Автор: vdm 16.2.2008, 22:42 |
Да, Ты прав. Именно это меня и интересует. А как можно узнать, поддерживает ли фильтр тот или инной интерфейс? И как правельно посмотреть, что возвращает QueryInterface? |
Автор: Greeen 16.2.2008, 22:57 |
Проверь результат QueryInterface на равенство E_NOINTERFACE. Посмотри интерфейс IVMRMixerControl (особенно его метод SetOutputRect). Запросить его можно у рендерера (VMR). |
Автор: vdm 17.2.2008, 00:08 |
![]() До этого я выводил через простой Video Renderer, если поменяю выход на Video Mixer Renderer, неполадок быть не должно? |
Автор: vdm 17.2.2008, 00:23 |
Описание: The SetOutputRect method sets the position of this stream within the composition rectangle. При чём здесь SetOutputRect? На сколько я понял он выстанавливает позицию окна в которой будет видео поток. Когда мне нужно повернуть изображение на 90 градусов. |
Автор: Greeen 17.2.2008, 00:49 | ||
А ты посмотри статью "Positioning and Moving Video Rectangles in Composition Space" и сразу станет ясно... ![]() Возможности проверить нет, но как то так:
Не забудь для VMR указать число потоков (IVMRFilterConfig::SetNumberOfStreams) = 1. |
Автор: vdm 17.2.2008, 01:03 |
Как у тебя только терпения хватает со мной возиться... ![]() "Не забудь для VMR указать число потоков (IVMRFilterConfig::SetNumberOfStreams) = 1." А зачем? получается мне придётся ещё один интерфейс вызывать (IVMRFilterConfig) Число потоков это Pin 'ы Функция просит DWORD значение. На сколько я понял надо получить количество Pin'ов выводимое VMR renderer'ом? Как это сделать и обязательно ли это? ![]() |
Автор: Greeen 17.2.2008, 12:09 | ||||
A value of 1 is valid for dwMaxStreams. This value does not cause any extra pins to be created, but it does force the VMR to go into "mixer mode."
А что, трудно интерфейс получить? ![]()
Зачем?! Если не будешь микшировать потоки просто поставишь 1 для числа потоков и тебе для этого совершенно не нужно знать сколько их было до тебя! |
Автор: vdm 17.2.2008, 16:38 |
Привет. А ты уверен, что после вызова интерфейса, IVMRFilterConfig::SetNumberOfStreams(1) это прокатит? Ведь функция ждёт DWORD значения.. |
Автор: Greeen 17.2.2008, 17:06 |
![]() |
Автор: vdm 17.2.2008, 18:16 |
Во вторник у меня будет возможность опробовать наговореное. ![]() ![]() |
Автор: Greeen 17.2.2008, 18:34 |
На данный момент - пожалуйста ![]() |
Автор: vdm 19.2.2008, 09:38 |
Привет. Вызвал фильтр. hr = AddFilterByCLSID(m_pGraph, CLSID_VideoMixingRenderer, L"Video Renderer", &pNullRendererFilter); Вызвал интерфейс. hr = pNullRendererFilter->QueryInterface(IID_IVMRFilterConfig, (void**)&pIVMRFilterConfig); Установил значение. pIVMRFilterConfig->SetNumberOfStreams(1); До этого места всё шло хорошо, пока не добрался до сюда. Но pIVMRFilterConfig->SetNumberOfStreams(1); возвращает значение 0 почему? hr = pNullRendererFilter->QueryInterface(IID_IVMRMixerControl, (void**)&pIVMRMixerControl); Здесь pIVMRMixerControl не получает никакого значения... В чём может быть дело? К даполнению, я соединяю pFilter с pNullRendererFilter через KGTee фильтр. |
Автор: Greeen 19.2.2008, 12:46 | ||||||
QueryInterface что возвращает? |
Автор: vdm 19.2.2008, 13:05 |
hr = pNullRendererFilter->QueryInterface(IID_IVMRFilterConfig, (void**)&pIVMRFilterConfig); if(FAILED(hr)) { return hr; } Возвращает: S_OK hr = pIVMRFilterConfig->SetNumberOfStreams(1); Возвращает: -2147220877 hr = pNullRendererFilter->QueryInterface(IID_IVMRMixerControl, (void**)&pIVMRMixerControl); if(FAILED(hr)) { return hr; } Пишит, что FAILED.... E_NOINTERFACE но как такое может быть, если VMR поддерживает IVMRMixerControl? Что может на это влиять? Надеюсь видео карта здесь не при чём... |
Автор: Greeen 19.2.2008, 14:33 | ||||
Попробуй вместо
вот так
|
Автор: vdm 19.2.2008, 14:45 | ||||||
Эфект тот-же... Есть идеи почему? |
Автор: Greeen 19.2.2008, 15:39 |
vdm, хм... уже хз пахнет ![]() |
Автор: vdm 19.2.2008, 19:54 | ||
Ты прав, запах уже неочень ![]() ![]() |
Автор: Greeen 19.2.2008, 22:35 |
Так, давай по пунктам: 1. Создаешь фильтр VMR. В результате у тебя IBaseFilter * на фильтр рендерера. 2. Добавляешь его в граф. 3. Запрашиваешь интерфейс IVMRFilterConfig и вызываешь SetNumberOfStreams(1). Освобождаешь интерфейс. 4. Коннектишь пины. Запускаешь граф. 5. Запрашиваешь интерфейс IVMRMixerControl и делаешь что там тебе нужно. Освобождаешь интерфейс. |
Автор: vdm 19.2.2008, 23:14 | ||
Вот это прикол. Дома создаёт hr = pIVMRFilterConfig->SetNumberOfStreams(1);. Дальше проверить не могу. Завтро всё заново испробую на месте. Дома нету железа... Утричком напишу. ![]() ![]() |
Автор: vdm 20.2.2008, 10:38 |
Да ты прав, по ходу рендер у меня используется, потому и не могу присвоить hr = pIVMRFilterConfig->SetNumberOfStreams(1); Как его сбросить? ![]() |
Автор: Greeen 20.2.2008, 12:57 |
Не понял ![]() Попробуй GraphEdit'ом построить нужный граф, настройки фильтров подергать. |
Автор: vdm 20.2.2008, 13:05 |
http://entrymsg.narod.ru/graph.JPG Вот такой получился граф. А какие там настройки подёргать? ![]() Снова не даёт присвоить hr = pIVMRFilterConfig->SetNumberOfStreams(1); :\ |
Автор: Greeen 20.2.2008, 13:33 |
ОК, хрен с ней с единицей. Попробуй поставить число потоков MAX_MIXER_STREAMS. |
Автор: vdm 20.2.2008, 14:56 |
hr = pIVMRFilterConfig->SetNumberOfStreams(MAX_MIXER_STREAMS); error C2065: 'MAX_MIXER_STREAMS' : undeclared identifier ![]() |
Автор: vdm 20.2.2008, 15:33 |
Может быть проблема из за видео карты? Дома с Radeon9800pro норма, здесь с GeForce MX 4000 не идёт. Хотя, не знаю влияет ли это. Интересно, что hresult возвращает ошибку: -2147220877 что за она? ![]() Беру железо домой, там вроде бы эта беда отсутствует. Проверю. |
Автор: vdm 20.2.2008, 22:32 |
А что может быть, когда при попытке соединить два фильтра, даже при дебугере тупо всё сбрасывается и можно запускать заново? hr = ConnectFilters(m_pGraph, pKGTeeFilter, pNullRendererFilter); Эти фильтры. |
Автор: vdm 21.2.2008, 09:31 |
Послушай, Грин ![]() |
Автор: Greeen 21.2.2008, 13:56 | ||
Это делает фильтр VMR, а как он это делает я не знаю... Этого и не нужно знать, это проблемы фильтра. |
Автор: vdm 21.2.2008, 14:31 | ||||
И всё бы ничего, если бы не то, что в итоге мне всё равно нужно сделать так, чтовы флип делал Video Capture фильтр а не рендерер. Свой фильтр возможно написать, чтобы его поставить между Video Capture и Video Renderer? Вообще, возможно ли узнать список всех поддерживаемых интерфейсов данным фильтром? Как это сделать? Писать изготовителю тюнера? |
Автор: Greeen 22.2.2008, 01:17 | ||||
можно
Посмотри http://pctuner.ru/page-id-1109-a-dl.html. Кажется он это умеет. |
Автор: vdm 25.2.2008, 13:23 |
Почему не получалось: В Windows 2003 server Hardware aceleration стоит на минимуме - поставил на максимум - заработало! Но как не стараюс, флип идёт только горизонтально или вертикально, но в любом случае 180 градусов. Может есть идеи, как сотварить чудо и сделать rotate на 90 градусов? ![]() NORMALIZEDRECT rect1; NORMALIZEDRECT rect; pNullRendererFilter->QueryInterface(IID_IVMRMixerControl, (void**)&pIVMRMixerControl); pIVMRMixerControl->GetOutputRect(0,&rect1); rect.bottom = rect1.bottom; rect.top = rect1.top; rect.right = rect1.left; rect.left = rect1.right; pIVMRMixerControl->SetOutputRect(0,&rect); if (NULL != pIVMRMixerControl) pIVMRMixerControl->Release(); А если хочу на 90 градусов, пишу: rect.bottom = rect1.left; rect.top = rect1.right; rect.right = rect1.bottom; rect.left = rect1.top; Но как не кручю, изображение на 90 не поворачивается... только 180? ![]() И ещё вопрос. Почему, когда оприделяю VideoMixingRenderer9 фильтра указатели интерфейсов: IVMRFilterConfig9 *pIVMRFilterConfig = NULL; IVMRMixerControl9 *pIVMRMixerControl = NULL; IVMRFilterConfig9 и IVMRMixerControl9 не оприделяет как интерфейсы? |
Автор: vdm 26.2.2008, 09:50 |
Выяснил, помогло: #include "D3d9.h" #include "Vmr9.h" Закоментировал: //#include "qedit.h" |