DirectX SDK 中非常有用的一段代码
以下是两段摘自微软Directshow filte例子的源代码(两个递归函数),稍作修改。它们的功能是:给定一个Filter,删除这个Filter上面/下面连着的所有Filter。非常实用!欢迎大家收藏。
// Tear down everything downstream of a given filter DirectShow 开发论坛*Ms'q3F/z1s
void NukeDownstream(IGraphBuilder * inGraph, IBaseFilter * inFilter)
{ - DirectShow - Filter -www.DirectShow.cn:n;~[)GE] b
if (inGraph && inFilter)
{ DirectShow 开发论坛tK ]%LD Rx
IEnumPins * pinEnum = 0;
if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) DirectShow 开发论坛yC(J0Ia!UH;Hz{:X
{
pinEnum->Reset();
IPin * pin = 0; DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cn4U$Z_A8ow9vy
ULONG cFetched = 0;
bool pass = true;
while (pass && SUCCEEDED(pinEnum->Next(1, &pin, &cFetched))) DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn%I?:rE3QI
{
if (pin && cFetched) www.directshow.cnE)Vu;sb+W'~
{ *W0T&u-r,y&U,cW
IPin * connectedPin = 0; - DirectShow - Filter -www.DirectShow.cn)V&O6A3G$E
pin->ConnectedTo(&connectedPin); DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn d
u!kOT^
if(connectedPin)
{
PIN_INFO pininfo; #H2O*M5TZ-t
V!J
if (SUCCEEDED(connectedPin->QueryPinInfo(&pininfo))) DirectShow 开发论坛^:O$?vq3A[
{ DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn^fr,i];f
if(pininfo.dir == PINDIR_INPUT) - DirectShow - Filter -www.DirectShow.cn
{
NukeDownstream(inGraph, pininfo.pFilter); www.directshow.cnd7i)oq
w)IL6L
inGraph->Disconnect(connectedPin); DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn:T9h:T)rM'j-`vl
inGraph->Disconnect(pin);
inGraph->RemoveFilter(pininfo.pFilter); - DirectShow - Filter -www.DirectShow.cnMu[N
?ne&A
}
pininfo.pFilter->Release(); c{8_5f&O Y7BE(n}
} DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cnPWkc%K1a.z%z Y
connectedPin->Release();
} - DirectShow - Filter -www.DirectShow.cn9G b;Q(n/ht Q
pin->Release(); - DirectShow - Filter -www.DirectShow.cn
^9_!Z?V(dD
} DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn3c:j
R"b1O:H
else
{ DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cn2ZdSt
DtZ{/W
pass = false;
} DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cnPs8IvqpG
} "[Y0E.knF!J3i
pinEnum->Release(); www.directshow.cnI'd[%yt9v:F
} %~v"@#c-E#f
}
} DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn-M!pJLDbwv ]+}
// Tear down everything upstream of a given filter
void NukeUpstream(IGraphBuilder * inGraph, IBaseFilter * inFilter)
{ www.directshow.cnf!W.cx6Tx
if (inGraph && inFilter)
{
IEnumPins * pinEnum=0; DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn`9Kg9@
w - DirectShow - Filter -www.DirectShow.cn2H;{S0X"Ck)HXB if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) T#r
q
[
_D1S%d,y
{
pinEnum->Reset(); S5eoSh JE)E@
IPin * pin = 0; DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn?b#[4l'i8@0@
ULONG cFetched = 0; www.directshow.cn7kq9KJ1lL!I"^
bool pass = true; DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cn+A-^ AF/c
while (pass && SUCCEEDED(pinEnum->Next(1, &pin, &cFetched)))
{
if (pin && cFetched) - DirectShow - Filter -www.DirectShow.cn ggOg;GW
{ www.directshow.cn/*u"Qp}
IPin * connectedPin = 0;
pin->ConnectedTo(&connectedPin); www.directshow.cnUW Y]*YW*u-k
if(connectedPin)
{
PIN_INFO pininfo;
if (SUCCEEDED(connectedPin->QueryPinInfo(&pininfo)))
{
NukeUpstream(inGraph, pininfo.pFilter); www.directshow.cnM/MyZlA
inGraph->Disconnect(connectedPin);
inGraph->Disconnect(pin); - DirectShow - Filter -www.DirectShow.cnU3UK5Q,Qp/
inGraph->RemoveFilter(pininfo.pFilter);
}
pininfo.pFilter->Release();
}
connectedPin->Release();
}
else
{ DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cnH;XU,R^L0B
pass = false;
} www.directshow.cnh}pLoU|u*H#c
}
pinEnum->Release();
}
} www.directshow.cn
}
以下是两段摘自微软Directshow filte例子的源代码(两个递归函数),稍作修改。它们的功能是:给定一个Filter,删除这个Filter上面/下面连着的所有Filter。非常实用!欢迎大家收藏。
// Tear down everything downstream of a given filter DirectShow 开发论坛*Ms'q3F/z1s
void NukeDownstream(IGraphBuilder * inGraph, IBaseFilter * inFilter)
{ - DirectShow - Filter -www.DirectShow.cn:n;~[)GE] b
if (inGraph && inFilter)
{ DirectShow 开发论坛tK ]%LD Rx
IEnumPins * pinEnum = 0;
if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) DirectShow 开发论坛yC(J0Ia!UH;Hz{:X
{
pinEnum->Reset();
IPin * pin = 0; DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cn4U$Z_A8ow9vy
ULONG cFetched = 0;
bool pass = true;
while (pass && SUCCEEDED(pinEnum->Next(1, &pin, &cFetched))) DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn%I?:rE3QI
{
if (pin && cFetched) www.directshow.cnE)Vu;sb+W'~
{ *W0T&u-r,y&U,cW
IPin * connectedPin = 0; - DirectShow - Filter -www.DirectShow.cn)V&O6A3G$E
pin->ConnectedTo(&connectedPin); DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn d
u!kOT^
if(connectedPin)
{
PIN_INFO pininfo; #H2O*M5TZ-t
V!J
if (SUCCEEDED(connectedPin->QueryPinInfo(&pininfo))) DirectShow 开发论坛^:O$?vq3A[
{ DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn^fr,i];f
if(pininfo.dir == PINDIR_INPUT) - DirectShow - Filter -www.DirectShow.cn
{
NukeDownstream(inGraph, pininfo.pFilter); www.directshow.cnd7i)oq
w)IL6L
inGraph->Disconnect(connectedPin); DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn:T9h:T)rM'j-`vl
inGraph->Disconnect(pin);
inGraph->RemoveFilter(pininfo.pFilter); - DirectShow - Filter -www.DirectShow.cnMu[N
?ne&A
}
pininfo.pFilter->Release(); c{8_5f&O Y7BE(n}
} DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cnPWkc%K1a.z%z Y
connectedPin->Release();
} - DirectShow - Filter -www.DirectShow.cn9G b;Q(n/ht Q
pin->Release(); - DirectShow - Filter -www.DirectShow.cn
^9_!Z?V(dD
} DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn3c:j
R"b1O:H
else
{ DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cn2ZdSt
DtZ{/W
pass = false;
} DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cnPs8IvqpG
} "[Y0E.knF!J3i
pinEnum->Release(); www.directshow.cnI'd[%yt9v:F
} %~v"@#c-E#f
}
} DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn-M!pJLDbwv ]+}
// Tear down everything upstream of a given filter
void NukeUpstream(IGraphBuilder * inGraph, IBaseFilter * inFilter)
{ www.directshow.cnf!W.cx6Tx
if (inGraph && inFilter)
{
IEnumPins * pinEnum=0; DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn`9Kg9@
w - DirectShow - Filter -www.DirectShow.cn2H;{S0X"Ck)HXB if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) T#r
q
[
_D1S%d,y
{
pinEnum->Reset(); S5eoSh JE)E@
IPin * pin = 0; DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cn?b#[4l'i8@0@
ULONG cFetched = 0; www.directshow.cn7kq9KJ1lL!I"^
bool pass = true; DirectShow 开发, Filter 开发,多媒体编程, Directshow Filter - www.DirectShow.cn+A-^ AF/c
while (pass && SUCCEEDED(pinEnum->Next(1, &pin, &cFetched)))
{
if (pin && cFetched) - DirectShow - Filter -www.DirectShow.cn ggOg;GW
{ www.directshow.cn/*u"Qp}
IPin * connectedPin = 0;
pin->ConnectedTo(&connectedPin); www.directshow.cnUW Y]*YW*u-k
if(connectedPin)
{
PIN_INFO pininfo;
if (SUCCEEDED(connectedPin->QueryPinInfo(&pininfo)))
{
NukeUpstream(inGraph, pininfo.pFilter); www.directshow.cnM/MyZlA
inGraph->Disconnect(connectedPin);
inGraph->Disconnect(pin); - DirectShow - Filter -www.DirectShow.cnU3UK5Q,Qp/
inGraph->RemoveFilter(pininfo.pFilter);
}
pininfo.pFilter->Release();
}
connectedPin->Release();
}
else
{ DirectShow 开发,Filter 开发, 多媒体编程, Directshow Filter -www.DirectShow.cnH;XU,R^L0B
pass = false;
} www.directshow.cnh}pLoU|u*H#c
}
pinEnum->Release();
}
} www.directshow.cn
}