MV预测过程详解

===========第一步:确定相邻块===========

      MV 预测以宏块分割(或亚宏块分割,如果宏块存在亚分割)为单位,同一个宏块分割(或亚宏块分割)内所有 4*4 块 MV 预测值相同。以每个宏块分割(或亚宏块分割)的左上角像素 pixel1 和右上角像素 pixel2 为参考点来确定相邻块则:
      pixel1 左侧相邻像素所在 4*4 块为当前宏块分割(或亚宏块分割)的相邻块 A
      pixel1 上方相邻像素所在 4*4 块为当前宏块分割(或亚宏块分割)的相邻块 B
      pixel2 右上对角线像素所在 4*4 块为当前宏块分割(或亚宏块分割)的相邻块 C
      pixel1 左上对角线像素所在 4*4 块为当前宏块分割(或亚宏块分割)的相邻块 D


MV预测示意图.JPG
      以最复杂的 8*8 宏块分割类型为例(此时只存在亚宏块分割),分析如下:
      假设图中黑色框表示宏块、每个绿色框表示一个 4*4 块、每个红色框表示一个 8*8 块。当前宏块的宏块分割模式为 8*8(如图中红色线),其亚宏块分割模式分别为:第一个 8*8 块为 8*8,第二个 8*8 块为 4*4(如图中蓝色线),第三个 8*8 块为 4*8(如图中蓝色线),第四个 8*8 块为 8*4(如图中蓝色线)。则按照上述方法来确定相邻块的方法如下:
      第一个预测对象为第一个 8*8 块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 7 号 4*4 块,B 为 2 号 4*4 块,C 为 4 号 4*4 块,D 为 1 号 4*4 块。9、14、15 与 8 具有相同 MV 预测值
      第二个预测对象为第二个 8*8 块的第一个 4*4 块,即 10 号块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 9 号4*4块,B 为 4 号4*4块,C 为 5 号 4*4 块, D 为 3 号 4*4 块
      第三个预测对象为第二个 8*8 块的第二个 4*4 块,即 11 号块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 10 号4*4块,B 为 5 号4*4块,C 为 6 号 4*4 块,D 为 4 号 4*4 块
      第四个预测对象为第二个 8*8 块的第三个 4*4 块,即 16 号块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 15 号4*4块,B 为 10 号4*4块,C 为 11 号 4*4 块,D 为 9 号 4*4 块
      第五个预测对象为第二个 8*8 块的第四个 4*4 块,即 17 号块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 16 号4*4块,B 为 11 号4*4块,C 为 12 号 4*4 块,D 为 10 号 4*4 块
      第六个预测对象为第三个 8*8 块的第一个 4*8 块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 19 号 4*4 块,B 为 14 号 4*4 块,C 为 15 号 4*4 块,D 为 13 号 4*4 块。26 与 20 具有相同 MV 预测值
      第七个预测对象为第三个 8*8 块的第二个 4*8 块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 20 号 4*4 块,B 为 15 号 4*4 块,C 为 16 号 4*4 块,D 为 14 号 4*4 块。27 与 21 具有相同 MV 预测值
      第八个预测对象为第四个 8*8 块的第一个 8*4 块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 21 号 4*4 块,B 为 16 号 4*4 块,C 为 18 号 4*4 块,D 为 15 号 4*4 块。23 与 22 具有相同 MV 预测值
     第九个预测对象为第四个 8*8 块的第二个 8*4 块,以其左上角像素 pixel1 和右上角像素 pixel2 为参考点,则:A 为 27 号 4*4 块,B 为 22 号 4*4 块,C 为 24 号 4*4 块,D 为 21 号 4*4 块。29 与 28 具有相同 MV 预测值



===========第二步:确定 A、B、C 的可用性===========

根据 A、B、C 所在宏块是否存在或者是否允许参与预测来判断。如果 C 不可用,采用 D 代替 C




===========第三步:预测 MV ===========

