x264 编码之 psy ,psy_rd [学习笔记 三]

http://www.cameravideo.net/forum/dv-technique-generale-video-audio/17350-ffmbc.html

-psy <int> E.V.. Psychovisual Optimization: 0: Disabled
-psy_rd <string> E.V.. Strength of psychovisual optimization <rd:trel
lis>: RD (requires subme>=6), Trellis (requires trellis)


http://www.nmm-hd.org/doc/index.php?title=X264%E8%A8%AD%E5%AE%9A&variant=zh-sg#aq-strength

psy-rd

预设值:1.0:0.0

第一个数是Psy-RDO的强度(需要subme>=6)。第二个数是Psy-Trellis的强度(需要trellis>=1)。注意,Trellis仍然被视为“实验性的”,而且几乎可以肯定至少卡通不适合使用。

psy-rd的解释可以参阅http://forum.doom9.org/showthread.php?t=138293




参考网页:

http://bbs.popgo.org/bbs/read.php?tid=498654


subme

预设值:7

设定子像素(subpixel)估算复杂度。值越高越好。层级1~5只是控制子像素细分(refinement)强度。层级6为模式决策启用RDO,而层级8为动态向量和内部预测模式启用RDO。RDO层级明显慢于先前的层级。

使用小于2的值不但会启用较快且品质较低的lookahead模式,而且导致较差的--scenecut决策,因此不建议。

可用的值:

0:Fullpel only
1:QPel SAD 1 iteration
2:QPel SATD 2 iterations
3:HPel on MB then QPel
4:Always QPel
5:Multi QPel + bi-directional motion estimation
6:RD on I/P frames
7:RD on all frames
8:RD refinement on I/P frames
9:RD refinement on all frames
10:QP-RD (requires --trellis=2, --aq-mode>0)
11:Full RD: disable all early terminations

建议:预设值,或者更高,除非速度非常重要


留着以后更改。


<think>好的,用户现在问的是如何在C语言中使用函数指针赋值,特别是提到了示例代码中的`info->psy_dvchg_desc1.get_property = psy_charger_get_property`。我需要先理解用户的具体需求。 用户之前已经询问过函数指针的基本用法和传参,现在这个例子看起来像是结构体中的一个函数指针成员被赋值。可能用户正在开发涉及到结构体和回调函数的项目,比如驱动开发或者嵌入式系统,其中需要将特定的函数赋值给结构体中的函数指针。 首先,我需要确认用户提供的代码片段的上下文。`info`可能是一个结构体指针,`psy_dvchg_desc1`是其中的一个成员,而`get_property`是这个成员结构体中的一个函数指针。用户需要将`psy_charger_get_property`函数赋值给这个函数指针。 接下来,我应该分步骤解释如何正确进行这样的赋值。需要确保函数签名(返回值类型和参数类型)与函数指针的定义完全匹配。例如,如果`get_property`的函数指针类型是`int (*)(struct power_supply *, enum power_supply_property, union power_supply_propval *)`,那么`psy_charger_get_property`必须有相同的参数和返回值类型。 然后,需要提醒用户常见的错误,比如函数签名不匹配、未初始化指针等。同时,结合用户之前的问题,可能需要补充回调函数在具体场景中的应用,比如在Linux内核驱动中的使用,类似power_supply子系统中的情况,这样用户能更好地理解实际应用。 用户提供的引用内容中提到了`power_supply_config`结构体和一些属性设置,这可能与Linux内核的电源管理相关。因此,在回答时,可以结合这些实际案例,说明函数指针赋值在驱动开发中的重要性,以及如何避免类型不匹配的问题。 最后,生成相关问题,帮助用户深入理解函数指针的高级应用和调试技巧,确保他们能够应对更复杂的场景。</think>在C语言中,函数指针赋值需要严格匹配函数签名(返回值类型、参数类型及顺序)。您提供的代码片段 `info->psy_dvchg_desc1.get_property = psy_charger_get_property` 是一个典型的结构体函数指针赋值场景,常见于驱动开发或模块化设计。以下是具体解析和完整示例: --- ### 一、函数指针赋值的核心规则 #### 1. 函数签名必须严格一致 假设 `psy_dvchg_desc1` 结构体中的 `get_property` 成员定义为: ```c int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); ``` 则被赋值的函数 `psy_charger_get_property` **必须**满足以下格式: ```c int psy_charger_get_property( struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val ) { // 具体实现 return 0; } ``` --- ### 二、赋值操作详解 #### 2.1 直接赋值(标准方式) ```c // 假设 info 是包含 psy_dvchg_desc1 的结构体指针 info->psy_dvchg_desc1.get_property = psy_charger_get_property; ``` **关键点**: - 无需取地址符 `&`,函数名本身即代表函数地址[^1] - 赋值后可通过 `info->psy_dvchg_desc1.get_property(...)` 调用目标函数 #### 2.2 动态条件赋值 ```c if (use_charger_mode) { info->psy_dvchg_desc1.get_property = psy_charger_get_property; } else { info->psy_dvchg_desc1.get_property = default_get_property; } ``` --- ### 、Linux驱动开发中的典型应用 在电源管理子系统(如 `power_supply` 框架)中,函数指针用于实现硬件操作接口: ```c struct psy_dvchg_desc { const char *name; int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); // 其他成员... }; static struct psy_dvchg_desc dvchg_desc = { .name = "battery", .get_property = psy_charger_get_property, // 关键赋值操作 }; // 注册到内核 power_supply_register(NULL, &dvchg_desc, NULL); ``` --- ### 四、常见错误排查 #### 4.1 类型不匹配警告 若出现类似警告: ```text warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] ``` 说明函数签名与指针定义不一致,需检查: - 返回值类型是否匹配 - 参数类型及顺序是否完全一致 - 是否遗漏 `const` 等修饰符 #### 4.2 悬空指针问题 确保被赋值函数已正确定义: ```c // 错误示例:函数未定义即赋值 info->psy_dvchg_desc1.get_property = undefined_func; // 导致链接错误 ``` --- ### 五、完整示例代码 ```c #include <stdio.h> // 定义函数指针类型 typedef int (*get_property_fn_t)( struct power_supply *, enum power_supply_property, union power_supply_propval * ); // 结构体定义 struct psy_dvchg_desc { get_property_fn_t get_property; // 其他成员... }; // 目标函数实现 int psy_charger_get_property( struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val ) { // 具体属性读取逻辑 return 0; } int main() { struct psy_dvchg_desc desc = { .get_property = psy_charger_get_property // 正确赋值 }; return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值