三个文件名以 erc 开头的文件就是 EC 相关的文件。EC 的入口在 exit_picture 函数中,从 ercStartSegment 开始到 ercConcealInterFrame 结束。你自己做一个丢包之后的码流,把程序跑起来跟踪一下 EC 过程,慢慢分析代码。

错误隐藏过程在整个帧全部解码后,而且位于环状滤波过程之后。

因为宏块按扫描顺序一行一行的编解码,错误码流会影响一连串的宏块。因此,错误隐藏时,一般在当前帧解码结束后,一列一列的错误隐藏。又由于人眼对图像中间区域更敏感,故常从两侧边缘开始对宏块列进行掩藏,再逐渐向中央逼近,掩藏块的运动矢量可以进一步为后续处理块提供预测信息,从而这样做使得图像中间误码块的恢复效果更好些

所谓时域错误隐藏,就是根据正确解码的邻块或前帧块信息,推测得到合适的当前误码块运动矢量。该运动矢量对应的参考块直接拷贝至当前块位置,就完成了错误隐藏过程。可见,关键问题在于如何找到合适的运动矢量

最简单的时域错误隐藏,就是设定每个错误宏块的运动矢量都是零,这样对于静止块和准静止块有效,对于运动较大的块这出现了明显的质量下降。一个稍稍改进的方法是:设定其运动矢量为邻块运动矢量、或它们的中值、或均值运动矢量,对于运动矢量场连续的序列效果较好,对于复杂运动序列依然效果较差。

改进方法1:得到多个候选运动矢量。比如,所有的邻块(4领域或8领域)运动矢量、它们的中值和均值、运动矢量、前一帧对应块运动矢量....。然后根据匹配准则选择代价最小的运动矢量。常用的准则就是边界匹配法(BMA,boundary matching algorithm),就是选择边界像素和误码块周围相邻的像素差值最小的块。JM中正是这么做的,它的候选运动矢量只考虑了4邻域的邻块运动矢量和零运动矢量

改进方法2:方法1中的BMA准则,参与计算差异的像素个数较少,容易受到噪声干扰。而且,如果本来宏块边界就存在物体边缘,BMA的匹配效果将大打折扣。一个替代的准则是外边界匹配法(EBMA,external boundary matching algorithm)。就是计算参考块和误码块的外部相邻像素的差异。

改进方法3:方法1中得到的运动矢量,一般并不是误码块的真实运动矢量。因此可以用加入运动估计过程,得到更佳的匹配块。

改进方法4:以往的算法中,一般以整个宏块为单元做错误隐藏(JM中就是这么做的)。可以将宏块分成多个小块(比如4个8*8块),对每个小块分别做错误隐藏,效果更好。但是这样做,会出现一定的块效应。因此,一个更折衷的方法是根据邻块的编码模式推测误码块的隐藏块模式。

改进方法5:由于H.264中采用了更小的宏块分割模式(最小支持到4*4),这样使得编码后的运动矢量场更佳连续,即块与块的运动矢量相关性更大。可以将误码块分成16个4*4块,每个4*4块的运动矢量由周围宏块的运动矢量插值得到。一般是水平、垂直方向各插值一遍,然后取二者的均值。

改进方法6:在b、p帧中,也有一定的帧内编码块。同样,错误隐藏的时候,也可以考虑空域错误隐藏方法。关键是如何判断用空域还是时域隐藏。研究比较多的是,对I slice的宏块(第一帧除外)也进行时域隐藏,前提是要判断没有出现场景转换。

补充一点,时域错误隐藏也可以被应用于intra frame。h.264的对于intra-frame的weighted pixel averaging(WPA)插补错误隐藏算法不能取得良好的效果,时域错误隐藏往往能取得比WPA更好的结果。

Q1:风车,能不能推荐几篇文章是讲通过相邻宏块的编码模式推测丢失块类型的???

A:

A New Temporal Error Concealment Method for H.264 using Adaptive Block Sizes

A New Error Concealment algorithm for H.264 Video   Transmission

Q:改进方法3:方法1中得到的运动矢量,一般并不是误码块的真实运动矢量。因此可以用加入运动估计过程,得到更佳的匹配块。不太明白如何进行运动估计,哪位高手指点下

A:就是说在做错误隐藏时采用一种类似于运动估计的方法,比如你有一个丢失的宏块,你可以用这个丢失宏块的临近宏块的边界像素在前一帧中进行边界匹配计算,在 一定的范围内进行遍历。最后得到的边界匹配失真最小的宏块就可以用来替代丢失的宏块。这个过程 和运动估计 有些相似。