1、如果 A、B、C 三个参考块中只有一个与当前预测对象为同一参考帧,则选取该参考块的 MV 作为最终 MV 预测值
2、当前宏块是否为 8*16 或者 16*8 分割:
(1)、如果当前宏块为 8*16 分割类型:
          对于左边 8*16 分割,如果 A 与当前分割为同一参考帧,则采用 A 的 MV 为该分割的最终 MV 预测值
          对于右边 8*16 分割,如果 C 与当前分割为同一参考帧,则采用 C 的 MV 为该分割的最终 MV 预测值
(2)、如果当前宏块为 16*8 分割类型:
          对于上边 16*8 分割,如果 B 与当前分割为同一参考帧,则采用 B 的 MV 为该分割的最终 MV 预测值
          对于下边 16*8 分割,如果 A 与当前分割为同一参考帧,则采用 A 的 MV 为该分割的最终 MV 预测值
3、其余情况并且 B、C 中有一个可用或者两者都可用,则采用中值预测(取 A、B、C 三者中MV的中值为最终 MV 预测值)
4、其余情况并且 B、C 皆不可用,则采用 A 的 MV 为最终 MV 预测值


【注】:1、宏块分割时的相邻块确定方法与第一步所述过程雷同:16*16 相当于 8*8,8*16、16*8 分别相当于 4*8、8*4
            2、对于不可用的相邻块,其 MV 仍然可能参与 MV 预测,但其值为 0。例如:A 不可用,B、C 可用,则最终可能仍然是在 A、B、C 中取中值,但此时 A 的 MV 为 0;
            3、对于不可用的相邻块,其参考帧索引被设置为 -1,即必然与当前预测对象非同一参考帧;
            4、可以验证:同时满足第三步的第一、第二两种情况时,按第一种情况计算 MV 预测值与按第二种情况计算 MV 预测值等效;
            5、该预测过程即为标准 8.4.1.3 小节的内容,在 JM86 中对应的代码为 SetMotionVectorPredictor 函数;
            6、MBAFF 情况下的相邻块均指对应位置(co-locate)块。

 

 

我有一点想问,为什么SetMotionVectorPredictor 函数只在
img->type==B_SLICE && img->direct_type && (IS_DIRECT (currMB) ||
    (IS_P8x8(currMB) && !(currMB->b8mode[0] && currMB->b8mode[1] && currMB->b8mode[2] && currMB->b8mode[3])))
这个条件下进行,其他条件下为什么不用呢?

另外,我最近在看decode_one_macroblock这个函数,感觉跟标准上定义的有出入,比如上面这个问题,还有一些参数看不明白,字面上的意思与实际用途不符合,好郁闷。

 

还是上面的问题,在条件里面IS_P8x8(currMB)在这里做何意?定义IS_P8x8(MB)=((MB)->mb_type==P8x8) P8x8=8。这里我就是想不通,标准里面mb_type=8(B Slice情况下)表示B_L0_L1_16x8。而P条带里面P8x8的mb_type值为3,任何一个都不为8,真的是不明白啊。

还有后面的currMB->b8mode又是指什么呢,按照条件,任何一个currMB->b8mode[x]=0条件就满足,这又是什么意思呢?

我在decode_one_macroblock这个函数里琢磨了好几天了,一直为一些细节烦恼,又找不到人讨论,快崩溃啦,帮帮我~~

 

 

本帖最后由 firstime 于 2009-3-23 09:49 PM 编辑

1、为什么SetMotionVectorPredictor 函数只在
img->type==B_SLICE && img->direct_type && (IS_DIRECT (currMB) ||
    (IS_P8x8(currMB) && !(currMB->b8mode[0] && currMB->b8mode[1] && currMB->b8mode[2] && currMB->b8mode[3])))
这个条件下进行,其他条件下为什么不用呢?
——你看错了哈。JM86 代码中一共有 7 处调用该函数。

2、IS_P8x8(currMB)在这里做何意?
——说明你没有看我的这篇帖子“JM 代码中宏块类型宏定义的说明

