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. python2.+进化至python3.+ 语法变动差异(不定期更新)

    1.输出 python2.+ 输出: print "" python3.+ 输出: print ("") 2.打开文件 python2.+ 打开文件: file ...

  2. Struts2.xml中result type属性说明

    在struts2配置XML里,result中type属性有以下几种: 1.dispatcher:服务器跳转到前台,后面跟着可以是JSP.htm等等前台页面,默认是这种. 2.redirect:客户端跳 ...

  3. JSP简易留言板

    写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...

  4. iphone匹配邮箱的正则表达式

    NSString *str = [NSString stringWithString:@"\\b([a-zA-Z0-9%_.+\\-]+)@([a-zA-Z0-9.\\-]+?\\.[a-z ...

  5. select默认选择的实现方法

    <script type="text/javascript"> <!-- document.biao.bbb.value = "云南";//b ...

  6. [Unity-24] Unity的四种载入场景的方法

    Unity官方提供了4种载入场景(scene)的方法.各自是: 1. Application.LoadLevel():同步载入 2. Application.LoadLevelAsync():异步载入 ...

  7. Linux在山Windows共享文件夹

    $ sudo mount.cifs //windows-ip/shared  /media/ -o user=username password=password 该命令挂载Windows在下面sha ...

  8. 成为VR开发者的六个基本问题

    2016-05-31 小小CTO 未来CTO 我常被问起能否提供更多的建议,帮助其他人进入这个行业,或是做VR开发人员该怎么赚钱.我很难具体回答,因为每个人的情况都很不一样.不过还是有一些建议适用于想 ...

  9. yii columns value and type and checkbox columns

    value  I am here type  I am here checkbox columns   useage

  10. MyBatis 学习总结(二)

    1.MyBatis基础环境的搭建 1.1 核心配置文件mybatis-config.xml <?xml version="1.0" encoding="UTF-8& ...