2013-05-25 5 views
2

Я пытаюсь передать сжатые необработанные данные фреймбуфера в мое клиентское приложение на ПК, с моего сервера на Android. На ПК я хочу отображать эти необработанные данные в виде потокового видео в представлении моего Клиента, предоставляя представление в реальном времени экрана Android-устройства. Я знаю, как получить разрешение экрана, , но неBits-Per-Pixel (BPP) или Формат изображения пикселя программных данных на стороне Android (Server). Пожалуйста помоги.Как программно определить формат цвета bpp и пикселя экрана 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; 
    } 
} 

ответ

3

, наконец, выяснили, как определить

  • 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; 
    } 
    

Литература: -

+0

FYI Это работает только для Android устройств, опирающихся на систему видеобуфера. – pbj4cX9

 Смежные вопросы

  • Нет связанных вопросов^_^