Informace o MFT
Transformace Media Foundation (MFT) poskytují obecný model pro zpracování mediálních dat. MFT se používají pro dekodéry, kodéry a digitální procesory signálu (DSP). Stručně řečeno, cokoli, co se nachází v kanálu médií mezi zdrojem médií a jímkou médií, je MFT.
U většiny aplikací jsou podrobnosti zpracování dat MFT skryty vyššími vrstvami architektury Media Foundation. Mnoho aplikací Media Foundation nikdy nebude přímo volat MFT. Je však jistě možné hostovat MFT přímo ve vaší aplikaci.
MFT jsou vývojem transformačního modelu, který byl poprvé představen s objekty médií DirectX (DMO). Ve skutečnosti je poměrně snadné vytvořit transformaci, která podporuje oba modely. Ve srovnání s objekty dynamické správy jsou požadovaná chování MFT jasně specifikována, což usnadňuje zápis správné implementace. Kromě toho můžou MFT podporovat hardwarově akcelerované zpracování videa.
Toto téma poskytuje stručný přehled modelu zpracování MFT, který se zaměřuje na celkový návrh, nikoli na konkrétní volání metod. Podrobnější podrobný popis najdete v tématu Základní model zpracování MFT.
Proudy
MFT obsahuje vstupní datové proudy a výstupní datové proudy. Vstupní datové proudy přijímají data a výstupní datové proudy vytvářejí data. Dekodér má například jeden vstupní datový proud, který přijímá zakódovaná data, a jeden výstupní datový proud, který vytváří dekódovaná data.
Datové proudy v MFT nejsou reprezentovány jako odlišné objekty COM. Místo toho má každý datový proud určený identifikátor datového proudu a metody v MMFTransform rozhraní přebírají identifikátory datového proudu jako vstupní parametry.
Některé MFT mají pevný počet datových proudů. Dekodéry a kodéry mají například obvykle přesně jeden vstup a jeden výstup. Jiné MFT mají dynamický počet datových proudů. Pokud MFT podporuje dynamické datové proudy, může klient přidat nové vstupní streamy. Klient nemůže přidat výstupní streamy, ale MFT může během zpracování přidávat nebo odebírat výstupní streamy. Multiplexery například obvykle umožňují klientovi přidat vstupní datové proudy a mít jeden výstup pro multiplexovaný datový proud. Demultiplexery jsou obrácené, s jedním vstupem, ale dynamickým počtem výstupních datových proudů v závislosti na obsahu vstupního datového proudu. Následující obrázek ukazuje rozdíl mezi multiplexerem a demultiplexerem.
Typy médií
Při prvním vytvoření MFT nemá žádný z datových proudů nastavený formát. Aby MFT mohl zpracovávat data, musí klient nastavit formáty datových proudů. Například s dekodérem je vstupní formát komprese použitý v původním zdrojovém souboru a výstupní formát je nekomprimovaný formát, například zvuk PCM nebo video RGB. Formáty datových proudů jsou popsány pomocí typy médií.
V závislosti na vnitřním stavu MFT může poskytnout seznam možných typů médií pro každý datový proud. Tento seznam můžete použít jako nápovědu při nastavování typů médií. Nastavení typu média v jednom datovém proudu může změnit seznam možných typů pro jiný datový proud. Dekodér například obvykle nemůže poskytovat žádné výstupní typy, dokud klient nenastaví vstupní typ. Vstupní typ obsahuje informace, které dekodér potřebuje k vrácení seznamu možných výstupních typů.
Chcete-li nastavit typ média ve streamu, zavolejte IMFTransform::SetInputType nebo IMFTransform::SetOutputType. Chcete-li získat seznam možných typů médií pro datový proud, zavolejte MMFTransform::GetInputAvailableType nebo MMFTransform::GetOutputAvailableType.
Zpracování dat
Jakmile klient nastaví typy médií ve streamech, MFT je připraven ke zpracování dat. Aby k tomu došlo, klient se střídá mezi poskytováním vstupních dat MFT a získáváním výstupních dat z MFT:
- Chcete-li poskytnout vstupní data MFT, zavolejte IMFTransform::ProcessInput.
- Chcete-li vyžádat výstupní data z MFT, zavolejte IMFTransform::ProcessOutput.
Metoda ProcessInput přebírá ukazatel na ukázku média přidělenou klientem. Ukázka média obsahuje jednu nebo více vyrovnávacích pamětí a každá vyrovnávací paměť obsahuje vstupní data pro zpracování MFT.
Metoda ProcessOutput podporuje dva různé modely přidělování: Buď MFT přidělí výstupní vyrovnávací paměti, nebo klient přidělí výstupní vyrovnávací paměti. Některé MFT podporují oba modely přidělování, ale není nutné, aby MFT podporoval obojí. Například MFT může vyžadovat, aby klient alokoval výstupní buffery. Metoda MMFTransform::GetOutputStreamInfo vrací informace o výstupním datovém proudu, včetně modelu přidělování, který MFT podporuje.
MFT jsou navrženy tak, aby ukládaly co nejméně dat do vyrovnávací paměti, aby se minimalizovala latence v potrubí. Proto MFT může v daném okamžiku signalizovat jednu z následujících podmínek:
- MFT vyžaduje více vstupních dat. V tomto stavu MFT nemůže vytvořit výstup, dokud klient nevolá ProcessInput alespoň jednou.
- MFT nebude přijímat žádné další vstupy, dokud klient nevolá ProcessOutput alespoň jednou.
Předpokládejme například, že používáte dekodér videa k dekódování video streamu, který obsahuje kombinaci klíčových snímků a delta snímků. MFT zpočátku vyžaduje nějaký vstup, aby mohl dekódovat jakékoli rámce. Klient volá ProcessInput za účelem doručení prvního snímku. Předpokládejme, že první rámec je rozdílový rámec (zobrazený v následujícím diagramu jako P pro predikovaný rámec). Dekodér si tento rámec ponechá, ale nemůže vytvořit žádný výstup, dokud nezíská další klíčový snímek.
Klient pokračuje v volání ProcessInput a nakonec dosáhne dalšího klíčového rámce (zobrazený v dalším diagramu jako I pro intrakódovaný rámec). Dekodér má nyní dostatek snímků, aby mohl zahájit dekódování. V tomto okamžiku přestane přijímat vstup a klient musí volat ProcessOutput, aby dekódované rámce získal.
Nejjednodušším přístupem pro klienta je jednoduše střídat volání ProcessInput a ProcessOutput. Složitější algoritmus je popsán v tématu Základní model zpracování MFT.
Související témata