当前位置:  编程技术>综合
本页文章导读:
    ▪HEVC学习(二十五) —— 变换系数的编码之一      本文首先介绍系数扫描模式的初始化。 直接给出代码及相应的注释:   // scanning order table UInt* g_auiSigLastScan[ 3 ][ MAX_CU_DEPTH ]; //!< [pattern][depth] const UInt g_sigLastScan8x8[ 3 ][ 4 ] = { {0, 2, 1, 3}, .........
    ▪java实现栈结构      栈的定义         栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。       (1)通常称插入、删除的这一端为栈顶 (Top),另.........
    ▪25. Notes About Garbage Collection In LotusScript      Garbage collection is done with three characteristics in Lotusscript. a) It’s done after the execution of EACH line of code. b) It reclaims the memory of an object when on local variable references it directly, even when another referenced object lin.........

[1]HEVC学习(二十五) —— 变换系数的编码之一
    来源: 互联网  发布时间: 2013-11-10

本文首先介绍系数扫描模式的初始化。

直接给出代码及相应的注释:

 

// scanning order table
UInt* g_auiSigLastScan[ 3 ][ MAX_CU_DEPTH ]; //!< [pattern][depth]

const UInt g_sigLastScan8x8[ 3 ][ 4 ] =
{
  {0, 2, 1, 3}, //!< right-up diagonal
  {0, 1, 2, 3}, //!< horizontal
  {0, 2, 1, 3}  //!< vertical
};
UInt g_sigLastScanCG32x32[ 64 ];


 

