h.264标准中由于分为宏块分割块(8x8),子宏块分割块(4x4),所以各种各样的求解过程比较繁琐

下面整理出标准中mvp的求解过程

8.4.1.3

已知条件有当前块的属性:位置、块类型
需要得到当前块的mvp

已知条件(当前块位置,类型)
     |
     |8.4.1.3.2                         (步骤1)
     |
得到相邻块(ABC(4x4))的mv与refIdx
     |
     |8.4.1.3.1 或 8.4.1.3 后半段 (步骤2)
     |
得到mvp

另外还需要注意的一点是,mvp是具有方向性的。意思是说在预测B slice的mvp时,需要分为前向mvp:mvL0;后向mvp:mvL1;他们分别对应的参考图像索引为refIdxL0与refIdxL1。也就是说,当在进行前向运动预测时,计算mvp阶段得到的是mvL0以及refIdxL0;当在进行后向运动预测时,计算mvp阶段得到的是mvL1以及refIdxL1。

8.4.1.3.2

  1. 规定一个D块作为备用
  2. 调用6.4.8.5得到ABC块位置

6.4.8.5

子宏块分割块A,B,C中包含有以下像素点(xN,yN)

$\begin{align*}
xN &= x + xS + xD\\
yN &= y + yS + yD
\end{align*}$

  • (x,y)为当前宏块分割块左上角点
  • (xS,yS)为当前子宏块分割块左上角点
  • (xD,yD)跟据A,B,C变化选择不同点

他们各自有以下特点

  • (x,y)采用6.4.2.1的反向宏块分割块扫描
  • (xS,yS)只有mb_type为P_8x8,P_8x8ref0,或者B_8x8时采用6.4.2.1的反向子宏块分割块扫描,否则为(0,0)
  • (xD,yD)需要通过查表6-2得到,表当中有个变量predPartWidth

predPartWidth计算方式如下

  • 当mb_type为P_Skip,B_Skip,B_Direct_16x16时,predPartWidth = 16
  • 当mb_type为B_8x8,
    • 如果currSubMbType为B_Direct_8x8时,predPartWidth = 16
    • 否则 predPartWidth = SubMbPartWidth( sub_mb_type[ mbPartIdx ] )
  • 当mb_type为P_8x8或P_8x8ref0,

    $predPartWidth = SubMbPartWidth( sub_mb_type[ mbPartIdx ] )$

  • 否则 predPartWidth = MbPartWidth( mb_type )

得到(xN,yN)之后需要知道(xN,yN)所在的宏块mbAddrN以及其在宏块内的地址(xW,yW),即从相对地址转换到绝对地址

6.4.9

这一小节会通过(xN,yN)的相对地址得到它们的绝对地址。

首先需要知道宏块大小

  • luma: maxW = maxH = 16
  • chroma: maxW = MbWidthC maxH = MbHeightC

所在的宏块mbAddrN,根据MbaffFrameFlag不同,有不同求法

  • 如果MbaffFrameFlag为0,    6.4.9.1
  • 如果MbaffFrameFlag为1,    6.4.9.2
6.4.9.1

表6-3得到mbAddrN

$\begin{align*}
xW &= ( xN + maxW )\ \%\ maxW\\
yW &= ( yN + maxH )\ \%\ maxH
\end{align*}$

6.4.9.2

表6-4,即mbaff的情况,可以通过脑补获得,大概比B_Direct时容易

从mbAddrN得到该宏块是否可用
从(xW,yW)得到该子宏块分割块(4x4)位置,如果mbAddrN不可用则该4x4块不可用,如果该4x4块未解码那么也不可用

ABC的运动矢量与参考索引处理

本小节的目的是得到得到A,B,C的参考图像索引refIdxLXN(refIdxLXA,refIdxLXB,refIdxLXC)以及运动矢量mvLXN(mvLXA,mvLXB,mvLXC)。不过由于我们已经得到了A、B、C块的位置,因此他们的这两个参数肯定是能获取得到的,除非出现以下的状况

首先,如果C不可用则用D来代替(4x4)

A,B,C的运动矢量mvLXN以及参考图像索引refIdxLXN在下面的情况下会进行特殊处理

  • 某个N不可用
  • 某个N为Intra编码
  • 某个N的predFlagLX等于0(即该X方向不采用帧间预测编码)

则mvLXN的两个分量均置为0且refIdxLXN置为−1

(注:一般来说mv以4x4为单位,refIdx以8x8为单位)

进一步处理:

  • 如果当前宏块为场宏块,且宏块mbAddrN为帧宏块,则

    $\begin{align*}mvLXN[ 1 ] &= mvLXN[ 1 ] / 2 \\
    refIdxLXN &= refIdxLXN \times 2 \end{align*}$

  • 否则,如果当前宏块为帧宏块且宏块mbAddrN为场宏块,那么

    $\begin{align*}mvLXN[ 1 ] &= mvLXN[ 1 ] \times 2 \\
    refIdxLXN &= refIdxLXN / 2 \end{align*}$

  • 否则,运动矢量垂直分量mvLXN[ 1 ]和参考索引refIdxLXN保持不变

