openh264 编码器源码分析:AnalyzePictureComplexity 函数

news2025/3/13 19:15:45

介绍

  1. 文件位置:
    • openh264/codec/processing/src/complexityanalysis/ComplexityAnalysis.cpp
  2. 功能:
    • 作为CWelsPreProcess类中一个方法,用来分析当前图像与参考图像之间的复杂度关系,以便编码策略。
  3. 原型:
void CWelsPreProcess::AnalyzePictureComplexity (sWelsEncCtx* pCtx, SPicture* pCurPicture, SPicture* pRefPicture,
    const int32_t kiDependencyId, const bool bCalculateBGD)
  1. 参数:
    • sWelsEncCtx* pCtx:指向sWelsEncCtx结构的指针,这通常是一个上下文结构,包含了编码过程中所需的状态信息。
    • SPicture* pCurPicture:指向当前待编码图片的指针。
    • SPicture* pRefPicture:指向参考图片的指针,用于与当前图片进行比较。
    • const int32_t kiDependencyId:一个整数常量,表示依赖层的ID,可能用于确定当前图片所属的编码层。
    • const bool bCalculateBGD:一个布尔值常量,指示是否需要计算背景差分(Background Difference)。

函数关系图

在这里插入图片描述

原理

桌面图像

  1. process 函数
  • 如果是IDR帧或参考图像为空,则调用GomComplexityAnalysisIntra函数执行内部复杂度分析;
  • 如果滚动标志为假或滚动偏移量在X和Y方向上都为0,则调用GomComplexityAnalysisInter函数执行无滚动的交互复杂度分析;
  • 调用GomComplexityAnalysisInter函数执行有滚动的交互复杂度分析;
  1. GomComplexityAnalysisIntra函数
  • 变量初始化;
  • 嵌套循环分析每个宏块;
    - 检查是否有可用的垂直或水平参考宏块,如果有,则使用相应的预测函数m_pIntraFunc和SAD计算函数m_pSadFunc来计算SAD值iBlockSadH、iBlockSadV;
    • 如果垂直或水平参考宏块存在,则累加中iBlockSadH、iBlockSadV的最小值到iGomSad中;
      • 如果当前宏块是一行中的最后一个宏块,或者已经到达了宏块组的底部,将iGomSad的值存储到类成员变量m_ComplexityAnalysisParam.pGomComplexity中,并更新帧复杂度m_ComplexityAnalysisParam.iFrameComplexity;
      • 更新索引iIdx,将变量iGomSad置 0,为下一个宏块组的复杂度值做准备;
      • 在处理完一行的所有宏块后,更新指针pPtrY到下一行的开始位置;
  • 更新类成员变量m_ComplexityAnalysisParam.iGomNumInFrame,表示帧中宏块组的数量;
  1. GomComplexityAnalysisInter函数
  • 变量初始化;
  • 嵌套 for 循环分析每个宏块;
    • 首先调用m_pSadFunc函数计算当前块的SAD值iInterSad;
    • 如果bScrollFlag为真,并且当前块的SAD值不为0,且滚动偏移量在有效范围内,则调用m_pSadFunc函数计算考虑滚动后的SAD值iScrollSad,并取两者的较小值作为当前块的SAD值iInterSad;
    • 如果当前宏块不是第一行或第一列的宏块,使用类成员预测函数m_pIntraFuncm_pSadFunc计算水平和垂直预测的SAD值iBlockSadH、iBlockSadV;
    • 选择iBlockSadH、iBlockSadV、iInterSad中最小值最为总体 SAD 值iGomSad;
    • 果当前宏块是一行中的最后一个宏块,或者已经到达了宏块组的底部,将iGomSad的值存储到类成员变量m_ComplexityAnalysisParam.pGomComplexity中,并更新帧复杂度m_ComplexityAnalysisParam.iFrameComplexity;
    • 更新索引iIdx,将变量iGomSad置 0,为下一个宏块组的复杂度值做准备;
    • 在处理完一行的所有宏块后,更新指针pPtrY到下一行的开始位置;
  • 更新类成员变量m_ComplexityAnalysisParam.iGomNumInFrame,表示帧中宏块组的数量;
  1. m_pSadFunc函数
  • 指向WelsSampleSad16x16_c函数
  1. m_pIntraFunc[0]函数
  • 指向WelsI16x16LumaPredV_c函数
  1. m_pIntraFunc[1]函数
  • 指向WelsI16x16LumaPredH_c函数

