5 subtitle解码器模型
Subtitle解码器模型是解析subtitling流所需的处理过程的抽象。该模型的主要目的是定义一系列的约束,用于验证subtitling流的有效性。下图给出了接收器中subtitling解码过程的一个典型的实现方式。
Subtitling解码过程的输入时一个MPEG-2传输流。经过基于PID值的过滤后,完整的传输流包进入一个512字节的传输缓存。当传输缓存中有数据时,该缓存中的数据将以192kbit/s的速度被取走。没有数据时,速度等于0。
从缓存中获取的MPEG-2传输流包会根据特有的数据标示值进行去TS包头和PES包头的处理。PTS字段需要传递到subtitling处理的下一阶段。预处理的输出是subtitling分段,它们是经过page_id过滤的。
被选中的分段进入一个24K字节大小的编码数据缓存。Subtitle解码器会从该缓存中取走完整的分段。分段的移除和解码时连续的(也就是说,这个过程需要的时间为0)。如果一个分段产生像素数据,subtitle解码器停止从编码数据缓存中移除分段,直至所有的像素已经被传输到像素缓存中。像素数据传输到像素缓存的速率为512kbit/s。
5.1 解码器时间模型
解码器的内存使用的完整描述需要在每个epoch的开始被传输。因此,epoch的边界提供了一个有保障的服务查询点。Epoch的边界以页组合分段的“mode change”标记来做标志。
像素缓存和组合缓存(composition buffer)记录subtitling解码器的状态。epoch的状态是在页组合分段(Page Composition Segments ,PCSs)之间以页状态“mode change”来定义的。当一个状态为“mode change”的PCS被接收时,先前的分段指示的所有内存将被丢弃,即解码器状态复位。
一个epoch中使用的所有的region将由伴随着页状态为“mode change”的PCS的显示集合中的区域组合段(Region Composition Segments ,RCSs)描述(即epoch的第一个显示结合)。这个要求允许解码器可以在任何对象数据在写入缓存之前安排所有像素缓存的分配。相似的,在一个epoch期间所有使用的CLUT条目都应在第一个显示集合中描述。随后的分权可以修改像素缓存和组合缓存中的值,但是不能修改所需的内存的数量。
5.1.1 service acquisition
其他的页状态允许的值还有“acquisition point”和“normal case”。前者和“modechange”状态类似,标示解码器所需内存完整的描述正在广播。然而,该内存的使用保持为和之前操作的内存一致。已经获取了该服务的解码器仅需查找已经存在的显示的发展(例如,解码新的图像对象)。解码器尝试获取service时,可以将“acquisition point”做和“modechange”一样的处理。
使用页状态“mode change”可能会要求解码器在分配使用的内存时要先移除图形显示一段时间。“acquisition point”不应该造成任何的显示中断。因此,“modechange”很少使用(例如,在节目的开始或者图形显示中有重要的变化时),而“acquisition point”则每几秒就会被使用,以使得解码器可以快速获得service。
“normal case”说明RCS集合可能不是完整的(仅仅包含该显示集合中被绘制的region)。目前暂不要求解码器在“normalcase”显示集合去尝试service acquisition。
5.1.2 显示时间戳PTS
分段被封装在PES包中。PES包结构主要用于为subtitling数据携带PTS。
和视频不同,subtitling显示没有自刷新率。所以,每个显示都和一个PTS关联,以控制其显示的时间。对任何一个subtitling流来说,每一PES包中最多有一个显示集合。然而,PES包可以包含很多不同subtitle流公用的显示集合,它们共享相同的显示时间戳。一个显示时间的分段有可能必须被划分到多个PES包中(例如,因为PES包长度不大于64K字节的限制)。在这种情况下,多个PES包拥有相同的PTS值。
总的来说,一个单独的显示集合的所有分段应该在一个(或多个)拥有相同PTS值的PES包中携带。
一个显示的所有数据应该在充足的时间内传递到解码器,以使得一个解码器可以在PTS指示的时间下解码所有的数据。
5.1.3 page composition
页组成段(PCS)携带一个包含0或者多个region的清单。这个列表定义了PCS定义的显示中可见的region的集合。
这个可见清单在PTS定义的时间变得可用。解码器的显示将立即从之前存在的可见区域的集合切换到最新定义的集合。
PCS之后可能会跟着0 或多个区域组合段(RCS)。PCS中的region清单可能和后面跟着的RCS集合有很大的不同。
5.1.4 region composition
一个完整的RCS集合将随着标志有“modechange”或“acquisition point”状态的PCS之后出现,这是引入region并为它们分配内存的过程。“normalcase”状态后的显示集合应该进包含内容变化的region。
一旦一个region引入了“foot print”,该区域应该在这个epoch中保持固定。Region指定的下面的要素一旦设置不能改变:
- width
- height
- depth
- region_level_of_compatability
- CLUT_id
Region的属性region_fill_flag和regin_n-bit_pixel_code。当region_fill_flag设置时,region上执行的第一个图形操作应该使用region_n-bit_pixel_code指示的颜色来为该区域中的所有像素着色。region_n-bit_pixel_code的值应该只有在RCS中region_fill_flag被设置的地方变化。已经获取了subtitling service的解码器在region_fill_flag没有设置时,可以忽略region_n-bit_pixel_code。在获取这个service的过程中的解码器可以依赖region_n-bit_pixel_code作为当前region的填充色,而忽略region_fill_flag的状态。
并不需要在epoch的开始引入region时就初始化填充该region。这使得渲染的工作可以推迟到该区域可见时再做。在特定的情况下,region可能永远不会初始化。例如,如果一个使用图象对象完整填充的region就永远不需要被初始化。
【这里region初始化填充应该指的是使用特定颜色填充整个region,但是有时region是需要有其他数据再次填充的,因此就没有必要再使用填充色着色了】
5.1.5 Point to note 重点
- 在每个epoch开始,显示集合(display set)应该包含一个完整的RCS集合,该RGS集合包含了所有在这个epoch中使用的region。PCS只需要列出所有这些region中初始化可见的子集。在特定的情况下,任何PCS有可能会列出0个可见region。
- 如果一个RCS的内容需要被修改的话,其应该被显示在一个显示集合中。然而,这个RCS不应该存在于PCS region列表中。这就使得region在它们不可见时可以被修改。
- RCS即使不会被修改,也可以存在于一个显示集合中。例如,一个广播可能会选择在每个显示集合中播放一个完整的RCS列表。
- 解码器应该检测显示集合中的每个RCS以决定哪个需要修改像素缓存。通过检测RCS版本号来判断一个region是否需要修改对解码器来说是高效的。有三个因素可造成修改产生:
- region fill flag 被设置
- CLUT 变化
- 非0长度的对象列表
5.2 缓存模型 Buffer Memory model
像素像是和组合缓存是有限的内存资源。一个状态为“modechange”的页组合分段会销毁所有之前分配的显示和组合缓存内存,使这些内存的内容为未定义。
各个过程(如下面详述)从这些有限的资源中分配内存。这些分配的内存会保持至下一个状态为“modechange”的页组合分段到来。
没有部分地重分配内存的机制。一个region一旦引入,则保持分配状态知道下一个状态为“modechange”的也组合分段到来。
5.2.1 像素显示缓存
显示缓存有80k字节的容量,其中60k字节可以分配给活动的显示。剩下的容量可以被分配给未来的显示。Subtitle解码器模型假设存储在显示缓存的数据的需求为:
region_bits = region_width × region_height × region_depth
region_depth是region的像素深度,从表4的RCS元素region_depth得到。Subtitle解码器的真实的实现可能需要更多的内存来实现每个region。该实现需求的上限在subtitle解码器模型中没有涉及到。
显示缓存的占用量就是所有定义的region的region_bits的总和。
5.2.2 Region memory
像素缓存是在一个region首次引入时分配的。该内存分配一直保持到下一个“modechange”的的页组成段到来销毁掉所有的内存分配为止。
5.2.3 Composition buffer memory
组合缓存保持所有的显示数据结构而不是显示的图象对象。组合缓存记录着页组成,region组成和CLUT定义的信息。
组合缓存分配模型假设使用如下的数量的字节大小:
Page composition 4
per region 6
Region composition 12
per object 8
CLUT definition 4
per non full range entry 4
per full range entry 6
5.3 Cumulative display construction
一旦引入,和region相关联的像素缓存的内容就会在每个显示集合中累积修改。
5.4 Decoder rendering bandwidth model 解码器渲染带宽模型
显示内存的渲染带宽被设置为512kb/s。理想的模型假设内存操作是百分百有效的。所以,当一个10像素乘以10像素的对象在一个region以4比特像素深度渲染时,就是需要进行400比特的操作。
512kb/s的设置包括所有对像素缓存的修改。不同解码器架构可能需要不同数量的内存操作。比如,某个架构可能需要在几个字节上进行读、修改、写操作才能修改一个像素。这些实现的情况和解码器模型无关而是需要解码器的设计者考虑的。
5.4.1 Page erasure
页擦除不会直接对像素缓存进行任何修改。所以不会影响解码器的渲染时间。
5.4.2 Region move or change in visibility
通过对PCS中的列表中记录的region的位置修改,使得region被重新定位。这个处理的计算负载很大程度上依赖于图形系统的实现。然而,解码器模型是基于region的,所以解码器模型假设region的移动没有渲染的负担。
同样地,region的可见性可以通过将其放入或移除PCS的region列表来改变。同上,解码器模型假设该操作没有渲染消耗。
5.4.3 Region fill
设置region的fill标志指示该region需要使用定义的填充色完全重画。例如,填出一个100像素乘以100像素且4比特深的region需要消耗40000比特的操作。在region的fill标志被设置的地方,假设region的填充发生在任何其他对象呗渲染进该region之前。
Region仅在region的fill标志设置时被填充。在region第一次引入时并不会自动进行填充操作。这允许编码器可以延迟填充操作和渲染的负担。
一个解码器可以选择的查看region的对象列表中的对象和将被擦除的区域的交集,然后尝试优化区域擦除操作。对象可能有不规则的右边缘或者包含透明的孔。解码器模型没有涉及可能的优化操作。
5.4.4 CLUT modification
一旦引入,region总是和一个特定的CLUT关联。然而,CLUT的新的定义可能被广播(即,像素编码和显示颜色之间的映射可以被重新定义)。CLUT定义的变化被假设没有渲染负担。
5.4.5 Graphic object decoding
图形对象应该在它们被解码后被渲染进像素缓存。一个对象可以被引用多次(例如,一个字符在一个文本片段中使用多次)。每个对象的渲染负担取决于:
- 可以包含在对象中的最小矩形封装的像素的数量
- 对象实例化所在的region的像素深度
- 对象实例化的次数
“最小封闭矩形”规则一般用于简化计算,同样也处于read-modify-write的像素渲染处理本质的考量。
对象编码系统允许对象有不规则的右边缘。“end of object line code”和“最小封闭矩形”之间的像素位置并没有提供。这些像素应该保持不被修改。
5.4.6 Character object decoding
Subtitling系统允许字符引用被作为一个图形对象的替换者被传送。Subtitling流中的信息不能保证一个字符编码系统可靠地工作。
广播发送者和设备生产商之间的本地协议可能是一个合适的方式来保证可靠地字符编码subtitle操作。本地协议将会适当地定义字体的特征(字符大小和其他度量)。还应该为每个字符定义一个解码器渲染预算模型。