Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 конструктора...

В чём дело? smile






Автор: Greeen 16.2.2008, 18:20
А ты уверен что фильтр поддерживает данный интерфейс? У тебя ведь тв-тюнер?

Автор: vdm 16.2.2008, 18:35
Цитата(Greeen @ 16.2.2008,  18:20)
А ты уверен что фильтр поддерживает данный интерфейс? У тебя ведь тв-тюнер?

Ты задал очень хороший вопрос smile 

У меня "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
Цитата(vdm @  16.2.2008,  22:42 Найти цитируемый пост)
А как можно узнать, поддерживает ли фильтр тот или инной интерфейс?

Проверь результат QueryInterface на равенство E_NOINTERFACE.

Цитата(vdm @  16.2.2008,  22:42 Найти цитируемый пост)
Именно это меня и интересует

Посмотри интерфейс IVMRMixerControl (особенно его метод SetOutputRect). Запросить его можно у рендерера (VMR).

Автор: vdm 17.2.2008, 00:08
smile Так а при чём здесь IVMRMixerControl, когда перед этим ты упомянул CameraControl_Roll который принадлежит IAMCameraControl интерфейсу.

До этого я выводил через простой Video Renderer, если поменяю выход на Video Mixer Renderer, неполадок быть не должно?

Автор: Greeen 17.2.2008, 00:18
Цитата(vdm @  17.2.2008,  00:08 Найти цитируемый пост)
неполадок быть не должно

нет, проблем не будет..

Цитата(vdm @  17.2.2008,  00:08 Найти цитируемый пост)
Так а при чём здесь IVMRMixerControl, когда перед этим ты упомянул CameraControl_Roll который принадлежит IAMCameraControl интерфейсу.

ты же убедился что фильтр твоего девайса не поддерживает IAMCameraControl...

Автор: 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" и сразу станет ясно...  smile 
Возможности проверить нет, но как то так:
Код

NORMALIZEDRECT rect;
rect.left = 1.0;
rect.top = 0.0;
rect.right = 0.0;
rect.bottom = 1.0;
SetOutputRect(0, &rect);

Не забудь для VMR указать число потоков (IVMRFilterConfig::SetNumberOfStreams) = 1.

Автор: vdm 17.2.2008, 01:03
Как у тебя только терпения хватает со мной возиться... smile

"Не забудь для VMR указать число потоков (IVMRFilterConfig::SetNumberOfStreams) = 1."

А зачем? получается мне придётся ещё один интерфейс вызывать (IVMRFilterConfig)    Число потоков это Pin 'ы Функция просит DWORD значение. На сколько я понял надо получить количество Pin'ов выводимое VMR renderer'ом? Как это сделать и обязательно ли это? smile


Автор: Greeen 17.2.2008, 12:09
Цитата(vdm @  17.2.2008,  01:03 Найти цитируемый пост)
А зачем? 

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."

Цитата(vdm @  17.2.2008,  01:03 Найти цитируемый пост)
получается мне придётся ещё один интерфейс вызывать (IVMRFilterConfig) 

А что, трудно интерфейс получить?  smile 

Цитата(vdm @  17.2.2008,  01:03 Найти цитируемый пост)
На сколько я понял надо получить количество Pin'ов выводимое VMR renderer'ом?

Зачем?! Если не будешь микшировать потоки просто поставишь 1 для числа потоков и тебе для этого совершенно не нужно знать сколько их было до тебя!

Автор: vdm 17.2.2008, 16:38
Привет. А ты уверен, что после вызова интерфейса, IVMRFilterConfig::SetNumberOfStreams(1) это прокатит? Ведь функция ждёт DWORD значения..

Автор: Greeen 17.2.2008, 17:06
 smile А 1 - это не DWORD?

Автор: vdm 17.2.2008, 18:16
Во вторник у меня будет возможность опробовать наговореное. smile Извесчу тебя о результатах. На данный момент, спасибо.  smile 

Автор: Greeen 17.2.2008, 18:34
На данный момент - пожалуйста  smile 

