Lance
Lance

Reputation: 1

DirectShow .NET custom graph

I am trying to build a custom graph filter and I am having problems.

I am using the C# DirectShow.NET lib

I am reading a file with vc1 video and dts audio. i add the source filter to the graph, it works fine, i can also add the splitter filter (using lav splitter), but when i try to connect the file source filter to the lav splitter, it fails.

and it fails, because it doesn't find any input pin on the splitter ... i know that output pins can be dynamic, but the input pin should be there right ?

this is the code

_graphBuilder = (IGraphBuilder)new FilterGraph();
_dsRotEntry = new DsROTEntry((IFilterGraph)_graphBuilder);

LogInfo("Adding source filter...");
int hr = _graphBuilder.AddSourceFilter(_inputFilePath, _inputFilePath, 
    out _fileSource);
DsError.ThrowExceptionForHR(hr);

IPin pinSourceOut = DsFindPin.ByDirection(_fileSource, PinDirection.Output, 0);
if (pinSourceOut == null)
{
    LogError("Unable to find source output pin");
};

IBaseFilter lavSplitter = CreateFilter(LAV_SPLITTER);
if (lavSplitter == null)
{
    LogError("LAV Splitter not found");
};

hr = _graphBuilder.AddFilter(lavSplitter, "LAV Splitter");
DsError.ThrowExceptionForHR(hr);

bool result = TryConnectToAny(pinSourceOut, lavSplitter);
if (!result)
{
    LogError("Unable to connect FileSource with LAV Splitter");
}

and

private bool TryConnectToAny(IPin sourcePin, IBaseFilter destinationFilter)
{
    IEnumPins pinEnum;
    int hr = destinationFilter.EnumPins(out pinEnum);
    DsError.ThrowExceptionForHR(hr);
    IPin[] pins = { null };
    while (pinEnum.Next(pins.Length, pins, IntPtr.Zero) == 0)
    {
        int err = _graphBuilder.Connect(sourcePin, pins[0]);
        if (err == 0)
            return true;
        Marshal.ReleaseComObject(pins[0]);
    }
    return false;
}

Upvotes: 0

Views: 1661

Answers (1)

Roman Ryltsov
Roman Ryltsov

Reputation: 69734

Most likely that input pin does exist, and what fails is the connection itself. err holds error code to possibly explain the problem. If it is unable to make the connection, TryConnectToAny returns false the same way as if there were no input pins on the filter at all.

Upvotes: 1

Related Questions