Sdílet prostřednictvím


Typy médií DMO

[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, MMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]

Typ média popisuje formát přidružený k datovému proudu médií. Tento článek popisuje, jak DMO zpracovává typy médií. Primárně je určen pro vývojáře, kteří píší vlastní dmos.

Typy médií jsou definovány pomocí struktury DMO_MEDIA_TYPE. Tato struktura obsahuje následující informace:

  • hlavní typ je globálně jedinečný identifikátor (GUID), který definuje širokou kategorii, například zvuk nebo video.
  • Podtyp je identifikátor GUID, který definuje konkrétnější aspekty typu. Například ve videu zahrnují podtypy 16bitové RGB, 24bitové RGB, UYVY, video s kódováním DV atd.
  • Blok formátu je sekundární struktura, která plně specifikuje formát. Rozložení bloku formátu závisí na typu dat. Například PCM audio používá WAVEFORMATEX struktury. Video používá různé další struktury, včetně VIDEOINFOHEADER a VIDEOINFOHEADER2. Rozložení bloku formátu je identifikováno identifikátorem GUID typu formátu. Například FORMAT_WaveFormatEx určuje strukturu WAVEFORMATEX.

Při prvním vytvoření DMO datové proudy nemají typ média. Aby objekt DMO mohl zpracovávat jakákoli data, musí klient nastavit typ média pro každý datový proud. Tento proces je popsán z pohledu klienta v Nastavení typů médií vDMO .

typy médií v registru

DMO může přidat seznam typů médií, které podporuje do registru, voláním funkce DMORegister. Aplikace může tyto informace použít k vyhledání zobrazení dynamické správy, které odpovídají určitému formátu. Informace v registru nejsou komplexní. Obvykle byste zahrnuli pouze hlavní typy, které DMO podporuje. Položka registru má samostatné klíče pro vstupní a výstupní typy, ale nerozlišuje mezi jednotlivými datovými proudy.

Funkce DMORegister používá k popisu typů médií strukturu DMO_PARTIAL_MEDIATYPE. Tato struktura obsahuje podmnožinu informací nalezených ve struktuře DMO_MEDIA_TYPE – konkrétně hlavní typ a podtyp. Neobsahuje blok formátu, protože blok formátu obvykle obsahuje informace, které jsou příliš podrobné pro zahrnutí do registru, jako je výška a šířka obrázku videa.

upřednostňovaných typů médií

Jakmile aplikace vytvoří DMO, může dotazovat DMO pro typy médií, které podporuje. Pro každý datový proud vytvoří DMO seznam typů médií (pravděpodobně prázdný), seřazený v pořadí podle priority. IMediaObject::GetInputType a IMediaObject::GetOutputType metody vyčíslí upřednostňované typy. Upřednostňované typy datového proudu se můžou dynamicky měnit, když aplikace nastaví typy médií v jiných datových proudech. Například seznam upřednostňovaných typů výstupu se může po nastavení vstupního typu změnit nebo naopak. DMO ale není nutné dynamicky aktualizovat upřednostňované typy. Aplikace nemůže předpokládat, že každý typ, který obdrží, je platný. Z tohoto důvodu IMediaObject::SetInputType a IMediaObject::SetOutputType metody podporují příznak pro testování konkrétního typu.

Metoda GetInputType a GetOutputType vrací DMO_MEDIA_TYPE strukturu. DMO může ponechat některé informace v této struktuře prázdné, aby bylo možné označit rozsah typů. Hlavní typ nebo podtyp mohou být GUID_NULL a blok formátu může být prázdný (nula bajtů). Pokud je blok formátu prázdný, typ formátu musí být GUID_NULL.

Jakmile aplikace nastaví všechny vstupní typy DMO, měl by objekt DMO obecně vrátit alespoň jeden úplný typ pro každý výstupní datový proud. Kompletní typ výstupu usnadňuje testování a aplikace ho můžou používat jako rozumný výchozí. Testovací aplikace DMO spoléhá na toto chování. (Viz použitíaplikace DMOTest .)

Nastavení typů médií

Aplikace používají metody SetInputType a SetOutputType k testování, nastavení nebo vymazání typů v zadaném datovém proudu. Aplikace musí plně zadat typ. DMO ověří, jestli může přijmout navrhovaný typ. Odpověď může záviset na tom, které typy byly nastaveny v jiných datových proudech. Příznak DMO_SET_TYPEF_CLEAR vymaže typ datového proudu, aby se aplikace "vrátila" a zkusí jinou kombinaci.

ukázkové scénáře

Následující příklady popisují některé typické scénáře, které ilustrují body uvedené v předchozích částech.

  • Video dekodéry. V typickém videokodéru částečně určuje typ výstupu. Například oba datové proudy musí mít stejnou frekvenci snímků a rozměry obrázků. Jednou z možností není definovat žádné upřednostňované výstupní typy, dokud není nastaven vstupní typ. Další možností je vytvořit výčet sady neúplných typů a vynechat blok formátu. Podtyp použijte k označení podporovaných nekomprimovaných typů, jako jsou 16bitové RGB, 24bitové RGB atd. Dekodéry videa obecně nepodporují nastavení výstupního typu před vstupním typem. Obvyklým scénářem je dekódování ze známého vstupního formátu, takže toto omezení je přiměřené.
  • Zvukové dekodéry. Dekodér zvuku může podporovat omezenou, pevnou sadu výstupních formátů. V takovém případě může být možné vytvořit seznam upřednostňovaných výstupních formátů před tím, než je vstupní formát znám.
  • Kompresory. Ve většině případů nemůže kompresor videa plně určit upřednostňované výstupní formáty, dokud aplikace nenastaví vstupní formát a naopak. Místo toho by objekt DMO měl vrátit neúplný typ bez bloku formátu. Pro kompresi zvuku i videa aplikace obvykle potřebuje nastavit různé výstupní parametry, jako je přenosová rychlost. Po nastavení vstupního typu by však kompresor měl vrátit alespoň jeden úplný výstupní typ z dříve uvedených důvodů.

psaní DMO