Void initSigLastScan(UInt* pBuffD, UInt* pBuffH, UInt* pBuffV, Int iWidth, Int iHeight, Int iDepth)
{
  const UInt  uiNumScanPos  = UInt( iWidth * iWidth );
  UInt        uiNextScanPos = 0;

  /*
  ** 在这里需要先作如下说明,以免对接下来代码中的一些处理会有疑惑。
  ** 首先,在初始化时,总共有2x2,4x4,8x8,16x16,32x32,64x64,128x128这7种情况,当然,我们实际使用
  ** 的就只有4x4,8x8,16x16,32x32这4种,其余的几种至少目前的draft中是不采用的,故重点关注这4种即可。
  ** 其次,这段初始化代码是基于JCTVC-G644这个提案的,提案的具体内容请自行把这个提案下载下来阅读,这里
  ** 不作详细介绍。
  */

  if( iWidth < 16 )
  {
  UInt* pBuffTemp = pBuffD;
  if( iWidth == 8 )
  {
    pBuffTemp = g_sigLastScanCG32x32; //!< 用于TU为32x32时的系数扫描,CG为Coefficient Group的缩写
  }
  for( UInt uiScanLine = 0; uiNextScanPos < uiNumScanPos; uiScanLine++ )
  {
    Int    iPrimDim  = Int( uiScanLine );	//!< uiScanLine为已经扫描过的反对角线数
    Int    iScndDim  = 0;						//!< 在某条反对角线上的计数
    while( iPrimDim >= iWidth )				//!< 扫描的反对角线如果已经超过矩阵反对角线数的一半
    {													//!< 则根据该反对角线与反主对角线的距离,距离每增加1,则总元素数减1
      iScndDim++;
      iPrimDim--;
    }
    while( iPrimDim >= 0 && iScndDim < iWidth ) //!< 设置矩阵中某一条反对角线上(左下到右上)的元素的序号 
    {//!< pBuffTemp赋值的原理:iPrimDim控制当前扫描到的元素的行数,iiScndDim控制该元素在反对角线上的序号
      pBuffTemp[ uiNextScanPos ] = iPrimDim * iWidth + iScndDim ;
      uiNextScanPos++;
      iScndDim++;
      iPrimDim--;
    }
  }
  }
  if( iWidth > 4 )
  {
    UInt uiNumBlkSide = iWidth >> 2;						//!< 以4x4像素为一个单元
    UInt uiNumBlks    = uiNumBlkSide * uiNumBlkSide; //!< 单元数
    UInt log2Blk      = g_aucConvertToBit[ uiNumBlkSide ] + 1;

    for( UInt uiBlk = 0; uiBlk < uiNumBlks; uiBlk++ )
    {
      uiNextScanPos   = 0;
      UInt initBlkPos = g_auiSigLastScan[ SCAN_DIAG ][ log2Blk ][ uiBlk ]; //!< 以4x4块为单元的位置(序号)	
      if( iWidth == 32 )
      {
        initBlkPos = g_sigLastScanCG32x32[ uiBlk ]; //!< TU为32x32时,不会再在16个4x4块中进行up-right diamond扫描,而直接在整一个32x32中以4x4块为单元进行扫描
      }
      UInt offsetY    = initBlkPos / uiNumBlkSide;					//!< 当前4x4块垂直方向的偏移量
      UInt offsetX    = initBlkPos - offsetY * uiNumBlkSide;	//!< 当前4x4块水平方向的偏移量
      UInt offsetD    = 4 * ( offsetX + offsetY * iWidth );		//!< 当前4x4块第一个位置序号
      UInt offsetScan = 16 * uiBlk;	//!< 每一个4x4块包含了16个像素(即系数),用于给出当前4x4块第一个位置相对于第1个4x4块第一个位置的偏移量
      for( UInt uiScanLine = 0; uiNextScanPos < 16; uiScanLine++ ) //!< 对每个4x4块进行扫描顺序的确定	
      {
        Int    iPrimDim  = Int( uiScanLine );
        Int    iScndDim  = 0;
        while( iPrimDim >= 4 ) //!< 则根据该反对角线与反主对角线的距离,距离每增加1,则总元素数减1
        {
          iScndDim++;
          iPrimDim--;
        }
        while( iPrimDim >= 0 && iScndDim < 4 ) //!< 设置矩阵中某一条反对角线上(左下到右上)的元素的序号 
        {
          pBuffD[ uiNextScanPos + offsetScan ] = iPrimDim * iWidth + iScndDim + offsetD;
          uiNextScanPos++;
          iScndDim++;
          iPrimDim--;
        }
      }
    }
  }
  
  UInt uiCnt = 0;
  if( iWidth > 2 )
  {//!< 水平扫描模式
    UInt numBlkSide = iWidth >> 2;  
    for(Int blkY=0; blkY < numBlkSide; blkY++) //!< 以4x4块为单元,行优先
    {
      for(Int blkX=0; blkX < numBlkSide; blkX++)
      {
        UInt offset    = blkY * 4 * iWidth + blkX * 4; //!< 确定当前4x4块的第一个位置序号
        for(Int y=0; y < 4; y++) //!< 对每个4x4块中的16个位置进行遍历,行优先
        {
          for(Int x=0; x < 4; x++)
          {
            pBuffH[uiCnt] = y*iWidth + x + offset;
            uiCnt ++;
          }
        }
      }
    }
    //!< 垂直扫描模式
    uiCnt = 0;
    for(Int blkX=0; blkX < numBlkSide; blkX++) //!< 以4x4块为单元,列优先
    {
      for(Int blkY=0; blkY < numBlkSide; blkY++)
      {
        UInt offset    = blkY * 4 * iWidth + blkX * 4;
        for(Int x=0; x < 4; x++) //!< //!< 对每个4x4块中的16个位置进行遍历,行优先
        {
          for(Int y=0; y < 4; y++)
          {
            pBuffV[uiCnt] = y*iWidth + x + offset;
            uiCnt ++;
          }
        }
      } //!< for(Int blkY=0; blkY < numBlkSide; blkY++)       
    } //!< for(Int blkX=0; blkX < numBlkSide; blkX++)     
  } //!< if( iWidth > 2 )   
  else  //!< if( iWidth <= 2 )
  { //!< Horizontal scan pattern
  for(Int iY=0; iY < iHeight; iY++)
  {
    for(Int iX=0; iX < iWidth; iX++)
    {
      pBuffH[uiCnt] = iY*iWidth + iX;
      uiCnt ++;
    }
  }

  //!< Vertical scan pattern
  uiCnt = 0;
  for(Int iX=0; iX < iWidth; iX++)
  {
    for(Int iY=0; iY < iHeight; iY++)
    {
      pBuffV[uiCnt] = iY*iWidth + iX;
      uiCnt ++;
    }
  }    
  } //!< else //!< if( iWidth <= 2 )
}


 

作者:HEVC_CJL 发表于2013-1-12 14:33:07 原文链接
阅读:35 评论:0 查看评论

    
[2]java实现栈结构
    来源: 互联网  发布时间: 2013-11-10

