144 lines
5.5 KiB
C
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
|