Самый эффективный метод записи файлов для видеомагнитофона Linux - PullRequest
8 голосов
/ 08 марта 2012

Я работаю над встроенным приложением видеомагнитофона Linux, которое записывает видео в формате MP4 в файл (на SD-карту формата FAT).

Некоторые усложняющие факторы - это то, что видео и аудио данные поступают из аппаратных кодеков.которые должны обслуживаться с низкой задержкой и должны записывать в буферы с поддержкой DMA.

В данный момент для выходного файла я использую open () и write (), но обнаружим, что write () может занять сотнимиллисекунд, чтобы вернуться, когда система находится под нагрузкой, поэтому мои записи выполняются в отдельном потоке.

В существующем состоянии я копирую данные из (небольшого, ограниченного числа) буферов DMA в мультимегабайтный malloc 'd кольцевой буфер, затем write () из этого в другом потоке.Это означает, что я делаю как минимум две копии, один раз в буфер приложения и один раз в кэш системного буфера.

Я рассматриваю попытку записи O_DIRECT, чтобы избежать копирования, но мне интересны любые комментарии.Я отмечаю, что Роберт Лав комментирует, что O_DIRECT ужасен , но не говорит почему.

С другой стороны, мне также было бы интересно, если кто-нибудь знает способ заставить write () неостанавливаться на длительные периоды времени (AIO?), тогда я мог бы использовать буферный кеш, как предполагал Линус.

Этот вопрос не связан с моим очень старым вопросом о записи срывов .

1 Ответ

2 голосов
/ 20 марта 2012

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

И здесь - это пример реализации памяти драйвера, совместно используемой процессом пользовательского пространства с использованием mmap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...