Maskinvaru-MFI
Not
Det här avsnittet gäller för Windows 7 eller senare.
Det här avsnittet beskriver hur du skriver en Media Foundation-transformering (MFT) som fungerar som en proxy till en maskinvarukodare, avkodare eller digital signalprocessor (DSP).
Viktig
Om en maskinvarukodc använder avstream-drivrutinen för multimediaklass krävs ingen anpassad MFT. Media Foundation tillhandahåller en AVStream-proxy för detta ändamål. Informationen i det här avsnittet gäller endast i specialfall där maskinvarukodexen inte använder AVStream. Mer information finns i Hardware Codec Support in AVStream.
Det här avsnittet innehåller följande avsnitt:
- Introduktion
- MFT-maskinvaruattribut
- Handskakningssekvens för maskinvara
- databearbetning
- parkopplad avkodare/kodare
- Relaterade ämnen
Införandet
Alla maskinvarukodc som inte baseras på AVStream måste tillhandahålla sin egen MFT för att fungera som en proxy till drivrutinen. En maskinvarukodex kan innehålla flera olika funktionella block:
- Kodare
- Avkodare
- Ramskalning/formatkonvertering
Var och en av dessa funktioner ska hanteras av en separat MFT. En maskinvaru-MFT bör aldrig fungera som en multifunktionell "transcoder". Placera i stället kodningsfunktioner i en kodare mFT och avkodningsfunktioner i en avkodare MFT. Om maskinvaran erbjuder ramskalning och formatkonverteringar placerar du dessa funktioner i en separat videoprocessor som är registrerad i kategorin MFT_CATEGORY_VIDEO_PROCESSOR. Om maskinvaran inte stöder ramskalning eller formatkonvertering tillhandahåller Media Foundation en videoprocessor för programvara.
Maskinvaru-MMFT:erna har följande allmänna krav:
- Maskinvaru-MMFT måste använda den nya asynkrona bearbetningsmodellen enligt beskrivningen i Asynkrona MFI-.
- Maskinvaru-MMFT måste ha stöd för ändringar i dynamiskt format enligt beskrivningen i Ändringar i dynamiskt format.
MFT-maskinvaruattribut
En maskinvaru-MFT måste implementera följande metoder som rör attribut:
- IMFTransform::GetAttributes: Returnerar ett attributarkiv för globala MFT-attribut.
- IMFTransform::GetInputStreamAttributes: Returnerar ett attributarkiv för en indataström.
- IMFTransform::GetOutputStreamAttributes: Returnerar ett attributarkiv för en utdataström.
När MFT först skapas måste den ange följande attribut i sitt eget globala attributarkiv (det vill: attributarkivet som returneras av GetAttributes):
Attribut | Beskrivning |
---|---|
MF_TRANSFORM_ASYNC | Måste anges till TRUE. Anger att MFT utför asynkron bearbetning. |
MFT_ENUM_HARDWARE_URL_Attribute | Innehåller den symboliska länken för maskinvaruenheten. Topologiinläsaren använder förekomsten av det här attributet för att testa om en MFT representerar en maskinvaruenhet. |
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE | Måste anges till TRUE. Anger att MFT stöder ändringar i dynamiskt format. |
Handskakningssekvens för maskinvara
Om två MMFT representerar samma fysiska enhet kan de utbyta data inom maskinvaran, till exempel via en maskinvarubuss. Du behöver inte kopiera data till systemminnet och sedan tillbaka till enheten.
I följande diagram representerar MMFT:erna märkta "A" och "B" funktionella block inom samma maskinvara. I ett omkodningsscenario kan till exempel "A" representera en maskinvarudekodare och "B" kan representera en maskinvarukodare. Dataflödet mellan "A" och "B" sker inom maskinvaran. MFT märkt "C" är en programvara MFT. Dataflödet från "B" till "C" använder systemminne.
För att upprätta en maskinvaruanslutning måste de två maskinvaru-MFI använda en privat kommunikationskanal. Den här anslutningen upprättas under formatförhandlingen innan medietyperna anges och före det första anropet till ProcessInput. Anslutningsprocessen fungerar på följande sätt:
Topologiinläsaren kontrollerar båda MFT:erna för förekomsten av attributet MFT_ENUM_HARDWARE_URL_Attribute. Observera att den inte undersöker värdet för det här attributet.
Om MFT_ENUM_HARDWARE_URL_Attribute finns på båda MMFT:erna gör topologiinläsaren följande:
- Topologiinläsaren anropar IMFTransform::GetOutputStreamAttributes på den överordnade MFT (A). Den här metoden returnerar en IMFAttributes pekare. Låt den här pekaren anges pUpstream.
- Topologiinläsaren anropar IMFTransform::GetInputStreamAttributes på nedströms MFT (B). Det här anropet returnerar också en IMFAttributes pekare. Låt den här pekaren anges pDownstream-.
- Topologiinläsaren anger attributet MFT_CONNECTED_STREAM_ATTRIBUTE på pDownstream- genom att anropa IMFAttributes::SetUnknown. Värdet för attributet är pUpstream pekare.
- Topologiinläsaren anger attributet MFT_CONNECTED_TO_HW_STREAM till TRUE på både pDownstream och pUpstream.
I det här läget har nedströms-MFT en pekare till det överordnade MFT-attributarkivet, enligt följande diagram.
Not
För tydlighetens skull visar det här diagrammet strömmarna och attributarkiven som distinkta objekt, men det krävs inte för implementeringen.
Den underordnade MFT använder IMFAttributes pekare för att upprätta en privat kommunikationskanal med den överordnade MFT. Eftersom kanalen är privat definieras den exakta mekanismen av implementeringen. MFT kan till exempel fråga efter ett privat COM-gränssnitt.
Under steg 4 måste den underordnade MFT-enheten kontrollera om de två MMFT:erna delar samma fysiska enhet. Annars måste de återgå till att använda systemminne för datatransport. Detta gör att MFT kan fungera korrekt med programvaru-MMFT och andra maskinvaruenheter.
Om handskakningen lyckas och de två MMFT:erna delar en privat datakanal använder de inte standardmodellen för databearbetning (beskrivs i nästa avsnitt) vid anslutningspunkten. Mer specifikt skickar inte nedströms-MFT METransformNeedInput händelser. Mer information finns i nästa avsnitt i det här avsnittet.
Databehandling
När en maskinvaru-MFT använder systemminne för datatransport fungerar processen på följande sätt:
- Om du vill begära mer indata skickar MFT en METransformNeedInput- händelse.
- Händelsen METransformNeedInput gör att pipelinen anropar IMFTransform::P rocessInput.
- När MFT har utdata skickar MFT en METransformHaveOutput- händelse.
- Händelsen METransformHaveOutput gör att pipelinen anropar IMFTransform::P rocessOutput.
Mer information finns i Asynkrona MFI-.
Om MFT använder en maskinvarukanal skickar den dock inte dessa händelser på maskinvaruanslutningsplatsen, eftersom all dataöverföring sker internt inom maskinvaran. Därför anropar pipelinen inte ProcessInput- eller ProcessOutput- vid anslutningspunkten.
Tänk till exempel på det första diagrammet i det här avsnittet. Med tanke på den här konfigurationen skulle databehandling ske på följande sätt:
- "A" skickar METransformNeedInput- för att begära data.
- Pipelinen anropar ProcessInput på "A".
- "A" och "B" bearbetar data i maskinvaran.
- När bearbetningen är klar skickar "B" en METransformHaveOutput- händelse.
- Pipelinen anropar ProcessOutput på "B".
Parkopplad avkodare/kodare
Om en avkodare och kodare finns på samma maskinvaruchip kan det vara bättre att använda dem tillsammans vid omkodning. Det innebär att om du väljer den ena bör den andra väljas i omkodningspipelinen. För att säkerställa att matchande maskinvarukodkort väljs bör båda kodade MFI erbjuda en anpassad medietyp. Så här skapar du en anpassad medietyp:
- Ange attributet MF_MT_MAJOR_TYPE till MFMediaType_Audio eller MFMediaType_Video, efter behov.
- Ange attributet MF_MT_SUBTYPE till ett anpassat GUID-värde.
Andra typattribut är valfria. Avkodaren returnerar den anpassade typen från sin IMFTransform::GetOutputAvailableType, och kodaren returnerar den anpassade typen från sin IMFTransform::GetInputAvailableType-metoden. I båda fallen måste den anpassade typen vara den första posten i listan (dwTypeIndex = 0).
Om du vill arbeta med programvaru codecs bör codec också returnera minst ett standardformat, till exempel NV12 för video. Standardformat bör visas efter den anpassade typen (dwTypeIndex> 0). Om de två codec-koderna alltid måste kopplas ihop och inte kan samverka med programvarukodare, bör MFI returnera endast det anpassade formatet och inte returnera några standardformat.
Not
Om en avkodare inte returnerar några standardformat kan den inte användas för uppspelning med Enhanced Video Renderer. I så fall bör den registreras som en avkodare med endast transcode. Se Transcode-Only avkodare.
Relaterade ämnen