openh264 帧内预测编码过程源码分析

函数关系

在这里插入图片描述

  1. 说明:
    可以看到完成帧内预测编码的核心函数就是 WelsMdI16x16WelsMdI4x4WelsMdI4x4Fast WelsMdIntraChroma 四个函数。

原理

WelsMdI16x16函数

  1. 功能:针对16x16像素块的帧内模式决策
  2. 过程
  • 局部变量申明;
  • 根据宏块的领域宏块情况计算得出iOffset;
  • iAvailCount 和 kpAvailMode 用于获取当前宏块可用的帧内预测模式数量和预测模式列表;
  • 如果iAvailCount大于 3,且提供 pfIntra16x16Combined3函数;
    • 则调用pfIntra16x16Combined3函数来获取最佳模式iBestMode和成本iBestCost;
    • 从kpAvailMode[3]中确定当前模式iCurMode,表明考虑 第四种模式;
    • 调用pfGetLumaI16x16Pred函数,根据当前模式编号 iCurMode 生成预测块,并将结果存储在 pDst 中;
    • pfMdCost[BLOCK_16x16] 函数计算当前预测块 pDst 和编码图像 pEnc 之间的成本iCurCost;
    • iCurCost小于iBestCost,
      • 将iCurMode和iCurCost确定最佳模式iBestMode和成本iBestCost;
    • 否则,
      • 则调用pfGetLumaI16x16Pred函数使用最佳模式iBestMode重新生成预测块,并存储在 pDst 中;
    • iIdx 被设置为1,最佳成本 iBestCost 被加上量化参数 iLambda,作为总开销;
  • 否则
    • iBestMode 被初始化为第一个可用模式,即 kpAvailMode[0];
    • for 循环遍历所有可用的模式iAvailCount;
      • 在每次循环迭代中,iCurMode 被设置为当前考虑的模式编号iCurMode;
      • 调用 pfGetLumaI16x16Pred[iCurMode] 函数,根据当前模式编号 iCurMode 生成预测块;
      • 使用 pfMdCost[BLOCK_16x16] 函数计算当前预测块 pDst 和编码图像 pEnc 之间的成本iCurCost;
      • iCurCost 加上量化参数 iLambda 与当前模式编号的编码长度(使用 BsSizeUE 函数和 g_kiMapModeI16x16 数组计算)的乘积;
      • 如果 iCurCost小于 iBestCost;
        • 更新iBestMode、iBestCost、iIdx、pDst;iIdx 通过异或操作 ^ 0x01 来切换,这在每次找到更好的模式时都会发生;
        • iIdx用来指向预测块pPredI16x16;
    • 更新缓存SMbCache中pMemPredChroma、pMemPredLuma、uiLumaI16x16Mode;
    • 返回 最佳代价iBestCost。
  1. 原理图
    在这里插入图片描述
  2. 说明
  • pfGetLumaI16x16Pred函数指针根据不同的模式指向不同的函数,具体在WelsInitIntraPredFuncs函数中定义。
  • pfMdCost函数指针根据 fastmode 模式指向pfSampleSadpfSampleSatd函数指针,而且根据不同预测模式指向不同的函数实现,具体在WelsInitSampleSadFunc函数中定义。
  1. 源码:
