首页 > 其他分享 >帧内预测代码

帧内预测代码

时间:2023-10-17 18:23:14浏览次数:35  
标签:预测 PU 代码 TU 滤波 划分 mode CU

在码流中,split_cu_flag 用来控制 CU 是否划分为 4 个 sub-CU ;part_mode 用来控制 CU 是否划分为 4 个 PU;split_tu_flag 用来控制 CU 是否划分为 4 个 TU。

每个 CU 可以划分为一个或多个 PU ,每个 PU 独立持有一个预测模式 (prediction mode)。 PU 的划分不是递归的,一个 CU 要么不划分,要么划分为4个PU,而这些PU不能再划分为多个PU。

对于 8x8 的 CU ,可选两种 PU 划分方式 (part_mode):

  • PART_2Nx2N:不划分,CU本身就是一个PU。
  • PART_NxN:划分为4个PU。

而 64x64, 32x32 和 16x16 的 CU 只能选择 PART_2Nx2N ,也即只能自身作为一个 PU。即只需要对 8x8 的 CU 编码 part_mode 语法元素。

对于 CU ,在码流中编码一个语法元素 part_mode 来指示它的 PU 划分方式:

  • part_mode=PART_2Nx2N 时,说明 CU 自身就是一个 PU ,此时码流中的 part_mode 后面应该紧跟着1个预测模式 (也即该 PU 的预测模式),然后编码 PU 的其它数据。
  • part_mode=PART_NxN 时,说明 CU 被划分为 4 个 PU ,此时码流中的 part_mode 位后面应该紧跟4个预测模式 (也即这4个PU 的预测模式) ,然后先后编码 4 个 PU 的其它数据。

每个 CU 可以按四叉树递归的方式划分为多个 TU 。TU 的尺寸可以是 32x32, 16x16, 8x8, 4x4 。

在帧内编码中,TU 不能大于 PU (不能跨越 PU 的边界),因此 TU 的划分只存在以下几种情况 :

  • 对于 64x64 的 CU ,它必须划分为 4 个 32x32 的 TU (因为 TU 的最大尺寸为 32x32) 。当然,这些 TU 也可以继续递归划分。划分出的所有小 TU 都共享同一个预测模式,也即这个 64x64 CU 所对应的 64x64 PU 的预测模式。
  • 对于 32x32, 16x16 的 CU 或 TU , 它可以不划分 (自身就是一个 TU),也可以继续划分为更小的 TU 。当然,这些 TU 也可以继续递归划分。划分出的所有小 TU 都共享同一个预测模式,也即它们所在的 32x32 CU 或 16x16 CU 所对应的 PU 的预测模式。
  • 对于一个 8x8 CU,若它没有划分为 4 个 4x4 的 PU (part_mode=PART_2Nx2N), 则它可以不划分 (自身就是一个 8x8 的 TU),也可以继续划分为 4 个 4x4 的 TU ,此时 4 个 TU 共享同一个预测模式,也即它们所在的 8x8 CU 所对应的 8x8 PU 的预测模式。图8中最下面的例子就对应了这种情况。
  • 对于一个 8x8 CU,若它被划分为 4 个 4x4 的 PU (part_mode=PART_NxN) ,则它也必须划分为 4 个 4x4 的 TU ,每个 TU 的预测模式就是他所在的 4x4 PU 的预测模式。

CU 中划分 TU 的最大深度是可以设定的,由 HEVC 码流头部的 SPS 中的 max_transform_hierarchy_depth_intra 语法元素决定。例如,当 max_transform_hierarchy_depth_intra=0 时,表示任何CU都不能划分为更小的TU。再例如,当 max_transform_hierarchy_depth_intra=1 时,表示任何CU最多只能划分成4个TU,而这些 TU 不能再划分为更小的 TU 。

需要在码流中编码一个 split_tu_flag 来决定这个 TU 是否要继续划分为 4 个 sub-TU 。split_tu_flag=1 代表划分;split_tu_flag=0 代表不划分。

在没有歧义的地方不需要编码split_tu_flag ,包括以下4种情况:

  • 对于 64x64 的 CU ,不需要编码 split_tu_flag ,因为它一定要划分为 4 个 32x32 TU。
  • 对于 4x4 的 TU ,不需要编码 split_tu_flag ,因为它一定不能再划分为更小的 TU。
  • 对于被划分为 4 个 4x4 PU 的 8x8 CU ,不需要编码 split_tu_flag ,因为它一定要划分为 4 个 4x4 TU 。
  • 当受限于 max_transform_hierarchy_depth_intra 的取值,也即当前 TU 在 CU 中的深度等于设定的最大深度时,不需要编码 split_tu_flag ,因为它一定不能再划分为更小的 TU。

HEVC 规定在某些情况时,需要先对边界像素进行平滑滤波,然后再进行预测。对于 U, V 分量块,在任何情况下都不用滤波。而对于 Y 分量块,需要查询表来确定是否需要进行滤波。

