FrameBuffer의 각 줄에 쓰여진 바이트 수를 얻는 방법은 무엇입니까?

FrameBuffer의 각 줄에 쓰여진 바이트 수를 얻는 방법은 무엇입니까?

표적: 저는 프레임 버퍼를 위한 매우 간단한 이미지 뷰어를 작성하고 있습니다 /dev/fb0(예:FBI).

현재 상태:

  1. /sys/class/graphics/fb0/virtual_size내 소프트웨어는 (예를 들어) 에서 픽셀 해상도를 가져옵니다 1920,1080.
  2. 그런 다음 (각 행마다) 1920행 픽셀(총 4x1920 = 7680바이트)당 4바이트(BGRA)를 /dev/fb0.
  3. 보다 정확하게는 y-row -col =>에서 값이 각각 (, 및 )인 x픽셀을 설정합니다 .arr[y * 1920 * 4 + x * 4 + channel]channel0,1,2,3BGRA

질문:

/sys/.../virtual_size( -> 해상도) 를 사용하여 이전 노트북에서 1366,768동일한 소프트웨어를 시도했을 때 이미지가 올바르게 표시되지 않았습니다(약간 기울어짐). 그래서 픽셀 너비 값을 조사한 결과 값이 다음과 같은 것으로 나타났습니다.1376 화(1366이 아님).

질문:

  1. 이 10개의 추가 바이트는 어디서 오는 걸까요?
  2. 그리고 다른 컴퓨터에서 이 10바이트의 값을 어떻게 얻을 수 있습니까(수동으로 조정하지 않고 자동으로)?
  3. 왜 일부 시스템에는 이러한 추가 10바이트가 필요하고 일부 시스템에는 필요하지 않습니까?

답변1

프로그래밍 방식으로 프레임 버퍼에 대한 정보를 검색하려면 다음을 사용해야 합니다.FBIOGET_FSCREENINFO그리고FBIOGET_VSCREENINFO ioctl:

#include <fcntl.h>
#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>

int main(int argc, char **argv) {
  struct fb_fix_screeninfo fix;
  struct fb_var_screeninfo var;

  int fb = open("/dev/fb0", O_RDWR);
  if (fb < 0) {
    perror("Opening fb0");
    exit(1);
  }

  if (ioctl(fb, FBIOGET_FSCREENINFO, &fix) != 0) {
    perror("FSCREENINFO");
    exit(1);
  }

  if (ioctl(fb, FBIOGET_VSCREENINFO, &var) != 0) {
    perror("VSCREENINFO");
    exit(1);
  }

  printf("Line length: %ld\n", fix.line_length);
  printf("Visible resolution: %ldx%ld\n", var.xres, var.yres);
  printf("Virtual resolution: %ldx%ld\n", var.xres_virtual, var.yres_virtual);
}

line_length당신에게 행 보폭을 제공합니다.

답변2

좋아요보폭와 관련될 필요는 없다너비;1920 와이드스크린에서 소프트웨어는 "우연히" 작동합니다(우연이 아닙니다. 스트라이드는 일반적으로 하드웨어 정렬 요구 사항에 따라 선택되며 1920은 이미 일반적인 정렬 요구 사항인 16으로 나눌 수 있습니다).

좋은 기존 Linux 프레임 버퍼 인프라에 익숙하지 않기 때문에 이를 수행하는 방법을 직접적으로 말할 수는 없지만 진행 상황을 파악해야 합니다.

Linux는 줄 정렬을 16의 배수로 기록하므로 항상 너비를 다음 배수로 반올림하거나 /sys/class/graphics/fb0/에 보폭 또는 줄 정렬을 정의하는 다른 더미 파일을 포함하도록 해야 합니다.

관련 정보