Dela via


Bearbeta data

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Analysera mediedata

Om filtret parsar mediedata ska du inte lita på rubriker eller andra självbeskrivande data i innehållet. Lita till exempel inte på storleksvärden som visas i AVI RIFF-segment eller MPEG-paket. Vanliga exempel på den här typen av fel är:

  • Läser N byte med data, där värdet för N kom från innehållet, utan att kontrollera N mot buffertens faktiska storlek.
  • Hoppa till en byteförskjutning i en buffert, utan att verifiera att förskjutningen ligger inom bufferten.

En annan vanlig felklass handlar om att inte validera formatbeskrivningar som finns i innehållet. Till exempel:

  • En BITMAPINFOHEADER- struktur kan följas av en färgtabell. Strukturen BITMAPINFO definieras som en BITMAPINFOHEADER- struktur följt av en matris med RGBQUAD- värden som utgör färgtabellen. Matrisens storlek bestäms av värdet för biClrUsed. Kopiera aldrig en färgtabell till en BITMAPINFO- utan att först kontrollera storleken på bufferten som allokerades för BITMAPINFO- struktur.
  • En WAVEFORMATEX- struktur kan ha extra formatinformation som läggs till i strukturen. cbSize fält anger storleken på den extra informationen.

Under pin-anslutningen bör ett filter kontrollera att alla formatstrukturer är välformade och innehåller rimliga värden. Annars avvisar du anslutningen. I koden som validerar formatstrukturen bör du vara särskilt försiktig med aritmetiskt spill. I en BITMAPINFOHEADER-är bredden och höjden till exempel 32-bitars långa värden, men bildstorleken (som är en funktion av produkten av de två) är bara ett DWORD- värde.

Om formatdata från källan är större än den allokerade bufferten ska du inte trunkera källdata för att kopiera dem till bufferten. Detta kan skapa en struktur vars implicita storlek är större än dess faktiska storlek. Ett bitmappshuvud kan till exempel ange en paletttabell som inte längre finns. I stället kan du omfördela bufferten eller helt enkelt misslyckas med anslutningen.

fel vid direktuppspelning

Om filtret tar emot felaktigt innehåll när diagrammet körs bör det avsluta strömningen. Gör följande:

Formatering av förändringar

Det finns flera mekanismer för filter för att ändra format mitt i strömmen. Var och en av dem omfattar mer än ett steg, vilket skapar potential för falska godkännanden. Om filtret får en begäran om en ändring i dynamiskt format måste det antingen avvisa begäran eller respektera det nya formatet när det kommer. På samma sätt växlar du aldrig format om inte det andra filtret samtycker. Mer information finns i Ändringar i dynamiskt format.