对于需要滤波的情况,有两种滤波方式:常规滤波和强滤波。码流头部的 SPS 中的 strong_intra_smoothing_enable_flag 语法元素规定了是否开启强滤波,只有在开启时并满足一定条件时,才使用强滤波。

常规滤波的方法是:把 (4×N+1) 个边界像素“放平”成一个 (4×N+1) 个元素的数组。对于相邻的3个元素,使用3抽头的 FIR 滤波器进行滤波,抽头参数为 [0.25, 0.5, 0.25] 。对于最左下边和最右上边的像素,因为它们两边缺少像素,无法进行滤波,所以不用滤波,直接复制。

 

标签:预测,PU,代码,TU,滤波,划分,mode,CU
From: https://www.cnblogs.com/jhzj/p/17770369.html

相关文章

  • Laravel Macro 让你的代码更简洁,更具有可读性
    来源:http://www.shanhubei.com/archives/2806.html你可以把它理解成为 trait 中的一个方法,还有点和我们开发中常用助手文件中 helpers 中的方法类似,其目的是将Laravel的内部组件进行横向扩展以全局通用。下面我们来看一个例子:User 表中有一个字段是 is_vip,用来记录用户......
  • 如何通过代码混淆绕过苹果机审,解决APP被拒问题
     目录 iOS代码混淆功能分析实现流程类名修改方法名修改生成垃圾代码替换png等静态资源MD5info.plist文件添加垃圾字段功能分析实现流程类名修改方法名修改生成垃圾代码替换png等静态资源MD5info.plist文件添加垃圾字段混淆前后对比 iOS代码混淆目前公司......
  • iframe实现与父页面跨域隔离的JavaScript 代码沙箱
    这篇文章主要介绍了使用iframe实现与父页面跨域隔离的JavaScript代码沙箱,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪目录正文1.iframe2.dataURL3.将JavaScript代码变成dataURL4.如果需要获取执行结果的话,基于postMessage定制通信机制正文假......
  • 请在课上练习的基础上,实现输出加减法混合的运算题目列表。请提交代码及运行效果截图。
    importjava.util.Random;publicclassMathOperationGenerator{  publicstaticvoidmain(String[]args){    intnumberOfQuestions=10;//指定生成题目的数量    generateMathQuestions(numberOfQuestions);  }  publicstaticvoidgenerateMat......
  • 请完善课上的口算题卡代码,实现重复题目的检测、题目数字范围、加减乘除算式的参数化等
    importjava.util.HashSet;importjava.util.Random;importjava.util.Set;publicclassMathQuizGenerator{  publicstaticvoidmain(String[]args){    intnumberOfQuestions=10;//设定生成题目的数量    intminNumber=1;//题目数字的最小值 ......
  • 首页database SQL Server异常代码处理的深入讲解
    SQLServer异常代码处理的深入讲解在SQLServer中,异常代码处理(ExceptionHandling)是非常重要的技术之一。良好的异常处理可以帮助我们更好地处理运行中的错误,保障系统的稳定性和安全性。本文将深入讲解SQLServer异常代码处理,包括常见的异常类型、异常处理方式及异常处理的最......
  • 在html中 如何 插入 js 和 css 代码 以及 如何 引用 js 和 css 文件
    在HTML中插入JavaScript和CSS代码,以及引用JavaScript和CSS文件的方法如下:插入JavaScript代码:在HTML文件中,你可以使用<script>标签来插入JavaScript代码。例如:<script>functionmyFunction(){alert("Hello,World!");}</script>引用JavaScript文件:如果你的JavaScript......
  • iOS代码混淆和加固技术详解
    目录 摘要:本文介绍了iOS开发中常用的代码混淆和加固技术,包括数据加密、应用加壳和代码混淆。其中,重点讨论了代码混淆的实现方法和注意事项,并推荐了一些相关的工具和库。引言代码混淆和加固数据加密应用加壳代码混淆总结参考资料  摘要:本文介绍了iOS开发中常用的......
  • 如何通过代码混淆绕过苹果机审,解决APP被拒问题
     如何通过代码混淆绕过苹果机审,解决APP被拒问题目录 iOS代码混淆功能分析实现流程类名修改方法名修改生成垃圾代码替换png等静态资源MD5info.plist文件添加垃圾字段功能分析实现流程类名修改方法名修改生成垃圾代码替换png等静态资源MD5info.plist文件添加垃......
  • c语言模仿kfifo撰写的一个共用代码框架,可根据需要
    ////kfifo简化版本,根据需要进行改装//定义KFIFO结构体typedefstruct{uint8_t*buffer;//缓冲区指针uint32_tsize;//缓冲区大小,如果要求是2^n-1可以将取余操作修改为按位与操作,同时修改其他相关信息volatileuint32_tin;//入队指针......