windows-nt/Source/XPSP1/NT/multimedia/dshow/vidctl/msvidctl/webdvdcomp.h
2020-09-26 16:20:57 +08:00

144 lines
5.5 KiB
C++

//==========================================================================;
//
// 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 <winerror.h>
#include <algorithm>
#include <objectwithsiteimplsec.h>
#include <compimpl.h>
#include <seg.h>
#include "resource.h" // main symbols
#include "perfcntr.h"
/////////////////////////////////////////////////////////////////////////////
// CAnaCapComp
class ATL_NO_VTABLE __declspec(uuid("267db0b3-55e3-4902-949b-df8f5cec0191")) CWebDVDComp :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CWebDVDComp, &__uuidof(CWebDVDComp)>,
public IObjectWithSiteImplSec<CWebDVDComp>,
public IMSVidCompositionSegmentImpl<CWebDVDComp>
{
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