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中字典编码分析的更多相关文章

  1. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

  2. Java开发中的编码分析__GET&POST

    GET方式提交参数分析 code.jsp <%@ page language="java" contentType="text/html; charset=UTF- ...

  3. JAVA中的编码分析

    在实际编程中可以不用关注JVM中使用的是什么编码,而只需要关注自己输出需要采用的编码,JVM会根据你设置的编码正确操作. 1.String采用的是什么编码? 很多厂家根据规范实现了JVM,JVM只说明 ...

  4. Python2 中字典实现的分析【翻译】

    在这片文章中会介绍 Python2 中字典的实现,Hash 冲突的解决方法以及在 C 语言中 Python 字典的具体结构,并分析了数据插入和删除的过程.翻译自python-dictionary-im ...

  5. HM中再增加一路自己的entropy coder

    compressSlice 中一开始的entropy coder 设置: // set entropy coder if( m_pcCfg->getUseSBACRD() ) { m_pcSba ...

  6. WebGIS中GeoHash编码的研究和扩展

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 1.1普通地理编码流程 将采集的POI入库后,数据库里保存有 ...

  7. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  8. HM中CU,TU的划分

    相信只要是做算法改进的,首先都会遇到这么一个问题:CU,PU及TU这几个在HM中该如何打印出它们最终的划分情况呢?也经常有人来问我这个问题,一般来说,因为问我的时候我一般手头都没有现成的代码可以提供, ...

  9. Java web中常见编码乱码问题(一)

    最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...

随机推荐

  1. 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005

    检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005.跟踪了一下,结果是将记录导出 ...

  2. Bootstrap——基本模板

    <!DOCTYPE html><html lang="zh-cn">  <head>    <meta charset="utf ...

  3. C# for和 foreach 的数组遍历 比较

    刚学习程序,感觉写代码 很有意思,所以把自己的感悟写下来啦,第一次写博客,可能是菜鸟中的菜鸟  时间久了,相信就会写的很好哦! for和 foreach 的数组遍历 比较 很简单的程序,不解释啦! u ...

  4. 如何在安装32位Oracle客户端组件的情况下以64位模式运行

    C#使用System.Data.OracleClient连接Oracle数据库.之前在WinXP上正常运行的程序移植到Windows 2008 x64上之后就连不上数据库了,错误信息如下:启动data ...

  5. c#调用cmd的ping命令

    private static string CmdPing(string strIp) { Process p = new Process(); p.StartInfo.FileName = &quo ...

  6. unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)

    gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的 GameObject.Destr ...

  7. Update与FixedUpdate区别

    以下的代码能使游戏暂停,记得要使速度*Time.deltaTime,目的是保证游戏运行在帧数不同的情况下,角色移动速度都一样,因为此时角色是按时间移动与帧数无关. using UnityEngine; ...

  8. DataTable或者DataRow转换对象

    public static IEnumerable<T> ConvertObject<T>(DataTable dt) where T : new() { var v = ty ...

  9. C#中获取程序集版本号的方法

    我的方法: string version = Assembly.GetExecutingAssembly().GetName().Version.ToString();   方法一: public v ...

  10. Spring整合Tiles

    1.假设Spring相关的包和配置已经导入成功(后续有时间补上,本项目用的是3.2.0版本). 2.导入Tiles相关的jar包. tiles-api-2.2.2.jar tiles-core-2.2 ...