Отправить стереоскопическое изображение через HDMI Frame Packing

Упаковка кадров - это метод отправки левого и правого изображений (для стереоскопического 3D), вертикально расположенных в одном кадре через HDMI. Если каждый вид имеет размер width x height результирующий "упакованный" кадр имеет размер width x 49/24 heightто есть оба вида с несколькими пустыми строками между ними.

Для 1080p это приводит к кадрам размером 1920x2205. Для большинства устройств FullHD (но не UHD или аналогичных) упаковка кадров является единственным методом отправки представления FullHD для каждого глаза.

Следующий метод работает для установки размера:

cvt cvt 1920 2205 24 #generate Modeline
xrandr --newmode "1920x2205_24.00"  .... #Modeline 
xrandr --addmode HDMI1 "1920x2205_24.00"
xrandr --output  HDMI1 --mode 1920x2205_24.00

Однако стереоскопические режимы необходимо объявлять на ТВ / проекторе с помощью так называемых информационных кадров, которые задают режим 3D. Хотя ядро ​​поддерживает отправку этих информационных фреймов, xrandr и т. Д. Не позволяют передавать соответствующую информацию в drm.

Как я могу заставить ядро ​​отправлять необходимые информационные фреймы?

PS: я не могу добавить тег "Stereo3D" из-за отсутствия репутации. Тег "3d" не подходит.

1 ответ

Следующее решение поставляется без каких-либо гарантий. Имейте в виду, что отправка сигналов HDMI, которые нарушают стандарт, может быть вредной для вашего телевизора / проектора, и что следующий крошечный взлом разрушает уровни абстракции, которые были введены по причине. Пожалуйста, не спрашивайте о патче для ядра (т.е. сообщите об ошибке там).

Одним из методов является небольшая модификация модуля ядра drm. Пожалуйста, прочитайте Как (рецепт) собрать только один модуль ядра? первый.

Файл, который вы должны изменить, это: drivers / gpu / drm / drm_edid.c. Мы изменили эту строку на:

    s3d_flags = (mode->flags & DRM_MODE_FLAG_3D_MASK) ||
            (mode->vdisplay == 2205);

и вставьте сюда следующие строки:

    if(mode->vdisplay == 2205)
            return HDMI_3D_STRUCTURE_FRAME_PACKING;

Вы должны удалить большинство (если не все) определенные модули графической карты из drivers/gpu/drm/Makefile перед компиляцией модуля drm в соответствии с вопросом, упомянутым в начале. Помните, что вам нужно обновить initramfs, так как модуль drm загружается во время загрузки.

Это решение было протестировано с проектором Epson и видеокартой Intel (используется i915). Перед изменением модуля drm вы должны убедиться, что модуль ядра вашей графической карты действительно использует соответствующие функции модуля drm. Иначе этот взлом бессмысленен.

Другие вопросы по тегам