HM中参考图像列表的设置

2024-02-12 09:32
文章标签 设置 图像 列表 参考 hm

本文主要是介绍HM中参考图像列表的设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于帧间预测而言,一定会涉及到参考图像的问题,但是搞清楚HM中参考图像是如何配置,对理解其编码结构尤为关键。顾名思义,参考图像应该是属于picture级别的,因此可以在compressGOP函数中找到相应的函数。主要包括以下三个函数:

1、arrangeLongtermPicturesInRPS(pcSlice, rcListPic);

2、pcSlice->setRefPicList ( rcListPic );

3、pcSlice->setRefPOCList();

首先说第一个函数,主要是在RPS(Reference Picture Set)句法中设置LongTermPicture,那么什么是LT呢?参考图像主要有以下三种:long-term,short-term before curr和short-term after curr。第一个函数就是用来提供long-term 参考图像的,具体实现可以查看函数,这里不做重点叙述。



重点是第二个函数setRefPicList,上面我们了解到参考图像主要有三种,但是最后参考图像列表中的参考图像是通过下面的方式确定的。那些在参考列表中用到的参考图像,其标志为1,相反,则为0;故setRefPicList函数的实现过程是先通过标志位判断(if(m_pcRPS->getUsed(i)))确定三种参考图像的实际参考帧(如下面第一部分),然后再通过ref_pic_list_init过程,再组成list0和list1列表,实现过程详见程序。



