Как программно определить bpp и пиксельный формат цвета экрана андроида?
Я пытаюсь передать сжатые необработанные данные кадрового буфера в мое клиентское приложение на ПК из службы сервера на Android. На ПК я хочу отображать эти необработанные данные в виде потокового видео в виде моего Клиента, предоставляя в режиме реального времени представление экрана устройства Android. Я знаю, как получить разрешение экрана, но не программное обеспечение Bits-Per-Pixel(BPP) и не Pixel Color Format необработанных данных на стороне Android(сервера). Пожалуйста помоги.
Все, что я мог найти в Интернете, - это нативный код. Но я действительно хочу поддерживать приложение как можно более определенным на Java.
Из FBIOGET_VSCREENINFO через ioctl получают BPP(биты на пиксель) следующим образом
int main () {
int fbfd;
struct fb_var_screeninfo variable_info;
fbfd=open("/dev/fb0", O_RDWR);
//in real life, check every ioctl if it returns -1
ioctl (fbfd, FBIOGET_VSCREENINFO, &variable_info);
//This is the required BPP value
switch(variable_info.bits_per_pixel) {
case 16: //pixel format is RGB_565
break;
case 24: //pixel format is RGB_888
break;
case 32: //pixel format is RGBX_8888
break;
}
}
1 ответ
Наконец-то разобрался, как определить
- BPP(бит на пиксель) кадра
- Фактическая ориентация байта RGB в пикселе
Размер кадрового буфера и отдельных кадров
int main() { //Structs defined in "linux/fb.h" struct fb_var_screeninfo vscreeninfo; struct fb_fix_screeninfo fscreeninfo; //Open the framebuffer fbfd=open("/dev/graphics/fb0",O_RDONLY); if(fbfd==-1) { __android_log_print(ANDROID_LOG_ERROR,ERR, "Could not open framebuffer fbfd=%d errno=%d",fbfd,errno); return errno; } //Fetch variable screen info ioct=ioctl(fbfd,FBIOGET_VSCREENINFO,&vscreeninfo); if(ioct==-1) { __android_log_print(ANDROID_LOG_ERROR,ERR, "VSCREEN-IOCTL failed ioct=%d errno=%d",ioct,errno); return errno; } //Fetch fixed screen info ioct=ioctl(fbfd,FBIOGET_FSCREENINFO,&fscreeninfo); if(ioct==-1) { __android_log_print(ANDROID_LOG_ERROR,ERR, "FSCREEN-IOCTL failed ioct=%d errno=%d",ioct,errno); return errno; } close(ioct); /**********************************VSCREEN DATA************************************/ printf("\nVscreen Info:-\n"); printf(" Xres = %4ld | Yres = %4ld\n",vscreeninfo.xres,vscreeninfo.yres); printf(" BPP = %4ld | Height = %4ld | Width = %4ld\n",vscreeninfo.bits_per_pixel, vscreeninfo.height, vscreeninfo.width); printf(" Xres_V = %4ld | Yres_V = %4ld\n",vscreeninfo.height,vscreeninfo.width); printf(" Pixel format : RGBX_%ld%ld%ld%ld\n",vscreeninfo.red.length, vscreeninfo.green.length, vscreeninfo.blue.length, vscreeninfo.transp.length); printf(" Begin of bitfields(Byte ordering):-\n"); //In my case : printf(" Red : %ld\n",vscreeninfo.red.offset); //Red : 16 printf(" Blue : %ld\n",vscreeninfo.blue.offset); //Blue : 0 printf(" Green : %ld\n",vscreeninfo.green.offset); //Green : 8 printf(" Transp : %ld\n",vscreeninfo.transp.offset); //Transp : 24 //Hence orientation is : BGRT => (BGR4)RGB32 packed format /********************************~VSCREEN DATA************************************/ /*********************************FSCREEN DATA************************************/ printf("\nFscreen Info:-\n"); printf(" Device ID : %s\n",fscreeninfo.id); printf(" Start of FB physical address : %ld\n",fscreeninfo.smem_start); printf(" Length of FB : %ld\n",fscreeninfo.smem_len); //Size of framebuffer in bytes printf(" Length of Line : %ld\n",fscreeninfo.line_length); printf(" Start of MMIO physical address : %ld\n",fscreeninfo.mmio_start); printf(" Length of MMIO : %ld\n",fscreeninfo.mmio_len); /********************************~FSCREEN DATA************************************/ close(fbfd); return 0; }
Рекомендации:-
- Данные кадрового буфера http://www.ummon.eu/Linux/API/Devices/framebuffer.html
- Упакованные форматы RGB http://linuxtv.org/downloads/v4l-dvb-apis/packed-rgb.html