www.pudn.com > VOBSUB.rar > misc.cpp


#include "stdafx.h" 
 
#include "resource.h" 
 
#include  
#include  
 
#include "DirectVobSubUIDs.h" 
#include "IDirectVobSub.h" 
 
void memsetd(void* dst, unsigned int c, int len) 
{ 
	__asm 
	{ 
		mov eax, c 
		mov ecx, len 
		shr ecx, 2 
		mov edi, dst 
		cld 
		rep stosd 
	} 
} 
 
void FillRectD(BITMAP& bm, unsigned int c, RECT& r) 
{ 
	CRect rr = r; 
	rr &= CRect(0, 0, bm.bmWidth, bm.bmHeight); 
 
	int w = (rr.right - rr.left) << 2; 
	int h = rr.bottom - rr.top; 
	char* ptr = (char*)bm.bmBits + ((bm.bmHeight - rr.top - h) * bm.bmWidthBytes) + (rr.left << 2); 
 
	while(--h >= 0) 
	{ 
		memsetd(ptr, c, w); 
		ptr += bm.bmWidthBytes; 
	} 
} 
 
int FindMyself(IFilterGraph* pGB) 
{ 
    CComPtr pEnum; 
    if(FAILED(pGB->EnumFilters(&pEnum))) return(0); 
 
	int nInstances = 0; 
 
    for(CComPtr pFilter; S_OK == pEnum->Next(1, &pFilter, NULL); pFilter = NULL) 
    { 
        if(CComQIPtr(pFilter)) nInstances++; 
    } 
 
    return(nInstances); 
} 
 
bool FindSourceFileName(IFilterGraph* pGB, WCHAR* fn) 
{ 
	if(!pGB || !fn) return(false); 
 
	bool fRet = false; 
 
    CComPtr pEnum; 
    if(FAILED(pGB->EnumFilters(&pEnum))) return(false); 
 
    for(CComPtr pFilter; !fRet && S_OK == pEnum->Next(1, &pFilter, NULL); pFilter = NULL) 
    { 
		CComQIPtr pFSF = pFilter; 
		LPOLESTR fnw = NULL; 
 
        if(!pFSF || FAILED(pFSF->GetCurFile(&fnw, NULL)) || !fnw) 
            continue; 
 
		wcscpy(fn, fnw); 
		CoTaskMemFree(fnw); 
 
		fRet = true; 
	} 
 
    return(fRet); 
} 
 
CComPtr FindAudioRenderer(IFilterGraph* pGB) 
{ 
    CComPtr pEnum; 
	if(FAILED(pGB->EnumFilters(&pEnum))) return NULL; 
 
	for(CComPtr pFilter; S_OK == pEnum->Next(1, &pFilter, NULL); pFilter = NULL) 
	{ 
		if(CComQIPtr(pFilter) && CComQIPtr(pFilter))  
			return pFilter; 
	} 
 
    return NULL; 
} 
 
CComPtr FindFirstPin(IBaseFilter* pBF) 
{ 
    CComPtr pEnum; 
    if(FAILED(pBF->EnumPins(&pEnum))) return(NULL); 
 
    CComPtr pPin; 
    if(FAILED(pEnum->Next(1, &pPin, NULL))) return(NULL); 
 
    return(pPin); 
} 
 
bool FindTextStream(IFilterGraph* pGraph) 
{ 
	if(!pGraph) return(false); 
 
	CComPtr pSplitter; 
	if(FAILED(pGraph->FindFilterByName(L"AVI Splitter", &pSplitter)) 
	&& FAILED(pGraph->FindFilterByName(L"Ogg Splitter", &pSplitter))) 
		return(false); 
 
	CComPtr pEnum; 
	if(FAILED(pSplitter->EnumPins(&pEnum))) 
		return(false); 
 
	bool fFound = false; 
 
	for(CComPtr pPin; !fFound && S_OK == pEnum->Next(1, &pPin, NULL); pPin = NULL) 
	{ 
		CComPtr pEnumMT; 
		if(FAILED(pPin->EnumMediaTypes(&pEnumMT))) 
			continue; 
 
		for(AM_MEDIA_TYPE* pAMMT = NULL; !fFound && S_OK == pEnumMT->Next(1, &pAMMT, NULL); DeleteMediaType(pAMMT), pAMMT = NULL) 
		{ 
			if(IsEqualGUID(pAMMT->majortype, MEDIATYPE_Text)) 
				fFound = true; 
		} 
	} 
 
	return(fFound); 
} 
 
