framebuffer如何在指定区域显示?

时间:2022-04-02 04:00:10
我现在主要是用来显示视频。。。。考虑到将硬解码的视频传个GUI再去一帧一帧的去刷是不是比较不符合常规啊?这样效率太低了吧?一般大神们做的硬解码播放器都是怎么做的啊?是直接使用framebuffer还是传到上层UI啊?前提是保障流畅性。。。而且我这个还有摄像头实时预览的情况。。还有4宫格显示视频的情况。。

现在我暂时采用的是framebuffer。。但是framebuffer显示一个视频还好吧。。。如果是显示四个,弄一个四宫格,分别显示不同的视频。。那就没办法了啊?framebuffer是线性的区域。。。一整行一整行的存储的。。那四个格就打断了线性存储。。如何对这四个格对应的区域进行赋值显示啊?或者一般大家都是怎么显示这样的视频的?采用什么方法比较专业啊?

求大神现身说法!

20 个解决方案

#1


解决方案各种各样,看哪种符合你的需要了。
你的系统显卡是什么?也许很多事让显卡来做更合适。

#2


引用 1 楼 Huntercao 的回复:
解决方案各种各样,看哪种符合你的需要了。
你的系统显卡是什么?也许很多事让显卡来做更合适。


额。。我现在这个就是三星4412芯片啊。。然后就是在板子上的LCD上显示。。。我又不想去搞驱动啊。。来不及啊。。想请教下FB的现有驱动有没有可以操作的接口啊?比如我现在用将LCD分成四块来显示。。但是FB映射出来的区域是线性区域。。我没法整体赋值啊。。对于每一个四分之一块 我如何控制它显示指定的画面啊?

#3


该回复于2014-09-12 13:36:04被管理员删除

#4


自顶。。。坐等大神现身

#5


楼主。。。。我最近在弄tiny4412的CMOS 摄像头。。。。能指导下不? framebuffer如何在指定区域显示?

#6


引用 5 楼 qiou661 的回复:
楼主。。。。我最近在弄tiny4412的CMOS 摄像头。。。。能指导下不? framebuffer如何在指定区域显示?

你弄CMOS摄像头的神马啊?CMOS我也还没弄的

#7


这个需要硬件支持
如果硬件只支持提供一个线性区域,则只能自己写算法来分4块显示。速度肯定慢,因为压力全在CPU上。
如果硬件支持通过设定某些特殊寄存器而把一些区块临时合并成一个小的连续内存访问区域,则通过这种映射的办法可以做到分成多块高速显示。这实际上是把计算压力压向硬件。
当你面临这个需求时,复杂度就已确定了。不能消灭复杂度,只能转移它。
这就是为什么现在电脑都配独立GPU,GPU就是把图象功能抽象出来,转移CPU的压力到其自身上。

#8


CMOS 摄像头的内核驱动。。。。。类似 ov7670 ov9650的摄像头。。。。

#9


我一下子想起来了Android系统中实现的方案,它完全不会去动驱动中的任何东西。把FB看成一个画布,按照大小分4块A B C D,A B C D分别当时一个单独的小的画面,分别的进程去操作它,将要显示的内容填充进去。然后将A B C D合并到一个画布上,填充到FB中。这样就实现了你的需求。换成Android中的话就是每个APP都是一个surface,各自尽情地绘制自己的界面,最终将这些个suface合成在一起,很典型的比如调出输入法的时候其实是APP 和 输入法APP都在前端显示,它们是两个不同的surface。它们之间的合并还是叠加性质的,你要实现的其实更简单,仅仅是像「拼圆」一样拼接在一起。

倒着看世界,一切都好办。

#10


struct fb_var_screeninfo {
 __u32 xres;
 __u32 yres;
 __u32 xres_virtual;
 __u32 yres_virtual;
 __u32 xoffset;
 __u32 yoffset;

 __u32 bits_per_pixel;
 __u32 grayscale;

 struct fb_bitfield red;
 struct fb_bitfield green;
 struct fb_bitfield blue;
 struct fb_bitfield transp;

 __u32 nonstd;

 __u32 activate;

 __u32 height;
 __u32 width;

 __u32 accel_flags;

 __u32 pixclock;
 __u32 left_margin;
 __u32 right_margin;
 __u32 upper_margin;
 __u32 lower_margin;
 __u32 hsync_len;
 __u32 vsync_len;
 __u32 sync;
 __u32 vmode;
 __u32 rotate;
 __u32 reserved[5];
};

