





Сейчас приходится подробно разбираться с тем как вросли в друг друга и работают
Видеодрайверы и FVID2.
Возможно потом можно будет сделать простую и компакную систему с минимальным количеством сущностей,
но пока единственный пример завязан на FVID2.

TI соорудил некую абстракцию - FVID2: - Video Frame buffer library version 2, как было сказано на форуме,
но похоже правильнее расшифровать - "Frame VIDeo (buffer library) ver.2"


Для чего якобы сделали FVID2:

Типичные проблемы с общепринятыми видеоинтерфейсами:
- должны обеспечивать универсальность вне зависимости от кристалла
- не должны зависеть от ОС/аппаратуры/драйвера и должен быть масштабируемым
- должен иметь общий API для дисплея, видеозахвата и операций с памятью как масштабирование - упрощяет структуру данных для операций копирования и манипулирования на различных стадиях обработки в цепочке.
- видеокомпозиции - многооконные операции - несколько буферов преставляют один фрейм - к примеру, 16 видеопотоков представляют один фрейм.
  (Также проблема, что тот же самый интерфейс должен быть масштабируемым также и для отдельного видеопотока)
Многоканальный видеозахват, скажем захват 16 D1/64 CIF должен уметь работать с несколькими буферами.
  (Также проблема, что тот же самый интерфейс должен быть масштабируемым также и для отдельного видеопотока)
– Multiplexed capture - One queue could have multiple dequeue/callback
– Все драйверы, дисплея, видеозахвата, памяти должны быть неблокирующими.

Типичные проблемы с общепринятыми драйверами памяти:
- Операции с памятью должны иметь сходные возможности по приему нескольких потоков для согласования скоростей программы и драйвера.
Проблема также что одновременно интерфейс должен быть масштабируемым для 1...n видеопотоков как для входа, так и для выхода.
– Количество входных и выходных потоков различается в зависимости от операций с памятью, таких как:
   Скаляр требует 1 вход и 1 выход.
   Деинтерлейс может потребовать 2/3 предыдущих фреймов, т.е. 2/3 входа и 1 выхода.
   Фильтр шума может потребовать фрейма для будущих данных, т.е. 2 входа и 1 выхода.
   Два скаляра в очереди с возможностью заглянуть обратно в память - требуют одного входа и 2 выхода.
 
Также проблемы с вариациями одно и того же API:
– Видеокомпозиция в драйвере памяти
– Послойная поддержка в медленных приложениях.
– Интерфейс д.б. масштабируемый в плоскости OSD/graphics

FVID2 обеспечивает интерфейс к потоковым операциям наподобие органицации очередей и буферизации для драйвера, абстрагирует видеоприложение от аппаратуры одним стандартным интерфейсом, не зависящим от кристалла, от ОС, аппаратуры и драйвера, работает в DSP/BIOS.
FVID2 не драйвер как таковой и не задает аппаратно-зависимые API и структуры.


Возможности:

- Non-blocking interface with callback for display/capture/M2M (memory to memory) drivers
- Multi-window Operation – Multiple buffers representing a single frame
- Multiplexed capture/M2M drivers – Queue/Dequeue can take multiple requests
- Multiplexed capture - One queue could have multiple dequeue/callback
- M2M driver interface
- Per frame changes like scaling, positioning etc…
- Field based capture/display (in case of de-interlaced display)
- Sliced based capture/memory operation


Интерфейсные функции FVID2:

[ FVID2_init ] - Инициализация списка драйверов и аппаратуры. (Initializes the drivers and the hardware. Should be called before calling any of the FVID2 functions)
[ FVID2_deInit ] - Деинициализация спика драйверов и аппаратуры. (Un-initializes the drivers and the hardware)
[ FVID2_create ] - Открывает драйвер и канал из списка. (Opens a instance/channel video driver).
[ FVID2_delete ] - Закрывает драйвер и канал из списка. (Closes a instance/channel of a video driver).
[ FVID2_control ] - Посылает управляющие команды драйверу и устройству. (To send standard (set/get format, alloc/free buffers etc..) or device/driver specific control commands to video driver).
[ FVID2_queue ] - Подает видеобуфер. (Submit a video buffer to video driver. Used in display/capture drivers).
[ FVID2_dequeue ] - Убирает видеобуфер. (Get back a video buffer from the video driver. Used in display/capture drivers).
[ FVID2_processFrames ] - Подает пачку буферов для видеопроцессинга. (Submit video buffers to video driver for processing. Used only in M2M drivers).
[ FVID2_getProcessedFrames ] - Убирает пачку буферов с видеопроцессинга. (Get back the processed video buffers from video driver. Used only in M2M drivers).
[ FVID2_start ] - Запускает видеозахват или вывод на дисплей (Start video capture or display operation. Not used in M2M drivers).
[ FVID2_stop ] - Останавливает видеозахват или вывод на дисплей (Stop video capture or display operation. Not used in M2M drivers).
[ FVID2_Frame ] - Задает видеобуфер с причиндалами.
–Represents the video frame buffer along with other meta data
–This is the entity which is exchanged between driver and application and not the buffer address pointers
–Meta data include timestamp, field ID, per frame configuration, application data etc…
–Since video buffers can have up to 3 planes and two fields (in the case of YUV planar interlaced), buffer addresses are represented using a two dimensional array of pointers of size 2 (field) x 3 (planes)

Эти функции компактно размещены в fvid2_drvMgr.c