int32_t WelsMdI16x16 (SWelsFuncPtrList* pFunc, SDqLayer* pCurDqLayer, SMbCache* pMbCache, int32_t iLambda) {const int8_t*  kpAvailMode;int32_t iAvailCount;int32_t iIdx = 0;uint8_t* pPredI16x16[2] = {pMbCache->pMemPredMb, pMbCache->pMemPredMb + 256};uint8_t* pDst       = pPredI16x16[0];uint8_t* pDec       = pMbCache->SPicData.pCsMb[0];uint8_t* pEnc       = pMbCache->SPicData.pEncMb[0];int32_t iLineSizeDec = pCurDqLayer->iCsStride[0];int32_t iLineSizeEnc = pCurDqLayer->iEncStride[0];int32_t i, iCurCost, iCurMode, iBestMode, iBestCost = INT_MAX;int32_t iOffset = pMbCache->uiNeighborIntra & 0x07;iAvailCount = g_kiIntra16AvaliMode[iOffset][4];kpAvailMode = g_kiIntra16AvaliMode[iOffset];if (iAvailCount > 3 && pFunc->sSampleDealingFuncs.pfIntra16x16Combined3) {iBestCost = pFunc->sSampleDealingFuncs.pfIntra16x16Combined3 (pDec, iLineSizeDec, pEnc, iLineSizeEnc, &iBestMode,iLambda, pDst/*temp*/);iCurMode = kpAvailMode[3];pFunc->pfGetLumaI16x16Pred[iCurMode] (pDst, pDec, iLineSizeDec);iCurCost = pFunc->sSampleDealingFuncs.pfMdCost[BLOCK_16x16] (pDst, 16, pEnc, iLineSizeEnc) + iLambda * 4 ;if (iCurCost < iBestCost) {iBestMode = iCurMode;iBestCost = iCurCost;} else {pFunc->pfGetLumaI16x16Pred[iBestMode] (pDst, pDec, iLineSizeDec);}iIdx = 1;iBestCost += iLambda;} else {iBestMode = kpAvailMode[0];for (i = 0; i < iAvailCount; ++ i) {iCurMode = kpAvailMode[i];assert (iCurMode >= 0 && iCurMode < 7);pFunc->pfGetLumaI16x16Pred[iCurMode] (pDst, pDec, iLineSizeDec);iCurCost = pFunc->sSampleDealingFuncs.pfMdCost[BLOCK_16x16] (pDst, 16, pEnc, iLineSizeEnc);iCurCost += iLambda * (BsSizeUE (g_kiMapModeI16x16[iCurMode]));if (iCurCost < iBestCost) {iBestMode = iCurMode;iBestCost = iCurCost;iIdx = iIdx ^ 0x01;pDst = pPredI16x16[iIdx];}}}pMbCache->pMemPredChroma = pPredI16x16[iIdx];pMbCache->pMemPredLuma = pPredI16x16[iIdx ^ 0x01];pMbCache->uiLumaI16x16Mode  = iBestMode;return iBestCost;
}

WelsMdI4x4函数

  1. 功能:针对4x4像素块的帧内模式决策
  2. 过程:类似 I16x16,只不过预测模式更多,有 16 种模式;
  3. 源码:略

WelsMdI4x4Fast函数

  1. 功能:针对4x4像素块的帧内模式决策的快速实现逻辑
  2. 过程:类似 I16x16,只不过预测模式更多,有 16 中模式,但采用了快速算法;
  3. 源码:略

WelsMdIntraChroma函数

  1. 功能:针对色度像素块的帧内模式决策
  2. 过程:类似 I16x16决策过程,色度的预测模式跟 I16x16 块一样,有 7 种模式;
  3. 源码:略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349175.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记&#xff0c;有一些简单的证明和原理&#xff0c;是根据李宏毅老师的课程整理的&#xff0c;下面有链接。本篇文章主要就是梳理基础的概念和训练过程&#xff0c;如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…

Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

项目启动|鑫泓佳电子牵手盘古信息,迈向数字化转型新征程

随着科技的迅猛发展和数智化浪潮的推进&#xff0c;电子行业正经历着一场前所未有的深刻变革。在这场变革中&#xff0c;深圳市鑫泓佳电子有限公司&#xff08;以下简称“鑫泓佳电子”&#xff09;凭借其敏锐的市场洞察力和前瞻性的战略规划&#xff0c;一直保持在行业的前列。…

46-4 等级保护 - 网络安全等级保护概述

一、网络安全等级保护概述 原文:没有网络安全就没有国家安全 二、网络安全法 - 安全立法 中华人民共和国主席令 第五十三号 《中华人民共和国网络安全法》已于2016年11月7日由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过,并自2017年6月1日起正式…

MES系统助力制造业数字化转型

一、MES系统的定义和功能 MES&#xff08;Manufacturing Execution System&#xff09;即制造执行系统&#xff0c;是一种可层级化管理生产活动的软件系统。它可以实现对生产过程全面的监控、调度、控制和优化&#xff0c;提高生产的效率、质量和安全性。MES系统具有以下几个主…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上&#xff0c;Stable Diffusion 3&#xff08;SD3&#xff09;的开源无疑是一场技术革新的盛宴。就在3月份&#xff0c;我撰写了一篇博文&#xff0c;深入探讨了SD3的技术报告内容与介绍&#xff0c;文章发表在CSDN博客上&#xff0c;https:…

汽车EDI:BRP EDI项目案例

项目背景 BRP Inc.使用EDI&#xff08;电子数据交换&#xff09;来处理其与供应商、客户和合作伙伴之间的业务交流。通过EDI&#xff0c;BRP可以在各种业务流程中自动化数据交换&#xff0c;例如采购订单、发货通知、发票、付款和库存信息等&#xff0c;从而提高操作效率、降低…

【RAG】RAG性能提升之路-RAPTOR:一种构建递归文档树的增强检索方法

