subtitle模块从TPS模块(?) 拿到的data是PES ,DVB的subtitle解码出来实际是一段index,取决于pallete的表 在code中体现为clut 表示的是这段index表示的pixel是哪个颜色。
IP和OP的概念,主要区别是由输入scaler,缩放成scaler的size以后再由scaler缩放处理,在panel上显示出来;而OP则是直接有scaler直接进行输出
dfb window可以视为是一个buffer,图像和坐标信息绑定在window surface上,通过surface来操控buffer。
主要属性有:width ,height ,start x,start y;
透明度:data format
Data format (I8 ARGB4444 ARGB8888)(?)
dfb(linux轻量级图形系统) layer 和硬件的GOP一一对应 每层都会对应一个GOP(graphics output path),由GOP通过IP/OP的形式,在panel上显示。
而layer相当于一个总集,每个layer上有许多个dfb window依附其上 作用:每个window可以画在自己的缓冲区,最后一并显示。
dfb layer的主要属性有:IP/OP的输出方式;Timing大小 GetScreen->GetScreen->(iScreenWidth,iScreenHeight),正常的,在IP情况下是Video 的size OP情况下是panel的Size
决定大小和相对于panel位置的width height,start x,start y。
更改位置信息属性SetScreenLocation,并自动缩放。(?)
单buffer 或者 双buffer交替使用避免闪烁(?)
(单buffer:cpu往framebuffer 里写 ,led从framebuffer里读,如果写>读,led还没读完,cpu却以及刷新了数据,这样就容易导致数据混乱;一般情况下,led花较短的时间就读完CPU的数据,很长时间处等待过程中;如果写<读,会造成屏幕一闪的状态,所以cpu需要尽快地写入数据,争取在led读取数据的一个时间周期以内)
在单buffer时代,为了尽快的写入数据,会在内存中另开一块作为buffer,事先存储好,需要显示的内容,然后在需要写入的时候只要执行一次内存拷贝就可以了。
但是这样做的效率太低,针对其软件的角度改善,每次尽量缩小刷新的范围,减少内存的传输。
从硬件角度来讲,采用更高的CPU,采用更快的DDR内存,提高内存的吞吐率。
双buffer:LED显示当前的framebuffer时,软件可以直接向后台的framebuffer写,写完之后只是两个buffer做下切换,不需要内存拷贝,提高效率。利用GPU的硬加速,显示的数据必须留存在物理内存中的,这是单buffer所不能实现的
局部刷新:单buffer很容易实现局部刷新,而双buffer如果要实现局部刷新的话,必须先将当前的buffer拷贝到后台buffer,然后再做局部刷新,所以不如整屏刷新。
I8(Alpha 8?) ARGB4444 ARGB8888 ARGB(Alpha ,red,green,blue各占8位)
region window : 一个或多个Region组成,每个region(分区)都是做RLD解码,并存储解码后的index,每个region都包含坐标信息,是subtitle的位置。
region的buffer从DFB中获取,并且依附于dfb window surface,format I8。
offscreen window 和 onscreen window:
offscreen window 从dfb 获取而来的buffer存储的内容是region buffer通过位块转换(BitBlT)而来的
onscreen window 是外接于dfb layer,考虑IP和OP 的选取,IP根据video crop window 来缩放画面OP 是根据Display window 设置dfb属性。,存储的也是offscreen 位块转换而来的内容。
offscreen 和onscreen 的buffer 都是由dfb获取,附于dfb window surface和ARGB4444。
开始看code:'\'作为一行的连接符;“::”在c艹中的一种功能是作用域限定符/静态函数定义A::B,定义B是A类中的一个静态函数
~----->析构函数 和构造函数同名,只在前面加一个~,对该构造函数的动作做一些处理工作
namespace 命名空间,有点像类,又不同于类。使用namespace中的变量用 :: 操作符,避免了变量重名的问题
enum类型第一个的默认值为0,每个变量在之前的基础上加一。
学习了一个do{...} while(0)的写法 辅助定义复杂的宏
GCC 下 DLL_PUBLIC 不太理解
在加了virtual的前提下,只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用------C++primer,
可以通过重写虚拟函数来对基类虚拟函数进行覆盖
由于虚析构的特性,如果析构函数不加virtual,那么在delete删除指针的时候,会仅仅只删除基类而不删除派生类。给析构函数加上一个virtual会让从派生类由下至上一直删除指针到该指针被声明的类型。