21 #pragma warning(disable:4237)
46 const OLECHAR FAR *szFile,
47 __deref_out ITypeLib FAR* FAR* pptlib);
53 __deref_out ITypeLib FAR* FAR* pptlib);
62 __deref_out ITypeInfo ** pptinfo)
72 return TYPE_E_ELEMENTNOTFOUND;
75 if (
NULL == pptinfo) {
87 static const char szTypeLib[] =
"LoadTypeLib";
88 static const char szRegTypeLib[] =
"LoadRegTypeLib";
89 static const WCHAR szControl[] = L
"control.tlb";
97 DWORD dwError = GetLastError();
102 if (lpfnLoadRegTypeLib ==
NULL) {
103 DWORD dwError = GetLastError();
107 hr = (*lpfnLoadRegTypeLib)(LIBID_QuartzTypeLib, 1, 0,
115 lpfnLoadTypeLib = (
LPLOADTYPELIB)GetProcAddress(hInst, szTypeLib);
116 if (lpfnLoadTypeLib ==
NULL) {
117 DWORD dwError = GetLastError();
121 hr = (*lpfnLoadTypeLib)(szControl, &ptlib);
127 hr = ptlib->GetTypeInfoOfGuid(
147 __in_ecount(cNames) LPOLESTR * rgszNames,
150 __out_ecount(cNames) DISPID * rgdispid)
159 hr = pti->GetIDsOfNames(rgszNames, cNames, rgdispid);
180 if (
riid == IID_IMediaControl) {
203 __deref_out ITypeInfo ** pptinfo)
216 __in_ecount(cNames) LPOLESTR * rgszNames,
219 __out_ecount(cNames) DISPID * rgdispid)
236 __in DISPPARAMS * pdispparams,
237 __out_opt VARIANT * pvarResult,
238 __out_opt EXCEPINFO * pexcepinfo,
239 __out_opt UINT * puArgErr)
242 if (IID_NULL !=
riid) {
243 return DISP_E_UNKNOWNINTERFACE;
254 (IMediaControl *)
this,
282 if (
riid == IID_IMediaEvent ||
riid == IID_IMediaEventEx) {
305 __deref_out ITypeInfo ** pptinfo)
318 __in_ecount(cNames) LPOLESTR * rgszNames,
321 __out_ecount(cNames) DISPID * rgdispid)
338 __in DISPPARAMS * pdispparams,
339 __out_opt VARIANT * pvarResult,
340 __out_opt EXCEPINFO * pexcepinfo,
341 __out_opt UINT * puArgErr)
344 if (IID_NULL !=
riid) {
345 return DISP_E_UNKNOWNINTERFACE;
378 __in_opt LPUNKNOWN pUnk,
379 __inout HRESULT * phr) :
382 UNREFERENCED_PARAMETER(phr);
392 if (
riid == IID_IMediaPosition) {
415 __deref_out ITypeInfo ** pptinfo)
428 __in_ecount(cNames) LPOLESTR * rgszNames,
431 __out_ecount(cNames) DISPID * rgdispid)
448 __in DISPPARAMS * pdispparams,
449 __out_opt VARIANT * pvarResult,
450 __out_opt EXCEPINFO * pexcepinfo,
451 __out_opt UINT * puArgErr)
454 if (IID_NULL !=
riid) {
455 return DISP_E_UNKNOWNINTERFACE;
466 (IMediaPosition *)
this,
483 __in_opt LPUNKNOWN pUnk,
484 __inout HRESULT *phr,
504 if (
riid == IID_IMediaSeeking) {
505 return GetInterface(
static_cast<IMediaSeeking *
>(
this), ppv);
514 CPosPassThru::GetPeer(IMediaPosition ** ppMP)
519 HRESULT
hr = m_pPin->ConnectedTo(&pConnected);
523 IMediaPosition * pMP;
524 hr = pConnected->QueryInterface(IID_IMediaPosition, (
void **) &pMP);
525 pConnected->Release();
538 CPosPassThru::GetPeerSeeking(__deref_out IMediaSeeking ** ppMS)
543 HRESULT
hr = m_pPin->ConnectedTo(&pConnected);
548 hr = pConnected->QueryInterface(IID_IMediaSeeking, (
void **) &pMS);
549 pConnected->Release();
566 HRESULT
hr = GetPeerSeeking(&pMS);
571 hr = pMS->GetCapabilities(pCaps);
580 HRESULT
hr = GetPeerSeeking(&pMS);
585 hr = pMS->CheckCapabilities(pCaps);
594 HRESULT
hr = GetPeerSeeking(&pMS);
599 hr = pMS->IsFormatSupported(pFormat);
609 HRESULT
hr = GetPeerSeeking(&pMS);
614 hr = pMS->QueryPreferredFormat(pFormat);
624 HRESULT
hr = GetPeerSeeking(&pMS);
629 hr = pMS->SetTimeFormat(pFormat);
639 HRESULT
hr = GetPeerSeeking(&pMS);
644 hr = pMS->GetTimeFormat(pFormat);
654 HRESULT
hr = GetPeerSeeking(&pMS);
659 hr = pMS->IsUsingTimeFormat(pFormat);
667 __in_opt
const GUID * pTargetFormat,
669 __in_opt
const GUID * pSourceFormat )
672 HRESULT
hr = GetPeerSeeking(&pMS);
677 hr = pMS->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat );
686 __inout_opt LONGLONG * pStop,
690 HRESULT
hr = GetPeerSeeking(&pMS);
695 hr = pMS->SetPositions(pCurrent, CurrentFlags, pStop, StopFlags );
704 HRESULT
hr = GetPeerSeeking(&pMS);
709 hr = pMS->GetPositions(pCurrent,pStop);
715 CPosPassThru::GetSeekingLongLong
716 ( HRESULT (__stdcall IMediaSeeking::*pMethod)( __out LONGLONG * )
721 HRESULT
hr = GetPeerSeeking(&pMS);
724 hr = (pMS->*pMethod)(pll);
737 if (SUCCEEDED(
hr))
hr = NOERROR;
738 else hr = GetSeekingLongLong( &IMediaSeeking::GetCurrentPosition, pCurrent );
746 return GetSeekingLongLong( &IMediaSeeking::GetStopPosition, pStop );;
752 return GetSeekingLongLong( &IMediaSeeking::GetDuration, pDuration );;
759 return GetSeekingLongLong( &IMediaSeeking::GetPreroll, pllPreroll );;
767 HRESULT
hr = GetPeerSeeking(&pMS);
772 hr = pMS->GetAvailable( pEarliest, pLatest );
782 HRESULT
hr = GetPeerSeeking(&pMS);
786 hr = pMS->GetRate(pdRate);
800 HRESULT
hr = GetPeerSeeking(&pMS);
804 hr = pMS->SetRate(dRate);
819 HRESULT
hr = GetPeer(&pMP);
824 hr = pMP->get_Duration(plength);
834 HRESULT
hr = GetPeer(&pMP);
838 hr = pMP->get_CurrentPosition(pllTime);
848 HRESULT
hr = GetPeer(&pMP);
852 hr = pMP->put_CurrentPosition(llTime);
862 HRESULT
hr = GetPeer(&pMP);
866 hr = pMP->get_StopTime(pllTime);
876 HRESULT
hr = GetPeer(&pMP);
880 hr = pMP->put_StopTime(llTime);
890 HRESULT
hr = GetPeer(&pMP);
894 hr = pMP->get_PrerollTime(pllTime);
904 HRESULT
hr = GetPeer(&pMP);
908 hr = pMP->put_PrerollTime(llTime);
918 HRESULT
hr = GetPeer(&pMP);
922 hr = pMP->get_Rate(pdRate);
936 HRESULT
hr = GetPeer(&pMP);
940 hr = pMP->put_Rate(dRate);
950 HRESULT
hr = GetPeer(&pMP);
954 hr = pMP->CanSeekForward(pCanSeekForward);
964 HRESULT
hr = GetPeer(&pMP);
968 hr = pMP->CanSeekBackward(pCanSeekBackward);
984 __in_opt LPUNKNOWN pUnk,
985 __inout HRESULT *phr,
1001 LONGLONG StartMedia;
1008 HRESULT
hr = pMediaSample->GetTime(&StartMedia,&EndMedia);
1011 ASSERT(
hr == VFW_E_SAMPLE_TIME_NOT_SET);
1015 m_StartMedia = StartMedia;
1016 m_EndMedia = EndMedia;
1028 m_StartMedia = StartTime;
1029 m_EndMedia = EndTime;
1043 if (m_bReset == TRUE) {
1050 if (pEndTime && SUCCEEDED(
hr)) {
1077 if ( m_bReset == TRUE )
hr = E_FAIL;
1085 m_EndMedia = llStop;
1094 __in_opt LPCTSTR
pName,
1095 __in_opt LPUNKNOWN pUnk,
1096 __inout HRESULT* phr,
1107 | AM_SEEKING_CanSeekBackwards
1108 | AM_SEEKING_CanSeekAbsolute
1109 | AM_SEEKING_CanGetStopPos
1110 | AM_SEEKING_CanGetDuration;
1115 if(
riid == IID_IMediaSeeking) {
1117 return GetInterface(
static_cast<IMediaSeeking *
>(
this), ppv);
1129 return *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
1135 *pFormat = TIME_FORMAT_MEDIA_TIME;
1144 return *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : E_INVALIDARG;
1150 return *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
1156 *pFormat = TIME_FORMAT_MEDIA_TIME;
1199 __in_opt
const GUID * pTargetFormat,
1201 __in_opt
const GUID * pSourceFormat )
1208 if(pTargetFormat == 0 || *pTargetFormat == TIME_FORMAT_MEDIA_TIME)
1210 if(pSourceFormat == 0 || *pSourceFormat == TIME_FORMAT_MEDIA_TIME)
1217 return E_INVALIDARG;
1223 __inout_opt LONGLONG * pStop,
1226 DWORD StopPosBits = StopFlags & AM_SEEKING_PositioningBitsMask;
1227 DWORD StartPosBits = CurrentFlags & AM_SEEKING_PositioningBitsMask;
1233 if(StopPosBits != StopFlags) {
1234 return E_INVALIDARG;
1240 if(StartPosBits != AM_SEEKING_AbsolutePositioning &&
1241 StartPosBits != AM_SEEKING_RelativePositioning) {
1242 return E_INVALIDARG;
1252 if(StartPosBits == AM_SEEKING_AbsolutePositioning)
1256 else if(StartPosBits == AM_SEEKING_RelativePositioning)
1262 if(StopPosBits == AM_SEEKING_AbsolutePositioning)
1266 else if(StopPosBits == AM_SEEKING_IncrementalPositioning)
1270 else if(StopPosBits == AM_SEEKING_RelativePositioning)
1278 if(SUCCEEDED(
hr) && StopPosBits) {
1346 __in_opt LPUNKNOWN pUnk,
1347 __inout HRESULT* phr,
1449 *pCanSeekForward =
OATRUE;
1460 *pCanSeekBackward =
OATRUE;
1479 if (
riid == IID_IBasicAudio) {
1498 __deref_out ITypeInfo ** pptinfo)
1511 __in_ecount(cNames) LPOLESTR * rgszNames,
1514 __out_ecount(cNames) DISPID * rgdispid)
1527 DISPID dispidMember,
1531 __in DISPPARAMS * pdispparams,
1532 __out_opt VARIANT * pvarResult,
1533 __out_opt EXCEPINFO * pexcepinfo,
1534 __out_opt UINT * puArgErr)
1537 if (IID_NULL !=
riid) {
1538 return DISP_E_UNKNOWNINTERFACE;
1549 (IBasicAudio *)
this,
1576 if (
riid == IID_IVideoWindow) {
1595 __deref_out ITypeInfo ** pptinfo)
1608 __in_ecount(cNames) LPOLESTR * rgszNames,
1611 __out_ecount(cNames) DISPID * rgdispid)
1624 DISPID dispidMember,
1628 __in DISPPARAMS * pdispparams,
1629 __out_opt VARIANT * pvarResult,
1630 __out_opt EXCEPINFO * pexcepinfo,
1631 __out_opt UINT * puArgErr)
1634 if (IID_NULL !=
riid) {
1635 return DISP_E_UNKNOWNINTERFACE;
1646 (IVideoWindow *)
this,
1674 if (
riid == IID_IBasicVideo ||
riid == IID_IBasicVideo2) {
1675 return GetInterface(
static_cast<IBasicVideo2 *
>(
this), ppv);
1693 __deref_out ITypeInfo ** pptinfo)
1706 __in_ecount(cNames) LPOLESTR * rgszNames,
1709 __out_ecount(cNames) DISPID * rgdispid)
1722 DISPID dispidMember,
1726 __in DISPPARAMS * pdispparams,
1727 __out_opt VARIANT * pvarResult,
1728 __out_opt EXCEPINFO * pexcepinfo,
1729 __out_opt UINT * puArgErr)
1732 if (IID_NULL !=
riid) {
1733 return DISP_E_UNKNOWNINTERFACE;
1744 (IBasicVideo *)
this,
1763 rgdispidNamedArgs =
NULL;
1767 rgvarg =
new VARIANT[cArgs];
1768 if (
NULL == rgvarg) {
1771 *phr = E_OUTOFMEMORY;
1776 for (UINT i = 0; i < cArgs; i++) {
1780 VARIANT * pDest = &rgvarg[i];
1781 VARIANT * pSrc = &pArgs[i];
1783 pDest->vt = pSrc->vt;
1787 pDest->lVal = pSrc->lVal;
1791 pDest->bVal = pSrc->bVal;
1795 pDest->iVal = pSrc->iVal;
1799 pDest->fltVal = pSrc->fltVal;
1803 pDest->dblVal = pSrc->dblVal;
1807 pDest->boolVal = pSrc->boolVal;
1811 pDest->scode = pSrc->scode;
1815 pDest->cyVal = pSrc->cyVal;
1819 pDest->date = pSrc->date;
1824 pDest->bstrVal =
NULL;
1830 WORD len = * (WORD*) (pSrc->bstrVal - (
sizeof(WORD) /
sizeof(OLECHAR)));
1831 OLECHAR* pch =
new OLECHAR[len + (
sizeof(WORD)/
sizeof(OLECHAR))];
1833 WORD *pui = (WORD*)pch;
1835 pDest->bstrVal = pch + (
sizeof(WORD)/
sizeof(OLECHAR));
1836 CopyMemory(pDest->bstrVal, pSrc->bstrVal, len*
sizeof(OLECHAR));
1840 *phr = E_OUTOFMEMORY;
1847 pDest->punkVal = pSrc->punkVal;
1848 pDest->punkVal->AddRef();
1852 pDest->pdispVal = pSrc->pdispVal;
1853 pDest->pdispVal->AddRef();
1872 for (UINT i = 0; i < cArgs; i++) {
1873 switch(rgvarg[i].vt) {
1877 OLECHAR * pch = rgvarg[i].bstrVal - (
sizeof(WORD)/
sizeof(OLECHAR));
1883 rgvarg[i].punkVal->Release();
1887 rgvarg[i].pdispVal->Release();
1899 __in_opt LPUNKNOWN pUnk,
1900 __inout HRESULT * phr,
1901 __in LPUNKNOWN pUnkExecutor,
1907 __in_ecount(nArgs) VARIANT* pDispParams,
1908 __out VARIANT* pvarResult,
1909 __out
short* puArgErr,
1914 m_pUnk(pUnkExecutor),
1916 m_dispidMethod(dispidMethod),
1918 m_DispParams(nArgs, pDispParams, phr),
1919 m_pvarResult(pvarResult),
1932 IUnknown * pInterface;
1933 HRESULT
hr =
m_pUnk->QueryInterface(
GetIID(), (
void**) &pInterface);
1938 pInterface->Release();
1953 if (wFlags == DISPATCH_PROPERTYPUT) {
1960 hr = pQ->Insert(
this);
1971 CDeferredCommand::~CDeferredCommand()
1997 if (
riid == IID_IDeferredCommand) {
2013 return VFW_E_ALREADY_CANCELLED;
2060 return VFW_E_TIME_ALREADY_PASSED;
2084 return VFW_E_ALREADY_CANCELLED;
2096 IUnknown* pInterface;
2116 pInterface->Release();
2133 m_listPresentation(
NAME(
"Presentation time command list")),
2134 m_listStream(
NAME(
"Stream time command list")),
2183 __in LPUNKNOWN pUnk,
2189 __in_ecount(cArgs) VARIANT* pDispParams,
2190 __out VARIANT* pvarResult,
2191 __out
short* puArgErr,
2234 if (pCmd->IsStreamTime()) {
2267 if (pCmd->IsStreamTime()) {
2275 while (pos && (pList->
GetValid(pos) != pCmd)) {
2281 hr = VFW_E_NOT_FOUND;
2359 if ((current ==
TimeZero) || (t < current)) {
2377 (REFERENCE_TIME)current,
2455 if (!pCmd || (t < pCmd->GetTime())) {
2474 if (WaitForSingleObject(
m_evDue, msTimeout) != WAIT_OBJECT_0) {
2517 if (pStream && (pStream->
GetTime() <= tStream)) {
2532 if (pPresent->
GetTime() <= tStream) {
2539 return VFW_E_NOT_FOUND;