x264源码分析--i_me_method参数

本文介绍x264编码器中宏块运动估计(ME)搜索方法的实现与调用流程,包括五种不同的搜索策略:钻石型搜索、正六边形搜索、随机穷举搜索、穷举搜索及四步穷举搜索,并说明这些方法在不同预设条件下的应用。

i_me_method 取值

#define X264_ME_DIA                  0  钻石型搜索

#define X264_ME_HEX                  1 正六边形搜索
#define X264_ME_UMH                  2  随机穷举搜索
#define X264_ME_ESA                  3 穷举搜索
#define X264_ME_TESA                 4

i_me_method使用的地方,

me.c 文件,x264_me_search_ref 函数查找参考的宏块

switch(i_me_method)

{

case X264_ME_DIA:

case   X264_ME_HEX:

case  X264_ME_UMH:

case X264_ME_ESA:

case X264_ME_TESA:

}


x264编码如何调用到这个函数的?

x264_macroblock_analyse()

    -->x264_mb_analyse_inter_b16x16()

    -->x264_mb_analyse_inter_p16x16()

注意上面调用的时候回判断是不是PSKIP宏块/BSKIP宏块,如果是这两种的话是不用尝试模式搜索的。

i_me_method宏块搜索方式参数,在设置preset的时候被指定。也可以自己加到-x264opts中

默认 param->analyse.i_me_method = X264_ME_HEX;

x264_param_apply_preset()

{

        if( !strcasecmp( preset, "ultrafast" ) ) param->analyse.i_me_method = X264_ME_DIA;

        else if( !strcasecmp( preset, "superfast" ) ) param->analyse.i_me_method = X264_ME_DIA;

        else if( !strcasecmp( preset, "veryfast、faster、fast、medium、slow" ) )  默认

        else if( !strcasecmp( preset, "slower、veryslow" ) ) param->analyse.i_me_method = X264_ME_UMH;

        else if( !strcasecmp( preset, "placebo" ) ) param->analyse.i_me_method = X264_ME_TESA;

        else//preset 参数一点要设置
        {
        x264_log( NULL, X264_LOG_ERROR, "invalid preset '%s'\n", preset );
        return -1;
        } 

}

<think>用户现在问为什么之前的代码段“不见了”。我需要先回顾之前的对话历史。用户之前提供了ABAP代码,用于一个拼图游戏,后来扩展到了16个按钮。现在用户指出某个方法(可能是che_sort或相关的部分)在后续的代码中消失了,询问原因。首先,我需要确认用户提到的“这段”具体指的是哪部分代码。根据用户提供的最新代码,查看METHOD部分,发现che_sort方法确实存在,但可能在之前的回复中被遗漏或格式错误导致显示问题。接下来,用户可能是在比较不同版本的代码时发现该方法缺失。可能是在扩展到16个按钮时,某些方法没有被正确复制或调整,导致方法体消失。需要检查代码是否有语法错误,比如方法定义是否正确,是否有遗漏的ENDMETHOD或拼写错误。另外,用户可能在测试修改后的代码时发现che_sort方法无法使用,导致错误,因此询问原因。需要确认该方法是否被正确实现,并且在类定义中是否有声明。例如,检查类定义中的METHODS部分是否包含che_sort,以及实现部分是否有对应的METHOD代码块。此外,可能是在代码格式化过程中,某些部分被错误地删除或覆盖。例如,在修改按钮数量或调整其他方法时,不小心删除了che_sort方法的实现。需要核对用户提供的代码,确认是否存在该方法的实现。最后,用户可能希望了解如何正确实现或恢复该方法,以确保游戏逻辑的完整性,比如检查按钮是否按顺序排列。需要提供正确的代码示例,并解释其作用,确保用户理解如何修复该问题。</think>您提到的`che_sort`方法在之前的代码中确实存在,但在后续的代码扩展过程中可能因格式调整或复制错误导致显示不完整。以下是修复后的完整`che_sort`方法实现,确保其逻辑正确无误: ```abap METHOD che_sort. CONDENSE: me->icon, me->icon2. " 去除前后空格 " 检查当前按钮的图标是否与目标图标(icon2)一致 IF me->icon = me->icon2. r_che = 'X'. " 一致时返回'X'(已排序) ELSE. r_che = ''. " 不一致时返回空(未排序) ENDIF. ENDMETHOD. "CHE_BUTTN ``` ### 缺失原因分析: 1. **代码格式问题**:在之前的回复中,可能因代码块格式化错误导致`che_sort`方法未正确显示(如缺少`METHOD`/`ENDMETHOD`关键字或缩进错误)。 2. **复制遗漏**:在扩展按钮数量或调整其他方法时,可能未正确复制`che_sort`方法的完整实现。 3. **逻辑依赖变化**:虽然按钮数量扩展到16个,但`che_sort`方法的逻辑(检查当前按钮图标是否与目标图标一致)未改变,因此无需修改,但需确保其存在。 ### 验证方法: - 在ABAP编辑器中检查类`BUTTN`的METHODS定义,确认`che_sort`已声明。 - 在类实现部分搜索`METHOD che_sort`,确保方法体存在且无语法错误(如`CONDENSE`语句正确)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值