不知道
 __u32 left_margin;
 __u32 right_margin;
 __u32 upper_margin;
 __u32 lower_margin;
能不能满足你的需求

#11


楼主  根据我的关产,你已经4天没上线了,还不来吗? framebuffer如何在指定区域显示?

#12


你快粗来   framebuffer如何在指定区域显示?

#13


引用 8 楼 qiou661 的回复:
CMOS 摄像头的内核驱动。。。。。类似 ov7670 ov9650的摄像头。。。。


我不是做驱动的啊。。你问我也没用啊。。我只是搞应用的。。。不做驱动

#14


引用 9 楼 kangear 的回复:
我一下子想起来了Android系统中实现的方案,它完全不会去动驱动中的任何东西。把FB看成一个画布,按照大小分4块A B C D,A B C D分别当时一个单独的小的画面,分别的进程去操作它,将要显示的内容填充进去。然后将A B C D合并到一个画布上,填充到FB中。这样就实现了你的需求。换成Android中的话就是每个APP都是一个surface,各自尽情地绘制自己的界面,最终将这些个suface合成在一起,很典型的比如调出输入法的时候其实是APP 和 输入法APP都在前端显示,它们是两个不同的surface。它们之间的合并还是叠加性质的,你要实现的其实更简单,仅仅是像「拼圆」一样拼接在一起。

倒着看世界,一切都好办。


你这样做貌似不靠谱吧。。

你说分成ABCD四块。然后四块合并成到一个画布。。问题就是在这里。。你怎么合并啊? 无论你怎么合并都是将四块区域合并到一个线性存储的FB空间。。。也就是说你需要A块的第一行和B块的第一行先连接起来然后第二行连接。。以此类推下面的CD也是如此。。你这样显示一整幅图就要这样线性的去操作四块的每一行进行拷贝,这样的显示效率你知道有多滴么。。对于高帧率的视频这是不可能的事情。。时间不允许。。。。

#15


引用 9 楼 kangear 的回复:
我一下子想起来了Android系统中实现的方案,它完全不会去动驱动中的任何东西。把FB看成一个画布,按照大小分4块A B C D,A B C D分别当时一个单独的小的画面,分别的进程去操作它,将要显示的内容填充进去。然后将A B C D合并到一个画布上,填充到FB中。这样就实现了你的需求。换成Android中的话就是每个APP都是一个surface,各自尽情地绘制自己的界面,最终将这些个suface合成在一起,很典型的比如调出输入法的时候其实是APP 和 输入法APP都在前端显示,它们是两个不同的surface。它们之间的合并还是叠加性质的,你要实现的其实更简单,仅仅是像「拼圆」一样拼接在一起。

倒着看世界,一切都好办。


你的意思可能是我的另外一种做法。。估计你是这个意思。。。

我的另外一种做法就是本身这个fb是有多个的。。你在每个FB上画四分之的图。然后将四个FB重叠合并。。

这种做法我早就实现了。。这个我知道。。是可以做到的。。问题是这样做要考虑到FB个数的问题。。它只有5个FB。。我QT GUI用掉一个。还剩下四个。。这四个刚好可以做四个视频的窗口。。。

但是问题来了。。我还额外需要一个窗口用来和四窗口切换。。。这时候就没有FB可用了。。。所以我才放弃这种方案来这里问有没有在一个FB上弄四个窗口显示视频的方案。。。

#16


别那么早就是想着fb,在最后关头才是它。以下是Android的实现框架,供你参考:
framebuffer如何在指定区域显示?

#17


引用 16 楼 kangear 的回复:
别那么早就是想着fb,在最后关头才是它。以下是Android的实现框架,供你参考:
framebuffer如何在指定区域显示?

还有一张图:
framebuffer如何在指定区域显示?

#18


这个问题现在解决了。。最后还是在单个FB上进行的四块视频显示。。。。其实还是自己定义了一个API能够在FB上指定位置显示一个矩形。。。具体实现就是逐行去扫描。。。之前一直也有想过这么做。。只是感觉效率可能不行。。现在试了一下还可以 。。就这么用着了。。

#19


framebuffer如何在指定区域显示?

就是要让黑色部分透明,黑色区域的后面是采集的视频, framebuffer如何在指定区域显示?

在网上找到了fb_bitfield这个结构体怎么赋值才是透明的,尝试了很多没法解决,谢谢!!!!!!求赐教啊!!