[cpp]  view plain copy print ?
  1. Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic )  
  2. {  
  3.   if (m_eSliceType == I_SLICE)  
  4.   {//==对于I帧而言,直接返回==//  
  5.     ::memset( m_apcRefPicList, 0, sizeof (m_apcRefPicList));  
  6.     ::memset( m_aiNumRefIdx,   0, sizeof ( m_aiNumRefIdx ));  
  7.       
  8.     return;  
  9.   }  
  10.     
  11.   m_aiNumRefIdx[0] = getNumRefIdx(REF_PIC_LIST_0); //==list0参考图像数目==//  
  12.   m_aiNumRefIdx[1] = getNumRefIdx(REF_PIC_LIST_1); <span style="font-family: Arial, Helvetica, sans-serif;">//==list0参考图像数目==//  
  13. </span>  
  14.   TComPic*  pcRefPic= NULL;  
  15.   TComPic*  RefPicSetStCurr0[16];  
  16.   TComPic*  RefPicSetStCurr1[16];  
  17.   TComPic*  RefPicSetLtCurr[16];  
  18.   UInt NumPocStCurr0 = 0;  
  19.   UInt NumPocStCurr1 = 0;  
  20.   UInt NumPocLtCurr = 0;  
  21.   Int i;  
  22.   
  23.   for(i=0; i < m_pcRPS->getNumberOfNegativePictures(); i++)  
  24.   {// 设置short term negative(即前向参考图像)  
  25.     if(m_pcRPS->getUsed(i))  
  26.     {  
  27.       pcRefPic = xGetRefPic(rcListPic, getPOC()+m_pcRPS->getDeltaPOC(i));  
  28.       pcRefPic->setIsLongTerm(0);  
  29.       pcRefPic->setIsUsedAsLongTerm(0);  
  30.       pcRefPic->getPicYuvRec()->extendPicBorder();  
  31.       RefPicSetStCurr0[NumPocStCurr0 ] = pcRefPic;  
  32.       NumPocStCurr0++;  
  33.       pcRefPic->setCheckLTMSBPresent(false);    
  34.     }  
  35.   }  
  36.   for(; i < m_pcRPS->getNumberOfNegativePictures()+m_pcRPS->getNumberOfPositivePictures(); i++)  
  37.   {// 设置short term positive(即后向参考图像)  
  38.     if(m_pcRPS->getUsed(i))  
  39.     {  
  40.       pcRefPic = xGetRefPic(rcListPic, getPOC()+m_pcRPS->getDeltaPOC(i));  
  41.       pcRefPic->setIsLongTerm(0);  
  42.       pcRefPic->setIsUsedAsLongTerm(0);  
  43.       pcRefPic->getPicYuvRec()->extendPicBorder();  
  44.       RefPicSetStCurr1[NumPocStCurr1] = pcRefPic;  
  45.       NumPocStCurr1++;  
  46.       pcRefPic->setCheckLTMSBPresent(false);    
  47.     }  
  48.   }  
  49.   for(i = m_pcRPS->getNumberOfNegativePictures()+m_pcRPS->getNumberOfPositivePictures()+m_pcRPS->getNumberOfLongtermPictures()-1; i > m_pcRPS->getNumberOfNegativePictures()+m_pcRPS->getNumberOfPositivePictures()-1 ; i--)  
  50.   {//==设置long term参考图像==//  
  51.     if(m_pcRPS->getUsed(i))  
  52.     {  
  53.       pcRefPic = xGetLongTermRefPic(rcListPic, m_pcRPS->getPOC(i));  
  54.       pcRefPic->setIsLongTerm(1);  
  55.       pcRefPic->setIsUsedAsLongTerm(1);  
  56.       pcRefPic->getPicYuvRec()->extendPicBorder();  
  57.       RefPicSetLtCurr[NumPocLtCurr] = pcRefPic;  
  58.       NumPocLtCurr++;  
  59.     }  
  60.     if(pcRefPic==NULL)   
  61.     {  
  62.       pcRefPic = xGetLongTermRefPic(rcListPic, m_pcRPS->getPOC(i));  
  63.     }  
  64.     pcRefPic->setCheckLTMSBPresent(m_pcRPS->getCheckLTMSBPresent(i));    
  65.   }  
  66.   // ref_pic_list_init  
  67. #if RPL_INIT_FIX  
  68.   TComPic*  rpsCurrList0[MAX_NUM_REF+1];  
  69.   TComPic*  rpsCurrList1[MAX_NUM_REF+1];  
  70.   Int numPocTotalCurr = NumPocStCurr0 + NumPocStCurr1 + NumPocLtCurr;  
  71.   
  72.   {  
  73.     Int cIdx = 0;  
  74.     for ( i=0; i<NumPocStCurr0; i++, cIdx++)  
  75.     {//==(0<=cIdx<NumPocStCurr0)==//  
  76.       rpsCurrList0[cIdx] = RefPicSetStCurr0[i];  
  77.     }  
  78.     for ( i=0; i<NumPocStCurr1; i++, cIdx++)  
  79.     {//==(NumPocStCurr0<=cIdx<NumPocStCurr1+NumPocStCurr0)==//  
  80.       rpsCurrList0[cIdx] = RefPicSetStCurr1[i];  
  81.     }  
  82.     for ( i=0; i<NumPocLtCurr;  i++, cIdx++)  
  83.     {//==(NumPocStCurr1<=cIdx<numPocTotalCurr)==//  
  84.       rpsCurrList0[cIdx] = RefPicSetLtCurr[i];  
  85.     }  
  86.   }  
  87.   
  88.   if (m_eSliceType==B_SLICE)  
  89.   {  
  90.     Int cIdx = 0;  
  91.     for ( i=0; i<NumPocStCurr1; i++, cIdx++)  
  92.     {//==(0<=cIdx<NumPocStCurr0)==//  
  93.       rpsCurrList1[cIdx] = RefPicSetStCurr1[i];  
  94.     }  
  95.     for ( i=0; i<NumPocStCurr0; i++, cIdx++)  
  96.     {//==(NumPocStCurr0<=cIdx<NumPocStCurr1+NumPocStCurr0)==//  
  97.       rpsCurrList1[cIdx] = RefPicSetStCurr0[i];  
  98.     }  
  99.     for ( i=0; i<NumPocLtCurr;  i++, cIdx++)  
  100.     {//==(NumPocStCurr1+NumPocStCurr0<=cIdx<numPocTotalCurr)==//  
  101.       rpsCurrList1[cIdx] = RefPicSetLtCurr[i];  
  102.     }  
  103.   }  
  104.      
  105.   ///=====Unification of reference picture list modification processes(参考JCTVC-H0138)=====///  
  106.   for (Int rIdx = 0; rIdx <= (m_aiNumRefIdx[0]-1); rIdx ++)  
  107.   {//===修正list0列表===//  
  108.     m_apcRefPicList[0][rIdx] = m_RefPicListModification.getRefPicListModificationFlagL0() ? rpsCurrList0[ m_RefPicListModification.getRefPicSetIdxL0(rIdx) ] : rpsCurrList0[rIdx % numPocTotalCurr];  
  109.   }  
  110.   if ( m_eSliceType == P_SLICE )  
  111.   {//==若为P帧,则list1为零==/  
  112.     m_aiNumRefIdx[1] = 0;  
  113.     ::memset( m_apcRefPicList[1], 0, sizeof(m_apcRefPicList[1]));  
  114.   }  
  115.   else  
  116.   {//===修正list1列表===//  
  117.     for (Int rIdx = 0; rIdx <= (m_aiNumRefIdx[1]-1); rIdx ++)  
  118.     {  
  119.       m_apcRefPicList[1][rIdx] = m_RefPicListModification.getRefPicListModificationFlagL1() ? rpsCurrList1[ m_RefPicListModification.getRefPicSetIdxL1(rIdx) ] : rpsCurrList1[rIdx % numPocTotalCurr];  
  120.     }  
  121.   }  

而最后一个函数setRefPOCList就是实现将参考图像转化成其相应的POC列表。

[cpp]  view plain copy print ?
  1. Void TComSlice::setRefPOCList       ()  
  2. {//===将参考图像列表转化成相应的POC===//  
  3.   for (Int iDir = 0; iDir < 2; iDir++)  
  4.   {  
  5.     for (Int iNumRefIdx = 0; iNumRefIdx < m_aiNumRefIdx[iDir]; iNumRefIdx++)  
  6.     {  
  7.       m_aiRefPOCList[iDir][iNumRefIdx] = m_apcRefPicList[iDir][iNumRefIdx]->getPOC();  
  8.     }  
  9.   }  
  10. }  


另外在第二个函数中有涉及到ListModification(列表修正)的问题,由于篇幅有限,将和 List Combination(参考列表联合)一起留到后续再讨论!

这篇关于HM中参考图像列表的设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702282

相关文章

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert