Показать сообщение отдельно
  #10  
Старый 13.01.2013, 00:43
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 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.
Ответить с цитированием