#20


引用 19 楼 u012175394 的回复:
framebuffer如何在指定区域显示?

就是要让黑色部分透明,黑色区域的后面是采集的视频, framebuffer如何在指定区域显示?

在网上找到了fb_bitfield这个结构体怎么赋值才是透明的,尝试了很多没法解决,谢谢!!!!!!求赐教啊!!


请参见我的博客:
http://blog.csdn.net/chutianya/article/details/43206559

#1


解决方案各种各样,看哪种符合你的需要了。
你的系统显卡是什么?也许很多事让显卡来做更合适。

#2


引用 1 楼 Huntercao 的回复:
解决方案各种各样,看哪种符合你的需要了。
你的系统显卡是什么?也许很多事让显卡来做更合适。


额。。我现在这个就是三星4412芯片啊。。然后就是在板子上的LCD上显示。。。我又不想去搞驱动啊。。来不及啊。。想请教下FB的现有驱动有没有可以操作的接口啊?比如我现在用将LCD分成四块来显示。。但是FB映射出来的区域是线性区域。。我没法整体赋值啊。。对于每一个四分之一块 我如何控制它显示指定的画面啊?

#3


该回复于2014-09-12 13:36:04被管理员删除

#4


自顶。。。坐等大神现身

#5


楼主。。。。我最近在弄tiny4412的CMOS 摄像头。。。。能指导下不? framebuffer如何在指定区域显示?

#6


引用 5 楼 qiou661 的回复:
楼主。。。。我最近在弄tiny4412的CMOS 摄像头。。。。能指导下不? framebuffer如何在指定区域显示?

你弄CMOS摄像头的神马啊?CMOS我也还没弄的

#7


这个需要硬件支持
如果硬件只支持提供一个线性区域,则只能自己写算法来分4块显示。速度肯定慢,因为压力全在CPU上。
如果硬件支持通过设定某些特殊寄存器而把一些区块临时合并成一个小的连续内存访问区域,则通过这种映射的办法可以做到分成多块高速显示。这实际上是把计算压力压向硬件。
当你面临这个需求时,复杂度就已确定了。不能消灭复杂度,只能转移它。
这就是为什么现在电脑都配独立GPU,GPU就是把图象功能抽象出来,转移CPU的压力到其自身上。

#8


CMOS 摄像头的内核驱动。。。。。类似 ov7670 ov9650的摄像头。。。。

#9


我一下子想起来了Android系统中实现的方案,它完全不会去动驱动中的任何东西。把FB看成一个画布,按照大小分4块A B C D,A B C D分别当时一个单独的小的画面,分别的进程去操作它,将要显示的内容填充进去。然后将A B C D合并到一个画布上,填充到FB中。这样就实现了你的需求。换成Android中的话就是每个APP都是一个surface,各自尽情地绘制自己的界面,最终将这些个suface合成在一起,很典型的比如调出输入法的时候其实是APP 和 输入法APP都在前端显示,它们是两个不同的surface。它们之间的合并还是叠加性质的,你要实现的其实更简单,仅仅是像「拼圆」一样拼接在一起。

倒着看世界,一切都好办。

#10


struct fb_var_screeninfo {
 __u32 xres;
 __u32 yres;
 __u32 xres_virtual;
 __u32 yres_virtual;
 __u32 xoffset;
 __u32 yoffset;

 __u32 bits_per_pixel;
 __u32 grayscale;

 struct fb_bitfield red;
 struct fb_bitfield green;
 struct fb_bitfield blue;
 struct fb_bitfield transp;

 __u32 nonstd;

 __u32 activate;

 __u32 height;
 __u32 width;

 __u32 accel_flags;

 __u32 pixclock;
 __u32 left_margin;
 __u32 right_margin;
 __u32 upper_margin;
 __u32 lower_margin;
 __u32 hsync_len;
 __u32 vsync_len;
 __u32 sync;
 __u32 vmode;
 __u32 rotate;
 __u32 reserved[5];
};

不知道
 __u32 left_margin;
 __u32 right_margin;
 __u32 upper_margin;
 __u32 lower_margin;
能不能满足你的需求

#11


楼主  根据我的关产,你已经4天没上线了,还不来吗? framebuffer如何在指定区域显示?

#12


你快粗来   framebuffer如何在指定区域显示?

#13


引用 8 楼 qiou661 的回复:
CMOS 摄像头的内核驱动。。。。。类似 ov7670 ov9650的摄像头。。。。


