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); }