DirectShow - Filtergraph umbauen



  • So, meine Filterklasse läuft inzwischen ganz gut (sogar die Synchronisation klappt ohne größere Komplikationen), aber jetzt taucht ein neues Problem mit meiner Testumgebung auf:

    In der Ausgangssituation habe ich einen IGraphBuilder* pGraph, der den ganzen Graph verwaltet, sein IMediaControl* pCnt (für die Ablaufsteuerung) und drei in Reihe geschaltete Filter pSrc (vom Graph über AddSourceFilter() geliefert), pKonv (mein selbstgeschriebener Transform-Filter) und ein Null Renderer sowie deren Ein- und Ausgangspins.
    Dann starte ich den Graphen mittels pCnt->Run() - alles läuft wunderbar (sprich: pSrc liefert einzeln jedes Bild der Datei aus un jagt es durch den Graphen).

    Das Problem kommt, wenn ich am Ende der Datei angekommen bin und den Source-Filter austauschen will: Direkt nach dem Start des Filtergraphen verabschiedet sich mein Programm mit einer Access Violation.

    Habe ich mir das Umbauen eventuell zu einfach gemacht?

    //Filtergraph anhalten:
    pCnt->Stop();
    //alten Source-Filter abklemmen und aus Graph entfernen:
    pGraph->Disconnect(pSrcOut);
    pGraph->Disconnect(pKonvIn);
    pGraph->RemoveFilter(pSrc);
    //neuen Sourc-Filter holen und anschließen:
    pGraph->AddSourceFilter(filename,L"Quelle",&pSrc);
    pSrc->EnumPins(&pEnum);
    pEnum->Next(1,&pSrcOut,&n);
    pGraph->Connect(pSrcOut,pKonvIn);
    pGraph->Reconnect(pKonvOut);//reinitialisiert Verbindung zum Renderer
    //Filtergraph neu starten:
    pCnt->Run();
    

    (PS: Wenn ich die selbe Datei nochmal neu lade, gibt es keinen Fehler, allerdings werden nur die ersten paar Samples übertragen, danach hört der Source-Filter auf)



  • So, Problem ist gelöst - ich war wirklich zu "faul" beim Umbauen des Filtergraphen.

    (oder ausführlicher: Der GraphBuilder hatte zwischen pSrc und pKonv noch einen MPEG Splitter und einen MPEG Decoder eingereiht - und ich hatte vergessen, deren Ein/Ausgangspins zu disconnecten (offenbar mit dem Ergebnis, daß der Splitter versucht hat, den nicht mehr existierenden alten Sourcefilter um Daten zu bitten).


Anmelden zum Antworten