HM中字典编码分析
LZ77算法基本过程 http://jpkc.zust.edu.cn/2007/dmt/course/MMT03_05_2.htm
LZ77压缩算法详解 http://wenku.baidu.com/view/c4ee642bcfc789eb172dc8f5.html
输入待字典编码的CU,
CopyCuFromPicYuv444(pcPic,m_pCuBuf, cuIdx,bEncOrg);
待编码的输入64*64,重排序后的YUV (*(m_matchFinderBase.stream)).data
void CDictEncoder::WriteStrMapResult(int len, int pos,const UChar * pCurBuf)
//写入编码的结果,32位数的iDst编码结果push_banck到m_pStrMapBufList,m_uCurrPackSize为list大小。
{
…
if (len == 1 && pos == (UInt)-1)//没有匹配的
{
if (numCoded>=3)
{
litFlag = (pCurBuf[0]-pCurBuf[-3])<0;
c = (UInt)ABS_DIFF(pCurBuf[0],pCurBuf[-3]);
}
else
c = (UInt)pCurBuf[0];
WriteBits(iDst,0,1,1);
WriteBits(iDst,litFlag,1,2);//因为排列顺序是YUVYUV,所以编的是与pCurBuf[-3]的差值,litFlag表示差值的正负
WriteBits(iDst,c,8,3);
}
else
{
WriteBits(iDst,1,1,1); //第1个bit占一位,指示有匹配,第2bit开始的9位表示匹配长度len,第11bit开始的22位表示偏移pos
WriteBits(iDst,len,9,2);
WriteBits(iDst,pos,22,11);
}
}
void CDictEncoder::DictCodeOneBlock()
{
…
for (;;)
{
len = GetOptimumFast(&pos);//返回最佳的匹配,len长度,pos偏移
…
pCurBuf = MatchFinder_GetPointerToCurrentPos(&m_matchFinderBase) - m_uAdditionalOffset;
//(m_matchFinderBase).buffer匹配的结束位置,即m_uAdditionalOffset=len,向前len为匹配的开始位置pCurBuf,len>8 时匹配串在pCurBuf-(pos-8)-1, pos<8时,在pCurBuf- m_uReps[pos]-1
WriteStrMapResult(len,pos,pCurBuf);
m_uAdditionalOffset -= len;
nowPos32 += len;
if ((m_uAdditionalOffset == 0) && (MatchFinder_GetNumAvailableBytes(&m_matchFinderBase) == 0))// AvailableBytes还待编的字符数,编完了则跳出
{
break;
}
}//for
}
字典的输入是pixels data in previously constructed CUs 和current LCU data
如果previously constructed CUs 是dictionary编码的,无需rollback
如果是HM编码的,则previous CUs需 rollback.
rollback的原因:用HM的constructed CU要作为下一个CU的字典输入,还需调用DictCompressCu(uiCUAddr,cuCnt-1,false,pcSlice); 再字典编码一次,不过与真正的字典编码不同,只执行编码的过程(哈希和匹配),而不写入结果。这样constructed CU 就生成了哈希表,可以作为了下一个CU的字典,方便查找。
if(dCostHM / dCostDictCoder > 1.0)
{
int i;
m_pTComDictEncoder->WriteCu2RecYuv444(pcCU,uiCUAddr);//选择字典编码,内部其实是把原CU写入到重构pic,因为重构和原CU一样
bLastCuRollBack = false;
pcCU->m_bCUCodedByDictCoderFlag = true;
for (i=0;i<pcCU->getTotalNumPart();i++)
{
pcCU->setPredictionMode(i,MODE_INTRA);
}
}
else
{
m_pTComDictEncoder->SetNeedRollBackVar(true);
bLastCuRollBack = true;
m_pTComDictEncoder->DictCompressCu(uiCUAddr,cuCnt-1,false,pcSlice);
m_pTComDictEncoder->SetNeedRollBackVar(false);
}
void TComDictEnc::DictCompressCu(UInt cuIdx, UInt cuEndIdx, bool bEncOrg, TComSlice* pcSlice)
{
if (m_bNeedRollBack)
{
…
for(i = 0 ;i < m_pDictEncoder->m_uCurrPackSize;i++)//选择的是HM编码,所以把第一次CU原图字典编码写入的结果都弹出
{
m_pDictEncoder->m_pStrMapBufList.pop_back();
}
m_pDictEncoder->m_uCurrPackSize = 0;
}
...
CopyCuFromPicYuv444(pcPic,m_pCuBuf, cuIdx,bEncOrg);// 原CU编码时,复制的是原CU到m_pCuBuf,rollback时复制的是重构CU到m_pCuBuf
…
m_pDictEncoder->DictCodeOneBlock();
…
}
void CDictEncoder::DictCodeOneBlock()
{
…
len = GetOptimumFast(&pos);
if (!m_matchFinderBase.m_bEncOrg)//重构CU,rollback,只执行了编码过程,不写入结果
{
m_uAdditionalOffset -= len;
if ((m_uAdditionalOffset == 0) && (MatchFinder_GetNumAvailableBytes(&m_matchFinderBase) == 0))
{
m_bIsLastCuRollBack = 1;
break;
}
continue;
}
if (m_matchFinderBase.m_bEncOrg)//原CU,要写入结果
{
WriteStrMapResult(len,pos,pCurBuf);
}
…
}
void CDictEncoder::DictCodeOneBlock()
{
…
for (;;)
{
len = GetOptimumFast(&pos);//返回最佳的匹配,len长度,pos偏移
…
if (!m_matchFinderBase.m_bEncOrg)//重构CU,rollback,只执行了编码过程,不写入结果
{
m_uAdditionalOffset -= len;
if ((m_uAdditionalOffset == 0) && (MatchFinder_GetNumAvailableBytes(&m_matchFinderBase) == 0))
{
m_bIsLastCuRollBack = 1;
break;
}
continue;
}//if
if (m_matchFinderBase.m_bEncOrg)//原CU,要写入结果
{
pCurBuf = MatchFinder_GetPointerToCurrentPos(&m_matchFinderBase) - m_uAdditionalOffset;
//(m_matchFinderBase).buffer匹配的结束位置,即m_uAdditionalOffset=len,向前len为匹配的开始位置pCurBuf,len>8 时匹配串在pCurBuf-(pos-8)-1, pos<8时,在pCurBuf- m_uReps[pos]-1
WriteStrMapResult(len,pos,pCurBuf);
m_uAdditionalOffset -= len;
nowPos32 += len;
if ((m_uAdditionalOffset == 0) && (MatchFinder_GetNumAvailableBytes(&m_matchFinderBase) == 0))// AvailableBytes还待编的字符数,编完了则跳出
{
break;
}
}//if
}//for
}
参考:
JCTVC-K0133
JCTVC-I0272-r2444 Screen Content Coding using Dual-coder Mixed Chroma-sampling-rate (DMC) Techniques
HM80ECF444DualCoderSourceCode.zip
HM中字典编码分析的更多相关文章
- JAVA WEB 中的编码分析
JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...
- Java开发中的编码分析__GET&POST
GET方式提交参数分析 code.jsp <%@ page language="java" contentType="text/html; charset=UTF- ...
- JAVA中的编码分析
在实际编程中可以不用关注JVM中使用的是什么编码,而只需要关注自己输出需要采用的编码,JVM会根据你设置的编码正确操作. 1.String采用的是什么编码? 很多厂家根据规范实现了JVM,JVM只说明 ...
- Python2 中字典实现的分析【翻译】
在这片文章中会介绍 Python2 中字典的实现,Hash 冲突的解决方法以及在 C 语言中 Python 字典的具体结构,并分析了数据插入和删除的过程.翻译自python-dictionary-im ...
- HM中再增加一路自己的entropy coder
compressSlice 中一开始的entropy coder 设置: // set entropy coder if( m_pcCfg->getUseSBACRD() ) { m_pcSba ...
- WebGIS中GeoHash编码的研究和扩展
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 1.1普通地理编码流程 将采集的POI入库后,数据库里保存有 ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- HM中CU,TU的划分
相信只要是做算法改进的,首先都会遇到这么一个问题:CU,PU及TU这几个在HM中该如何打印出它们最终的划分情况呢?也经常有人来问我这个问题,一般来说,因为问我的时候我一般手头都没有现成的代码可以提供, ...
- Java web中常见编码乱码问题(一)
最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...
随机推荐
- Python学习笔记-Day2-Python基础之列表操作
列表的常用操作包括但不限于以下操作: 列表的索引,切片,追加,删除,切片等 这里将对列表的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 type(list) 使 ...
- linux select 学习
一.select介绍 函数原型: #include <sys/select.h> int select(int maxfdp1, fd_set *restrict readfds, fd_ ...
- php基础复习(3)文件上传于下载
一. 客户端配置: 表单页面 表单的发送方式是post 添加enctype = “multipart/form-data” <form action="doaction.php&q ...
- Eclipse常用快捷键windows
Ctrl+1:快速修正Ctrl+W: 关闭当前文件ctrl+O:打开outlineCtrl+D: 删除当前行 Ctrl+L: 定位在某行Ctrl+Q:转到上次修改位置Ctrl+/:注释代码Ctrl+H ...
- ActiveMQ点对点的消息发送案例
公司最近会用MQ对某些业务进行处理,所以,这次我下载了apache-activemq-5.12.0-bin把玩下. 基于练习方便需要,使用Windows的版本. 参考的优秀文章: activemq的几 ...
- PostGIS_导入shp格式的数据
1.导入shp到PostGIS 开启PostGIS shp Loader,如下图: 打开View connection details....输入连接数据库的参数,如下: 连接成功后,点击Add Fi ...
- windows下的mysql客户端mysqlworkbench链接虚拟机上CentOS的mysql服务器
本人在虚拟机上CentOS的Linux环境下安装了mysql服务器,在本地Windows下安装了mysql的客户端mysqlworkbench ,所以就想让windows下的mysql客户端mysql ...
- SpringMVC 配置过滤器解决中文乱码问题
<!-- 字符集过滤器 --> <filter> <filter-name>Charset</filter-name> ...
- Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
此文章非原创,仅为分享.学习!!! 参考数据库链接串: <add key="data" value="server=192.168.1.123; port=3306 ...
- TCP的流量控制和拥塞控制
1.TCP的流量控制 一般说来,我们总是希望数据传输的更快一些.但如果发送方吧数据发送的过快,接收方就可能来不及接收,就会造成数据的丢失.所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来的及 ...