Dela via


Om MFI

Media Foundation-transformeringar (MFI) tillhandahåller en allmän modell för bearbetning av mediedata. MMFT används för avkodare, kodare och digitala signalprocessorer (DSP). Kort sagt är allt som finns i mediepipelinen mellan mediekällan och mediemottagaren en MFT.

För de flesta program döljs informationen om MFT-databehandling av högre lager i Media Foundation-arkitekturen. Många Media Foundation-program kommer aldrig att göra ett direktanrop till en MFT. Det är dock säkert möjligt att vara värd för en MFT direkt i ditt program.

MMFT är en utveckling av transformeringsmodellen som först introducerades med DirectX Media Objects (DMOs). Det är faktiskt relativt enkelt att skapa en transformering som stöder båda modellerna. Jämfört med DMO:er anges de nödvändiga beteendena för MFI tydligare, vilket gör det lättare att skriva en korrekt implementering. Dessutom kan MFI stödja maskinvaruaccelererad videobearbetning.

Det här avsnittet ger en kort översikt över MFT-bearbetningsmodellen med fokus på den övergripande designen snarare än specifika metodanrop. En mer detaljerad stegvis beskrivning finns i Grundläggande MFT-bearbetningsmodell.

Strömmar

En MFT har indataströmmar och utdataströmmar. Indataströmmar tar emot data och utdataströmmar skapar data. En avkodare har till exempel en indataström som tar emot kodade data och en utdataström som genererar de avkodade data.

Strömmarna på en MFT representeras inte som distinkta COM-objekt. I stället har varje ström en utsedd strömidentifierare, och metoderna i IMFTransform- gränssnitt tar strömidentifierare som indataparametrar.

Vissa MFT har ett fast antal strömmar. Till exempel har avkodare och kodare normalt exakt en indata och en utdata. Andra MMFT:er har ett dynamiskt antal strömmar. Om en MFT stöder dynamiska strömmar kan klienten lägga till nya indataströmmar. Klienten kan inte lägga till utdataströmmar, men MFT kan lägga till eller ta bort utdataströmmar under bearbetningen. Till exempel tillåter multiplexer vanligtvis att klienten lägger till indataströmmar och har en utdata för den multiplexade strömmen. Demultiplexers fungerar omvänt, med en ingång men ett dynamiskt antal utgångsströmmar, beroende på innehållet i ingångsströmmen. Följande bild visar skillnaden mellan multiplexer och demultiplexer.

diagram som visar en kodare/avkodare (1 indata, 1 utdata), en multiplexer (2 indata, 1 utdata) och en demultiplexer (1 indata, 2 utdata)

Medietyper

När en MFT först skapas har ingen av strömmarna ett etablerat format. Innan MFT kan bearbeta data måste klienten ange formaten för strömmarna. Med en avkodare är till exempel indataformatet det komprimeringsformat som används i den ursprungliga källfilen, och utdataformatet är ett okomprimerat format, till exempel PCM-ljud eller RGB-video. Dataströmformaten beskrivs med hjälp av Medietyper.

Beroende på MFT:s interna tillstånd kan det ge en lista över möjliga medietyper för varje ström. Du kan använda den här listan som ett tips när du anger medietyperna. Om du ställer in medietypen på en ström kan du ändra listan över möjliga typer för en annan ström. En avkodare kan till exempel vanligtvis inte ange några utdatatyper förrän klienten anger indatatypen. Indatatypen innehåller den information som avkodaren behöver för att returnera en lista över möjliga utdatatyper.

Om du vill ange medietypen på en ström anropar du IMFTransform::SetInputType eller IMFTransform::SetOutputType. Om du vill hämta listan över möjliga medietyper för en ström anropar du IMFTransform::GetInputAvailableType eller IMFTransform::GetOutputAvailableType.

Bearbetning av data

När klienten har angett medietyperna på strömmarna är MFT redo att bearbeta data. För att göra detta växlar klienten mellan att tillhandahålla indata till MFT och att hämta utdata från MFT:

Metoden ProcessInput tar en pekare till ett medieexempel som allokeras av klienten. Medieexemplet innehåller en eller flera buffertar och varje buffert innehåller indata som MFT kan bearbeta.

Metoden ProcessOutput stöder två olika allokeringsmodeller: Antingen allokerar MFT utdatabuffertarna eller så allokerar klienten utdatabuffertarna. Vissa MMFT stöder båda allokeringsmodellerna, men det krävs inte för att en MFT ska stödja båda. En MFT kan till exempel kräva att klienten allokerar utdatabuffertarna. Metoden IMFTransform::GetOutputStreamInfo returnerar information om en utdataström, inklusive vilken allokeringsmodell som MFT stöder.

MMFT är utformade för att buffrar så lite data som möjligt för att minimera svarstiden i pipelinen. Därför kan MFT vid varje given tidpunkt signalera något av följande villkor:

  • MFT kräver mer indata. I det här tillståndet kan MFT inte generera utdata förrän klienten anropar ProcessInput minst en gång.
  • MFT accepterar inte fler indata förrän klienten anropar ProcessOutput minst en gång.

Anta till exempel att du använder en videodekodare för att avkoda en videoström som innehåller en blandning av nyckelramar och deltaramar. Till en början kräver MFT vissa indata innan de kan avkoda några bildrutor. Klienten anropar ProcessInput för att leverera den första ramen. Anta att den första ramen är en deltaram (visas i följande diagram som "P" för förutsagd ram). Avkodaren håller kvar i den här ramen, men den kan inte generera några utdata förrän nästa nyckelram har hämtats.

diagram som visar mft som behöver indata och pekar på en förväntad ram

Klienten fortsätter att anropa ProcessInput- och når slutligen nästa nyckelram (visas i nästa diagram som "I" för intrakodad ram). Nu har avkodaren tillräckligt med ramar för att börja avkoda. I det här läget slutar den acceptera indata och klienten måste anropa ProcessOutput för att hämta de avkodade ramarna.

diagram som visar en mft som inte accepterar indata, pekande mot en intrakodad bildruta och tre förutsagda bildrutor

Den enklaste metoden för klienten är helt enkelt att växla anrop till ProcessInput och ProcessOutput. En mer avancerad algoritm beskrivs i avsnittet Basic MFT Processing Model.

Media Foundation transformerar