依赖检查

config中看到最多的是:

...
nvenc_deps="ffnvcodec"
nvenc_deps_any="libdl LoadLibrary"
nvenc_encoder_deps="nvenc"
...
h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
h264_cuvid_decoder_deps="cuvid"
h264_cuvid_decoder_select="h264_mp4toannexb_bsf"
h264_mediacodec_decoder_deps="mediacodec"
h264_mediacodec_decoder_select="h264_mp4toannexb_bsf h264_parser"
h264_mf_encoder_deps="mediafoundation"
h264_mmal_decoder_deps="mmal"
h264_nvenc_encoder_deps="nvenc"
h264_nvenc_encoder_select="atsc_a53"
...

这个主要用来做依赖检查,比如上面的nvenc_deps="ffnvcodec"表示:
nvenc这个模块依赖ffnvcodec,其余以此类推。

依赖类型:

_deps:必须全部满足的依赖(如 flv_decoder 依赖 h264_decoder)。
_deps_any:只需满足任意一个的依赖。
_conflict:不能同时存在的冲突依赖。
_select:强制启用的依赖(如 flv_decoder 强制启用 h264_parser)。
_suggest:建议启用的可选依赖。
_if 和 _if_any:条件启用的依赖。

依赖检查函数

核心检查在下边:

  • 首先我们看到list列表是从相关的allxxx.c文件中获取到的,然后添加到对应的list中
FILTER_LIST=$(find_filters_extern libavfilter/allfilters.c)
OUTDEV_LIST=$(find_things_extern muxer AVOutputFormat libavdevice/alldevices.c outdev)
INDEV_LIST=$(find_things_extern demuxer AVInputFormat libavdevice/alldevices.c indev)
MUXER_LIST=$(find_things_extern muxer AVOutputFormat libavformat/allformats.c)
DEMUXER_LIST=$(find_things_extern demuxer AVInputFormat libavformat/allformats.c)
ENCODER_LIST=$(find_things_extern encoder AVCodec libavcodec/allcodecs.c)
DECODER_LIST=$(find_things_extern decoder AVCodec libavcodec/allcodecs.c)
CODEC_LIST="$ENCODER_LIST$DECODER_LIST
"
PARSER_LIST=$(find_things_extern parser AVCodecParser libavcodec/parsers.c)
BSF_LIST=$(find_things_extern bsf AVBitStreamFilter libavcodec/bitstream_filters.c)
HWACCEL_LIST=$(find_things_extern hwaccel AVHWAccel libavcodec/hwaccels.h)
PROTOCOL_LIST=$(find_things_extern protocol URLProtocol libavformat/protocols.c)
...
AVCODEC_COMPONENTS_LIST="$BSF_LIST$DECODER_LIST$ENCODER_LIST$HWACCEL_LIST$PARSER_LIST
"
...check_deps $CONFIG_LIST       \$CONFIG_EXTRA      \$HAVE_LIST         \$ALL_COMPONENTS    \
# The cfg loop is very hot (several thousands iterations), and in bash also
# potentialy quite slow. Try to abort the iterations early, preferably without
# calling functions. 70%+ of the time cfg is already done or without deps.
check_deps(){for cfg; do# 避免重复检查或检测循环依赖eval [ x\$${cfg}_checking = xdone ] && continueeval [ x\$${cfg}_checking = xinprogress ] && die "Circular dependency for $cfg."# 获取组件的各种依赖配置eval "dep_all=\$${cfg}_depsdep_any=\$${cfg}_deps_anydep_con=\$${cfg}_conflictdep_sel=\$${cfg}_selectdep_sgs=\$${cfg}_suggestdep_ifa=\$${cfg}_ifdep_ifn=\$${cfg}_if_any"# most of the time here $cfg has no deps - avoid costly no-op workif [ "$dep_all$dep_any$dep_con$dep_sel$dep_sgs$dep_ifa$dep_ifn" ]; theneval ${cfg}_checking=inprogress# 递归检查当前组件的所有依赖#递归策略:先检查当前组件的所有依赖项(如 A 依赖 B,则先检查 B 的依赖),确保依赖链上的所有组件状态都被确定。set -- $cfg "$dep_all" "$dep_any" "$dep_con" "$dep_sel" "$dep_sgs" "$dep_ifa" "$dep_ifn"check_deps $dep_all $dep_any $dep_con $dep_sel $dep_sgs $dep_ifa $dep_ifncfg=$1; dep_all=$2; dep_any=$3; dep_con=$4; dep_sel=$5 dep_sgs=$6; dep_ifa=$7; dep_ifn=$8# 条件启用:若 dep_ifa 中所有项都启用,则弱启用当前组件[ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }[ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }# 弱启用(enable_weak):仅在其他条件允许时启用,否则保持禁用。# 必须依赖:所有 _deps 必须满足enabled_all  $dep_all || { disable_with_reason $cfg "not all dependencies are satisfied: $dep_all"; }# 可选依赖:_deps_any 中至少满足一个enabled_any  $dep_any || { disable_with_reason $cfg "not any dependency is satisfied: $dep_any"; }# 冲突检查:_conflict 中所有项必须禁用disabled_all $dep_con || { disable_with_reason $cfg "some conflicting dependencies are unsatisfied: $dep_con"; }# 强制依赖:_select 中所有项必须启用disabled_any $dep_sel && { disable_with_reason $cfg "some selected dependency is unsatisfied: $dep_sel"; }# 若当前组件启用,则递归启用 _select 和 _suggest 中的依赖enabled $cfg && enable_deep_weak $dep_sel $dep_sgs# 收集额外库依赖for dep in $dep_all $dep_any $dep_sel $dep_sgs; do# filter out library deps, these do not belong in extralibsis_in $dep $LIBRARY_LIST && continueenabled $dep && eval append ${cfg}_extralibs ${dep}_extralibsdonefieval ${cfg}_checking=donedone
}