背景 检索增强型语言模型&#xff08;RALMs&#xff09;在处理需要不断更新的知识和大量信息的文档时确实展现出了优势。然而&#xff0c;现有的方法在处理长篇文档时存在局限性&#xff0c;主要是因为它们通常只能检索较短的文本片段&#xff0c;这限制了对整体文档上下文的全…

云原生应用开发培训,开启云计算时代的新征程

在云计算时代&#xff0c;云原生应用开发技术已经成为IT领域的热门话题。如果您想要转型至云原生领域&#xff0c;我们的云原生应用开发培训将帮助您开启新征程。 我们的课程内容涵盖了云原生技术的基础概念、容器技术、微服务架构、持续集成与持续发布&#xff08;CI/CD&#…

22 CRT工具安装流程

22 CRT工具安装流程 SecureCRT 9.5 说明书 SecureCRT 9.5是一款由VanDyke Software开发的终端仿真程序。它为Windows、Mac和Linux操作系统提供了强大的SSH&#xff08;Secure Shell&#xff09;客户端功能。SecureCRT 9.5提供了对Telnet、RLogin、Serial和X.509等协议的支持&…

域内攻击 ----> DCSync

其实严格意义上来说DCSync这个技术&#xff0c;并不是一种横向得技术&#xff0c;而是更偏向于权限维持吧&#xff01; 但是其实也是可以用来横向&#xff08;配合NTLM Realy&#xff09;&#xff0c;如果不牵强说得话&#xff01; 那么下面&#xff0c;我们就来看看这个DCSyn…

SAP Web IDE 安装使用

For training SAP Web IDE 是基于 Eclipse 内核的在线开发 IDE&#xff0c;可以使用在线的试用版本&#xff0c;但服务器在德国&#xff0c;访问的网速特别慢。也可以使用 Personal Edition&#xff0c;在本机启动和编写代码。 打开官网下载WEBIDE工具包&#xff0c;包含 Tri…

CP AUTOSAR标准中文文档链接索引(更新中)

AUTOSAR标准的核心组件包括通信、诊断、安全等&#xff0c;这些组件通过模块化结构进行组织。系统被划分为多个模块&#xff0c;每个模块负责特定的功能。模块之间通过接口进行通信&#xff0c;接口定义了模块之间的交互规则。AUTOSAR标准支持模块的配置&#xff0c;可以根据不…

html实现粘贴excel数据,在页面表格中复制

录入数据时&#xff0c;有时候需要把excel中的数据一条条粘贴到页面中&#xff0c;当数据量过多时&#xff0c;这种操作很令人崩溃。本篇文章实现了从excel复制好多行数据后,可在页面粘贴的功能 具体实现代码 <!DOCTYPE html> <html lang"en"> <head…

KEIL5.39 5.40 fromelf 不能生成HEX bug

使用AC6 编译,只要勾选了生成HEX。 结果报如下错误 暂时没有好的解决办法 1.替换法 2.在编译完后用命令生成HEX

怎么提高音频的播放速度?提高音频播放速度的四种方法

怎么提高音频的播放速度&#xff1f;提高音频的播放速度是在处理音频文件时经常需要面对的问题。音频播放速度的调整可以带来多种应用场景和效果&#xff0c;例如加快语音记录的回放速度以节省时间、提高听力理解和语速训练的效果等。然而&#xff0c;对于不同的音频播放工具和…

wms海外仓系统什么价格?中小海外仓怎么选到高性价比wms系统

随着海外仓业务复杂度的逐渐提升&#xff0c;现在中小海外仓对wms海外仓系统的需求也越来越强烈。但是对于预算有限的中小海外仓企业来说&#xff0c;怎么才能选到性价比比较高的wms海外仓系统呢&#xff1f; 今天我们就来聊一下这个问题&#xff0c;希望对有类似需求的海外仓…

ZnO电阻片在低电场区域的泄漏电流及其电阻的负温度系数

在低电场区域,流过ZnO非线性电阻的泄漏电流小于1mA.泄漏电流不仅与施加的电压幅值有关,而且与温度高低有关。图2.6表示温度对泄漏电流的影响,温度越高,电子在电场作用下定向的运动就越激烈,导致泄漏电流增大。因此温度升高将导致电阳值下降,即ZnO 电阻呈现负温度特性。 一般以…

二开版视频CMS完整运营源码/新版漂亮APP手机模板/集成员分销功能等

一个二开的影视CMS&#xff0c;直接上传源码至网站根目录&#xff0c;访问网站域名即可安装。 测试环境&#xff1a;Nginx 1.20.1—MySQL 5.6.50–PHP-7.2&#xff08;安装拓展/fileinfo&#xff09; 上传源码&#xff0c;访问域名直接安装 后台地址&#xff1a;域名/MDadmi…

DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…