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.mzph.cn/web/26385.shtml

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

相关文章

波拉西亚战记加速器 台服波拉西亚战记免费加速器

波拉西亚战记是一款新上线的MMORPG游戏&#xff0c;游戏内我们有多个角色职业可以选择&#xff0c;可以体验不同的战斗流派玩法&#xff0c;开放式的地图设计&#xff0c;玩家可以自由的进行探索冒险&#xff0c;寻找各种物资。各种随机事件可以触发&#xff0c;让玩家的冒险过…

Python学习从0开始——Kaggle时间序列002

Python学习从0开始——Kaggle时间序列002 一、作为特征的时间序列1.串行依赖周期 2.滞后序列和滞后图滞后图选择滞后 3.示例 二、混合模型1.介绍2.组件和残差3.残差混合预测4.设计混合模型5.使用 三、使用机器学习进行预测1.定义预测任务2.为预测准备数据3.多步骤预测策略3.1 M…

sql:group by和聚合函数的使用

提示&#xff1a;本文只讲解group by的简单使用和group by和聚合函数组合使用 文章目录 常用聚合函数group by明天继续更新 常用聚合函数 1.MAX&#xff1a;返回某列的最大值 2.MIN(column) 返回某列的最高值 3.COUNT(column) 返回某列的总行数 4.COUNT(*) 返回表的总行数 5.S…

低代码开发MES系统,一周实现数字化

随着工业4.0和智能制造的兴起&#xff0c;企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统&#xff08;MES&#xff09;作为连接计划层与控制层的关键信息系统&#xff0c;在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而&#xff0c;传统…

计算机毕业设计Python+Django农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop Hive

课题研究的意义&#xff0c;国内外研究现状、水平和发展趋势 研究意义21世纪是一个信息爆炸的时代&#xff0c;人们在日常生活中可接触到的信息量非常之巨大。推荐系统逐步发展&#xff0c;其中又以个性化推荐系统最为瞩目。个性化推荐系统的核心在于个性化推荐算法&#xff0c…

[C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法

【训练源码】 https://github.com/albrateanu/LYT-Net 【参考源码】 https://github.com/hpc203/Low-Light-Image-Enhancement-onnxrun 【算法介绍】 一、研究动机 1.研究目标 研究的目标是提出一种轻量级的基于YUV Transformer 的网络&#xff08;LYT-Net&#xff09;&…

你知道古代青铜器的原色是什么吗?

在中国悠久的历史中&#xff0c;青铜器作为中华文明的瑰宝&#xff0c;一直以其独特的艺术魅力和深厚的文化内涵吸引着世人的目光。然而&#xff0c;对于大多数人来说&#xff0c;青铜器的形象往往与电视剧中的描绘有所出入。那些在剧中常见的青绿色青铜器&#xff0c;让许多观…

docker-compose启动oracle11、并使用navicat进行连接

一、docker-compose.yml version: 3.9 services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11grestart: alwaysprivileged: truecontainer_name: oracle11gvolumes:- ./data:/u01/app/oracleports:- 1521:1521network_mode: "host"logging:d…

三篇卫星切换的论文

目录 一、Energy-Aware Satellite Handover based on Deep Reinforcement Learning 1、题目翻译 2、来源 3、内容 二、A Reliable Handover Strategy with Second Satellite Selection in LEO Satellite Networks 1、题目翻译 2、来源 3、内容 三、User Grouping-Based…

nginx ws长连接配置

nginx ws长连接配置 http根节点下配上 map $http_upgrade $connection_upgrade {default upgrade; close;}如下&#xff1a; server服务节点下&#xff0c;后端接口的代理配置 proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connec…

vue2文件下载和合计表格

vue2文件数据不多可以直接下载不需要后端的时候 1.首先&#xff0c;确保你已经安装了 docx 和 file-saver 库 npm install file-saver npm install docx file-saver2.全部代码如下 <template><a-modaltitle"详情"width"80%"v-model"visi…

python的a[:2]

数据准备 import numpy as np X np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]]) print(X)形成矩阵 print (“X[: 2]:”, X[: 2]) ### :表示索引 0至1行&#xff1b;

MySQL日常问题-行列互换

问题 行列互换 场景1 行转换列 1、表结构和数据 /*Navicat Premium Data TransferSource Server : 本地Source Server Type : MySQLSource Server Version : 80027Source Host : localhost:3306Source Schema : schoolTarget Server Type :…

windows 环境下使用git命令导出差异化文件及目录

一、找出差异化的版本&#xff08;再此使用idea的show history&#xff09; 找到两个提交记录的id 分别为&#xff1a; 二、使用git bash执行命令&#xff08;主要使用 tar命令压缩文件&#xff09; 输出结果&#xff1a;

“人事助理转产品经理”历险记

​好久没写就业喜报了 去年太忙&#xff0c;年后了&#xff0c;必须给大家把同学们就业的情况梳理一下分享出来。希望对大家有所帮助。 同学档案 原岗位&#xff1a;HR 地点&#xff1a;西安 工作年限&#xff1a;2年 转岗级别&#xff1a;中级产品经理 转岗工资&#xff1…

Linux时间子系统2: clock_gettime的VDSO机制分析

在之前分析clock_gettime的文章中接触到了VDSO&#xff0c;本篇文章是对VDSO的学习总结&#xff0c;借鉴了很多前人的经验。 1. 什么是VDSO vDSO:virtual DSO(Dynamic Shared Object)&#xff0c;虚拟动态共享库&#xff0c;内核向用户态提供了一个虚拟的动态共享库。在 Linux …

Vue.js结合ASP.NET Core构建用户登录与权限验证系统

1. 环境准备2. 创建项目3. Vue配置步骤一: 安装包步骤二: 配置文件步骤三: 页面文件 4. 后台配置 在本教程中&#xff0c;我将利用Visual Studio 2022的强大集成开发环境&#xff0c;结合Vue.js前端框架和ASP.NET Core后端框架&#xff0c;从头开始创建一个具备用户登录与权限验…

恭喜!X医生斩获英国伦敦大学学院访问学者邀请函

伦敦大学学院&#xff08;University College London&#xff0c;简称&#xff1a;UCL&#xff09;&#xff0c;1826年创立于英国伦敦&#xff0c;是一所公立研究型大学。伦敦大学联盟的创校学院、罗素大学集团和欧洲研究型大学联盟创始成员&#xff0c;也是金三角名校和G5之一…

电商开发者必读:微店商品详情API接口全解析

微店作为一个流行的电商平台&#xff0c;提供了丰富的API接口供开发者使用。详细介绍商品详情API接口的使用方法&#xff0c;帮助开发者快速获取商品信息&#xff0c;实现商品信息的自动化展示和管理。 1. 接口简介 微店商品详情API接口允许开发者通过商品ID获取商品的详细信…

银行业信息技术外包(ITO)深度解析:现状、挑战、业务分类与协同策略

一、引言 最近有朋友在咨询关于银行业信息技术外包&#xff08;ITO&#xff09;这块业务&#xff0c;同时也在网上看到了关于银行业信息技术外包&#xff08;ITO&#xff09;的相关信息&#xff0c;今天正好有时间&#xff0c;通过采集的相关信息结合自己的相关工作接触到的相关…