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. SCOI2014 方伯伯的OJ onlinejudge

    终于用自己的方法水过去了. 本地测慢的一组要三四秒,一共要十几秒,BZOJ貌似一共只让跑6s,于是就还T着的. 一开始没看n<=1e8,想的直接splay+map(splay维护名次,map维护 ...

  2. Android Intent传递对象小结

    效果: 想看实例的,感兴趣的能够看之前的一篇文章 Android ViewPager Fragment实现选项卡 部分关键代码: public class SerializeActivity exte ...

  3. 【安卓】给ViewFlipper加指示器,相似ViewPagerIndicator库提供的那种、!

    思路: 1.viewPager有setOnPageChangeListener能够监听切换动作,但viewFlipper却死活没类似的东西.! 此处有一个变种思路,基于animation,animat ...

  4. 互联网TCP/IP五层模型(一)

    转载自:阮一峰 我们每天使用互联网.你是否想过,它是怎样实现的? 全世界几十亿台电脑,连接在一起,两两通信. 上海的某一块网卡送出信号,洛杉矶的还有一块网卡竟然就收到了.两者实际上根本不知道对方的物理 ...

  5. [PWA] 10. Trigger a version update

    When the refersh button is clicked, we need to tell the waiting service worker to replace the curren ...

  6. Android Bitmap开发之旅--基本操作

    1 Bitmap加载方式 在介绍Bitmap--OOM 异常时,首先介绍一下Bitmap有哪几种加载方式.通常Bitmap的加载方式有Resource资源加载.本地(SDcard)加载.网络加载等加载 ...

  7. php 数组排序 (转)

    // @param array $list 查询结果 // @param string $field 排序的字段名 // @param array $sortby 排序类型 // asc正向排序 de ...

  8. Visual C++内存泄露检测—VLD工具使用说明

    一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还 ...

  9. 常用布局,div竖直居中

    常用两列布局,多列布局和div竖直居中 body { margin:; padding:; } .w200 { width: 200px; } .mar-left200 { margin-left: ...

  10. 移动页面缩放方法之(一)控制meta法

    <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta http-equiv="Con ...