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).