13.01.2013, 00:43
|
Специалист
|
|
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
|
|
Код:
unit ConFilters;
interface
uses DirectShow9;
function GetUnconnectedPin(
pFilter: IBaseFilter; // Pointer to the filter.
PinDir: PIN_DIRECTION; // Direction of the pin to find.
out ppPin: IPin // Receives a pointer to the pin.
): HRESULT;
function ConnectFilters(
pGraph: IGraphBuilder; // Filter Graph Manager.
pOut: IPin; // Output pin on the upstream filter.
pDest: IBaseFilter // Downstream filter.
): HRESULT; overload;
function ConnectFilters(
pGraph: IGraphBuilder;
pSrc, pDest: IBaseFilter): HRESULT; overload;
implementation
uses Windows, ActiveX;
function GetUnconnectedPin(
pFilter: IBaseFilter;
PinDir: PIN_DIRECTION;
out ppPin: IPin
): HRESULT;
var
pEnum: IEnumPins;
pPin: IPin;
ThisPinDir: TPinDirection;
pTmp: IPin;
begin
Result:= pFilter.EnumPins(pEnum);
if FAILED(Result) then Exit;
while pEnum.Next(1, pPin, nil) = S_OK do
begin
pPin.QueryDirection(ThisPinDir);
if ThisPinDir = PinDir then
begin
Result:= pPin.ConnectedTo(pTmp);
if SUCCEEDED(Result) then // Already connected, not the pin we want.
pTmp:= nil
else // Unconnected, this is the pin we want.
begin
pEnum:= nil;
ppPin:= pPin;
Result:= S_OK; Exit;
end;
end;
pPin:= nil;
end;
pEnum:= nil;
// Did not find a matching pin.
Result:= E_FAIL;
end;
function ConnectFilters(
pGraph: IGraphBuilder; // Filter Graph Manager.
pOut: IPin; // Output pin on the upstream filter.
pDest: IBaseFilter // Downstream filter.
): HRESULT;
var
pIn: IPin;
begin
// Find an input pin on the downstream filter.
Result:= GetUnconnectedPin(pDest, PINDIR_INPUT, pIn);
if FAILED(Result) then Exit;
// Try to connect them.
Result:= pGraph.Connect(pOut, pIn);
pIn:= nil;
end;
function ConnectFilters(
pGraph: IGraphBuilder;
pSrc, pDest: IBaseFilter): HRESULT;
var
pOut: IPin;
begin
// Find an output pin on the first filter.
Result:= GetUnconnectedPin(pSrc, PINDIR_OUTPUT, pOut);
if FAILED(Result) then Exit;
Result:= ConnectFilters(pGraph, pOut, pDest);
pOut:= nil;
end;
end.
|