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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectShow, Transform фильтр с пинами разных media, тайпов 
:(
    Опции темы
klep
Дата 7.9.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет !

Есть у меня свой трансформ фильтр (от CTransInPlaceFilter), делает он поворот на угол 90 градусов.
Но вот проблема, работает он только в режиме RGB (так как использует WinApi функци масштабирования) из за чего DirectX не врубает Overlay и весь граф забивает 100% работы проца.

Я ручками в graphedite построил с использованием YUY2 скорость увеличилась в два раза.

Вопрос: Как мне перевести свой фильтр в режим: In Pin = RGB32,RGB24,RGB16 Out Pin = YUY2 ???
Проблема конвертации RGB в YUY2 в данной теме не рассматривается.

Я попробовал это сделать сам, в результате у меня получилось, что когда фильтр соединяется с Capture Device в режиме RGB — все хорошо.
Но как только соединяемся Output пином с VMR или с чем то другим в режиму YUY2 то автоматически разрывается связь с Input пином.

Почему ???

может ответ в этом, не знаю

Цитата

It asks the downstream filter for an allocator, but uses the allocator properties from the upstream connection. The filter reconnects the input pin, using the media type from the output pin.





вот мои потуги  

Код

const AMOVIESETUP_MEDIATYPE
sudPinTypes =   {&MEDIATYPE_Video               
                ,&MEDIASUBTYPE_NULL }  ;       

const AMOVIESETUP_PIN
psudPins[] = { { L"Input"            // strName
               , FALSE               // bRendered
               , FALSE               // bOutput
               , FALSE               // bZero
               , FALSE               // bMany
               , &CLSID_NULL         // clsConnectsToFilter
               , L"Output"           // strConnectsToPin
               , 1                   // nTypes
               , &sudPinTypes }      // lpTypes
             , { L"Output"           // strName
               , FALSE               // bRendered
               , TRUE                // bOutput
               , FALSE               // bZero
               , FALSE               // bMany
               , &CLSID_NULL         // clsConnectsToFilter
               , L"Input"            // strConnectsToPin
               , 1                   // nTypes
               , &sudPinTypes } };   // lpTypes


HRESULT CNullInPlaceInputPin::CheckMediaType( const CMediaType *pmt )
{
HRESULT   hr = E_FAIL; 
    VIDEOINFO *pvi=0; 
    
    CheckPointer(pmt,E_POINTER); 

    // Reject the connection if this is not a video type 
    if( *pmt->FormatType() != FORMAT_VideoInfo ) 
   { 
        return E_INVALIDARG; 
    } 
    
    // Only accept video 
    pvi = (VIDEOINFO *)pmt->Format(); 

    if(IsEqualGUID( *pmt->Type(), MEDIATYPE_Video)) 
   { 
      hr = S_OK; 

      if (IsEqualGUID( *pmt->Subtype(), MEDIASUBTYPE_RGB24)) 
      { 
      } 
      else if (IsEqualGUID( *pmt->Subtype(), MEDIASUBTYPE_RGB32)) 
      { 
      } 
      else if (IsEqualGUID( *pmt->Subtype(), MEDIASUBTYPE_RGB555)) 
      { 
      } 

      else 
      { 
         hr = VFW_E_TYPE_NOT_ACCEPTED; 
      } 
    } 
    
    return hr; 
}


HRESULT CNullInPlaceOutputPin::CheckMediaType( const CMediaType *pmt )
{   
        HRESULT hr=E_FAIL;
    

    if(IsEqualGUID( *pmt->Type(), MEDIATYPE_Video)) 
   { 
      hr = S_OK; 

      if (IsEqualGUID( *pmt->Subtype(), MEDIASUBTYPE_YUY2)) 
      { 
         sMediaFormat = YUY2; 
      } 

      else 
      { 
         hr = VFW_E_TYPE_NOT_ACCEPTED; 
      } 
    } 

   return hr;
}



HRESULT CNullInPlace::DecideBufferSize(IMemAllocator *pAlloc,ALLOCATOR_PROPERTIES *pProp)
{
    ALLOCATOR_PROPERTIES InputProps;
    IMemAllocator *pAllocInput = 0;
    HRESULT hr;

    if (m_pInput->IsConnected() == FALSE) 
    {
        return E_UNEXPECTED;
    }

    ASSERT(pAlloc);
    ASSERT(pProp);
    return NOERROR;
}

HRESULT CNullInPlace::CheckInputType(const CMediaType* mtIn)
{
    if (*mtIn->FormatType() != FORMAT_VideoInfo)
    {
       return E_INVALIDARG;   
    }
    if (
        (IsEqualGUID(*mtIn->Type(), MEDIATYPE_Video))
        && ( (IsEqualGUID(*mtIn->Subtype(), MEDIASUBTYPE_RGB24)) 
        || (IsEqualGUID(*mtIn->Subtype(), MEDIASUBTYPE_RGB32))
        || (IsEqualGUID(*mtIn->Subtype(), MEDIASUBTYPE_RGB555))
           )
        ) return NOERROR;


    return E_INVALIDARG;
}


HRESULT CNullInPlace::CheckTransform(const CMediaType *mtIn,const CMediaType *mtOut)
{
return NOERROR;
}


HRESULT CNullInPlace::Transform(IMediaSample *pSample)
{

//TODO: До сюда то дело и не доходит в режиме YUY2, если сделать RGB то все работает !
}
 

PM MAIL   Вверх
Vladimir35
Дата 9.10.2006, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 CTransInPlaceFilter в данном случае не подойдет - используйте CTransformFilter
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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