Как программно определить 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;
    }
    

Рекомендации:-

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