HEVC ME之 整像素TZ搜索代码分析

TEncSearch::xTZSearch  函数:进行整像素估计,输入原始图像的感兴趣区(当前块pcPatternKey)参考帧的坐标(piRefY),步长(iRefStride),搜索范围(iSearchRange),输出运动矢量(iBestX,iBestY)与代价(ruiSAD).

        参考帧的搜索块(cStruct)起始坐标作为是iRefY,在搜索块中不断找出一个匹配块(相对起始坐标为(X,Y),大小与当前块相同)与当前块做SAD,得出代价(SAD+将向量编码进去的代价)最小的块,其相对起始地址(X,Y)作为最后所要求的运动矢量(iBestX,iBestY),其中SAD也存储下来.

注意:(X,Y)既是参考帧搜索区域中的相对起始地址,也是匹配块相对于当前块的运动矢量.


    主要的搜索过程如下:(摘自CJL_CDSN_Blog)

    1. 搜索预测得到的mv所指向的点:中值预测mv,当前PU的左,上及右上PU的mv,还有零运动矢量(0,0)

    2. 在步骤1中找到匹配误差最小的点作为接下来搜索的起始点

    3. 步长从1开始,以2的指数递增,进行8点钻石搜索,该步骤中可以设置搜索的最大次数(以某个步长遍历一遍就算1次)

    4. 如果步骤3搜索得到的最佳步长为1,则需要以该最佳点为起点做1次两点钻石搜索,因为前面8点搜索的时候,这个最佳点的8个邻点会有两个没有搜索到

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HEVC的slice header数据包含了一些重要的信息,比如slice的类型、QP值、参考图像等。下面是一个简单的C代码示例,用于解析HEVC的slice header数据: ```c typedef struct { uint8_t slice_type; uint8_t pic_parameter_set_id; uint8_t colour_plane_id; uint16_t slice_qp_delta; uint8_t slice_qs_delta; uint8_t slice_beta_offset_div2; uint8_t slice_tc_offset_div2; uint8_t slice_num_ref_idx_active_override_flag; uint8_t slice_num_ref_idx_l0_active_minus1; uint8_t slice_num_ref_idx_l1_active_minus1; uint8_t num_ref_idx_l0_default_active_minus1; uint8_t num_ref_idx_l1_default_active_minus1; uint8_t ref_pic_list_modification_flag_l0; uint8_t ref_pic_list_modification_flag_l1; uint8_t luma_log2_weight_denom; uint8_t chroma_log2_weight_denom; uint8_t pred_weight_table_flag; uint8_t five_minus_max_num_merge_cand; uint8_t slice_qp_delta_cb; uint8_t slice_qp_delta_cr; uint8_t deblocking_filter_override_flag; uint8_t slice_deblocking_filter_disabled_flag; int8_t slice_beta_offset_div2; int8_t slice_tc_offset_div2; uint8_t slice_loop_filter_across_slices_enabled_flag; } hevc_slice_header_t; void parse_slice_header(uint8_t *data, hevc_slice_header_t *slice_header) { // 解析 slice_header 数据 slice_header->slice_type = data[0] & 0x7F; slice_header->pic_parameter_set_id = data[1]; slice_header->colour_plane_id = (data[2] >> 6) & 0x03; slice_header->slice_qp_delta = ((data[2] & 0x3F) << 8) | data[3]; slice_header->slice_qs_delta = (data[4] >> 4) & 0x0F; slice_header->slice_beta_offset_div2 = (data[4] >> 3) & 0x01; slice_header->slice_tc_offset_div2 = data[4] & 0x07; slice_header->slice_num_ref_idx_active_override_flag = (data[5] >> 7) & 0x01; slice_header->slice_num_ref_idx_l0_active_minus1 = data[5] & 0x7F; slice_header->slice_num_ref_idx_l1_active_minus1 = data[6] & 0x7F; slice_header->num_ref_idx_l0_default_active_minus1 = data[7] & 0x7F; slice_header->num_ref_idx_l1_default_active_minus1 = data[8] & 0x7F; slice_header->ref_pic_list_modification_flag_l0 = (data[9] >> 7) & 0x01; slice_header->ref_pic_list_modification_flag_l1 = (data[10] >> 7) & 0x01; slice_header->luma_log2_weight_denom = data[11] >> 5; slice_header->chroma_log2_weight_denom = data[12] >> 5; slice_header->pred_weight_table_flag = (data[13] >> 7) & 0x01; slice_header->five_minus_max_num_merge_cand = (data[13] >> 3) & 0x0F; slice_header->slice_qp_delta_cb = (data[13] >> 2) & 0x01; slice_header->slice_qp_delta_cr = (data[13] >> 1) & 0x01; slice_header->deblocking_filter_override_flag = data[13] & 0x01; slice_header->slice_deblocking_filter_disabled_flag = (data[14] >> 1) & 0x01; slice_header->slice_beta_offset_div2 = (int8_t)(((data[14] & 0x01) << 4) | ((data[15] >> 4) & 0x0F)); slice_header->slice_tc_offset_div2 = (int8_t)(((data[15] & 0x0F) << 2) | ((data[16] >> 6) & 0x03)); slice_header->slice_loop_filter_across_slices_enabled_flag = (data[16] >> 5) & 0x01; } ``` 在这个示例代码中,我们定义了一个名为 `hevc_slice_header_t` 的结构体,用于保存解析后的slice header数据。然后,我们通过一个名为 `parse_slice_header` 的函数来解析传入的slice header数据,并将解析后的数据填充到 `hevc_slice_header_t` 结构体中。 在 `parse_slice_header` 函数中,我们使用了一些位运算和位移操作来提取slice header数据中的各种字段。最终,我们将提取出来的字段填充到 `hevc_slice_header_t` 结构体中,以便后续使用。 需要注意的是,这只是一个简单的示例代码,实际情况中可能还需要根据HEVC标准的具体细节来进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值