依赖关系示例

以 FLV 解码器(flv_decoder)为例,假设其依赖配置如下:

flv_decoder_deps="h264_decoder aac_decoder"
flv_decoder_select="h264_parser"
flv_decoder_suggest="zlib"

必须依赖:h264_decoder 和 aac_decoder 必须同时启用。
强制启用:若 flv_decoder 启用,则 h264_parser 也会被强制启用。
建议依赖:zlib 可选,若可用则更好(如用于压缩数据)。

函数调用流程
初始化:配置脚本通过 enabled 等函数设置初始组件状态(如用户通过 --enable-xxx 指定)。
调用 check_deps:传入所有组件名,开始递归检查。
递归验证:从叶子节点(无依赖的组件)开始,逐层向上验证依赖关系。
状态传播:根据依赖结果,启用或禁用组件,并记录原因(如 “缺少 xyz 依赖”)。

命令参数–enable-xxx

这个处理在config :--enable-*=*|--disable-*=*)中处理。

–enable-?:匹配以 --enable- 开头,后跟至少一个字符的参数(如 --enable-libx264)。
–disable-?
:匹配以 --disable- 开头,后跟至少一个字符的参数(如 --disable-debug)

for opt dooptval="${opt#*=}"case "$opt" in--extra-ldflags=*)add_ldflags $optval;;...--enable-?*|--disable-?*)# 使用 sed 命令将参数转换为 shell 变量赋值语句:# --enable-libx264 → action=enable option=libx264# --disable-debug → action=disable option=debug# 通过 eval 执行转换后的语句,将 action 和 option 设为当前 shell 变量。eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')# 判断是否在$COMPONENT_LIST中if is_in $option $COMPONENT_LIST; thentest $action = disable && action=unseteval $action \$$(toupper ${option%s})_LISTelif is_in $option $CMDLINE_SELECT; then$action $optionelsedie_unknown $optfi;;...--help|-h) show_help;;--quiet|-q) quiet=yes;;--fatal-warnings) enable fatal_warnings;;--libfuzzer=*)libfuzzer_path="$optval";;*)optname="${opt%%=*}"optname="${optname#--}"optname=$(echo "$optname" | sed 's/-/_/g')if is_in $optname $CMDLINE_SET; theneval $optname='$optval'elif is_in $optname $CMDLINE_APPEND; thenappend $optname "$optval"elsedie_unknown $optfi;;esac
done

