SDV Media: gerenciamento de anúncios de display

A SDV Media expõe as telas disponíveis para aplicativos OEM com a API DRM do Linux.

Interação entre componentes de DRM

  • O framebuffer é uma fonte de dados de pixel, com suporte de um buffer de memória alocado externamente.

  • O plano é uma fonte de imagem usada pelo CRTC. Ele está associado a um framebuffer e pode representar uma visualização cortada do framebuffer.

  • O CRTC representa um pipeline de exibição geral. Ele pode combinar vários planos para criar a saída de vídeo final e enviar a saída para vários codificadores.

  • O codificador converte a saída de vídeo do CRTC em um formato adequado para um conector específico.

  • O conector representa um conector de tela disponível. Por exemplo, uma porta HDMI.

Para uma descrição mais detalhada, consulte:

Superfície da API

A SDV Media fornece as interfaces DRM do Linux. Embora elas possam ser usadas diretamente usando a chamada de sistema ioctl, para o desenvolvimento de aplicativos, é recomendável usar uma biblioteca auxiliar do espaço do usuário. Por exemplo:

Configurar a renderização para uma única tela

  1. Abra um dispositivo DRM (/dev/dri/card*) e use APIs DRM do Linux (por exemplo, usando libdrm) no descritor do arquivo dele para selecionar a tela e o modo.

    Normalmente, o sistema host expõe apenas um único dispositivo de GPU virtual, que aparece como /dev/dri/card0.

  2. Alocar buffers frontais e traseiros com a API DRM do Linux.

    É recomendável usar minigbm's gbm_bo_create() e receber o descritor do arquivo DMA-BUF com gbm_bo_get_fd().

  3. Crie framebuffers GL com suporte dos buffers alocados.

    1. Crie um EGLImage do buffer DRM com eglCreateImageKHR com EGL_LINUX_DMA_BUF_EXT (da EGL_EXT_image_dma_buf_import extensão).

    2. Crie uma textura GL e use glEGLImageTargetTexture2DOES (da GL_OES_EGL_image extensão) para definir o armazenamento da textura como a EGLImage da etapa anterior.

    3. Crie um framebuffer GL e use glFramebufferTexture2D para definir a textura de suporte como a criada na etapa anterior.

  4. Para renderizar um frame:

    1. Vincule um dos framebuffers GL criados.

    2. Desenhe um frame com as APIs GLES usuais.

    3. Mostre o frame em uma tela: use a API DRM do Linux (drmModeAtomicCommit()) para enviar um DRM_MODE_PAGE_FLIP_EVENT com o descritor de arquivo DMA-BUF usado pelo framebuffer GL vinculado.

Compor a saída de vídeo de várias camadas

Para a composição de várias camadas (multiplano) acelerada por hardware, dependemos do sistema host que expõe cada camada como um conector DRM separado (tela virtual) e as mapeia para o local / pipeline de hardware correto.

Consulte Configurar a renderização para várias telas para mais detalhes.

Configurar a renderização para várias telas

  1. Abra o dispositivo DRM /dev/dri/card* como no fluxo de tela única.

  2. Liste os conectores de tela disponíveis.

    Cada tela é exposta como um conector DRM separado do dispositivo DRM.

  3. Para cada conector de tela:

    1. Selecione um CRTC compatível com o conector. Cada conector tem uma lista de codificadores disponíveis, e cada codificador indica com quais CRTCs ele pode ser usado. Sempre haverá pelo menos um CRTC compatível.

      1. Selecione um plano compatível com o CRTC.

      2. Crie framebuffers DRM com suporte dos buffers de uma GPU. Esse processo é o mesmo da variante de tela única.

      3. Conecte o plano, o CRTC e o conector e defina o modo de vídeo no CRTC.

        É possível definir o modo de várias telas ao mesmo tempo usando a API atômica para definir as seguintes propriedades DRM para cada conjunto de conector, CRTC e plano.

    A lista completa de propriedades necessárias:

    Destino Propriedade Tipo Descrição
    conector CRTC_ID ID do CRTC ID do CRTC a ser atribuído ao conector
    CRTC MODE_ID ID do blob ID de um blob de propriedade criado usando drmModeCreatePropertyBlob, que contém a struct drmModeModeInfo do modo de vídeo selecionado
    CRTC ACTIVE bool true para marcar o CRTC como ativo
    avião FB_ID ID do framebuffer ID do framebuffer DRM a ser mostrado na tela
    avião SRC_X pixels Coordenada X do retângulo da imagem de origem do framebuffer
    avião SRC_Y pixels Coordenada Y do retângulo da imagem de origem do framebuffer
    avião SRC_W Ponto fixo 16.16 Largura do retângulo da imagem de origem do framebuffer (pixels deslocados para a esquerda em 16 bits)
    avião SRC_H Ponto fixo 16.16 Altura do retângulo da imagem de origem do framebuffer (pixels deslocados para a esquerda em 16 bits)
    avião CRTC_X pixels Coordenada X do retângulo da imagem de destino do CRTC
    avião CRTC_Y pixels Coordenada Y do retângulo da imagem de destino do CRTC
    avião CRTC_W pixels Largura do retângulo da imagem de destino do CRTC
    avião CRTC_H pixels Altura do retângulo da imagem de destino do CRTC
  4. Insira o loop de renderização:

    1. Aguarde o evento de inversão de página em um CRTC antes de renderizar o próximo frame.

    2. Renderize um frame e mostre-o na tela programando uma inversão de página para o CRTC+framebuffer especificado.