我不是做驱动的啊。。你问我也没用啊。。我只是搞应用的。。。不做驱动

#14


引用 9 楼 kangear 的回复:
我一下子想起来了Android系统中实现的方案,它完全不会去动驱动中的任何东西。把FB看成一个画布,按照大小分4块A B C D,A B C D分别当时一个单独的小的画面,分别的进程去操作它,将要显示的内容填充进去。然后将A B C D合并到一个画布上,填充到FB中。这样就实现了你的需求。换成Android中的话就是每个APP都是一个surface,各自尽情地绘制自己的界面,最终将这些个suface合成在一起,很典型的比如调出输入法的时候其实是APP 和 输入法APP都在前端显示,它们是两个不同的surface。它们之间的合并还是叠加性质的,你要实现的其实更简单,仅仅是像「拼圆」一样拼接在一起。

倒着看世界,一切都好办。


你这样做貌似不靠谱吧。。

你说分成ABCD四块。然后四块合并成到一个画布。。问题就是在这里。。你怎么合并啊? 无论你怎么合并都是将四块区域合并到一个线性存储的FB空间。。。也就是说你需要A块的第一行和B块的第一行先连接起来然后第二行连接。。以此类推下面的CD也是如此。。你这样显示一整幅图就要这样线性的去操作四块的每一行进行拷贝,这样的显示效率你知道有多滴么。。对于高帧率的视频这是不可能的事情。。时间不允许。。。。

#15


引用 9 楼 kangear 的回复:
我一下子想起来了Android系统中实现的方案,它完全不会去动驱动中的任何东西。把FB看成一个画布,按照大小分4块A B C D,A B C D分别当时一个单独的小的画面,分别的进程去操作它,将要显示的内容填充进去。然后将A B C D合并到一个画布上,填充到FB中。这样就实现了你的需求。换成Android中的话就是每个APP都是一个surface,各自尽情地绘制自己的界面,最终将这些个suface合成在一起,很典型的比如调出输入法的时候其实是APP 和 输入法APP都在前端显示,它们是两个不同的surface。它们之间的合并还是叠加性质的,你要实现的其实更简单,仅仅是像「拼圆」一样拼接在一起。

倒着看世界,一切都好办。


你的意思可能是我的另外一种做法。。估计你是这个意思。。。

我的另外一种做法就是本身这个fb是有多个的。。你在每个FB上画四分之的图。然后将四个FB重叠合并。。

这种做法我早就实现了。。这个我知道。。是可以做到的。。问题是这样做要考虑到FB个数的问题。。它只有5个FB。。我QT GUI用掉一个。还剩下四个。。这四个刚好可以做四个视频的窗口。。。

但是问题来了。。我还额外需要一个窗口用来和四窗口切换。。。这时候就没有FB可用了。。。所以我才放弃这种方案来这里问有没有在一个FB上弄四个窗口显示视频的方案。。。

#16


别那么早就是想着fb,在最后关头才是它。以下是Android的实现框架,供你参考:
framebuffer如何在指定区域显示?

#17


引用 16 楼 kangear 的回复:
别那么早就是想着fb,在最后关头才是它。以下是Android的实现框架,供你参考:
framebuffer如何在指定区域显示?

还有一张图:
framebuffer如何在指定区域显示?

#18


这个问题现在解决了。。最后还是在单个FB上进行的四块视频显示。。。。其实还是自己定义了一个API能够在FB上指定位置显示一个矩形。。。具体实现就是逐行去扫描。。。之前一直也有想过这么做。。只是感觉效率可能不行。。现在试了一下还可以 。。就这么用着了。。

#19


framebuffer如何在指定区域显示?

就是要让黑色部分透明,黑色区域的后面是采集的视频, framebuffer如何在指定区域显示?

在网上找到了fb_bitfield这个结构体怎么赋值才是透明的,尝试了很多没法解决,谢谢!!!!!!求赐教啊!!

#20


引用 19 楼 u012175394 的回复:
framebuffer如何在指定区域显示?

就是要让黑色部分透明,黑色区域的后面是采集的视频, framebuffer如何在指定区域显示?

在网上找到了fb_bitfield这个结构体怎么赋值才是透明的,尝试了很多没法解决,谢谢!!!!!!求赐教啊!!


请参见我的博客:
http://blog.csdn.net/chutianya/article/details/43206559

#21