组件列表处理分开解析:

if is_in $option $COMPONENT_LIST; thentest $action = disable && action=unseteval $action \$$(toupper ${option%s})_LIST

COMPONENT_LIST:包含 FFmpeg 中可独立配置的组件类型(如 encoders, decoders, filters 等)。

COMPONENT_LIST="$AVCODEC_COMPONENTS$AVDEVICE_COMPONENTS$AVFILTER_COMPONENTS$AVFORMAT_COMPONENTS
"

逻辑:
若 option 是组件类型(如 encoders),则:
若为 disable 操作,将其转换为 unset(从列表中移除)。
通过 eval 动态操作对应的大写组件列表变量:
例如 --enable-encoders → enable ENCODERS_LIST
例如 --disable-decoders → unset DECODERS_LIST

常规选项处理

elif is_in $option $CMDLINE_SELECT; then$action $option

CMDLINE_SELECT:包含可直接通过命令行启用 / 禁用的选项列表(如 debug, shared, static 等)。
逻辑:直接执行 action(enable 或 disable)操作对应的选项

示例说明

示例 1:启用所有编码器

--enable-encoders

转换为 action=enable option=encoders
由于 encoders 在 COMPONENT_LIST 中,执行 enable ENCODERS_LIST
最终启用所有编码器(通过修改 ENCODERS_LIST 变量)

示例 2:禁用调试模式

--disable-debug

转换为 action=disable option=debug
由于 debug 在 CMDLINE_SELECT 中,执行 disable debug
最终禁用调试模式(通过设置 enable_debug=no)

示例 3:启用 libx264 支持

--enable-libx264

转换为 action=enable option=libx264
由于 libx264 在 CMDLINE_SELECT 中,执行 enable libx264
最终启用 libx264 外部库支持

用户输入 --enable-libx264↓
configure 脚本解析参数,匹配 --enable-?* 模式↓
调用 enable libx264 → 设置 libx264=yes 由于 libx264 在 CMDLINE_SELECT 中,执行 enable libx264↓
遍历 AUTODETECT_LIBS,发现 libx264 已启用↓
调用 request libx264 → 强制验证依赖↓
check_deps 验证 libx264 的系统依赖(通过 pkg-config 等)↓
若验证通过,生成编译配置(CFLAGS/LDFLAGS、config.h)↓
启用依赖 libx264 的组件(如 h264_libx264_encoder)

命令参数—enable-=|–disable-=)

-enable-=
匹配以 --enable- 开头,后跟任意字符串,再以 = 连接另一个任意字符串的参数.
案例:

    --enable-decoder=libx264 \--enable-decoder=libx265 \

config 中处理代码:

        --enable-*=*|--disable-*=*)# ${opt%%=*}:提取参数等号前的部分(如 --enable-encoder → --enable-encoder)。# sed 替换:将 --enable-encoder 转换为 action=enable thing=encoder,并通过 eval 设置为变量。eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')# ${thing}s:将组件类型转为复数形式(如 encoder → encoders)is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"# 态获取组件列表:将组件类型转为大写并添加 _LIST 后缀(如 encoder → ENCODERS_LIST)。# 示例:thing=encoder → list=$ENCODERS_LIST,获取所有编码器列表。eval list=\$$(toupper $thing)_LIST# 将逗号分隔的多个组件名转为正则表达式(如 h264,mp3 → h264_encoder|mp3_encoder)。# 添加 _${thing} 后缀以匹配内部组件命名(如 h264 → h264_encoder)。name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}#filter 函数:从 $list 中筛选出匹配 $name 的组件。# 示例:若 name=h264_encoder,则从 ENCODERS_LIST 中筛选出 h264_encoderlist=$(filter "$name" $list)# 空检查:若未找到匹配组件,发出警告。# 依赖检查:若启用组件,先检查其依赖是否满足(warn_if_gets_disabled)。# 执行操作:调用 enable 或 disable 函数处理筛选出的组件。[ "$list" = "" ] && warn "Option $opt did not match anything"test $action = enable && warn_if_gets_disabled $list$action $list;;

示例说明

--enable-encoder=h264

