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