关于JSVM9.19.9代码CommonTypes.h中数据结构的解释
2010-09-26 08:44
337 查看
g_aucConvertBlockOrder的理解参考H.264 2005.3中文标准中P26,6.4.3 反向4*4亮度块扫描过程。
下面是我初步的理解,不一定正确:
class LumaIdx:一般是指4*4的块在光栅扫描下的索引。里面的成员变量m_iIdx就表示这个索引值。索引标示如下图所示,大的方框表示16*16的MB,小的方框表示4*4的block。
通过数组g_aucConvertBlockOrder
const UChar g_aucConvertBlockOrder[17] =
{
0, 1, 4, 5,
2, 3, 6, 7,
8, 9, 12, 13,
10, 11, 14, 15, 0xff,
};
可以将索引转为反向4*4亮度块扫描过程中的扫描顺序,详见H.264 2005.3中文标准中P26,6.4.3。 该顺序与上面数组显示是一致的,如下图。
成员函数Int b4x4():返回成员变量m_iIdx的值,就是光栅扫描下的索引。
Int x(),Int y():返回光栅扫描顺序下每个4*4块索引相对于最左上4*4块的坐标。
坐标图如下(x,y):
成员函数Par8x8 getPar8x8()作用:获取当前索引下的4*4块所在的8*8块的索引值。
比如,当m_iIdx=2,getPar8x8()返回的结果就是B_8x8_1(其值就是1,这是一个枚举数据),表明该4*4块在索引值为1的8*8块中。8*8的块索引如下图所示。
成员函数getS4x4:获取4*4的快在所在的8*8块中的反向扫描顺序号。在每个8*8块中4个4*4块都是按照下面的顺序反向扫描的。
比如当m_iIdx=2时,所在8*8中的位置如下:
getS4x4返回结果为0,同理:当m_iIdx=3,6,7时候,分别返回1,2,3。
函数operator + ( SParIdx4x4 eSParIdx )作用:根据当前m_iIdx的值,可以求8*8块中所有4*4块的索引值。比如当m_iIdx=2,eSParIdx= SPART_4x4_1,表明求8*8块中位置为1的4*4块的索引值,结果为3。同理,eSParIdx分别=SPART_4x4_2,SPART_4x4_3,返回的结果分别为6和7。
函数operator + ( ParIdx8x8 eParIdx )作用:也比较模糊。
operator + ( NeighbourBlock eBlock )作用:尚未搞清楚。
以上分析是个人意见,未必全对。待续。。。
根据后面代码发现,对于class LumaIdx的理解是有偏差的,可以指任何大小的块索引,后面再补充。
下面是我初步的理解,不一定正确:
class LumaIdx:一般是指4*4的块在光栅扫描下的索引。里面的成员变量m_iIdx就表示这个索引值。索引标示如下图所示,大的方框表示16*16的MB,小的方框表示4*4的block。
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
const UChar g_aucConvertBlockOrder[17] =
{
0, 1, 4, 5,
2, 3, 6, 7,
8, 9, 12, 13,
10, 11, 14, 15, 0xff,
};
可以将索引转为反向4*4亮度块扫描过程中的扫描顺序,详见H.264 2005.3中文标准中P26,6.4.3。 该顺序与上面数组显示是一致的,如下图。
0 | 1 | 4 | 5 |
2 | 3 | 6 | 7 |
8 | 9 | 12 | 13 |
10 | 11 | 14 | 15 |
Int x(),Int y():返回光栅扫描顺序下每个4*4块索引相对于最左上4*4块的坐标。
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
0,0 | 1,0 | 2,0 | 3,0 |
0,1 | 1,1 | 2,1 | 3,1 |
0,2 | 1,2 | 2,2 | 3,2 |
0,3 | 1,3 | 2,3 | 3,3 |
比如,当m_iIdx=2,getPar8x8()返回的结果就是B_8x8_1(其值就是1,这是一个枚举数据),表明该4*4块在索引值为1的8*8块中。8*8的块索引如下图所示。
0 | 1 |
2 | 3 |
0 | 1 |
2 | 3 |
2 | 3 |
6 | 7 |
函数operator + ( SParIdx4x4 eSParIdx )作用:根据当前m_iIdx的值,可以求8*8块中所有4*4块的索引值。比如当m_iIdx=2,eSParIdx= SPART_4x4_1,表明求8*8块中位置为1的4*4块的索引值,结果为3。同理,eSParIdx分别=SPART_4x4_2,SPART_4x4_3,返回的结果分别为6和7。
函数operator + ( ParIdx8x8 eParIdx )作用:也比较模糊。
operator + ( NeighbourBlock eBlock )作用:尚未搞清楚。
以上分析是个人意见,未必全对。待续。。。
根据后面代码发现,对于class LumaIdx的理解是有偏差的,可以指任何大小的块索引,后面再补充。
相关文章推荐
- C++卷积神经网络实例:tiny_cnn代码具体解释(6)——average_pooling_layer层结构类分析
- H.266中关于I帧亮度色度QTBT结构独立的解释
- 一段神奇的代码-关于PHP字符变量奇怪现象的解释
- 一段神奇的代码-关于PHP字符变量奇怪现象的解释
- SD--关于定价过程中的存储顺序的参考结构和参考字段的使用代码跟踪
- 关于com解释的一段代码,你懂的
- Spring Boot关于代码结构两点建议
- 关于ARM中断的具体的启动代码解释
- 关于日历实现代码里0x04bd8, 0x04ae0, 0x0a570的解释
- 关于JSP的Cookie的入门学习,以及部分代码的备注解释
- 关于使用PHP向客户端发送文件-示例代码解释
- 今天写了个关于大整数的保存结构和实现大整数相加的代码(暂时仅限正整数)
- 关于FTP出错代码解释
- 关于GCC汇编代码的几个寄存器解释
- 关于这段奇怪代码的解释
- [置顶] 关于决策树ID3算法,熵,信息增益率的权威解释,稍后奉上python代码
- 关于 HOG 代码 的一些解释
- SD--关于定价过程中的存储顺序的参考结构和参考字段的使用代码跟踪
- 解释一段java关于同步锁synchronized代码的结果
- 关于空间中数据库连接中最初一段代码的解释(转自扬中科老师的视频)