从页擦除开始,页是包含许多区域的容器,通过在 对域填充标志位置位的时候才会开始填充,然后进行object的绘制。
PES数据包 包括流ID,包长度,携带数据类型标志,PTS,以及PES数据域——>而PES数据域又包括subtitle段,数据标识符(0x20) subtitle流ID (0x00) 在其结尾还有8个数据域结束掩码,全部被置为1
subtitle段 的构成:同步字节:8比特,在PES数据包内,解码器通过同步字节来确定一段的开始。同步字节应该被设为00001111。
段类型:它指示了段所包含的数据的类型。0x10表示PCS,0x11表示RCS, 0x12表示CLUT定义段,0x13表示object数据段,0x80表示display set结束段.
页ID,表示了subtitle段中subtitle服务类型。具有composition page ID的段所携带的数据是某一subtitle服务专用的。而具有辅助页ID的段所携带的数据是被多个服务共享的。
段长度,表示段的数据域的长度,用字节表示。
段数据域,携带着信息。根据段的类型不同,携带的数据的意义不同。
CLUT定义段 CLUT ID: 标识了一个CLUT。
CLUT版本号:指出该段数据的版本号,当该段的任何内容改变是,版本号加1。
CLUT项目号:首个CLUT的项目号为1。
全范围标志:如果置1,表示Y值,CR值,CB值,T值全部用8位表示。
Y值
CR值
CB值
T值
object 数据段 包含的object ID
object版本号
object编码方式:表明如何对object进行编码,是用象素的方式,还是用字符串的方式。
头部区域数据模块长度
尾部区域数据模块长度
象素数据子模块
填充位: 8个0。
三、subtitle解码系统的实现
分为engine task 对数据包进行预处理,如将某些数据存进缓冲区中 取出PCS解析时存入的PCS_t结构,并将需要显示的域的像素数据注入区域位置上对应的缓冲区中,在然后生成一个STSUBT_DisplayItem_t以供timertask显示。(详情见源码?)
timer task 对数据的显示进行控制,当PTS到来时,将subtitle进行显示。
像素缓冲区储存在解码器初始化时分配,保证在任一时刻只有一个任务对其进行操作(使用指针)。同时,为方便缓冲区操作,对每个缓冲区都定义了一套接口函数,避免了直接操作缓冲区指针,增加了缓冲区操作的透明度,也提高了程序代码的可读性。
对区域表中的subtitle的存取和输出显示
有如下几张图