Zpracování dat

[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é.]

Analýza mediálních dat

Pokud filtr analyzuje mediální data, nedůvěřujte záhlavím ani jiným vlastním popisům dat v obsahu. Například nedůvěřujte hodnotám velikosti, které se zobrazují v blocích AVI RIFF nebo paketech MPEG. Mezi běžné příklady tohoto typu chyby patří:

  • Čtení N bajtů dat, kdy byla hodnota N získána z obsahu, bez kontroly N ve srovnání se skutečnou velikostí vyrovnávací paměti.
  • Přeskakování na posun bajtů v rámci vyrovnávací paměti bez ověření, že posun spadá do vyrovnávací paměti.

Další běžnou třídou chyb není ověřování popisů formátu nalezených v obsahu. Například:

  • Za strukturou BITMAPINFOHEADER může následovat barevná tabulka. BITMAPINFO struktura je definována jako struktura BITMAPINFOHEADER následována polem RGBQUAD hodnot, které tvoří barevnou tabulku. Velikost pole je určena hodnotou biClrUsed. Nikdy nekopírujte barevnou tabulku do BITMAPINFO, aniž byste nejprve zkontrolovali velikost vyrovnávací paměti, která byla přidělena pro strukturu BITMAPINFO.
  • Struktura WAVEFORMATEX může obsahovat další informace o formátu připojené ke struktuře. cbSize člen určuje velikost dodatečných informací.

Během připojování by měl filtr ověřit, že všechny struktury formátu jsou správně vytvořené a obsahují přiměřené hodnoty. Pokud ne, zamítněte připojení. V kódu, který ověřuje strukturu formátu, buďte obzvláště opatrní ohledně aritmetického přetečeního. Například v BITMAPINFOHEADER, šířka a výška jsou 32bitové dlouhé hodnoty, ale velikost obrázku (což je funkce součinu obou) je pouze hodnota DWORD.

Pokud jsou formátovaná data ze zdroje větší než přidělená vyrovnávací paměť, neořízejte zdrojová data, abyste je mohli zkopírovat do vyrovnávací paměti. Tím lze vytvořit strukturu, jejíž implicitní velikost je větší než jeho skutečná velikost. Například záhlaví rastrového obrázku může určovat tabulku palety, která již neexistuje. Místo toho přerozdělte vyrovnávací paměť nebo jednoduše přerušte připojení.

Chyby při streamování

Když je graf spuštěný, pokud filtr obdrží poškozený obsah, měl by ukončit streamování. Postupujte takto:

změny formátu

Existuje několik mechanismů pro filtry pro změnu formátů uprostřed datového proudu. Každý z nich zahrnuje více než jeden krok, které vytvářejí potenciál pro falešná přijetí. Pokud filtr obdrží požadavek na změnu dynamického formátu, musí žádost buď odmítnout, nebo jinak respektovat nový formát, jakmile přijde. Podobně nikdy nepřepínejte formáty, pokud jiný filtr nesouhlasí. Další informace naleznete v tématu Změny dynamického formátu.