www.pudn.com > src.rar > DirectVobSubOutputPin.cpp
#include "stdafx.h"
#include "resource.h"
#include "DirectVobSubFilter.h"
#include "DirectVobSubOutputPin.h"
#include "misc.h"
#include "Main.h"
CDirectVobSubOutputPin::CDirectVobSubOutputPin(CDirectVobSubFilter* pFilter, HRESULT* phr)
: CTransformOutputPin(NAME("CDirectVobSubOutputPin"), pFilter, phr, L"XForm Out")
, m_pFilter(pFilter)
{
}
STDMETHODIMP CDirectVobSubOutputPin::QueryAccept(const AM_MEDIA_TYPE* pmt)
{
HRESULT hr = S_FALSE;
IPin* pIn = m_pFilter->m_pInput->GetConnected();
if(!pIn) return hr;
BITMAPINFOHEADER bih;
ExtractBIH(pmt, &bih);
if(m_pFilter->m_bihSub.biHeight != abs(bih.biHeight)
|| (bih.biHeight > 0 && m_pFilter->m_bihSub.biWidth != bih.biWidth))
return hr;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
bool fForceRGB = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), 0);
if(fForceRGB && bih.biCompression > 3) return hr;
CComPtr pEnum;
if(FAILED(pIn->EnumMediaTypes(&pEnum))) return hr;
for(AM_MEDIA_TYPE* pmt2 = NULL; S_FALSE == hr && S_OK == pEnum->Next(1, &pmt2, NULL); DeleteMediaType(pmt2))
{
BITMAPINFOHEADER bih2;
ExtractBIH(pmt2, &bih2);
const CMediaType mt(*pmt2);
if(pmt->subtype == pmt2->subtype && m_pFilter->CheckInputType(&mt) == S_OK)
{
hr = pIn->QueryAccept(pmt2); // this shouldn't fail normally... (but it does, e.g. when divx5.02 is set to its yv12 mode, it offers rgb but won't switch...)
}
}
return(hr);
}