栈的定义  

      栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。  

    (1)通常称插入、删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom)。  

    (2)当表中没有元素时称为空栈。  

    (3)栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表。  

      栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中" 

最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部, 

要到最后才能删除。 

 

【示例】元素是以a1,a2,…,an的顺序进栈,退栈的次序却是an,an-1,…, 

a1。  

 

2、栈的基本运算  

 (1)InitStack(S)  

      构造一个空栈S。  

 (2)StackEmpty(S)  

      判栈空。若S为空栈,则返回TRUE,否则返回FALSE。  

 (3)StackFull(S)  

      判栈满。若S为满栈,则返回TRUE,否则返回FALSE。  

注意: 该运算只适用于栈的顺序存储结构。  

 (4)Push(S,x)  

      进栈。若栈S不满,则将元素x插入S的栈顶。  

 (5)Pop(S)  

 

 

定义堆栈ADT
StackADT
package Stack;
public interface StackADT {
    public void push(Object element);//压栈
    public Object pop();//出栈
    public boolean isEmpty();
    public int size();
    public Object peek();//返回栈顶对象的一个引用
    public String toString();
}

 

链式实现:


在栈的一段添加和删除元素,在栈中维护一个指向栈顶的结点和一个count变量指示栈的大小:
private LinearNode top; //指向栈顶
private int count;//标记栈的大小
每次出栈和压栈在链表的表头:(也可以再表尾,实现方式不一样而已)
top--->元素1--->元素2--->元素3.........
实现(附带测试main):
LinkedStack
package Stack;
import Bag.LinearNode;
//为了重点来实现算法,将异常情况直接打印出然后退出程序,不再声明异常类
public class LinkedStack implements StackADT {
    private LinearNode top; //指向栈顶
    private int count;//标记栈的大小
    public static void main(String[] args){
        LinkedStack stack = new LinkedStack();
        System.out.println("将

    
[3]25. Notes About Garbage Collection In LotusScript
    来源: 互联网  发布时间: 2013-11-10
Garbage collection is done with three characteristics in Lotusscript.
a) It’s done after the execution of EACH line of code.
b) It reclaims the memory of an object when on local variable references it directly, even when another referenced object links to it.
c) When it reclaims an object, it reclaims all the objects contained by the object. Notes does not allow free-floating objects that exist outside their container, or "owner" object. Documents, for example, must belong to a database. Items must belong to a document, and ACLEntries must belong to an ACL object.
Point a) ensures the efficient memory usage when a sub involves the iteration of a large number of Notes objects e.g. documents.
set view = db.GetView("$all") 
set doc = view.GetFirstDocument() 
while not (doc is nothing) 
      ' do something... 
      set doc = view.GetNextDocument(doc) 
wend

Point b) and c) are harmful when they work together.

dim s as new NotesSession 
dim entry as NotesEntry 
set entry = s.CurrentDatabase.ACL.GetFirstEntry
The entry object will be reclaimed right after the assignment statement is executed as the ACL object is not stored in any variable and thus destructed, which causes the child object ACLEntry to be reclaimed. The issue in this case can be fixed by storing the ACL object in a variable.
Another case is as below:
Sub Initialize
	Dim s As New NotesSession
	Dim view As NotesView
	Set view=TestObj()
	Print view.Name
End Sub
Function TestObj As NotesView
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Set db=s.Getdatabase(s.Currentdatabase.Server, "log.nsf")
	Set TestObj=db.Getview("UsageByUser")
End function
The View object returned by the function TestObj is reclaimed before it can be used by the caller because the parent database log.nsf is reclaimed after the function ends. If the view is from the current database, it will keep alive, even if the current database object is not initialized in the caller. The current session and database objects keep alive until the whole program e.g. agent exits. To avoid the failure above, a global variable can be declared to hold the exterior database object.

Sub Initialize
	Dim s As New NotesSession
	‘the following two lines are optional
	Dim db As NotesDatabase
	Set db=s.Currentdatabase
	Dim view As NotesView
	Set view=TestObj()
	Print view.Name
End Sub
Function TestObj As NotesView
	Dim s As New NotesSession
	Set TestObj=s.Currentdatabase.Getview("All")
End function



作者:starrow 发表于2013-1-12 14:20:23 原文链接
阅读:32 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3