参数解析:
action=enable
thing=encoder
list=$ENCODERS_LIST(所有编码器列表)
name=h264_encoder
执行结果:
从 ENCODERS_LIST 中筛选出 h264_encoder。
执行 enable h264_encoder,启用 H.264 编码器。

--disable-filter=scale,transpose

参数解析:
action=disable
thing=filter
list=$FILTERS_LIST(所有滤镜列表)
name=scale_filter|transpose_filter
执行结果:
从 FILTERS_LIST 中筛选出 scale_filter 和 transpose_filter。
执行 disable scale_filter transpose_filter,禁用这两个滤镜。

auto detect

auto detect 的模块都在下图所示的位置enable, enable_weak的意思是如果模块已经被设置过了,就不设置,没有设置的时候才设置。
比如下图nvdec和nvenc只有disable:在这里插入图片描述configure自动设置enable的位置:在这里插入图片描述

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

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

相关文章

Digital Rainwater Collection System (v1.0)

The law doesn’t punish the masses. If only one guy runs his own rainwater system, he gets fined for “illegal mining.” But if millions of households self-host their “digital wells,” the whole centralized model collapses. Cloud providers and regulators …

NFS文件存储及部署论坛(小白的“升级打怪”成长之路)

目录 一、概述 NFS挂载原理 NFS工作原理 RPC与NFS通讯过程 二、NFS服务安装与启停 NFS服务安装 NFS服务启停 三、NFS服务配置文件 四、NFS文件共享配置文件 配置参数说明 五、命令解析 六、客户端访问 七、客户端挂载 实战案例 部署NFS文件存储及discuz论坛应用 …

JavaScript 对象创建:new 操作符全解析

引言 在 JavaScript 中,new 操作符是实现面向对象编程的​​核心机制​​之一。本文将从原理层面对 new 操作符进行深度剖析,探讨其工作机制、内部实现和实际应用场景。无论您是 JavaScript 初学者还是资深开发者,都能从本文获得以下知识和技…

Spring Boot + Vue.js 全栈开发:从前后端分离到高效部署,打造你的MVP利器!

文章目录一、为何选择 Spring Boot Vue.js?全栈开发的“黄金搭档”!二、项目初始化与基础架构搭建2.1 后端:初始化 Spring Boot 项目2.2 前端:初始化 Vue.js 项目2.3 核心配置:打通前后端通信与跨域!后端 …

容器技术技术入门与Docker环境部署

目录 一:Docker 概述 1:什么是Docker 2:Docker 的优势 3:Docker的应用场景 4:Docker核心概念 二:Docker 安装 三:Docker 镜像操作 1:获取镜像 2:查看镜像信息 3&#xff1a…

构建高效分布式系统:bRPC组合Channels与HTTP/H2访问指南

构建高效分布式系统:bRPC组合Channels与HTTP/H2访问指南 引言 在现代分布式系统中,下游服务访问的复杂性日益增加。bRPC通过组合Channels和HTTP/H2访问优化,提供了解决多层级RPC调用、负载均衡和协议兼容性问题的完整方案。本文将深入解析两大…

WSL创建Ubuntu子系统与 VS code 开发

文章目录一、打开Windows的虚拟化基础功能二、安装WSL和Ubuntu1. 安装 WSL2. 安装 Ubuntu三、 VScode一、打开Windows的虚拟化基础功能 控制面板-程序和功能-启动或关闭Windows功能,勾选适用于Linux的Windows子系统、虚拟机平台, 完成后根据提示重启电脑…

AlpineLinux二进制文件部署prometheus

在Alpine Linux上通过二进制文件部署Prometheus的步骤如下: 创建用户和组: groupadd prometheus useradd -g prometheus -m -s /sbin/nologin prometheus下载Prometheus二进制文件: 你可以从Prometheus的官方GitHub发布页面下载最新的二进制文件。例如,使用wget命令: wget…

IoT 小程序:如何破解设备互联的碎片化困局?

一、IoT 设备管理为何需要轻量化解决方案?随着物联网设备规模爆发式增长 —— 预计 2025 年全球连接数将达 270 亿台,传统 Native 应用开发模式的弊端日益凸显:某智能家居厂商开发 3 款主流设备 APP,需维护 iOS/Android/ 小程序 3…

