码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • VVC 帧内预测 predIntraAng()函数 (getCoLocatedLumaPU没写)


    H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算预测像素值xPredIntraAng_liaojq2020的博客-CSDN博客

    VVC学习之五:帧内预测——67个模式预测信号生成 predIntraAng()_Aidoneus_y的博客-CSDN博客

    piPred:里面有W,H,Stride三个参数,建议在最边缘有填充的CTU时运行一下,看一下具体操作

    1. void IntraPrediction::predIntraAng( const ComponentID compId, PelBuf &piPred, const PredictionUnit &pu)
    2. {
    3. const ComponentID compID = MAP_CHROMA( compId );
    4. const ChannelType channelType = toChannelType( compID );
    5. const int iWidth = piPred.width;
    6. const int iHeight = piPred.height;
    7. CHECK(iWidth == 2, "Width of 2 is not supported");
    8. CHECK(PU::isMIP(pu, toChannelType(compId)), "We should not get here for MIP.");
    9. const uint32_t uiDirMode = isLuma( compId ) && pu.cu->bdpcmMode ? BDPCM_IDX : !isLuma(compId) && pu.cu->bdpcmModeChroma ? BDPCM_IDX : PU::getFinalIntraMode(pu, channelType);
    10. CHECK( floorLog2(iWidth) < 2 && pu.cs->pcv->noChroma2x2, "Size not allowed" );
    11. CHECK( floorLog2(iWidth) > 7, "Size not allowed" );
    12. const int srcStride = m_refBufferStride[compID];
    13. const int srcHStride = 2;
    14. const CPelBuf & srcBuf = CPelBuf(getPredictorPtr(compID), srcStride, srcHStride);
    15. const ClpRng& clpRng(pu.cu->cs->slice->clpRng(compID));//嵌位的范围
    16. /************ 根据模式进入对应的操作 ************/
    17. switch (uiDirMode)
    18. {
    19. case(PLANAR_IDX): xPredIntraPlanar(srcBuf, piPred); break;
    20. case(DC_IDX): xPredIntraDc(srcBuf, piPred, channelType, false); break;
    21. case(BDPCM_IDX): xPredIntraBDPCM(srcBuf, piPred, isLuma(compID) ? pu.cu->bdpcmMode : pu.cu->bdpcmModeChroma, clpRng); break;
    22. default: xPredIntraAng(srcBuf, piPred, channelType, clpRng); break;
    23. }

    uiDirMode:亮度BDPCM模式?BDPCM_IDX:色度BDPCM模式?BDPCM_IDX:getFinalIntraMode()

    getFinalIntraMode():如果是色度,进行预测模式转换:0~66.解析在最后

    srcStride :从m_refBufferStride[compID],根据分量的不同,从参考像素步长缓冲区取出值。所以应该是左或上的参考像素的长度,值为当前区域的(宽或高)*2+1.因为有一个最左上像素。以块为64X64为例,srcStride =129

    这里给出HEVC中的定义:

    \param srcStride the stride of the reconstructed sample array

    重建像素数组的步长,重建像素也被当成参考像素

    还可以参考​​​​​​H.266/VVC代码学习:帧内预测之角度预测函数(predIntraAng、xPredIntraAng)_涵小呆的博客-CSDN博客_vvc 帧内预测

    H.266/VVC代码学习20:角度预测入口 / 特殊模式的PDPC技术(predIntraAng)_海洋之心。的博客-CSDN博客

    srcHStride:这个2代表有两条参考像素,上边和左边。如果用了MRL可能会有变化,srcBuf存了上边和左边参考像素的信息

    srcBuf:存储了当前块预测要用的参考像素,第0行存的是上边的参考像素,第1行存的是左边的参考像素

    getPredictorPtr():ptr应该是pointer的意思。这个函数根据refFilterFlag的不同,返回滤波与未滤波的参考像素

    1. /************ PDDC模式(当前仅对planar.DC模式) ************/
    2. if (m_ipaParam.applyPDPC)
    3. {
    4. PelBuf dstBuf = piPred;
    5. const int scale = ((floorLog2(iWidth) - 2 + floorLog2(iHeight) - 2 + 2) >> 2);//缩放
    6. CHECK(scale < 0 || scale > 31, "PDPC: scale < 0 || scale > 31");
    7. if (uiDirMode == PLANAR_IDX || uiDirMode == DC_IDX)
    8. {
    9. for (int y = 0; y < iHeight; y++)
    10. {
    11. const int wT = 32 >> std::min(31, ((y << 1) >> scale));//距离大于32,则权重就为0
    12. const Pel left = srcBuf.at(y + 1, 1);
    13. for (int x = 0; x < iWidth; x++)
    14. {
    15. const int wL = 32 >> std::min(31, ((x << 1) >> scale));
    16. const Pel top = srcBuf.at(x + 1, 0);
    17. const Pel val = dstBuf.at(x, y);
    18. dstBuf.at(x, y) = val + ((wL * (left - val) + wT * (top - val) + 32) >> 6);
    19. }
    20. }
    21. }
    22. }
    23. }

     H.266/VVC技术学习:帧内预测之PDPC技术_涵小呆的博客-CSDN博客

     WT:当前测试像素与最上方参考像素的权重

    WL:当前测试像素与最左方参考像素的权重。举例,x,y(0,0)时,WL=32,但x,y(10,0)时,WL=1,因为当前预测像素离左边参考像素过远,所以权重下降

    注意:left,top读取的是srcBuf中的值,并不是整个块的dstBuf。所以这里也表示,srcBuf中第0行存的是上边的参考像素,第1行存的是左边的参考像素,有点像一个二维数组

    VAL:当前预测像素(x,y)的像素值,注意,这里读取的是dstBuf

    dstBuf.at(x, y):经过PDPC后的预测值(当前公式仅适用于planar,DC模式。其他的有变化)

    1.2 getFinalIntraMode()函数解析

    1. uint32_t PU::getFinalIntraMode( const PredictionUnit &pu, const ChannelType &chType )
    2. {
    3. //当前测试模式
    4. uint32_t uiIntraMode = pu.intraDir[chType];
    5. //当前预测模式为70且为色度,由函数决定
    6. if( uiIntraMode == DM_CHROMA_IDX && !isLuma( chType ) )
    7. {
    8. uiIntraMode = getCoLocatedIntraLumaMode(pu);
    9. }
    10. //若为422,色度,测试模式小于67.
    11. //422的一个表做转换得出测试模式序号
    12. if( pu.chromaFormat == CHROMA_422 && !isLuma( chType ) && uiIntraMode < NUM_LUMA_MODE ) // map directional, planar and dc
    13. {
    14. uiIntraMode = g_chroma422IntraAngleMappingTable[uiIntraMode];
    15. }
    16. return uiIntraMode;
    17. }

    H.266/VVC代码学习14:色度列表及DM模式代码(getFinalIntraMode、getIntraChromaCandModes)_海洋之心。的博客-CSDN博客

    DM_CHROMA_IDX:derived mode (DM),由亮度模式导出的色度模式号,DM_CHROMA_IDX =(NUM_LUMA_MODE + NUM_LMC_MODE)

    getCoLocatedLumaPU():之后写,这个是用在色度预测里的

    返回当前的预测模式序号

  • 相关阅读:
    木棍加工时间优化,代码精简
    myCobot pro 机械臂(6)逆向运动学
    【Rust 日报】2022-09-04 Rust基金会招募
    从零开始搭建仿抖音短视频APP--开发用户业务模块(4)
    Nginx如何做负载均衡
    yolo5 onnx2rknn 瑞芯微香橙派 rk3588
    【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.3p2(亲测无问题,建议收藏)
    【附源码】计算机毕业设计JAVA移动电商网站
    Trino Master OOM 排查记录
    Log4j 2再现新漏洞;缺乏资助不是开源软件安全的唯一问题;微软公布 Entity Framework 7.0 计划 | 开源日报
  • 原文地址:https://blog.csdn.net/dfhg54/article/details/125552233
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号