3、currMB->b8mode又是指什么
——说明你不但没看城里汉子的那篇帖子“对几个重要问题的详细阐述”,也没有查看以前的聊天记录,更没有看我加了注释的代码。

 

根据B,C的位置决定方法,本来的情况是B不可用的时候C也肯定不可用,但是由于有第二步中的D代替C这一条,B和C的可用不可用配对方式就似乎变得复杂了,但仔细按照MB可能的位置一一分析其实并不复杂,因为可以通过第三步前三种情况到达第4种情况(默认partitionType不是16X8和8X16)的,只能是当前MB是frame内第一行MB的情况。(在最后一列位置(除去同属于第一行的右上角位置)的时候,虽然C不可用,但是第2步中D代替了C,所以变成B和C同时可用,这样就满足第三步中第三个条件了)
      再来看第一行,对于所有位于第一行的MB,BC都是不存在的。 而除了位于最左上角的情况A都是存在,只有A存在的时候用A是理所当然。 而最左上角A也不存在,即可以理解为A,B,C都为(0,0),这样,A = (0,0) = Median((0,0),(0,0),(0,0)) = Median(A,B,C), 两者等效。
      呵呵,不知道这么想正确不,还请指正。

      还有,非常感谢这段分析,受益匪浅~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/455262.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/455262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django models中关于blank与null的补充说明

建立一个简易Model class Person(models.Model):GENDER_CHOICES((1,Male),(2,Female),)namemodels.CharField(max_length30,uniqueTrue,verbose_name姓 名) birthdaymodels.DateField(blankTrue,nullTrue)gendermodels.IntegerField(choicesGENDER_CHOICES)accountmodels.In…

python 人脸关键点检测_opencv+python+dlib人脸关键点检测、实时检测

安装的是anaconde3、python3.7.3,3.7环境安装dlib太麻烦,在anaconde3中新建环境python3.6.8,在3.6环境下安装dlib-19.6.1-cp36-cp36m-win_amd64.whl,下载地址:https://pypi.org/project/dlib/19.6.1/#filesvscode更改配…

Zabbix2.2.6邮件报警设置方法

http://www.jb51.net/article/56973.htm 这篇文章主要介绍了Zabbix邮件报警设置方法,在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱说明:Zabbix监控服务端、客户端都已经部署完…

Skip宏块与Direct预测模式浅析

对于我来说,这个是一个老问题了。以前蓝风车专门给我讲解,我都没搞懂(真有点对不起蓝风车的细心教诲哈。呵呵~~~)。今天终于弄清楚了,特此总结出来,请大家指正。 B_Skip类型宏…

自律

生活上的自律 写出自律的代码 身体上的自律 日常生活中,存在这么两条路。一条路诱惑我们只根据自己的冲动和直觉来生活。这条路可以称为「宠物之路」,因为所有的动物,包括家里养的宠物狗走的都是这条路。饿了就吃,吃完就算。…

解决兼容性的库

HTML5标签兼容方案&#xff1a;html5shiv.js [GitHub地址&#xff1a;https://github.com/aFarkas/html5shiv/] IE8不支持HTML5的新标签&#xff0c;如<header>、<nav>等标签在IE8无法渲染。html5shiv.js可帮助IE6-8浏览器兼容HTML5语义化标签。 使用方法&#xff…

H.264 中的相关问题

帧内解码时&#xff0c;在解码端&#xff0c;首先通过当前宏块左边、上边已经解码完成的宏块使用当前宏块的预测模式&#xff08;预测模式计算过程请参见我的论文《H.264数字视频差错控制技术的研究》&#xff0c;在群FTP“本群原创资料”目录中&#xff09;得到当前宏块的像素…

wenzhixin bootstrap-table 点击table单元格改变颜色

bootstrap-table用于展示数据非常方便&#xff0c;也需要满足一些个性化需求。比如点击窗格&#xff08;td&#xff09;标记下颜色&#xff0c;用于目测 代码如下&#xff0c;转载请注明 $("table").on(click-row.bs.table, function (e, row, $el) {//el[0] is tr …

tornado学习笔记day01-高并发性能web框架