摄像镜头图像

  1. process 函数
  • iComplexityAnalysisMode等于FRAME_SAD时,调用AnalyzeFrameComplexityViaSad函数分析图像复杂度;
  • iComplexityAnalysisMode等于GOM_SAD时,调用AnalyzeGomComplexityViaSad函数分析图像复杂度;
  • iComplexityAnalysisMode等于GOM_VAR时,调用AnalyzeGomComplexityViaVar函数分析图像复杂度;
  1. AnalyzeFrameComplexityViaSad函数
  • 将pCalcResult赋值给pVaaCalcResults;
  • 将pVaaCalcResults中的iFrameSad赋值给m_sComplexityAnalysisParam.iFrameComplexity,作为当前帧的复杂度;
  • 如果iCalcBgd,即有背景检测,则调用GetFrameSadExcludeBackground函数计算复杂度,赋值给m_sComplexityAnalysisParam.iFrameComplexity,作为当前帧的复杂度;
  • GetFrameSadExcludeBackground函数:这个函数的目的是计算帧的SAD值,但在计算时排除了背景区域的宏块,这有助于更准确地评估帧中实际的前景复杂度。
    • 初始化变量,计算宏块组iMbNumInGom和宏块数iGomMbNum;
    • m_sComplexityAnalysisParam.pCalcResult赋值给pVaaCalcResults;
    • 双层嵌套 for 循环遍历所有宏块,
      • 如果宏块不是背景宏块,增加对应宏块组的前景宏块数量,并累加该宏块的四个8x8块的SAD值到uiFrameSad;
    • 返回 uiFrameSad值;
  1. AnalyzeGomComplexityViaSad函数
  • 初始化变量,计算宏块组iMbNumInGom和宏块数iGomMbNum;
  • 调用InitGomSadFunc函数初始化SAD计算函数(m_pfGomSad),并为每个GOB分配一个SAD变量(uiGomSad)
  • 嵌套双层循环处理每个宏块,
    • 对当前GOB的每一行进行循环,计算SAD;
    • 调用m_pfGomSad函数来累加当前宏块的SAD值uiGomSad;
    • 将计算得到的SAD值uiGomSad存储到pGomComplexity数组中;
    • 更新整个帧的SAD值(uiFrameSad);
  • 将帧的SAD值uiFrameSad存储在m_sComplexityAnalysisParam结构体中。
  1. AnalyzeGomComplexityViaVar函数
  • 初始化变量,计算宏块组iMbNumInGom和宏块数iGomMbNum;
  • 初始化样本和平方和变量(uiSampleSum和uiSquareSum);
  • 双层嵌套循环遍历每一个宏块;
    • 对当前GOB的每一行进行循环,累加样本和uiSampleSum和平方和uiSquareSum;
    • 计算宏块组方差,将结果存到pGomComplexity中;
    • 累加pGomComplexity到帧的 SAD 值uiFrameSad;
  • 将帧的SAD值uiFrameSad存储在m_sComplexityAnalysisParam结构体中。

源码

  • 略。

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

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

相关文章

为什么要学习Flink系统管理及优化课程?

Flink系统是一种流式处理框架,能够高效地处理大规模数据流。然而,要确保Flink系统的正常运行,就需要进行系统管理和优化。系统管理是指对Flink集群的监控、调度和维护,而系统优化则是指通过调整参数和优化算法,提高Fli…

Class-Aware Self-Distillation for Remote SensingImage Scene Classification

这篇文章提出了一种新的蒸馏方式,由于遥感场景图像具有类间相似性和类内多样性的特点,这篇文章试图解决这个问题。通过三个共享权重的分支,同时输入三张图片,其中两张类别相同的图片,一张类别不同但地物特征相似的图片…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中,变量的作用域(Scope)定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言(简称Go)提供了几种不同的作用域类型,使得开发者可…

腾讯云SSL证书获取及Nginx配置教程

前言 很多人应该都有属于自己网站,刚开始基本是只能用http进行访问,无法使用https安全访问,但是随着网络安全意识的不断提高,越来越多的网站开始使用HTTPS协议来保护用户的数据安全,SSL证书是实现HTTPS协议的关键组件,本文将讲解如何在腾讯云上获取SSL证书,并配置到Ngi…

为什么要做数字化转型?数字化转型对企业的意义?

本人研究企业数字化转型9年多,为企业软件选型、数字化提供咨询服务!目前重点研究低代码数字化转型玩法,力争为各行各业探索出一条最具性价比的数字化方式。 【织信低代码】数字化系统一体化的定制开发工具。 什么是数字化转型,为什…

【教程】从0开始搭建大语言模型:实现Attention机制

从0开始搭建大语言模型 从0开始搭建大语言模型:实现Attention机制建模长序列存在的问题使用attention机制获得数据间的依赖Self-attention介绍带有可训练权重的self-attention1.生成Q,K,V变量2.计算attention score3.attention weight的获得4…

《网络反不正当竞争规定》9月1日实施,这两类欺诈被重点关注

近日,国家市场监督管理总局公布《网络反不正当竞争暂行规定》 ,自2024年9月1日起施行。《网络反不正当竞争暂行规定》是为预防和制止网络不正当竞争行为,维护公平竞争的市场秩序,鼓励创新,保护经营者和消费者的合法权益…

