Sdílet prostřednictvím


Hardwarové MFT

Poznámka

Toto téma se týká Windows 7 nebo novějšího.

 

Toto téma popisuje, jak napsat transformaci Media Foundation (MFT), která funguje jako proxy server pro hardwarový kodér, dekodér nebo digitální procesor signálu (DSP).

Důležitý

Pokud hardwarový kodek používá ovladač multimediální třídy AVStream, nevyžaduje vlastní MFT. Media Foundation poskytuje pro tento účel proxy server AVStream. Informace v tomto tématu platí pouze ve speciálním případě, kdy hardwarový kodek nepoužívá AVStream. Další informace naleznete v tématu Podpora hardwarového kodeku v AVStream.

 

Toto téma obsahuje následující části:

Úvod

Jakýkoli hardwarový kodek, který není založený na AVStreamu, musí poskytovat vlastní MFT, aby fungoval jako proxy server ovladače. Hardwarový kodek může obsahovat několik různých funkčních bloků:

  • Kodér
  • Dekodér
  • Převod velikosti rámce nebo formátu

Každá z těchto funkcí by měla být spravována samostatným MFT. Hardware MFT by nikdy neměl fungovat jako multi-účelový "transkódovač". Místo toho umístěte kódovací funkce do kodéru MFT a dekódování funkcí do dekodéru MFT. Pokud hardware nabízí převody snímků a formátů, umístěte tyto funkce do samostatného videoprocesoru registrovaného v kategorii MFT_CATEGORY_VIDEO_PROCESSOR. Pokud hardware nepodporuje škálování snímků nebo převod formátu, Media Foundation poskytuje softwarový videoprocesor.

Hardwarové MFT mají následující obecné požadavky:

  • Hardwarové MFT musí používat nový model asynchronního zpracování, jak je popsáno v Asynchronní MFT.
  • Hardwarové MFT musí podporovat změny dynamického formátu, jak je popsáno v Změny dynamického formátu.

Hardwarové atributy MFT

Hardware MFT musí implementovat následující metody související s atributy:

Při prvním vytvoření MFT musí nastavit následující atributy ve vlastním globálním úložišti atributů (to znamená úložiště atributů vrácené GetAttributes):

Atribut Popis
MF_TRANSFORM_ASYNC Musí být nastavena na hodnotu TRUE. Označuje, že MFT provádí asynchronní zpracování.
MFT_ENUM_HARDWARE_URL_Attribute Obsahuje symbolický odkaz pro hardwarové zařízení.
Zavaděč topologie používá přítomnost tohoto atributu k otestování, jestli MFT představuje hardwarové zařízení.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE Musí být nastavena na hodnotu TRUE. Označuje, že MFT podporuje změny dynamického formátu.

 

Hardwarová sekvence handshake

Pokud dva MFT představují stejné fyzické zařízení, mohou vyměňovat data v rámci hardwaru – například přes hardwarovou sběrnici. Není nutné kopírovat data do systémové paměti a pak zpátky do zařízení.

V následujícím diagramu MFT označené jako "A" a "B" představují funkční bloky ve stejném hardwaru. Například ve scénáři překódování může "A" představovat hardwarový dekodér a "B" může představovat hardwarový kodér. Tok dat mezi "A" a "B" probíhá v rámci hardwaru. MFT označený jako "C" je softwarový MFT. Tok dat z "B" do "C" používá systémovou paměť.

diagram zobrazující rámečky označené písmenem c a hardwarový kodek: bod b a kodek, kodek odkazuje na b a b a b odkazuje na c

K navázání hardwarového připojení musí dva hardwarové MFT používat privátní komunikační kanál. Toto připojení je vytvořeno během vyjednávání formátu, před nastavením typů médií a před prvním voláním ProcessInput. Proces připojení funguje takto:

  1. Zavaděč topologie kontroluje přítomnost atributu MFT_ENUM_HARDWARE_URL_Attribute oba MFT. Všimněte si, že nezkoumá hodnotu tohoto atributu.

  2. Pokud je MFT_ENUM_HARDWARE_URL_Attribute v obou MFT, zavaděč topologie provede následující:

    1. Zavaděč topologie volá DATACENTERTransform::GetOutputStreamAttributes v upstreamovém MFT (A). Tato metoda vrátí ukazatel MMFAttributes. Nechte tento ukazatel označen pUpstream.
    2. Zavaděč topologie volá DATACENTERTransform::GetInputStreamAttributes v podřízené MFT (B). Toto volání také vrátí MMFAttributes ukazatel. Nechte tento ukazatel označen pDownstream.
    3. Zavaděč topologie nastaví atribut MFT_CONNECTED_STREAM_ATTRIBUTE na pDownstream voláním MMFAttributes::SetUnknown. Hodnota atributu je ukazatel pUpstream.
    4. Zavaděč topologie nastaví atribut MFT_CONNECTED_TO_HW_STREAM na TRUE na pDownstream i pUpstream.
  3. V tomto okamžiku má podřízený MFT ukazatel na upstreamové úložiště atributů MFT, jak je znázorněno v následujícím diagramu.

    diagram s jednotlivými mfty ukazující na datový proud, každý datový proud směřující na jeho úložiště a vstupní úložiště s přerušovanou čárou do výstupního úložiště

    Poznámka

    Pro přehlednost tento diagram znázorňuje datové proudy a atributy úložiště jako odlišné objekty, ale to není nutné pro implementaci.

     

  4. Podřízený MFT používá MMFAttributes ukazatel k navázání privátního komunikačního kanálu s upstream MFT. Protože kanál je soukromý, přesný mechanismus je definován implementací. Například MFT může dotazovat na privátní rozhraní COM.