。。。。。etc 时域错误隐藏个人理解相关推荐

  1. 错误隐藏学习手记(六)

    现在又出了H.265,我觉得有必要在错误隐藏方面也要跟进,采用和H.265标准一致的东西才好!那么H.264和H.265的区别在于哪里呢? 随着用户对监控视频质量的要求越来越高,高清视频在安防监控中的 ...

  2. linux useradd bash,对于bash:useradd:command not found错误的一点理解

    对于bash:useradd:command not found错误的一点理解 问题: 前两天做实验,在命令行中添加用户时显示bash:useradd:command not found的错误,在网上 ...

  3. 聚爆登进去显示服务器,聚爆连接错误隐藏关卡,可以试一试这些方法

    聚爆中不少玩家反馈都会遇到聚爆无法连接服务器是什么原因的问题,那么怎么解决这个问题呢,这边ourplay小编为大家分享几个解决方案. 聚爆连接错误隐藏关卡 聚爆游戏简介 <聚爆>是一款由 ...

  4. TSlint注释忽略错误和RESTful理解

    restful推荐去看大神的博客 tslint注释标记 ts文件中使用以下注释来临时忽略规则出现的错误,参考这里 / tslint:disable /--忽略该行以下所有代码出现的错误提示 / tsl ...

  5. C++中关于隐藏的理解

    引言 在使用中弄清楚隐藏的区别之后,还需要明白怎么使用.下面说以下隐藏,重写,重载的区别: 与重载的区别: 在父类与子类中,函数名相同,参数不同,无论父类中的同名函数是否含有virtual关键字,都是 ...

  6. 计算机系统性错误,《深入理解计算机系统-异常》

    现代操作系统通过使控制流发生突变来对某些意外情况(磁盘读写数据准备就绪.硬件定时器产生信号等)做出反应.一般而言,我们把这些突变命名为异常控制流(Exceptional Contral Flow EC ...

  7. 关于sata状态寄存器和错误寄存器的理解

    在AHCI协议中Port Register中有如下几个寄存器,我们这里主要关注PxSSTS和PxSERR 2. 什么是SCR寄存器 参考AHCI协议14.1章节 Sata host适配器包括了一个额外 ...

  8. 从kernel源代码的角度分析signal的错误用法和理解

    读这份文档之前,建议先浏览一下 <Unix Advanced Programming >里面的signal 一章和下面这份出 自IBM 论坛的文章:进程间通信 信号(上) http://w ...

  9. 由频谱重构时域信号:直观理解Griffin Lim算法

    Griffin Lim算法利用frame之间相位的约束来实现迭代收敛,可以在缺乏原始相位信息的基础上利用频谱重构出语音信号. 以下是G-L算法的大致思路: 由频谱我们已经有了Amplitude矩阵A1 ...

最新文章

  1. MAPREDUCE实践篇(1)
  2. 32位系统 和 64位系统 C 程序中 为什么 指针的内存大小的不一样
  3. python源码学习_【Python学习】Python源码阅读(一)
  4. CSS3学习笔记-字体和文字
  5. 27 行代码开发一个最简单的 SAP ALV 报表
  6. jpg、gif、png-8、png-24的区别
  7. Spring Boot 静态资源访问原理解析
  8. 笨方法学python(本文为阅读时从此书摘录的笔记) 第五天
  9. Python的10个神奇的技巧
  10. xp下创建DOMDocument对象失败的解决方法
  11. IDL实现矢量(shp)裁剪栅格TASK(一)
  12. PHP动态网页设计与制作案例教程pdf
  13. user相关的一些命令及用法
  14. vue自定义表格(每一列表格下面包含一个子表格)
  15. CSS——CSS盒子模型(重点※)
  16. 2018-2019年世界经济危机是中国崛起最大的机遇!
  17. ARM Cortex M3M4处理器复位流程
  18. ACM-ICPC 2018 南京赛区网络预赛 J Sum(欧拉线性筛+思维)
  19. IDEA中如何给代码添加Copyright
  20. C++单例模式与线程安全

热门文章

  1. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
  2. Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】
  3. html5测试 iphone6sp,5款旧iPhone测试iOS运行速度:只有6S速度明显提升
  4. CCNA-第八篇-OSPF-上
  5. 【HRBUST - 1623】Relation(思维模拟,拆解字符串)
  6. 【2019浙江省赛 - K 】Strings in the Pocket(马拉车,思维)
  7. 【HDU - 1533】Going Home(网络流,二分图最优匹配,KM算法)
  8. 【POJ - 3342】Party at Hali-Bula(树形dp,最大独立集,是否有唯一解)
  9. C++手动开启O2优化(以及-O -O1 -O2 -O3优化的知识点)(竞赛可用)
  10. 11.深度学习练习:Keras tutorial - the Happy House(推荐)