www.pudn.com > VOBSUB.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); 
}