Během kroku 4 musí podřízený MFT ověřit, jestli dva MFT sdílejí stejné fyzické zařízení. Pokud ne, musí se vrátit do systémové paměti pro přenos dat. Díky tomu může MFT správně pracovat se softwarovými MFT a dalšími hardwarovými zařízeními.

Pokud handshake proběhne úspěšně a dva MFT sdílejí privátní datový kanál, nepoužívají standardní model zpracování dat (popsaný v další části) v spojovacím bodu. Konkrétně podřízený MFT neodesílá události METransformNeedInput; Další podrobnosti najdete v další části tohoto tématu.

Zpracování dat

Pokud hardware MFT používá systémovou paměť pro přenos dat, proces funguje takto:

  1. Pro vyžádání dalšího vstupu odešle MFT událost METransformNeedInput.
  2. Událost METransformNeedInput způsobí volání kanálu MMFTransform::P rocessInput.
  3. Pokud MFT obsahuje výstupní data, MFT odešle METransformHaveOutput událost.
  4. Událost METransformHaveOutput způsobí volání kanálu MMFTransform::P rocessOutput.

Podrobnosti najdete v asynchronních MFT.

Pokud však MFT používá hardwarový kanál, neodesílá tyto události v hardwarovém spojovacím bodu, protože veškerý přenos dat probíhá interně v rámci hardwaru. Kanál proto nevyvolá ProcessInput ani ProcessOutput v spojovacím bodu.

Představte si například první diagram v tomto tématu. Při této konfiguraci by zpracování dat probíhalo takto:

  1. "A" odešle METransformNeedInput k vyžádání dat.
  2. Kanál volá ProcessInput na "A".
  3. "A" a "B" zpracovávají data v hardwaru.
  4. Po dokončení zpracování odešle "B" událost METransformHaveOutput.
  5. Kanál volá ProcessOutput na B.

Spárovaný dekodér/kodér

Pokud jsou dekodér a kodér umístěny na stejném hardwarovém čipu, může být vhodnější je při překódování použít společně. To znamená, že výběr jednoho by měl způsobit výběr druhého v kanálu transkódování. Aby bylo zajištěno, že jsou vybrány odpovídající hardwarové kodeky, měly by oba kodeky MFT nabízet vlastní typ média. Vytvoření vlastního typu média:

  • Podle potřeby nastavte atribut MF_MT_MAJOR_TYPE na MFMediaType_Audio nebo MFMediaType_Video.
  • Nastavte atribut MF_MT_SUBTYPE na vlastní hodnotu GUID.

Jiné atributy typu jsou volitelné. Dekodér vrátí vlastní typ z jeho MMFTransform::GetOutputAvailableTypea kodér vrátí vlastní typ z jeho MMFTransform::GetInputAvailableType metoda. V obou případech musí být vlastní typ první položkou v seznamu (dwTypeIndex = 0).

Aby bylo možné pracovat se softwarovými kodeky, měl by tento kodek vrátit alespoň jeden standardní formát, například NV12 pro video. Standardní formáty by se měly zobrazit za vlastním typem (dwTypeIndex> 0). Pokud musí být tyto dva kodeky vždy spárované a nemůžou spolupracovat se softwarovými kodeky, MFT by měly vracet pouze vlastní formát a nevrací žádné standardní formáty.

Poznámka

Pokud dekodér nevrací žádné standardní formáty, nelze jej použít k přehrávání s Enhanced Video Renderer. V takovém případě by se měl zaregistrovat jako dekodér jen pro transkódování. Viz dekodérůTranscode-Only .

 

psaní vlastního MFT

implementace kodeku MFT

transformace Media Foundation