integra753
integra753

Reputation: 271

DirectShow .Net AddSourceFilter Release file

I have an application which plays video using DirectShow.Net and also records video. When I try to record to a filename that has just been used for playback by DirectShow it fails as the file is still in use. Sometimes it will work but take anywhere from 5 - 60 seconds until the file is unlocked. Before the recording is attempted the playback graph has definitely been destroyed. The code for creating and destroying the graph is below. If I stop and start my application following playback I can record to the same filename and there are no file locking issues.

Can anyone advise how I can correctly release the source filter so the file is not locked?

Creating the graph

try
{
    graphBuilder = (IGraphBuilder)new FilterGraph();

#if DEBUG
    // "Connect to remote graph" in GraphEdit
    rotEntry = new DsROTEntry(graphBuilder);
#endif

    hr = graphBuilder.AddSourceFilter(filename, filename, out baseFilter);
    DsError.ThrowExceptionForHR(hr);

    vmr9 = (IBaseFilter)new VideoMixingRenderer9();

    ConfigureVMR9InWindowlessMode();

    hr = graphBuilder.AddFilter(vmr9, "Video Mixing Renderer 9");
    DsError.ThrowExceptionForHR(hr);

    FilterGraphTools.ConnectFilters(graphBuilder, baseFilter, "Output", vmr9, "VMR Input0", true);
}

Destroying the graph

if (vmr9 != null)
{
    Marshal.ReleaseComObject(vmr9);
    vmr9 = null;
    windowlessCtrl = null;
}

if (graphBuilder != null)
{     
    // Remove and release all filters
    FilterGraphTools.RemoveAllFilters(graphBuilder);
    Marshal.ReleaseComObject(graphBuilder);
    graphBuilder = null;
    baseFilter = null;
}
#if DEBUG
if (rotEntry != null)
{
    rotEntry.Dispose();
    rotEntry = null;
}
#endif

Upvotes: 1

Views: 1320

Answers (1)

Roman Ryltsov
Roman Ryltsov

Reputation: 69706

Eventually the graph is a set of connected COM objects, and successful graph termination depends on correct release, without any leaked references. References that you might have left unreleased are leading to objects kept alive and possibly locking certain resources.

The best you can do is explicit termination/removal of individual objects:

  • Stop the graph
  • Remove all fitlers explicitly using IFilterGraph2.RemoveFilter
  • Use filter dependent methods calls to possibly terminate individual filters, such as by putting empty path to file source/sink filters

If even leak takes place, the graph should no longer reference resources. Note that you sometimes can also reuse filters if you are re-creating the graph.

Upvotes: 1

Related Questions