h.264 mvp求解过程
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
- 规定一个D块作为备用
- 调用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求解过程的更多相关文章
- [ffmpeg] h.264解码所用的主要缓冲区介绍
在进行h264解码过程中,有两个最重要的结构体,分别为H264Picture.H264SliceContext. H264Picture H264Picture用于维护一帧图像以及与该图像相关的语法元 ...
- h.264 去块滤波
块效应及其产生原因 我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact). 首先我们需要 ...
- 新手学习FFmpeg - 调用API完成录屏并进行H.264编码
Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...
- H.264学习笔记3——帧间预测
帧间预测主要包括运动估计(运动搜索方法.运动估计准则.亚像素插值和运动矢量估计)和运动补偿. 对于H.264,是对16x16的亮度块和8x8的色度块进行帧间预测编码. A.树状结构分块 H.264的宏 ...
- RNN求解过程推导与实现
RNN求解过程推导与实现 RNN LSTM BPTT matlab code opencv code BPTT,Back Propagation Through Time. 首先来看看怎么处理RNN. ...
- (转载)H.264码流的RTP封包说明
H.264的NALU,RTP封包说明(转自牛人) 2010-06-30 16:28 H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) ...
- H.264的优势和主要特点
H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压 ...
- 使用VideoToolbox硬编码H.264<转>
文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. ======= ...
- H.264简介
H.264/MPEG-4 AVC (H.264) 是1995年自MPEG-2视频压缩标准发布以后最新的, 最有前途的视频压缩标准. H.264是由ITU-U和ISO/IEC联合开发组共同开发的最新国际 ...
随机推荐
- 【Java】Java8新增的Lambda表达式_学习笔记
一.Lambda表达式可以简化创建匿名内部类对象 1.不需要new XXX(){}这种繁琐代码. 2.不需要指出重写的方法名. 3.不要给出重写的方法的返回值类型. 4.Lambda相当于一个匿名方法 ...
- UIAlertView弹出框
<Alert弹出框提示用户信息> 1.遵循代理方法<UIAlertViewDelete> 2.调用方法UIAlertView *alert = [[UIAlertV ...
- gcc -I -L -l区别
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录: 例: gcc -o hello hello.c -I /home/hello/inc ...
- Swift: 继承
为了在属性值改变的时候获得通知,类可以为继承的属性添加属性观察者.属性观察者可以添加到任何属性上,不管这个属性原来是存储属性还是计算属性. Swift中的类没有一个统一的基类. 为了讲明白继承,我们先 ...
- [转] 使用CodeViz生成C/C++函数调用关系图
运行环境:虚拟机下的Ubuntu 11.04 结合Graphviz工具,使用CodeViz可以生成直观和漂亮的C/C++程序函数之间的调用关系图. 1.安装graphviz 在安装CodeViz之前, ...
- Macos Coco2d-x Android开发
1. 在装好环境 2. cocos new [-h] [-p PACKAGE_NAME] -l {cpp,lua,js} [-d DIRECTORY] [-t TEMPLATE_NAME] [--io ...
- Android 设计模式之观察者模式(转载自:“http://blog.csdn.net/fangchongbory/article/details/7774044”)
/* * 观察者模式 * 定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的 * 对象都得到通知并被自动更新 * * 当然, ...
- android TimerTask 的简单应用,以及java.lang.IllegalStateException: TimerTask is scheduled already错误的解决方法【转】
Android应用开发中常常会用到定时器,不可避免的需要用到 TimerTask 定时器任务这个类下面简单的一个示例演示了如何使用TimerTask这个示例演示了3秒未有触屏事件发生则锁屏(只是设置下 ...
- ecshop首页调用指定商品分类下的商品品牌列表
转之--http://www.16css.com/ecshop/735.html 通过二次开发可以实现ECSHOP首页调用指定分类下的品牌列表. 第一步: 打开根目录下的index.php 在最后面 ...
- Tempdb对SQL Server性能的影响
转载文章,原文地址:http://www.cnblogs.com/laodao1/archive/2010/04/15/1712395.html1.SQL Server系统数据库介绍 SQL Serv ...