Автор: 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
Цитата(vdm @  19.2.2008,  09:38 Найти цитируемый пост)
Но pIVMRFilterConfig->SetNumberOfStreams(1); возвращает значение 0 почему?

Код
#define     S_OK     ((HRESULT)0x00000000L)

Цитата(vdm @  19.2.2008,  09:38 Найти цитируемый пост)
Здесь pIVMRMixerControl не получает никакого значения... В чём может быть дело?

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
Попробуй вместо
Код

hr = AddFilterByCLSID(m_pGraph, CLSID_VideoMixingRenderer, L"Video Renderer", &pNullRendererFilter);

вот так
Код

hr = AddFilterByCLSID(m_pGraph, CLSID_VideoRendererDefault, L"Video Renderer", &pNullRendererFilter);

Автор: vdm 19.2.2008, 14:45
Цитата(Greeen @ 19.2.2008,  14:33)
Попробуй вместо
Код

hr = AddFilterByCLSID(m_pGraph, CLSID_VideoMixingRenderer, L"Video Renderer", &pNullRendererFilter);

вот так
Код

hr = AddFilterByCLSID(m_pGraph, CLSID_VideoRendererDefault, L"Video Renderer", &pNullRendererFilter);

Эфект тот-же... Есть идеи почему?

Автор: Greeen 19.2.2008, 15:39
vdm, хм... уже хз пахнет  smile у тебя рендерер ни к чему не подключен случайно к моменту вызова SetNumberOfStreams?

Автор: vdm 19.2.2008, 19:54
Цитата(Greeen @ 19.2.2008,  15:39)
vdm, хм... уже хз пахнет  smile у тебя рендерер ни к чему не подключен случайно к моменту вызова SetNumberOfStreams?

Ты прав, запах уже неочень smile Не подключен ли рендер в тот момент? Да нет, ничего не запусчено, только Visual c++ и в нёв я тружусь. А может есть возможность проверить, запусчен ли рендер в тот момент? Блин дурдом какой-то... Рендер по идеи не запусчен, так-как я его сперва вызываю, потом кидаю в m_pgraph, потом вызываю интерфейсы, а в конце соединяю pFilter c KGTee и KGTee c VMR rendererom, потом grpah run()... а в конце release всех указателей. Коротко это звучит - очередная головная боль smile

Автор: Greeen 19.2.2008, 22:35
Так, давай по пунктам:
1. Создаешь фильтр VMR. В результате у тебя IBaseFilter * на фильтр рендерера.
2. Добавляешь его в граф.
3. Запрашиваешь интерфейс IVMRFilterConfig и вызываешь SetNumberOfStreams(1). Освобождаешь интерфейс.
4. Коннектишь пины. Запускаешь граф.
5. Запрашиваешь интерфейс IVMRMixerControl и делаешь что там тебе нужно. Освобождаешь интерфейс.

Автор: vdm 19.2.2008, 23:14
Цитата(Greeen @ 19.2.2008,  22:35)
Так, давай по пунктам:
1. Создаешь фильтр VMR. В результате у тебя IBaseFilter * на фильтр рендерера.
2. Добавляешь его в граф.
3. Запрашиваешь интерфейс IVMRFilterConfig и вызываешь SetNumberOfStreams(1). Освобождаешь интерфейс.
4. Коннектишь пины. Запускаешь граф.
5. Запрашиваешь интерфейс IVMRMixerControl и делаешь что там тебе нужно. Освобождаешь интерфейс.

Вот это прикол. Дома создаёт hr = pIVMRFilterConfig->SetNumberOfStreams(1);.
Дальше проверить не могу. Завтро всё заново испробую на месте. Дома нету железа...
 Утричком напишу. smile  smile 

Автор: vdm 20.2.2008, 10:38
Да ты прав, по ходу рендер у меня используется, потому и не могу присвоить 
hr = pIVMRFilterConfig->SetNumberOfStreams(1); 
Как его сбросить? smile

Автор: Greeen 20.2.2008, 12:57
Цитата(vdm @  20.2.2008,  10:38 Найти цитируемый пост)
Как его сбросить?