8.4.1.3后半段

8*16以及16*8的情况,参照表8-3

8.4.1.3.1

  • 如果B,C都不可用,用A代替
  • 如果A,B,C中只有一个refIdxLX等于当前宏块分割块的refIdxLX(遍历得到的,即每个都会遍历到),那么取该块的mv作为mvp
  • 否则取中值(中位数)

至于JM,由于采用的是4x4块的计数方式,所以很容易就可以得到相邻块的位置,然后用所得相邻块mv与ref进行比较得到mvp

整个选取结果可参考下图:

  • 蓝色为各个已选定用于编码的相邻块,
  • 红色为4x4块,也就是蓝色块的一部分,当然包含蓝色块所含有的mv与refIdx
  • 绿色为当前处理块,这里以16x16为例

得到(xN,yN)之后需要知道(xN,yN)所在的宏块mbAddrN以及其在宏块内的地址(xW,yW)
即从相对地址转换到绝对地址

h.264 mvp求解过程的更多相关文章

  1. [ffmpeg] h.264解码所用的主要缓冲区介绍

    在进行h264解码过程中,有两个最重要的结构体,分别为H264Picture.H264SliceContext. H264Picture H264Picture用于维护一帧图像以及与该图像相关的语法元 ...

  2. h.264 去块滤波

    块效应及其产生原因 我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact). 首先我们需要 ...

  3. 新手学习FFmpeg - 调用API完成录屏并进行H.264编码

    Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...

  4. H.264学习笔记3——帧间预测

    帧间预测主要包括运动估计(运动搜索方法.运动估计准则.亚像素插值和运动矢量估计)和运动补偿. 对于H.264,是对16x16的亮度块和8x8的色度块进行帧间预测编码. A.树状结构分块 H.264的宏 ...

  5. RNN求解过程推导与实现

    RNN求解过程推导与实现 RNN LSTM BPTT matlab code opencv code BPTT,Back Propagation Through Time. 首先来看看怎么处理RNN. ...

  6. (转载)H.264码流的RTP封包说明

    H.264的NALU,RTP封包说明(转自牛人) 2010-06-30 16:28 H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) ...

  7. H.264的优势和主要特点

    H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压 ...

  8. 使用VideoToolbox硬编码H.264<转>

    文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. ======= ...

  9. H.264简介

    H.264/MPEG-4 AVC (H.264) 是1995年自MPEG-2视频压缩标准发布以后最新的, 最有前途的视频压缩标准. H.264是由ITU-U和ISO/IEC联合开发组共同开发的最新国际 ...

随机推荐

  1. 开发环境下jboss 7.1.1 Final 的jsp热部署解决方案--转

    公司的网站系统使用的中间是jboss7.1.1 Final,由于有些数据和服务测试环境不具备,免不了要在测试环境调试些jsp页面,发现从jboss社区里下载的jboss应用有个问题,新增jsp页面会实 ...

  2. 解决XCode 4.x SVN无法连接的问题

    XCode升级到4.X版本后,确实好用了不少.但普通都存在SVN无法连接的问题.XCode4.x Source Control功能迁移到了File - Source Control目录下,也出现了一些 ...

  3. Array数组基本案例:图书基本录入输出系统

    import java.util.Scanner; public class ArrayTest{ public static void main(String args[]){ Scanner sc ...

  4. Android短信的发送和接收监听

    /**发送与接收的广播**/ String SENT_SMS_ACTION = "SENT_SMS_ACTION"; String DELIVERED_SMS_ACTION = & ...

  5. JNI与多线程

    在android开发过程中,由于主线程要聚焦于UI交互,为了软件运行流畅必然要用到很多多线程技术.而在JNI机制中专门提供了一些避免线程冲突的函数.了解.学习并掌握如何避免线程冲突问题是一个程序猿的必 ...

  6. group by、order by 先后顺序问题

    今天遇到个小问题 本来是很基础的问题 应该说 基础知道掌握的不牢  好了不说 错误 语句 :   select  a.a1  from table a  where order by a.a1 gro ...

  7. php5.2通过saprfc扩展远程连接sap730成功案例

    公司刚上sap系统,由于资金有限,sap与其它系统的数据交换需要公司内部实现.于是,领导决定入库申请流程需要在sap与OA系统里实现电子签核流,重担果然落到我的身上.好在我只负责OA,还一位同事负责s ...

  8. ICOMOON!强悍的WEB字体图标制造器/Web字体使用实例

    IcoMoon!一个可以通过个性化设置来创建自定义图标(字体)的生成器!也可以将SVG图片,转换成web字体 IcoMoon是一项免费的服务,通过使用不同设置使我们能够创建自定义的ICON图或ICON ...

  9. 编写利用Fragment创建新闻列表

    编写利用Fragment创建新闻列表 1.创建新闻实体类News,代码如下:   public class News { private String title; private String co ...

  10. Swift - 24 - switch语句的高级用法

    //: Playground - noun: a place where people can play import UIKit // 对区间进行判断 var score = 90 switch s ...