x264_scan8 的理解
来源:互联网 发布:松溪县网络推广专员 编辑:程序博客网 时间:2024/06/05 04:37
原文:http://blog.csdn.net/hevc_cjl/article/details/8273533
先上代码及注释
- #define X264_SCAN8_SIZE (6*8) //!< 扫描表的尺寸
- #define X264_SCAN8_0 (4+1*8) //!< 扫描表第一个扫描序(即亮度的首扫描序)
- static const int x264_scan8[16+2*4+3] =
- {
- /* Luma */
- 4+1*8, 5+1*8, 4+2*8, 5+2*8,
- 6+1*8, 7+1*8, 6+2*8, 7+2*8,
- 4+3*8, 5+3*8, 4+4*8, 5+4*8,
- 6+3*8, 7+3*8, 6+4*8, 7+4*8,
- /* Cb */
- 1+1*8, 2+1*8,
- 1+2*8, 2+2*8,
- /* Cr */
- 1+4*8, 2+4*8,
- 1+5*8, 2+5*8,
- /* Luma DC */
- 4+5*8,
- /* Chroma DC */
- 5+5*8, 6+5*8
- };
- /*
- 0 1 2 3 4 5 6 7
- 0
- 1 B B L L L L
- 2 B B L L L L
- 3 L L L L
- 4 R R L L L L
- 5 R R DyDuDv
- */ // B -- Cb; R -- Cr; L -- Luma; Dy -- Luma DC; Du -- Cb DC; Dv -- Cr DC
x264_scan8是一个存放着4x4亮度块及色度块扫描序的数组,其内存存储方式如下所示:
其中,每一个小方格代表着一个4x4块,方格中的数字则是对应块的序号。
根据代码中对x264_scan8这个数组的赋值不难得到上图,其中,红色方块代表的是亮度块,绿色块和蓝色块分别代表两个色度块,而三个橙色块则依次代表亮度、两个色度的DC块。
为什么要这么做呢?我们知道,在进行帧内预测,帧间运动矢量预测的时候,需要使用到当前块的left块和top块,在CAVLC编码过程中,也需要知道当前块的left块和top块的non_zero_count,故由上图可以看到,空出来的部分可以用于存储前述所需的left块和top块的相关参数,起到便于访问和节省内存的作用。
看下面这个例子:
- void x264_mb_predict_mv_16x16( x264_t *h, int i_list, int i_ref, int16_t mvp[2] )
- {
- int i_refa = h->mb.cache.ref[i_list][X264_SCAN8_0 - 1]; //!< a块参考帧序号
- int16_t *mv_a = h->mb.cache.mv[i_list][X264_SCAN8_0 - 1]; //!< a块的运动矢量
- int i_refb = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8]; //!< b块参考帧序号
- int16_t *mv_b = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8]; //!< b块的运动矢量
- int i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 + 4]; //!< c块参考帧序号
- int16_t *mv_c = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 + 4]; //!< c块的运动矢量
- int i_count;
- if( i_refc == -2 )
- {
- i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 - 1];
- mv_c = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 - 1];
- }
- i_count = 0;
- if( i_refa == i_ref ) i_count++;
- if( i_refb == i_ref ) i_count++;
- if( i_refc == i_ref ) i_count++;
- if( i_count > 1 )
- x264_median_mv( mvp, mv_a, mv_b, mv_c );
- else if( i_count == 1 )
- {
- if( i_refa == i_ref )
- *(uint32_t*)mvp = *(uint32_t*)mv_a;
- else if( i_refb == i_ref )
- *(uint32_t*)mvp = *(uint32_t*)mv_b;
- else
- *(uint32_t*)mvp = *(uint32_t*)mv_c;
- }
- else if( i_refb == -2 && i_refc == -2 && i_refa != -2 )
- *(uint32_t*)mvp = *(uint32_t*)mv_a;
- else
- x264_median_mv( mvp, mv_a, mv_b, mv_c );
- }
其中,a块,b块,c块分别是当前宏块左、上、右上邻块,结合x264_scan8的赋值及上图不难分析出上述结论。
0 0
- x264_scan8 的理解
- x264_scan8 的理解
- x264_scan8 的存储方式
- X264的x264_scan8变量
- x264_scan8
- x264_scan8
- x264_scan8分析
- x264-1.29 x264_scan8
- 理解 TranslateAnimation动画的理解
- CopyOnWriteArrayList的理解与理解
- 理解装饰模式的理解
- java数据源的理解---------------自己的理解
- Session的理解Cookie的理解
- 理解Javascript_06_理解对象的创建过程
- 理解select模型的关键在于理解fd_set
- 理解Javascript_06_理解对象的创建过程
- Hibernate理解2:hibernate的运用理解
- 关于自然语言理解的一些理解
- 编程语言与思维:科技公司如何自我重构?
- 5.3.2 成员变量的初始化和内存中的运行机制
- 修复Kaos的中文显示
- 安卓框架设置
- SIM9001GSM模块教程
- x264_scan8 的理解
- 解读思科2014-19年全球移动互联网发展趋势报告(1)
- Java面试题之==和equals的区别
- Hibernate学习笔记 - Session.evict(user)方法
- 5.3.3 局部变量的初始化和内存中的运行机制
- Android官方提供的两种viewpager滑动动画
- Enum 权举最好放在类以外
- HTML5之视频功能
- 运行STASM所需要的Visual Studio 2010和OpenCV的配置方法