Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку ! Код DirectShow 
V
    Опции темы
AndreySol
Дата 25.6.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Есть следующий код:
Код

HRESULT hr = S_FALSE;
IEnumFilters *pEnum = NULL;
IBaseFilter *pFilter = NULL;
ULONG cFetched;
IEnumPins *pEnumPins = NULL;
IPin *pPin = NULL;
int iIsCompat = 0;

hr = piGraphBuilder->EnumFilters(&pEnum);
if(hr == S_OK) 
{
    while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
    {
        hr = pFilter->EnumPins(&pEnumPins);
        if(hr == S_OK)
        {
            while(pEnumPins->Next(1, &pPin, 0) == S_OK)
            {
                PIN_DIRECTION PinDirThis;
                pPin->QueryDirection(&PinDirThis);
                if(PinDirThis == PINDIR_INPUT)
                {
                    IEnumMediaTypes* pEnumMediaTypes;
                    hr = pPin->EnumMediaTypes(&pEnumMediaTypes);
                    if(hr == S_OK)
                    {
//                        MessageBox("OK EnumMediaTypes","",0);
                        AM_MEDIA_TYPE* pMediaTypes = NULL;
                        while(pEnumMediaTypes->Next(1, &pMediaTypes, 0) == S_OK)
                        {
                            if(pMediaTypes->majortype == MEDIATYPE_Video)
                            {
                                MessageBox("OK","",0);
                                ++iIsCompat;
                            }
//                            DeleteMediaType(pMediaTypes);
                            FreeMediaType(*pMediaTypes);
                        }
                        pEnumMediaTypes->Release();
                    }
                }
                pPin->Release();
            }
        }
        pEnumPins->Release();
        pFilter->Release();
    }
    pEnum->Release();
}

смысл его работы - перебрать все фильтры в графе, для фильтров найти входные пины, для найденных пинов определить тип данных, для тех которые имеют majortype == MEDIATYPE_Video - увеличить счетчик на единицу.
Не работает, не пойму почему. Если раскомментировать первую мессагу, она появляется точно по кол-ву входных пинов всех фильтров в графе, а pEnumMediaTypes->Next дает ошибку. 
PM MAIL   Вверх
p0s0l
Дата 2.7.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Имхо, ошибок нет. Просто не все фильтры имеют список предпочитаемых форматов на входных пинах (так же как и на выходных). Что видимо и получается в твоем случае касательно входных пинов видеофильтров в графе.

Добавлено @ 21:48 
А какая задача стоит в конечном счете ? 


--------------------
С уважением, г-н Посол.
PM   Вверх
AndreySol
Дата 9.7.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Погодите, что значит
Цитата

Просто не все фильтры имеют список предпочитаемых форматов на входных пинах (так же как и на выходных). 

если фильтр подключен в граф, как он может не иметь формата для пина - а как тогда билдер его добавил в граф, если нет формата по которым он подбирает подходящие фильтры ?
К примеру если собрать граф в GraphEdit'е - для всех пинов есть текущий формат соединения.
А задача состоит в том, что-бы найти в графе все фильтры по видео каналу. Может конечно можно другим способом этого добиться ? 
PM MAIL   Вверх
p0s0l
Дата 9.7.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Цитата(AndreySol @  9.7.2006,  09:12 Найти цитируемый пост)
Погодите, что значит
Я не совсем про то. Текущий формат и список предпочитаемых форматов - разные вещи. Например, Sample Grabber - ему же не надо делать какие-либо преобразования над проходящими данными, поэтому по идее у него нет списка предпочитаемых форматов, ему все-равно... А когда свяжешь два пина, тогда у этого соединения появляется "текущий формат". Кстати, этот список может меняться при соединении/разъединении других пинов фильтра...
(всё имхо smile )

Насчет того, как добавил билдер фильтр - то это нужно читать MSDN, там довольно разветленный алгоритм добавления фильтров...
При соединении пинов, выходной пин делает Enum форматов входного пина, если облом - то делает Enum своих форматов (это я про выбор формата данных):
Цитата(MSDN)
During the negotiation process, the output pin proposes a media type by calling the input pin's IPin::ReceiveConnection method. The input pin can accept or reject the proposed type. This process repeats until either the input pin accepts a type, or the output pin runs out of types and the connection fails.

