本文来自于我的前同事-小卢,一个很有个性,能力又不错的年轻小伙子!
(文章已经得他本人同意分享)
429 AF 与 8909 有很大的区别,这种差别体现在算法的提升与架构的改善,下面简要介绍 429 CAF 的基本概念
Contrast Auto Focus
顾名思义,基于场景反差值进行马达位置搜索,找到一个反差值最大的位置,那这个位置就是当前距离最终的位置。因此,对于 CAF 而言,有两个概念是必须要清楚的:
- 搜索范围
- 合焦条件
1. 搜索范围
搜索范围最大是 0~1023,但不可能会设置这么大,因为马达可以活动的范围也有限,且这么大的搜索范围会非常限制对焦速度。
高通的搜索范围一般是从无穷远(5m左右)到 7cm (有时只有 10cm)
typedef enum _single_index_t
2372{
2373 SINGLE_NEAR_LIMIT_IDX = 0,
2374 SINGLE_7CM_IDX = 1,
2375 SINGLE_10CM_IDX = 2,
2376 SINGLE_14CM_IDX = 3,
2377 SINGLE_20CM_IDX = 4,
2378 SINGLE_30CM_IDX = 5,
2379 SINGLE_40CM_IDX = 6,
2380 SINGLE_50CM_IDX = 7,
2381 SINGLE_60CM_IDX = 8,
2382 SINGLE_120CM_IDX = 9,
2383 SINGLE_HYP_F_IDX = 10,
2384 SINGLE_INF_LIMIT_IDX = 11,
2385 SINGLE_MAX_IDX = 12,
2386} single_index_t;
以下是 ov13b10 dw9714 的案例
/* Index */
{
350, 385, 425, 474, 541, 569, 585, 605, 617, 629, //0~9
645, 677
},
这是至关重要的一步,可以说,如果这一步的数据不准确,那将会严重影响 AF 准确性
2. 合焦条件
搜索什么时候结束,这是由合焦条件来确定的,但这个条件每个平台都可能不一样,而且开放的调试接口也可能有差异,例如以下 log
可以发现,i1 ~ i5 已经出现了极大值点——549,但是 AF 却没有停下来,反而转换了一次方向继续搜索,最终也证明,final pos = 547,其实和 i1 ~ i5 找到的 549 非常接近,那么是什么原因使 AF 没有在 i5 就停下呢?
这个要参考高通提供的 3A 部分逻辑
algo logic:
case HJ_SCAN_DECREASE:
{
AF_MSG_LOW("HJ_SCAN_DECREASE");
if (is_flat_curve)
{
AF_MSG_LOW("flat curve detected, moving to hyperfocal %d",hyp_pos);
saf->final_pos = hyp_pos;
af_single_hj_end_search(p_caf_instance, HJ_AF_SINGLE_FAILED);
return;
} else if (saf->reverse_scan_cnt == 0)
{
/*Scan to Reverse direction*/
/*We don't use multi kernal. So don't need to check if sw stats or
hw stats*/
target_start_pos = saf->af_index[fv_info->max_index];
af_single_hj_start_srch_reverse(p_caf_instance, target_start_pos);
} else
{
/* Decrease and Reverse != 0*/
/*feature eable for flat_curve_detection_by_fratio & spot light detection*/
AF_MSG_LOW("Decrease in Reversed direction!");
}
2. Entering af_single_hj_start_srch_reverse function:
void af_single_hj_start_srch_reverse(
af_caf_search_internal_t *p_caf_instance, int target_pos)
{
af_single_hj_lib_info_t *saf = &p_caf_instance->af_single->af_hj_lib_info;
af_tuning_algo_adapter_t *af_tuning = &p_caf_instance->af_tuning->af_algo;
boolean ignore_first_invalid_frame =
(boolean)af_tuning->algo_extended.en_ignore_first_invalid_frame;
/* set the starting position */
saf->dest_pos =
af_single_hj_set_start_pos_reverse(p_caf_instance, target_pos);
/* House Keeping */
saf->reverse_scan_cnt++;
saf->saf_scan_state = AF_PRE_SCAN;
}
3.reverse_scan_cnt++,Enter another logic.
print log:
AF_MSG_LOW("Decrease in Reversed direction!");
基于以上分析,可以肯定的是,在正常情况下,AF 必定要进行两次搜索,一次正向,另一次反向,依次来提高 final pos 的可信度,这种做法明显的好处是提高了对焦准确率,但明显的坏处就是降低了对焦速度。而且,从高通提供的代码来看,这种做法是默认做法,也不提供调试接口。