草庐IT

FFmpeg学习(三)-- libavutil 代码组成

gushansanren 2024-05-03 原文

FFmpeg学习(三)-- libavutil 代码组成


libavutil库是一个实用的库,以提升多媒体编程的便捷性。它包含安全的可移植字符串函数、随机数生成器、数据结构、额外的数学函数、密码学和多媒体相关功能(如像素枚举和样本格式)。它不是libavcodec和libavformat所需的代码库。 libavutil目录下的aarch64、arm、avr32、bfin、loongarch、mips、ppc、sh4、tomi、x86目录内容为基于CPU的特定功能实现,一般均包含有汇编代码。

libavutil中包含的功能如下:(基于v5.0版本)

  • adler32.h/.c: Adler-32算法的实现
    • Adler-32是Mark Adler发明的校验和算法,和32位CRC校验算法一样,都是保护数据防止意外更改的算法。
    • Adler-32通过求解两个16位的数值A、B实现,并将结果连结成一个32位整数.A就是字符串中每个字节的和,而B是A在相加时每一步的阶段值之和。在Adler-32开始运行时,A初始化为1,B初始化为0,最后的校验和要模上65521(继216之后的最小素数)。
  • aes.h/.c/_ctr.c/_ctr.h/_internal.h: AES算法的实现
    • AES的全称是Advanced Encryption Standard,意思是高级加密标准。
    • AES要求分组大小为128位,密钥可以为128位、192位、256位。密钥长度每增加64位,算法的循环次数就增加2轮,128位循环10轮、192位循环12轮、256位循环14轮。
    • aes_ctr中为AES算法的CTR模式的实现。
  • audio_fifo.h/.c: audio 先入先出队列的实现
    • audio_fifo基于av_fifo实现,封装了audio buffer相关的计算。即根据sample_fmt、channels、nb_samples计算每个buffer的大小。
  • avassert.h: 定义了av_assert宏
    • av_assert宏用于当条件为false时,输出log,直接退出程序。
    • av_assert1、av_assert2用于代码速度优化。
  • avstring.h/.c/avsscanf.c:定义了字符数组的操作函数
    • av_strstart/av_stristart: 查找str是否以pfx开头。
    • av_stristr: 忽略大小写,从haystack查找字符串needle
    • av_strnstr:在从haystack开始的hay_length个字节中查找字符串needle
    • av_strlcpy:字符串复制
    • av_strlcat:字符串拼接
    • av_strlcatf: 类似vsnprintf,用参数化方式拼接字符串
    • av_strnlen: 计算字符串长度
    • av_asprintf:创建格式化字符串,并返回。
    • av_strtok/av_get_token: 用指定的字符串delim分割字符串,然后av_get_token依次获取分割项
    • av_isdigit: 判断字符是否为数字
    • av_isgraph: 判断字符是否可见
    • av_isspace: 判断字符是否为空格
    • av_toupper/av_tolower: 转换字符的大小写
    • av_isxdigit: 判断字符是否为数字或字母
    • av_strcasecmp/av_strncasecmp: 字符串对比
    • av_strireplace: 字符串替换
    • av_basename: 从全路径字符串中分离文件名
    • av_dirname: 从全路径字符串中分离目录名
    • av_match_name: 从逗号分割的字符串中查找是否匹配项,如果存在ALL,则也会匹配
    • av_append_path_component: 在目录名后面追加文件名
    • av_escape: 替换字符串中的特殊字符
    • av_utf8_decode: 解码一个utf8字符串
    • av_match_list: 查找两个字符串列表中是否有匹配项
    • av_sscanf:avsscanf.c 中实现了av_sscanf函数,类似C函数sscanf,用于实现从字符串中获得数据。
  • avutils.h/utils.c: 辅助函数:
    • av_get_media_type_string:将enum AVMediaType的值转换为字符串
    • av_get_picture_type_char:将enum AVPictureType 转换为字符串
    • av_x_if_null: 如果p为null则返回x
    • av_int_list_length_for_size: 计算list中的元素个数
    • av_fopen_utf8: 打开一个文件名为UTF8编码的文件
    • av_get_time_base_q: 返回一个以AV_TIME_BASE为分母的分数
    • av_fourcc2str/av_fourcc_make_string: Fourcc转字符串
  • base64.h/.c: base64算法的实现:
    • av_base64_decode: 将base64字符串转为原始字符串
    • av_base64_encode: 将原始字符串转为base64格式的字符串
  • blowfish.h/.c: blowfish 加密算法
  • bprint.h/*.c: 类似stringbuilder,实现字符串的动态扩展。
  • bswap.h: 16、32、64位整数的前后交换
  • buffer.h/.c/_internal.h: AVBuffer及buffer 池的实现,
    • AVBuffer and AVBufferRef 是两个核心的对象,AVBuffer不能被外部访问,外部API通过AVBufferRef操作AVBuffer.
    • av_buffer_create/av_buffer_realloc 可以创建一个AVBuffer,av_buffer_ref增加AVBuffer的引用计数,av_buffer_unref减少引用计数。引进计数减到0时,av_buffer_unref会自动释放AVBuffer。
    • av_buffer_pool_init/av_buffer_pool_init2 创建指定数量的AVBuffer 池
  • camellia.h/.c: camellia 加密算法
    • Camellia算法每块的的长度(block size)为128位元,密钥长度则可以使用128、192或256位元。具有与AES同等级的安全强度及运算量。
  • cast5.h/.c: CAST5 加密算法
  • channel_layout.h/.c: audio channel layout 的字符串名称和数值相互转换接口
  • color_untils.h/.c: 两个颜色转换接口
    • avpriv_get_gamma_from_trc:从AVColorTransferCharacteristic获取对应的gamma 值
    • avpriv_get_trc_function_from_trc: 获取AVColorTransferCharacteristic对应的转换函数
  • colorspace.h: YUV/RGB/JPEG/BT709/CCIR等颜色空间的相互转换宏
  • common.h: 常用数学函数及UTF8、UTF16的转换函数
  • cpu.h/.c/_internel.h: CPU相关的功能函数
  • crc.h/crc.c: crc算法
  • des.h/.c: des 加密算法
  • detecttion_bbox.h/.c: 获取帧数据的外围边框
  • dict.h/.c: FFmpeg的字典类AVDictionary的相关操作
  • display.h/.c: 根据指定的角度值,创建对应的旋转矩阵,用于旋转图片
  • dovi_meta.h/.c: dolby vision 的meta 数据
  • downmix_info.h/.c: downmix audio downmix medatata
  • encryption_info.h/.c: 加密信息
    • 描述packet中加密信息。它包含在将数据包传递给解码器之前,如何解密数据包的特定frame信息。
  • error.h/.c: FFmpeg中的错误值,及错误值对应的字符串
  • eval.h/.c: 简单的算术表达式求值器
    • av_expr_parse_and_eval 可以计算"1+2^3+5*5+sin(2/3)"的值
  • ffmath.h: 数学函数
    • ff_exp10/ff_exp10f: 更快的计算10^x的值
    • ff_fast_powf: 更快的计算x^y的值
  • fifo.h/.c: 先进先出队列的实现
  • file.h/.c: 将文件映射到内存,实现快速读取
  • film_grain_params.h/.c: 电影胶片参数
  • fixed_dsp.h/.c: 创建fixed DSP 上下文
  • float_dsp.h/.c: 创建float DSP 上下文
  • frame.h/.c: AVFrame 上下文数据
    • av_frame_alloc/av_frame_free: 创建/释放帧
    • av_frame_ref/av_frame_unref: 增加/减少引用计数
  • hash.h/.c: hash算法的实现
    • 支持MD5、SHA1、SHA256、RIPEMD320、CRC等
  • hdr_dynamic_metadata.h/.c: hdr 动态meta数据
  • hmac.h/.c: hmac算法
    • 支持MD5、SHA1、SHA512等
  • hwcontext.h/*.c等 硬件加速设备上下文及相关函数
  • imgutils.h/.c/_internal.c: 图片相关操作函数
    • av_image_fill_max_pixsteps: Compute the max pixel step for each plane of an image with a format described by pixdesc.
    • av_image_get_linesize: Compute the size of an image line with format pix_fmt and width width for the plane plane.
    • av_image_fill_linesizes: Fill plane linesizes for an image with pixel format pix_fmt and width width.
    • av_image_fill_plane_sizes: Fill plane sizes for an image with pixel format pix_fmt and height height.
    • av_image_fill_pointers: Fill plane data pointers for an image with pixel format pix_fmt and height height.
    • av_image_alloc: Allocate an image with size w and h and pixel format pix_fmt, and fill pointers and linesizes accordingly.
    • av_image_copy_plane/av_image_copy_plane_uc_from/av_image_copy: image copy
    • av_image_fill_arrays: Setup the data pointers and linesizes based on the specified image parameters and the provided array.
    • av_image_get_buffer_size: Return the size in bytes of the amount of data required to store an image with the given parameters。
    • av_image_copy_to_buffer: Copy image data from an image into a buffer.
    • av_image_check_size/av_image_check_size2: Check if the given dimension of an image is valid, meaning that all bytes of the image can be addressed with a signed int.
    • av_image_check_sar: Check if the given sample aspect ratio of an image is valid.
    • av_image_fill_black: Overwrite the image data with black.
  • integer.h/.c: 128位的整数运算
  • intfloat.h: uint64_t与double、uint32_t与float的相互转换
  • intmath.h: 快速计算整数的有效位数
  • intreadwrite.h: 整数的移位、复制等运算
  • lfg.h/.c: Context structure for the Lagged Fibonacci PRNG.
  • libm.h: float 数据的操作函数
  • lls.h: 线性最小二乘模型 Linear least squares model.
  • log.h/.c: FFmpeg中的日志相关功能
    • AVClass类用于实现对象的可视化,每个log格式化函数的头一个参数为AVClass指针
    • av_log/av_log_once/av_vlog: 创建log字符串,然后用callback方法发送出去。av_log_default_callback为缺省的log处理方法,将日志信息发送到stderr中。
    • av_log_format_line/av_log_format_line2: 创建格式化日志字符串
    • av_log_set_level: 设置log的显示级别,低于设定值得级别可显示。取值为-8、0、8、16、24、32、40、48、56。
  • lzo.h/.c: Decodes LZO 1x compressed data
  • macos_kperf.h/.c: macos 系统中kperf参数
  • macros.h: 常用宏:MAX、MIN、SWAP等
  • mastering_display_metadata.h/.c: 创建AVMasteringDisplayMetadata、AVContentLightMetadata
  • mathematics.h: 用于处理时间戳和时间基的数学工具。
    • av_gcd: 计算两个整数的最大公约数。
    • av_rescale/av_rescale_rnd: a * b / c 取整
    • av_rescale_q/av_rescale_q_rnd: a * bq / cq 取整
    • av_compare_ts: 比较两个时间戳
    • av_compare_mod: compare the least significant log2(mod) bits of integers a and b.
    • av_rescale_delta: 按照新的timebase,重新计时时间戳。
    • av_add_stable: 时间戳增加一个值
  • md5.h/.c: MD5 hash 算法
  • mem.h/.c/_internal.h: 内置内存操作函数
    • av_malloc/av_mallocz: 分配内存空间
    • av_malloc_array/av_calloc: 按数组方式分配内存空间
    • av_realloc/av_reallocp: 创建、重创建、释放内存
    • av_realloc_f/av_realloc_array/av_reallocp_array: 创建、重创建、释放数组形式的内存
    • av_fast_realloc: 如果原有buffer不够大时,重新分配内存
    • av_fast_malloc/av_fast_mallocz: 如果现有缓冲区足够大,则先释放然后重新分配一个,反之只释放不分配
    • av_free/av_freep: 释放分配的内存
    • av_strdup/av_strndup: 复制一个新的字符串
    • av_memdup: 复制一段内存空间
    • av_memcpy_backptr: Overlapping memcpy() implementation
  • murmur3.h/.c: AVMurMur3 hash 算法
    • MurmurHash是一种经过广泛测试且速度很快的非加密哈希函数。它有Austin Appleby于2008年创建,产生32位或128位哈希。
    • MurMurHash3 128 位版本的速度是 MD5 的十倍。MurMurHash3 生成 32 位哈希的用时比生成 128 位哈希的用时要长。原因在于生成 128 位哈希的实现受益于现代处理器的特性。
  • opt.h/.c: AVOption及相关操作函数
    • AVOptions提供了一个通用的系统来声明任意结构的选项(“对象”),一个选项可以有一个帮助文本,一个类型和一个可能范围值,AVOptions可以被枚举、读取或写入。
  • parseutils.h/.c: 多种解析工具
    • av_parse_ratio: 将一个字符串转换为分数
    • av_parse_video_size: 将一个字符串转换为视频的宽度、高度
    • av_parse_video_rate: 将一个字符串转换为视频的帧率
    • av_parse_color: 将一个字符串转换为RGBA格式的颜色值
    • av_get_known_color_name: 获取一个RGBA的颜色值的名称
    • av_parse_time: 将一个格式为“[{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m…]]]}|{HHMMSS[.m…]]]}}[Z]”时间字符串转换为以微妙为单位的时间
    • av_find_info_tag: 从一个URL字符串中获取tag对应的值
    • av_small_strptime: 将字符串转换为 struct tm 格式的时间。
    • av_timegm: 将struct tm转换为 time_t
  • pca.h/.c: principal component analysis(PCA)
    • 在ffmpeg v5.0的代码中未见使用
  • pixdesc.h/desc.c/fmt.h/elutils.h/elutils.c: 像素相关的功能
    • pixfmt.h 中定义了像素格式、颜色空间、格式转换的枚举值及相关宏。
    • pixelutils.h/.c: 定义了一个计算“两个数组的差的绝对值的和”的函数
    • pixdesc.h/.c: 定义了像素描述、颜色转换相关的函数。
      • av_read_image_line2: 从图片中读取一行像素值
      • av_write_image_line: 将一行像素值写到图片数据中
  • random_seed.h/.c: 获取一个随机数的种子
    • av_get_random_seed: 从硬件设备或其他途径产生一个真随机数,作为种子
  • rational.h/.c: 分数及相关运算函数
  • rc4.h/.c: rc4 加密算法
  • reverse.h/.c: 定义了一个字节的反转后的对应矩阵
  • ripemd.h/.c: RIPEMD hash 算法
  • samplefmt.h/.c: 音频采样格式及相关函数
  • sha.h/.c: SHA-1 & SHA-256 hash 算法
  • sha512.h/.c: SHA512 hash 算法
  • slicethread.h/.c: FFmpeg封装的多线程实现。
    • avpriv_slicethread_create: 输入work 函数、main函数,创建AVSliceThread上下文
    • avpriv_slicethread_execute: 多线程同时执行work函数
    • avpriv_slicethread_free: 释放AVSliceThread上下文
  • softfloat.h/_tables.h/_ieee754.h: 浮点数运算的软件实现
  • spherical.h/.c: 视频的球形映射
  • stereo3D.h/.c: 立体三维类型及相关函数
  • tea.h/.c: TEA 加密算法
  • thread.h: 封装了各个平台的线程函数及互斥函数
  • threadmessage.h/.c: 基于AVFifoBuffer实现的用于线程间通信的消息队列
  • time.h/.c/_internal.h: 时间相关的函数
    • av_gettime: 获得以微秒计数的当前时间
    • av_gettime_relative:获取基于一些非特定点的当前时间(微秒计数),如果没有定义CLOCK_TIME,则在av_gettime基础上增加42小时
    • av_gettime_relative_is_monotonic: av_gettime_relative的返回值是否单调递增。如果从av_gettime获取,则为0
    • av_usleep: 以微秒计数的休眠函数
  • timecode.h/.c: AVTimecode的定义及时间编码相关的函数
  • timer.h: 计时器相关的函数,仅用于测试
  • timestamp.h: 将pts转为字符串的函数
    • av_ts_make_string: 整数计数的pts转字符串
    • av_ts_make_time_string: 浮点数计数的pts转字符串
  • tree.h/.c: FFmpeg实现的二叉树形结构体AVTreeNode及相关函数。
    • av_tree_node_alloc: 创建树节点
    • av_tree_find: 通过键值值查找节点
    • av_tree_insert: 插入节点
    • av_tree_destroy: 销毁树节点及子节点
    • av_tree_enumerate: 遍历二叉树
  • twofish.h/.c: twofish 加密算法
  • tx.h/.c/_template.c/_priv.h/_int32.c/_float.c/_double.c: 基于AVTXContext的FFT和MDCT转换
    • FFT: 快速傅氏变换算法(Fast Fourier Transform Algorithm)
    • MDCT: 修正离散余弦变换(Modified Discrete Cosine Transform)
  • video_enc_param.h/.c: 根据指定参数,创建视频帧编码参数
  • vulkan.h/.c/_shaders.c/_loader.h/_glslang.c/_functions.h: 定义了vulkan相关功能函数
  • wchar_filename.h: 在window平台,实现utf8字符转宽字符
  • xga_font_data.h: CGA/EGA/VGA ROM font data
  • xtea.h/.c: xtea 算法的实现
    • TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据。TEA也发展出几个版本,分别是XTEA、Block TEA和XXTEA

有关FFmpeg学习(三)-- libavutil 代码组成的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  3. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  4. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  7. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

  8. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

随机推荐