TCHAR* CallPPage(IFilterGraph* pGraph, int idx, HWND hWnd) // hWnd == INVALID_HANDLE_VALUE - get name, hWnd != INVALID_HANDLE_VALUE - show ppage 
{ 
	int i = 0; 
	bool fFound = false; 
 
	WCHAR* wstr = NULL; 
 
	CAUUID caGUID; 
	caGUID.pElems = NULL; 
 
    CComPtr pEnum; 
    if(FAILED(pGraph->EnumFilters(&pEnum))) return(NULL); 
 
	CComPtr pFilter; 
    for(; pEnum->Next(1, &pFilter, NULL) == S_OK; pFilter = NULL) 
	{ 
		CComQIPtr pSpecify = pFilter; 
		if(!pSpecify) continue; 
 
		if(i == idx) 
		{  
			FILTER_INFO FilterInfo; 
			pFilter->QueryFilterInfo(&FilterInfo); 
			if(FilterInfo.pGraph) FilterInfo.pGraph->Release();  
 
			pSpecify->GetPages(&caGUID); 
			wstr = _wcsdup(FilterInfo.achName); 
			break; 
		} 
 
		i++; 
	} 
	 
	TCHAR* ret = NULL; 
 
	if(pFilter) 
	{ 
		if(hWnd != INVALID_HANDLE_VALUE) 
		{ 
			IUnknown* lpUnk = NULL; 
			pFilter.QueryInterface(&lpUnk); 
			OleCreatePropertyFrame( 
				hWnd, 0, 0, wstr,  
				1, &lpUnk,  
				caGUID.cElems, caGUID.pElems,  
				0, 0, NULL); // BUG: if the main app is closed before this modal ppage returns then lpUnk isn't going to be released... 
			lpUnk->Release(); 
		} 
		else 
		{ 
			int len = wcslen(wstr)+1; 
			ret = new TCHAR[len]; 
#ifdef UNICODE 
			if(ret)	wcscpy(ret, wstr); 
#else 
			if(ret)	wcstombs(ret, wstr, len+1); 
#endif 
		} 
	} 
 
	if(caGUID.pElems) CoTaskMemFree(caGUID.pElems); 
	if(wstr) free(wstr); 
 
	return(ret); 
} 
 
bool ExtractBIH(const AM_MEDIA_TYPE* pmt, BITMAPINFOHEADER* bih) 
{ 
	if(pmt) 
	{ 
		if(pmt->formattype == FORMAT_VideoInfo) 
		{ 
			VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->pbFormat; 
			memcpy(bih, &vih->bmiHeader, sizeof(BITMAPINFOHEADER)); 
		} 
		else if(pmt->formattype == FORMAT_VideoInfo2) 
		{ 
			VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)pmt->pbFormat; 
			memcpy(bih, &vih->bmiHeader, sizeof(BITMAPINFOHEADER)); 
		} 
 
		return(true); 
	} 
	 
	return(false); 
} 
 
bool ExtractBIH(IMediaSample* pMS, BITMAPINFOHEADER* bih) 
{ 
	AM_MEDIA_TYPE* pmt = NULL; 
	pMS->GetMediaType(&pmt); 
	if(pmt) 
	{ 
		bool fRet = ExtractBIH(pmt, bih); 
 
		DeleteMediaType(pmt); 
 
		return(fRet); 
	} 
	 
	return(false); 
} 
 
CComPtr FindVMRFilterFromPin(IPin* pPin) 
{ 
	CComPtr ret; 
 
	PIN_INFO pi; 
	if(SUCCEEDED(pPin->QueryPinInfo(&pi)) && pi.pFilter) 
	{ 
		ret.Attach(pi.pFilter); 
		if(!CComQIPtr(ret)) ret = NULL; // .Detach()->Release(); 
	} 
 
	return(ret); 
} 
 
HRESULT AddToRot(IUnknown* pUnkGraph, DWORD* pdwRegister)  
{ 
    CComPtr pROT; 
    if(FAILED(GetRunningObjectTable(0, &pROT))) 
		return E_FAIL; 
 
	WCHAR wsz[256]; 
    wsprintfW(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId()); 
 
    HRESULT hr; 
 
	CComPtr pMoniker; 
    if(SUCCEEDED(hr = CreateItemMoniker(L"!", wsz, &pMoniker))) 
        hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister); 
 
	return hr; 
} 
 
void RemoveFromRot(DWORD pdwRegister) 
{ 
	CComPtr pROT; 
    if(SUCCEEDED(GetRunningObjectTable(0, &pROT))) 
        pROT->Revoke(pdwRegister); 
}