tornado的安装 这里我使用的是虚拟环境中的pip安装,配合清华大学镜像源安装的 pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple我的第一个tornado程序 import tornado.web import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):主页处理…

python99乘法表while翻译_Python学习之while练习--九九乘法表

效果如下&#xff1a;实现代码;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;这是一个很简单的while嵌套程序&#xff0c;首先分析九九乘法表是从上往下逐行增加&#xff0c;且第一列乘积为1…

ASP.NET Core 2加入了Razor页面特性

最近发布的ASP.NET Core 2.0&#xff0c;连同新发布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并构成了.NET Core 2.0生态中的三元组。此发布给出了多个新特性和改进&#xff0c;其中包括通用性能的改进、Razor页面、新的开发模板以及更好的Azure Diagnostics支…

matlab 矩阵拼接

E[a&#xff0c;b]%水平方向上的拼接 E[a &#xff1b;b] %垂直方向上的拼接 转载于:https://www.cnblogs.com/hsy1941/p/7124083.html

JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客

JM8.5中的7种宏块模式问题 收藏 Outline: 1、 CFG文件中有关可变尺寸宏块模式的相关选项2、 7种宏块模式对应的数值常量3、 7种宏块模式被分成宏块和亚宏块4、 如何对宏块和亚宏块的运动估计&#xff0c;采用一个共同的函数来处理5、 遗留问题1、CFG文件中有关可变尺寸宏块…

tornado学习笔记day02-进阶与提升

整理基础工程 请看第一天的配置文件目录,搭建了一个框架的基础目录 Application settings debug 作用 可以设置tornado是否工作在调试模式下面,默认为false,即工作在生产模式下 true的特性: 自动重启: tornado程序会监控源代码文件,会自动重启服务器,减少我们手动重启…

python123测验2答案八边形_Python试卷

3、写一个函数&#xff0c;计算一个给定的日期是该年的第几天。def getday(self,yNone,mNone,dNone):date datetime(y,m,d)days date.strftime(%j)return days4、写一个函数&#xff0c;给定N&#xff0c;返回斐波那契数列第N项。def getn_vlaue(self,n):if n<2:return 1e…

java实体类如果不重写toString方法,会如何?

先认识一下Object Object 类的 toString 方法 返回一个字符串&#xff0c;该字符串由类名&#xff08;对象是该类的一个实例&#xff09;、at 标记符“”和此对象哈希码的无符号十六进制表示组成。换句话说&#xff0c;该方法返回一个字符串&#xff0c;它的值等于&#xff1a;…

H.264 中很有用的一些概念

Q:PSNR 峰值信噪比 是根据它来取qp是不是&#xff1f; A:不是 和QP没有直接关系但是QP的选择会影响到PSNR Q: 如果不用率失真最优化&#xff0c;为什么选择SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作为模式选择的依据&#xff1f;为什么运动估…

tornado学习笔记day03-响应输出

write: 作用: 将chunk中的数据写到输出缓冲区 利用write方法写json数据 我们自己手动序列化json的那种方式Content-Type 的属性值为text-html而我们采用write自动序列化方式,我们的content-type 属性为application/json set_default_headers(): 作用: 在进入HTTP响应方法…

Machine Learning——octave矩阵操作(2)——DAY3

矩阵的数学操作&#xff1a; Assumed: a为一个矩阵&#xff0c;m是一个向量 Log(a)——求每一个元素的对数 Exp(a)——以e为底的指数 1./a——求每个元素的导师 [a,b]max(m)——m是一个向量&#xff0c;a为m当中最大的元素&#xff0c;b为a在m中的排列序号&#xff08;已按从小…

python 多进程并发_python并发编程之多进程

一 multiprocessing模块介绍python中的多线程无法利用多核优势&#xff0c;如果想要充分地使用多核CPU的资源(os.cpu_count()查看)&#xff0c;在python中大部分情况需要使用多进程。Python提供了multiprocessing。multiprocessing模块用来开启子进程&#xff0c;并在子进程中执…