【Unity】Inspector排版扩展学习初探

一、简单的Unity Inspector扩展 [SerializeField] [SerializeField] 作用:让private属性也可以显示在面板上 [Range(x , y)] [Range(x , y)] 作用: 让参数从输入框变为范围滑条 [Header(" 标题 ")] [Header(" 标题 ")]作用&am…

基于YOLOv8的行人检测项目的实现

YOLOv8简介 YOLOv8是YOLO系列的最新版本,在继承YOLOv7的基础上进行了进一步改进。YOLOv8在网络结构、损失函数和训练策略上都有显著的提升,使其在目标检测任务中表现更加出色。各位只需要记住,做目标检测,无脑选V8就完了。YOLOv8…

游戏本地化:如何选择本地化程序

游戏开发商可能很难确定游戏应该翻译成哪些语言,如何选择本地化程序,以及在为新市场本地化游戏时应该考虑哪些细微差别。Logrus IT游戏本地化客户经理Valentina Chernova在接受RMAA Games采访时回答了这些问题和其他问题。 现在哪些本地化语言最受外国开…

Faiss assertion ‘err == cudaSuccess‘ failed in void faiss::gpu:runL2Norm()

Faiss assertion ‘err cudaSuccess’ failed in void faiss::gpu:runL2Norm(). details:CUA error 209 no kernel image is available for execution on the device 本人使用的ubuntu 22.04系统,conda的环境。使用pip安装faiss-gpu出现的问题。 pip install fai…

SOLIDWORKS学生支持 可访问各种产品资源

你是不是一个热爱设计、追求创新的学生?你是不是在寻找一款能够帮助你实现设计梦想的工具?那么,SolidWorks学生支持是你的首要选择! SOLIDWORKS作为三维CAD设计软件,一直致力于为广大学生提供全方面的支持。无论你是初…

在windows下安装docker-desktop

Docker Desktop是一个在Windows和macOS上运行的应用程序,能够让开发者使用Docker容器技术。它包括了Docker Engine、Docker CLI客户端、Docker Compose、Docker Content Trust、Kubernetes和Credential Helper等。下面是一篇详细的指南,帮助你在Windows上…

【Python/Pytorch - 网络模型】-- 手把手搭建3D U-Net模型

文章目录 文章目录 00 写在前面01 基于Pytorch版本的3D UNet代码02 论文下载 00 写在前面 通过3D U-Net代码学习,可以学习基于Pytorch的网络结构模块化编程,对于后续学习其他更复杂3D网络模型,有很大的帮助作用。 在01中,可以根…

C#——方法函数详情

方法(函数) C#是面向对象的,所以C#中的方法也是相对于对象来说的,是指某个对象的行为,比如,有一个动物的类,兔子是这个动物类里的一个对象,那么跳这个行为就是兔子这个对象的方法了.其实也就是C中的函数(C是面向过程的,叫函数). 方法: 就是把一系列相关的代码组织到一块 用于…

优化Elasticsearch搜索性能:查询调优与索引设计

在构建基于 Elasticsearch 的搜索解决方案时,性能优化是关键。本文将深入探讨如何通过查询调优和索引设计来优化 Elasticsearch 的搜索性能,从而提高用户体验和系统效率。 查询调优 优化查询是提高 Elasticsearch 性能的重要方法。以下是一些有效的查询…

运筹学基础与应用(简洁版总复习)

第一章 线性规划及单纯形法 图解法 单纯形法 大m法 看案例(综合题) 化标准形式 目标函数的转换 min z变为max z 变量的变换 变量取值无约束 约束方程的转换 ≤:加一个松弛变量 ≥:减一个剩余变量 变量符号≤0的变换 保持变量≥…

免密支付存隐患 谨防“便捷”变“踩坑”

免密支付存隐患 谨防“便捷”变“踩坑” 当前,我国网购用户已超9亿人,越来越便捷的支付手段让网络消费体验更加“丝滑”。但免密支付、自动续费等方式在简化付款流程的同时,也成为一些平台“套路”消费者的手段,暗藏诱导消费陷阱。…

L1306——串口的配置

这里需要介绍一下串口的时钟来源,串口的时钟来源一共有三个,分别是: BUSCLK:由内部高频振荡器提供的CPU时钟,通常芯片出厂时设置为了32MHz。 MFCLK:只能使用固定的4MHz时钟(参考用户手册132页)。开启的话…

工程英语【计算机英语】

文章目录 第一专题 Vocabulary, Terms 和 Jargons 区别1.1 知识1.1.1 Vocabulary——词汇1.1.2 Terms——术语1.1.3 Jargons——行话1.1.4 Buzzword——流行语 1.2 阅读文章【5.2 Type of Connection】1.2.1 翻译1.2.2 回答问题 第二专题 Abbreviations2.1 知识2.1.1 Abbreviat…