How an output pin selects media types to propose depends on the implementation. In the DirectShow base classes, the output pin calls IPin::EnumMediaTypes on the input pin. This method returns an enumerator that enumerates the input pin's preferred media types. Failing that, the output pin enumerates its own preferred types.


Цитата(AndreySol @  9.7.2006,  09:12 Найти цитируемый пост)
А задача состоит в том, что-бы найти в графе все фильтры по видео каналу. Может конечно можно другим способом этого добиться ? 
Я бы прошелся по собранному графу, проверяя ConnectionMediaType... Или что-то мешает так сделать ?...

 


--------------------
С уважением, г-н Посол.
PM   Вверх
AndreySol
Дата 11.7.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Цитата

Я бы прошелся по собранному графу, проверяя ConnectionMediaType... Или что-то мешает так сделать ?...

А алгоритм примерный можно ? 
PM MAIL   Вверх
p0s0l
Дата 11.7.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Алгоритм примерно таков:
Код
HRESULT hr = S_FALSE;
IEnumFilters *pEnum = NULL;
IBaseFilter *pFilter = NULL;
ULONG cFetched;
IEnumPins *pEnumPins = NULL;
IPin *pPin = NULL;
int iIsCompat = 0;
hr = piGraphBuilder->EnumFilters(&pEnum);
if(hr == S_OK) 
{
    while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
    {
        hr = pFilter->EnumPins(&pEnumPins);
        if(hr == S_OK)
        {
            while(pEnumPins->Next(1, &pPin, 0) == S_OK)
            {
                AM_MEDIA_TYPE MediaType;
                if(( pPin->ConnectionMediaType(&pMediaType) == S_OK ) &&
                   ( MediaType.majortype == MEDIATYPE_Video))
                {
                     MessageBox("OK","",0);    
                     ++iIsCompat;
                     pPin->Release();
                     FreeMediaType(&MediaType);
                     break;
                }
                pPin->Release();
                FreeMediaType(&MediaType);
            }
        }
        pEnumPins->Release();
        pFilter->Release();
    }
    pEnum->Release();
}
 


--------------------
С уважением, г-н Посол.
PM   Вверх
AndreySol
Дата 12.7.2006, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Попробовал, результат - ошибка "Неправильный указатель",  выскакивает по кол-ву входных пинов всех фильтров в графе. 
PM MAIL   Вверх
p0s0l
Дата 12.7.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Я удивлен что у тебя вообще скомпилилось, я же дал "примерный алгоритм". А Си я к сожалению не знаю, так что ошибки обязательны. 
Кстати, так правильнее:
Код
HRESULT hr = S_FALSE;    
IEnumFilters *pEnum = NULL;    
IBaseFilter *pFilter = NULL;    
ULONG cFetched;    
IEnumPins *pEnumPins = NULL;    
IPin *pPin = NULL;    
int iIsCompat = 0;    
hr = piGraphBuilder->EnumFilters(&pEnum);    
if(hr == S_OK)    
{    
    while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)    
    {    
        hr = pFilter->EnumPins(&pEnumPins);    
        if(hr == S_OK)    
        {    
            while(pEnumPins->Next(1, &pPin, NULL) == S_OK)    
            {    
                AM_MEDIA_TYPE MediaType;
                if( pPin->ConnectionMediaType(&pMediaType) == S_OK )
                {
                    if( MediaType.majortype == MEDIATYPE_Video )
                    {    
                         MessageBox("OK","",0);     
                         ++iIsCompat;    
                         pPin->Release();    
                         FreeMediaType(&MediaType);    
                         break;    
                    }
                    FreeMediaType(&MediaType);    
                }    
                pPin->Release();    
            }    
        }    
        pEnumPins->Release();    
        pFilter->Release();    
    }    
    pEnum->Release();    
}
Аналогичный код на Дельфи работает... Ищи ошибку smile 


--------------------
С уважением, г-н Посол.
PM   Вверх
AndreySol
Дата 13.7.2006, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Нашел, все заработало.
Дело было в том, что я не обратил внимания на AM_MEDIA_TYPE MediaType, а оставил как у меня было AM_MEDIA_TYPE *pMediaType, а указатель в этой ф-ции не прокатывает. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.