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

173 lines
4.6 KiB
C++

//==========================================================================;
//
// seg.h : additional infrastructure to support using IMSVidGraphSegment nicely from c++
// Copyright (c) Microsoft Corporation 1999.
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef SEG_H
#define SEG_H
#include <segment.h>
#include <fwdseq.h>
#include <devseq.h>
#include <dsextend.h>
#include <objectwithsiteimplsec.h>
namespace MSVideoControl {
typedef CComQIPtr<IMSVidGraphSegment, &__uuidof(IMSVidGraphSegment)> PQGraphSegment;
typedef Forward_Sequence<
PQGraphSegment,
PQEnumFilters,
DSFilter,
IMSVidGraphSegment,
IEnumFilters,
IBaseFilter*> VWGraphSegmentSequence;
class VWSegmentContainer;
class VWGraphSegment : public VWGraphSegmentSequence {
public:
inline VWGraphSegment() {}
virtual ~VWGraphSegment() {}
inline VWGraphSegment(const PQGraphSegment &a) : VWGraphSegmentSequence(a) {}
inline VWGraphSegment(IMSVidGraphSegment *p) : VWGraphSegmentSequence(p) {}
inline VWGraphSegment(IUnknown *p) : VWGraphSegmentSequence(p) {}
inline VWGraphSegment(const VWGraphSegment &a) : VWGraphSegmentSequence(a) {}
inline VWGraphSegment(const CComVariant &v) : VWGraphSegmentSequence(((v.vt == VT_UNKNOWN) ? v.punkVal : (v.vt == VT_DISPATCH ? v.pdispVal : NULL))) {}
VWSegmentContainer Container(void);
MSVidSegmentType Type(void);
DSGraph Graph(void);
GUID2 Category();
GUID2 ClassID();
};
typedef CComQIPtr<IMSVidGraphSegmentContainer, &__uuidof(IMSVidGraphSegmentContainer)> PQSegmentContainer;
class VWSegmentContainer : public PQSegmentContainer {
public:
inline VWSegmentContainer() {}
inline VWSegmentContainer(const PQSegmentContainer &a) : PQSegmentContainer(a) {}
inline VWSegmentContainer(IUnknown *p) : PQSegmentContainer(p) {}
inline VWSegmentContainer(IMSVidGraphSegmentContainer *p) : PQSegmentContainer(p) {}
inline VWSegmentContainer(const VWSegmentContainer &a) : PQSegmentContainer(a) {}
virtual ~VWSegmentContainer() {}
DSGraph GetGraph(void) {
DSGraph g;
IMSVidGraphSegmentContainer* p = (*this);
if (p) {
p->get_Graph(&g);
}
return g;
}
};
typedef std::vector<VWGraphSegment> VWSegmentList;
typedef CComQIPtr<IEnumMSVidGraphSegment, &__uuidof(IEnumMSVidGraphSegment)> PQEnumSegment;
void CtorStaticVWSegmentFwdSeqPMFs(void);
void DtorStaticVWSegmentFwdSeqPMFs(void);
class ATL_NO_VTABLE CSegEnumBase : public CComObjectRootEx<CComSingleThreadModel>,
public IEnumMSVidGraphSegment,
public IObjectWithSiteImplSec<CSegEnumBase>
{
BEGIN_COM_MAP(CSegEnumBase)
COM_INTERFACE_ENTRY(IEnumMSVidGraphSegment)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
virtual ~CSegEnumBase() {}
};
/////////////////////////////////////////////////////////////////////////////
// CSegEnum
class CSegEnum : public CComObject<CSegEnumBase>
{
public:
CSegEnum(DeviceCollection &d) {
for (DeviceCollection::iterator i = d.begin(); i != d.end(); ++i) {
VWGraphSegment seg(*i);
ASSERT(seg);
m_pSegments.push_back(seg);
}
}
CSegEnum(VWSegmentList &s) : m_pSegments(s), i(s.begin()) {
}
CSegEnum(CSegEnum &orig) : m_pSegments(orig.m_pSegments) {
i = m_pSegments.begin();
VWSegmentList::iterator i2 = orig.m_pSegments.end();
for (;i2 != orig.i; ++i2, ++i);
}
virtual ~CSegEnum() {
i = m_pSegments.end();
m_pSegments.clear();
}
// ISegEnum
public:
VWSegmentList m_pSegments;
VWSegmentList::iterator i;
// IEnumMSVidGraphSegment
STDMETHOD(Next)(ULONG celt, IMSVidGraphSegment **rgvar, ULONG * pceltFetched)
{
// pceltFetched can legally == 0
//
if (pceltFetched != NULL) {
try {
*pceltFetched = 0;
} catch(...) {
return E_POINTER;
}
}
// Retrieve the next celt elements.
HRESULT hr = NOERROR ;
for (ULONG l = 0;i != m_pSegments.end() && celt != 0 ; ++i, ++l, --celt) {
(*i).CopyTo(&rgvar[l]);
if (pceltFetched != NULL) {
(*pceltFetched)++ ;
}
}
if (celt != 0) {
hr = ResultFromScode( S_FALSE ) ;
}
return hr ;
}
STDMETHOD(Skip)(ULONG celt)
{
for (;i != m_pSegments.end() && celt--; ++i);
return (celt == 0 ? NOERROR : ResultFromScode( S_FALSE )) ;
}
STDMETHOD(Reset)()
{
i = m_pSegments.begin();
return NOERROR;
}
STDMETHOD(Clone)(IEnumMSVidGraphSegment * * ppenum)
{
PQEnumSegment temp;
try {
temp = new CSegEnum(*this);
} catch(...) {
return E_OUTOFMEMORY;
}
try {
*ppenum = temp.Detach();
} catch(...) {
return E_POINTER;
}
return NOERROR;
}
};
};
#endif
// end of file seg.h