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
- hardwarových atributů MFT
- hardwarová sekvence handshake
- zpracování dat
- spárovaný dekodér/kodér
- související témata
Ú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:
- MMFTransform::GetAttributes: Vrátí úložiště atributů pro globální atributy MFT.
- MMFTransform::GetInputStreamAttributes: Vrátí úložiště atributů pro vstupní datový proud.
- MMFTransform::GetOutputStreamAttributes: Vrátí úložiště atributů pro výstupní datový proud.
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ěť.
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:
Zavaděč topologie kontroluje přítomnost atributu MFT_ENUM_HARDWARE_URL_Attribute oba MFT. Všimněte si, že nezkoumá hodnotu tohoto atributu.
Pokud je MFT_ENUM_HARDWARE_URL_Attribute v obou MFT, zavaděč topologie provede následující:
- Zavaděč topologie volá DATACENTERTransform::GetOutputStreamAttributes v upstreamovém MFT (A). Tato metoda vrátí ukazatel MMFAttributes. Nechte tento ukazatel označen pUpstream.
- Zavaděč topologie volá DATACENTERTransform::GetInputStreamAttributes v podřízené MFT (B). Toto volání také vrátí MMFAttributes ukazatel. Nechte tento ukazatel označen pDownstream.
- Zavaděč topologie nastaví atribut MFT_CONNECTED_STREAM_ATTRIBUTE na pDownstream voláním MMFAttributes::SetUnknown. Hodnota atributu je ukazatel pUpstream.
- Zavaděč topologie nastaví atribut MFT_CONNECTED_TO_HW_STREAM na TRUE na pDownstream i pUpstream.
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.
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.
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:
- Pro vyžádání dalšího vstupu odešle MFT událost METransformNeedInput.
- Událost METransformNeedInput způsobí volání kanálu MMFTransform::P rocessInput.
- Pokud MFT obsahuje výstupní data, MFT odešle METransformHaveOutput událost.
- 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:
- "A" odešle METransformNeedInput k vyžádání dat.
- Kanál volá ProcessInput na "A".
- "A" a "B" zpracovávají data v hardwaru.
- Po dokončení zpracování odešle "B" událost METransformHaveOutput.
- 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 .
Související témata
-
psaní vlastního MFT
-
implementace kodeku MFT