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. CDOJ 92 – Journey 【LCA】

    [题意]给出一棵树,有n个点(2≤N≤105),每条边有权值,现在打算新修一条路径,给出新路径u的起点v,终点和权值,下面给出Q(1≤Q≤105)个询问(a,b)问如果都按照最短路径走,从a到b节省了 ...

  2. POJ 1113 Wall 求凸包的两种方法

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31199   Accepted: 10521 Descriptio ...

  3. 【开源java游戏框架libgdx专题】-09-动画的使用

    1.Animation类介绍   Api定义:动画是由多个帧,在设定的时间间隔序列显示.比如,一个跑步的人一个动画可以通过运行时播放这些图像无限拍照他了. 功能用法:管理动画,设置随即播放模式和播放顺 ...

  4. ajax传值

    $(function(){ $.ajax({ url:'order!seatnum.action', data:{ "entity.id":$("input[name=' ...

  5. Mock和injectMocks的区别

    @Mock private ForeCatalogManageServiceImpl foreCatalogManageServiceImpl; 如果是上面的写法,那么 红框方法里面的代码不会执行,这 ...

  6. 操作iis

    以后研究 try { string method = "Recycle"; string AppPoolName = "z.chinabett.com"; Di ...

  7. 开发RESTful WebService

    RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS,全称:Java API for RESTful WebService. ...

  8. Android开源项目 Universal imageloader 源码研究之Lru算法

    https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...

  9. 自定义控件出现“loaded nib but the view outlet was not set”

    我出现这个错误是因为我的自定义控件的名字和项目中一个控制器的名字很像 控制器 DDGuessYourLikeViewController 自定义控件 DDGuessYourLikeView 默认的, ...

  10. CompareValidator ASP控件

    定义和用法 CompareValidator 控件用于将由用户输入到输入控件的值与输入到其他输入控件的值或常数值进行比较. 注释:如果输入控件为空,则不会调用任何验证函数,并且验证将成功.使用 Req ...