嵌入式Linux下libjpeg RGB888模式JPEG显示黑屏问题排查
32位FrameBuffer模式下LibJPEG显示JPEG黑屏问题
基于kernel-5.10.24的嵌入式Linux系统开发,系统搭载LCD显示屏。尝试使用libjpeg库在LCD上显示JPEG图片,参考网上示例代码后,发现选择RGB888模式时屏幕仅显示黑色矩形。
核心代码
typedef unsigned int color_t; ///typedef unsigned short color_t; #define BITS_PER_PIXEL 32 ///#define BITS_PER_PIXEL 16 static struct fb_var_screeninfo __g_vinfo; static color_t *__gp_frame = NULL; ..... ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo); printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel); printf("xres_virtual = %d\n", __g_vinfo.xres_virtual); printf("yres_virtual = %d\n", __g_vinfo.yres_virtual); printf("xres = %d\n", __g_vinfo.xres); printf("yres = %d\n", __g_vinfo.yres); __gp_frame = mmap(NULL, __g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / 8, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); ...... ...... int drawjpg(unsigned int x, unsigned int y, const char *name) { color_t col; row_stride = cinfo.output_width * cinfo.output_components; printf("width = %d\n", cinfo.output_width); printf("height = %d\n", cinfo.output_height); buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, buffer, 1); line = cinfo.output_scanline - 1 + y; for(i = 0; i < cinfo.output_width; i++) { #if (BITS_PER_PIXEL == 16) char b, g, r; r = (buffer[0][i*3] >> 3); g = ((buffer[0][i*3+1] >> 2)); b = (buffer[0][i*3+2] >> 3); col = (r << 11) | (g << 5) | b; #elif (BITS_PER_PIXEL == 32) col = (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2]; #endif *(__gp_frame + line * __g_vinfo.xres + i + x) = col; } if (line >= __g_vinfo.yres) { break; } } ..... }
程序运行输出
bits_per_pixel = 32 xres_virtual = 720 yres_virtual = 3840 xres = 720 yres = 1280 cinfo.image_width = 442 cinfo.image_height = 442 cinfo.jpeg_color_space = 3 cinfo.num_components = 3 ------------- width = 442 height = 442
切换#define BITS_PER_PIXEL为16时,屏幕可显示两张图片;改为32时则无内容显示。已知显示屏支持ARGB模式,尝试修改代码为col = 0x0F000000 | (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2];,但结果仍为黑屏。
请问32位模式下的代码存在什么问题?
内容的提问来源于stack exchange,提问作者wangt13
相关产品推荐
相关产品推荐

