Udostępnij przez


Przetwarzanie danych

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

analizowanie danych multimedialnych

Jeśli filtr analizuje dane multimedialne, nie ufaj nagłówkom ani innym samoopisującym się danym w zawartości. Na przykład nie ufaj wartościom rozmiaru, które są wyświetlane we fragmentach AVI RIFF lub pakietach MPEG. Typowe przykłady tego rodzaju błędu obejmują:

  • Odczytywanie N bajtów danych, w których wartość N pochodzi z zawartości, bez sprawdzania N względem rzeczywistego rozmiaru buforu.
  • Przechodzenie do przesunięcia bajtów w buforze bez sprawdzania, czy przesunięcie mieści się w buforze.

Inna typowa klasa błędów polega na nie sprawdzaniu poprawności opisów formatów znalezionych w zawartości. Na przykład:

  • Po strukturze BITMAPINFOHEADER może następować tabela kolorów. Struktura BITMAPINFO jest definiowana jako struktura BITMAPINFOHEADER, a następnie tablica wartości RGBQUAD tworzących tabelę kolorów. Rozmiar tablicy zależy od wartości biClrUsed. Nigdy nie kopiuj tabeli kolorów do BITMAPINFO bez wcześniejszego sprawdzenia rozmiaru buforu przydzielonego dla struktury BITMAPINFO.
  • Struktura WAVEFORMATEX może zawierać dodatkowe informacje o formacie dołączane do struktury. Element członkowski cbSize określa rozmiar dodatkowych informacji.

Podczas łączenia pinów filtr powinien sprawdzić, czy wszystkie struktury formatu są poprawnie sformułowane i zawierają prawidłowe wartości. Jeśli nie, odrzuć połączenie. W kodzie, który weryfikuje strukturę formatu, należy zachować szczególną ostrożność podczas przepełnienia arytmetycznego. Na przykład w BITMAPINFOHEADERszerokość i wysokość to 32-bitowe długie wartości, ale rozmiar obrazu (który jest funkcją produktu dwóch) jest tylko wartością DWORD.

Jeśli dane formatu ze źródła są większe niż przydzielony bufor, nie przycinaj danych źródłowych, aby skopiować je do bufora. Może to spowodować utworzenie struktury, której rozmiar niejawny jest większy niż rzeczywisty rozmiar. Na przykład nagłówek mapy bitowej może określać tabelę palety, która już nie istnieje. Zamiast tego przydziel bufor na nowo lub po prostu zakończ połączenie.

Błędy podczas przesyłania strumieniowego

Gdy wykres jest w trakcie działania, jeśli filtr otrzymuje źle sformułowaną zawartość, powinien przerwać przesyłanie strumienia. Wykonaj następujące czynności:

Zmiany formatu

Istnieje kilka mechanizmów dla filtrów w celu zmiany formatów w trakcie przetwarzania. Każdy z nich obejmuje więcej niż jeden krok, co tworzy potencjał fałszywych akceptacji. Jeśli filtr otrzymuje żądanie zmiany formatu dynamicznego, musi odrzucić żądanie lub uhonorować nowy format, kiedy się pojawi. Podobnie nigdy nie przełączaj formatów, chyba że inny filtr zgadza się. Aby uzyskać więcej informacji, zobacz Zmiany formatu dynamicznego.