c ++ - Indsæt filter mellem brugerdefineret kilde og SmartTee lækager COM objekt

Indlæg af Hanne Mølgaard Plasc

Problem



Vi har en DirectShow-graf, der består af vores eget kildefilter, der gengives ved hjælp af CaptureGraphBuilder. I preview-tilstanden resulterer grafen i [[Source]] -> [[SmartTee]] - (PreviewPin) -> [[Decoder]] -> [[Renderer]]. Vores eget filter har en brugerdefineret tildeler og meddeler SmartTee om det. Afslutning nu vil være fint, alle objekter bliver udgivet.


Nu forsøger vi at indsætte et filter mellem vores eget kildefilter og SmartTee-filteret. Når du tilslutter det nyoprettede filter til vores kildefilter, oprettes en ny tildeler ved kildefiltret. Ved tilslutning af det nye filter (som ville foreslå en brugerdefineret tildeler på selve udgangsstiften) til SmartTee-filteret, foreslår SmartTee den tildeler, der blev oprettet i den første forbindelse mellem kilde og SmartTee. Men SmartTee burde have tabt denne allokering på grund af BreakConnect. Afslutte applikationen resulterer nu i et resterende kildeallokeringsobjekt, som er den tildeler, der er oprettet i den første forbindelse.


Kilden filteret, såvel som det indsatte filter har en InitAllocator funktion på output pin for at foreslå tildelingen.

Bedste reference


Du kan kontrollere kilden til DecideAllocator funktion i CBaseOutputPin klasse. Udgangsstiften vælger en tildeler. Den kan bruge en, der leveres af indtastningsstiften, eller oprette sin egen: https://msdn.microsoft.com/en-us/library/windows/desktop/dd390924(v=vs.85).aspx
For at gøre det kalder CBaseOutputPin GetAllocator af indgangsstiften og bestemmer, om indgangen giver sin egen tildeler.
For at give en tildeler til en output-pin, tilsidesætter du CBaseOutputPin :: InitAllocator-metoden for at oprette en forekomst af din tildeler: https://msdn.microsoft.com/en-us/library/windows/desktop/dd377477(v=vs. 85) Aspx
På dette tidspunkt skal din tildeler bruges, og outpinen kalder IMemInputPin :: NotifyAllocator for at informere indtastningsstiftet for udvælgelsen. Hvis NotifyAllocator returnerer en fejl, er tildeleren frigivet.
Har du baseret din output pin på CBaseOutputPin og har du erstattet DecideAllocator-metoden? [1] [2]