Не понял  smile 
Попробуй GraphEdit'ом построить нужный граф, настройки фильтров подергать.

Автор: vdm 20.2.2008, 13:05
http://entrymsg.narod.ru/graph.JPG Вот такой получился граф. А какие там настройки подёргать? smile 
Снова не даёт присвоить 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

 smile 

Автор: vdm 20.2.2008, 15:33
Может быть проблема из за видео карты?
Дома с Radeon9800pro норма, здесь с GeForce MX 4000 не идёт. Хотя, не знаю влияет ли это.
Интересно, что hresult возвращает ошибку: -2147220877 что за она? smile
Беру железо домой, там вроде бы эта беда отсутствует. Проверю.

Автор: vdm 20.2.2008, 22:32
А что может быть, когда при попытке соединить два фильтра, даже при дебугере тупо всё сбрасывается и можно запускать заново?

                hr = ConnectFilters(m_pGraph, pKGTeeFilter, pNullRendererFilter);
Эти фильтры.

Автор: vdm 21.2.2008, 09:31
Послушай, Грин smile VideoMixingRenderer - с помощью его вызваный интерфейс поможет мне повернуть изображение. А чья именно будет эта работа? Видео карты или моего тюнера? Я к чему виду, моя задача поревернуть изображение без каких либо усилий видео карты, чтобы небыло несастыковок с другими картами. На счёт того что VideoMixingRenderer FLIP делает сама видео карта, я прав?

Автор: Greeen 21.2.2008, 13:56
Цитата(vdm @  21.2.2008,  09:31 Найти цитируемый пост)
На счёт того что VideoMixingRenderer FLIP делает сама видео карта, я прав?

Это делает фильтр VMR, а как он это делает я не знаю... Этого и не нужно знать, это проблемы фильтра.

Автор: vdm 21.2.2008, 14:31
Цитата(Greeen @ 21.2.2008,  13:56)
Цитата(vdm @  21.2.2008,  09:31 Найти цитируемый пост)
На счёт того что VideoMixingRenderer FLIP делает сама видео карта, я прав?

Это делает фильтр VMR, а как он это делает я не знаю... Этого и не нужно знать, это проблемы фильтра.

И всё бы ничего, если бы не то, что в итоге мне всё равно нужно сделать так, чтовы флип делал Video Capture фильтр а не рендерер. Свой фильтр возможно написать, чтобы его поставить между Video Capture и Video Renderer? Вообще, возможно ли узнать список всех поддерживаемых интерфейсов данным фильтром? Как это сделать? Писать изготовителю тюнера?

Автор: Greeen 22.2.2008, 01:17
Цитата(vdm @  21.2.2008,  14:31 Найти цитируемый пост)
Свой фильтр возможно написать, чтобы его поставить между Video Capture и Video Renderer?

можно

Цитата(vdm @  21.2.2008,  14:31 Найти цитируемый пост)
Вообще, возможно ли узнать список всех поддерживаемых интерфейсов данным фильтром? Как это сделать?

Посмотри http://pctuner.ru/page-id-1109-a-dl.html. Кажется он это умеет.

Автор: vdm 25.2.2008, 13:23
Почему не получалось: В Windows 2003 server Hardware aceleration стоит на минимуме - поставил на максимум - заработало! Но как не стараюс, флип идёт только горизонтально или вертикально, но в любом случае 180 градусов. Может есть идеи, как сотварить чудо и сделать rotate на 90 градусов? smile Вот как я делаю: 

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? smile

И ещё вопрос. Почему, когда оприделяю VideoMixingRenderer9 фильтра указатели интерфейсов:

IVMRFilterConfig9 *pIVMRFilterConfig = NULL;
IVMRMixerControl9 *pIVMRMixerControl = NULL;


IVMRFilterConfig9 и IVMRMixerControl9 не оприделяет как интерфейсы?



Автор: vdm 26.2.2008, 09:50
Выяснил, помогло:
#include "D3d9.h"
#include "Vmr9.h"
Закоментировал:
//#include "qedit.h"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)