Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > DirectShow, Transform фильтр с пинами разных media


Автор: klep 7.9.2006, 09:48
Всем привет !

Есть у меня свой трансформ фильтр (от 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 то все работает !
}
 

Автор: Vladimir35 9.10.2006, 21:59
 CTransInPlaceFilter в данном случае не подойдет - используйте CTransformFilter

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