Word 怎么让字变大、变粗、换颜色?

这是Word中最常用也最基础的操作之一。学会它,你的文档就会立刻变得重点突出,清晰易读。 记住一个核心前提:无论做什么格式修改,第一步永远是【先选中你要修改的文字】。 你可以把鼠标放在文字的开头,按住左键&#xf…

Ruby 安装 - Linux

Ruby 安装 - Linux 引言 Ruby 是一种广泛使用的高级编程语言,以其简洁、优雅和强大的功能而闻名。在 Linux 系统上安装 Ruby 是许多开发者的首要任务。本文将详细介绍如何在 Linux 系统上安装 Ruby,包括准备工作、安装过程和常见问题解决。 准备工作 在开始安装 Ruby 之前…

数组的应用示例

任意输入【0,9】范围内的整数&#xff0c;统计输入的每一种数字的个数并输出&#xff0c;输入-1结束程序 #include <stdio.h> int main(){const int number 10;int x;int i;int count[number];for ( i 0; i < number; i){count[i] 0;}printf("请输入0&#xf…

鸿蒙智行6月交付新车52747辆 单日交付量3651辆

近日&#xff0c;鸿蒙智行公布最新销量数据&#xff0c;6月单月全系交付52747辆&#xff0c;单日交付量3651辆&#xff0c;分别刷新鸿蒙智行单月、单日销量历史新高。仅用39个月实现全系累计交付80万辆&#xff0c;创下新势力汽车最快交付纪录。 尊界S800自5月30日上市以来&…

基于模糊控制及BP神经网络开关磁阻电机的matlab仿真

1.模型简介本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2015Rb&#xff09;软件。2.仿真算法:1&#xff09;采用转速、转矩双闭环控制算法&#xff1b;2&#xff09;外环是速度环&#xff0c;采用改进复合模糊控制&#xff0c;实现速度跟踪&#xff1b;3&#xff09;…

最新团购源码商城 虚拟商城系统源码 全开源

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 最新团购源码商城 虚拟商城系统源码 全开源 基于PHP开发的多功能在线商城系统&#xff0c;适合个人、小型企业或创业团队快速搭建自己的商品销售平台。系统界面美观&#xff0c;功能丰富…

Visual Studio 旧版软件下载教程

一、前言最近在开发过程中编译使用Cuda的版本较低&#xff0c;导致与最新的Visual Studio Community 2022 17.14.8不兼容。编译报错如下&#xff1a;[cmake] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\yvals_core.h(902): e…

乐橙亮相2025广州建博会:用AI重新定义家庭安全与技术边界

在智能锁迈入AI新时代的关键节点&#xff0c;谁才是真正的技术引领者&#xff1f;2025年广州建博会&#xff0c;乐橙用一场“不炫技、重本质”的深度展演给出了答案。智哪儿在现场了解到&#xff0c;在A区3.1-28展位&#xff0c;乐橙围绕“智启新境 All in Intelligent”这一主…

快速搭建服务器,fetch请求从服务器获取数据

1.strapi首先strapi是一个api管理系统&#xff0c;可以让我们直接用网页的形式去定义自己的api&#xff0c;包括设置模型和权限等功能。首先直接在项目目录里面安装库。npx create-strapilatest server --quickstart这样就可以直接在项目目录创建一个连接数据库的服务器了。不用…

UGF开发记录_3_使用Python一键转换Excle表格为Txt文本

使用UnityGameFramework日常记录_3_配一键转换配置表 该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合UGF萌新 为了提高效率&#xff0c;我使用Python编写了一个脚本&#xff0c;实现了一键将Excel表格批量转换为带分隔符的Txt文件&#xff0c…

leetcode 3440. 重新安排会议得到最多空余时间 II 中等

给你一个整数 eventTime 表示一个活动的总时长&#xff0c;这个活动开始于 t 0 &#xff0c;结束于 t eventTime 。同时给你两个长度为 n 的整数数组 startTime 和 endTime 。它们表示这次活动中 n 个时间 没有重叠 的会议&#xff0c;其中第 i 个会议的时间为 [startTime[i]…