我目前正在为无损 JPEG(DNG、CR2 等)开发 OpenCL 解码器。该标准对组件的布局方式(交错与平面)几乎没有限制,这与相当不灵活的 OpenCL 内核相冲突。
特别是组件标识符的概念似乎不必要地复杂,所以我想知道我是否正确:
SOF3 标头(第 3 帧开始,非差分,霍夫曼编码,无损(顺序))包含有关每个组件的一些信息。那些是:
i
(隐式):组件的索引C_i
: 组件标识符H_i
/V_i
:水平/垂直采样因子Tq_i
:量化表目标选择器
每个帧可以由包含至少一个颜色分量的编码图像数据的若干扫描组成。每个 SOS 标头(扫描开始)声明哪些组件将成为特定扫描的一部分。对于每个组件,先前声明的标识符 ( C_i
) 之一用作反向引用 ( Cs_j
,扫描组件选择器)。标准中的限制很少(B.2.3 Scan header 语法):
规则1:
每个
Cs_j
都应匹配C_i
帧头中指定的值之一,并且扫描头中的顺序应遵循帧头中的顺序。如果Ns
> 1,则 MCU 中交错组件的顺序为Cs_1
第一、Cs_2
第二等。
规则 2:
的值
Cs_j
应不同于Cs_1
to的值Cs_j-1
。
我的问题是:
- 规则 1 不允许对组件重新排序(例如,帧中的 R|G|B,但扫描中的 B|G|R)。是否允许创建多个扫描,每个扫描包含一个组件(平面配置),同时使用扫描-B、扫描-G、扫描-R的顺序,而不是扫描-R、扫描-G、扫描-B?
- 是否可以在扫描中跳过组件?例如,R|G|B 在 Frame 中声明,然后是 scan-R|B,然后是 scan_G?
- 为什么扫描中的组件由其标识符 () 引用,而不是帧头中
C_i
的索引 ( )?i
除了唯一性之外,标识符是否有任何限制,或者声明 R:C_0=255、G:C_1=3、B:C_2=250 是否真的有效?