//==========================================================================; // // Composition.h : Declaration of the custom composition class for gluing WebDVD to ovmixer // Copyright (c) Microsoft Corporation 1999. // ///////////////////////////////////////////////////////////////////////////// #ifndef WEBDVDCOMP_H #define WEBDVDCOMP_H #pragma once #include #include #include #include #include #include "resource.h" // main symbols #include "perfcntr.h" ///////////////////////////////////////////////////////////////////////////// // CAnaCapComp class ATL_NO_VTABLE __declspec(uuid("267db0b3-55e3-4902-949b-df8f5cec0191")) CWebDVDComp : public CComObjectRootEx, public CComCoClass, public IObjectWithSiteImplSec, public IMSVidCompositionSegmentImpl { public: CWebDVDComp() {} virtual ~CWebDVDComp() {} REGISTER_NONAUTOMATION_OBJECT(IDS_PROJNAME, IDS_REG_WEBDVDCOMP_DESC, LIBID_MSVidCtlLib, __uuidof(CWebDVDComp)); DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CWebDVDComp) COM_INTERFACE_ENTRY(IMSVidCompositionSegment) COM_INTERFACE_ENTRY(IMSVidGraphSegment) COM_INTERFACE_ENTRY(IPersist) COM_INTERFACE_ENTRY(IObjectWithSite) END_COM_MAP() // IMSVidComposition public: // IMSVidGraphSegment // IMSVidCompositionSegment STDMETHOD(Compose)(IMSVidGraphSegment * upstream, IMSVidGraphSegment * downstream) { TRACELM(TRACE_DEBUG, "CWebDVDComp::Compose()"); if (m_fComposed) { return NOERROR; } ASSERT(m_pGraph); try { VWGraphSegment up(upstream); ASSERT(up.Graph() == m_pGraph); VWGraphSegment down(downstream); ASSERT(down.Graph() == m_pGraph); if (up.begin() == up.end()) { TRACELM(TRACE_ERROR, "CWebDVDComp::Compose() can't compose empty up segment"); return E_INVALIDARG; } if (down.begin() == down.end()) { TRACELM(TRACE_ERROR, "CWebDVDComp::Compose() can't compose empty down segment"); return E_INVALIDARG; } VWGraphSegment::iterator iNav = std::find_if(up.begin(), up.end(), arity1_pointer(&IsDVDNavigator)); if (iNav == up.end()) { TRACELM(TRACE_ERROR, "CWebDVDComp::Compose() upstream segment has no DVD Navigator"); return E_FAIL; } ASSERT((*iNav).GetGraph() == m_pGraph); VWGraphSegment::iterator iOv = std::find_if(down.begin(), down.end(), arity1_pointer(&IsVideoRenderer)); if (iOv == down.end()) { TRACELM(TRACE_ERROR, "CWebDVDComp::Compose() downstream segment has no ov mixer filter"); return E_FAIL; } ASSERT((*iOv).GetGraph() == m_pGraph); DSFilter pNav(*iNav); DSFilter pOv(*iOv); // video CPerfCounter pCounterDecoder; pCounterDecoder.Reset(); DSFilter::iterator iNavVideoPin = std::find_if(pNav.begin(), pNav.end(), arity1_pointer(&IsDVDNavigatorVideoOutPin)); if (iNavVideoPin == pNav.end()) { TRACELM(TRACE_ERROR, "CWebDVDComp::Compose() no video pin on DVD Navigator"); return E_FAIL; } DSPin pNavVideoPin(*iNavVideoPin); HRESULT hr = pNavVideoPin.IntelligentConnect(pOv, m_Filters); if (FAILED(hr)) { TRACELM(TRACE_DETAIL, "CWebDVDComp::Compose() SUCCEEDED"); return hr; } pCounterDecoder.Stop(); TRACELSM(TRACE_ERROR, (dbgDump << "CVidCtl:: Compose() connect decoder video: " << (unsigned long)(pCounterDecoder.GetLastTime() / _100NS_IN_MS) << "." << (unsigned long)(pCounterDecoder.GetLastTime() % _100NS_IN_MS) << " ms"), ""); // subpicture pCounterDecoder.Reset(); iNavVideoPin = std::find_if(pNav.begin(), pNav.end(), arity1_pointer(&IsDVDNavigatorSubpictureOutPin)); if (iNavVideoPin == pNav.end()) { TRACELM(TRACE_ERROR, "CWebDVDComp::Compose() no subpicture pin on DVD Navigator"); return E_FAIL; } pNavVideoPin = *iNavVideoPin; hr = pNavVideoPin.IntelligentConnect(pOv, m_Filters, DSGraph::RENDER_ALL_PINS | DSGraph::IGNORE_EXISTING_CONNECTIONS | DSGraph::DO_NOT_LOAD); if (FAILED(hr)) { TRACELSM(TRACE_ERROR, (dbgDump << "CWebDVDComp::Compose() FAILED hr = " << hexdump(hr)), ""); return hr; } pCounterDecoder.Stop(); TRACELSM(TRACE_ERROR, (dbgDump << "CVidCtl:: Compose() connect decoder subpicture: " << (unsigned long)(pCounterDecoder.GetLastTime() / _100NS_IN_MS) << "." << (unsigned long)(pCounterDecoder.GetLastTime() % _100NS_IN_MS) << " ms"), ""); m_fComposed = true; return NOERROR; } catch (ComException &e) { return e; } catch (...) { return E_UNEXPECTED; } } }; #endif // WEBDVDCOMP_H // end of file - WebDVDComp.h