Поделиться через


Обработка данных

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

анализ данных мультимедиа

Если фильтр анализирует данные мультимедиа, не доверяйте заголовкам или другим самоописывющим данным в содержимом. Например, не доверяйте значениям размера, которые отображаются в блоках AVI RIFF или MPEG-пакетах. Ниже приведены распространенные примеры такой ошибки:

  • Чтение N байт данных, где значение N поступило из содержимого, не проверяя N по фактическому размеру буфера.
  • Переход к байтовому смещению в буфере без проверки того, что смещение находится внутри буфера.

Другой распространенный класс ошибок включает в себя непроверку описаний форматов, найденных в содержимом. Например:

  • Структуру BITMAPINFOHEADER может сопровождать цветовая таблица. Структура BITMAPINFO определяется как структура BITMAPINFOHEADER, за которой следует массив значений RGBQUAD, образующих таблицу цветов. Размер массива определяется значением biClrUsed. Никогда не копируйте таблицу цветов в BITMAPINFO без первой проверки размера буфера, выделенного для структуры BITMAPINFO.
  • Структура WAVEFORMATEX может содержать дополнительные сведения о формате, добавленные в структуру. Элемент cbSize указывает размер дополнительных сведений.

Во время соединения через контактные штыри фильтр должен убедиться, что все структуры формата корректно сформированы и содержат разумные значения. В противном случае отклоните подключение. В коде, который проверяет структуру формата, особенно внимательно следите за арифметическим переполнением. Например, в BITMAPINFOHEADERширина и высота — 32-разрядные длинные значения, но размер изображения (который является функцией продукта двух) является только значением DWORD.

Если данные форматирования из источника больше выделенного буфера, не усекайте исходные данные для того чтобы скопировать их в буфер. Это может создать структуру, неявный размер которой превышает его фактический размер. Например, заголовок растрового изображения может указывать таблицу палитры, которая больше не существует. Вместо этого перераспределите буфер или просто прервите подключение.

Ошибки в процессе потоковой передачи

При запуске графа, если фильтр получает неправильно сформированное содержимое, он должен завершить передачу потоковых данных. Сделайте следующее:

Изменения формата

Существует несколько механизмов, позволяющих фильтрам изменять форматы в процессе передачи. Каждый из них включает несколько шагов, что создает потенциал для ложных принятия. Если фильтр получает запрос на изменение динамического формата, он должен либо отклонить запрос, либо принять новый формат, когда он поступит. Аналогичным образом никогда не переключать форматы, если другой фильтр не согласен. Дополнительные сведения см. в разделе Динамические изменения формата.