Envie uma imagem estereoscópica via HDMI Frame Packing

3

O empacotamento de quadros é um método de envio de uma vista esquerda e direita (para 3D estereoscópico) empilhada verticalmente em um quadro via HDMI. Se cada exibição tiver tamanho width x height , o quadro "empacotado" resultante terá tamanho width x 49/24 height , ou seja, ambas as exibições com algumas linhas em branco entre elas.

Para 1080p, isso resulta em quadros de tamanho 1920x2205. Para a maioria dos dispositivos FullHD (mas não UHD ou similar), o empacotamento de quadros é o único método de envio de uma visão FullHD para cada olho.

O método a seguir funciona para definir o tamanho:

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

No entanto, os modos estereoscópicos precisam ser anunciados para a TV / projetor com os chamados frames de informação que especificam o modo 3D. Embora o kernel tenha suporte para o envio desses quadros de informação, o xrandr etc. não permite passar as informações relevantes para o drm.

Como posso fazer o kernel enviar os quadros de informação necessários?

PS: não consigo adicionar uma tag "stereo3d" devido à falta de reputação. A tag "3d" não se encaixa.

    
por frafl 10.08.2016 / 09:50

1 resposta

2

A seguinte solução é fornecida sem qualquer garantia. Esteja ciente de que o envio de sinais HDMI que violem o padrão pode ser ruim para sua TV / projetor e que o seguinte pequeno corte quebra as camadas de abstração, que foram introduzidas por um motivo. Por favor, não peça um patch de kernel (por exemplo, arquive um bug).

Um método é uma pequena modificação do módulo drm kernel. Por favor leia Como (receita) construir apenas um módulo do kernel? primeiro.

O arquivo que você deve modificar é: drivers / gpu / drm / drm_edid.c . Nós mudamos esta linha para:

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

e insira aqui as seguintes linhas:

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

Você deve remover a maioria (se não todos) os módulos específicos da placa gráfica de drivers/gpu/drm/Makefile antes de compilar o módulo drm de acordo à questão mencionada no início. Esteja ciente de que você precisa atualizar o initramfs, já que o módulo drm é carregado no momento da inicialização.

Esta solução foi testada com um projetor Epson e placa gráfica Intel (usa i915). Antes de modificar o módulo drm, você deve verificar se o módulo do kernel de sua placa gráfica realmente usa as funções relevantes do módulo drm. Caso contrário, esse truque é inútil.

    
por frafl 10.08.2016 / 09:50