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


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

[Функция, связанная с этой страницей 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 .

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

Ошибки во время потоковой передачи

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

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

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