x264_scan8 的理解

先上代码及注释
#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的赋值及上图不难分析出上述结论。

 

(转载请注明出处。)


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: x-scan扫描器是一种基于Java语言开发的网络漏洞扫描器,其源码是通过开源方式提供给用户的。该源码主要涉及网络通信、协议解析、漏洞检测等方面的技术,使用者可以基于源码进行定制化开发,满足特定的需求。 源码中,主要包括了以下几个部分: 1. 网络通信模块:负责与目标主机进行网络通信,包括TCP连接、HTTP请求等。 2. 协议解析模块:针对各种网络协议进行解析,获取协议的具体信息,如HTTP响应头、DNS解析结果等。 3. 漏洞检测模块:结合已有的漏洞库,对目标主机进行漏洞扫描,并输出相应的扫描结果。 4. 数据存储模块:将扫描结果保存到数据库或文件中,使得用户可以进行统计分析和后续处理。 总之,x-scan扫描器源码在实现网络漏洞扫描方面具有一定的技术含量,用户可以根据自己的需求对其进行二次开发,提升其性能和应用范围。同时,用户在使用时也需要遵守相关的法律法规,避免对他人造成无意义的损失。 ### 回答2: X-Scan扫描器是一款免费的网络安全扫描工具,可以用于检测网络主机是否存在漏洞,并提供一些安全建议。它是基于Perl语言开发的,可以跨平台运行。X-Scan使用可编程的插件来增强其扫描功能,如高级 HTTP/CGI 检测、漏洞扫描、字典攻击等,可以扫描大量的网络协议,如FTP、SMTP、Telnet等。 X-Scan的源码可以在GitHub上找到,可以根据自己的需要定制安全扫描器。X-Scan的源码结构清晰,易于理解和修改。它的扫描模块和插件都可以自由添加或修改,而且可以通过简单的Perl脚本实现。可以根据不同的需要,自定义和增强扫描器的功能。 X-Scan扫描器源码的优势在于其灵活性和可扩展性。通过添加新的扫描模块和插件,可以快速适应新的安全威胁。而且,X-Scan的源码结构清晰,易于理解和修改,使开发人员可以快速进行二次开发和定制。 但是要注意,在使用X-Scan的源码进行开发时,需要对网络安全有一定的了解和经验。 ### 回答3: x-scan扫描器是一种网络安全工具,它可以通过扫描网络中的端口、协议等信息,发现网络中存在的安全隐患,帮助管理员及时排除漏洞。而x-scan扫描器源码,指的是这个安全工具的程序代码,是开发者为了让更多人了解其工作原理而公开的。 x-scan扫描器源码可以帮助用户学习网络安全方面的知识,特别是如何使用扫描器来保护网络安全。通过观察源码中的算法、代码注释等信息,可以深入理解扫描器的工作方式和原理。用户可以学习如何在掌握一些基本的网络知识后,自行开发或改进安全工具,提高对网络安全的防御能力。 同时,x-scan扫描器源码也是用来操作扫描的,通过关注源码中的检测技术,了解威胁、漏洞、攻击、欺骗等方面的知识,可以识别出一些潜在的安全隐患。有助于管理员及时排除漏洞,以提高网络系统的安全性。 因此,学习x-scan扫描器源码不仅可以提高用户的网络安全意识,还有助于提高技术能力和应对网络攻击的能力。在使用和学习的过程中,用户需要遵守相关的法律法规,以保障网络安全和个人隐私的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值