当前位置: 首页 > news >正文

FFmpeg源码:av_log2函数分析

一、av_log2函数的声明

av_log2函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavutil/common.h中:

#ifndef av_log2
av_const int av_log2(unsigned v);
#endif

该函数作用是:求形参v是2的多少次幂,把结果作为返回值返回。比如av_log2(1)为0,
av_log2(2)为1,av_log2(4)为2,av_log2(8)为3:

二、av_log2函数的定义

av_log2函数定义在源文件libavutil/intmath.c中:

int av_log2(unsigned v)
{return ff_log2(v);
}

三、编写例子测试av_log2函数

编写测试例子main.c,在Ubuntu上通过9.4.0版本的gcc可以成功编译:

#include <stdio.h>
#include <stdint.h>#ifdef __GNUC__
#    define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))
#    define AV_GCC_VERSION_AT_MOST(x,y)  (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y))
#else
#    define AV_GCC_VERSION_AT_LEAST(x,y) 0
#    define AV_GCC_VERSION_AT_MOST(x,y)  0
#endif#ifndef av_always_inline
#if AV_GCC_VERSION_AT_LEAST(3,1)
#    define av_always_inline __attribute__((always_inline)) inline
#elif defined(_MSC_VER)
#    define av_always_inline __forceinline
#else
#    define av_always_inline inline
#endif
#endif#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__)
#    define av_const __attribute__((const))
#else
#    define av_const
#endifextern const uint8_t ff_log2_tab[256];const uint8_t ff_log2_tab[256]={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
};#ifndef ff_log2
#define ff_log2 ff_log2_c
static av_always_inline av_const int ff_log2_c(unsigned int v)
{int n = 0;if (v & 0xffff0000) {v >>= 16;n += 16;}if (v & 0xff00) {v >>= 8;n += 8;}n += ff_log2_tab[v];return n;
}
#endifint av_log2(unsigned v)
{return ff_log2(v);
}int main()
{printf("av_log2(1): %d\n", av_log2(1));printf("av_log2(2): %d\n", av_log2(2));printf("av_log2(4): %d\n", av_log2(4));printf("av_log2(8): %d\n", av_log2(8));return 0;
}

使用gcc编译,运行,输出如下:

四、参考

《log2是什么意思》


http://www.mrgr.cn/news/431.html

相关文章:

  • Redis缓存——缓存更新策略和常见的缓存问题
  • JVM的组成
  • 用Python实现9大回归算法详解——01. 线形回归算法
  • 《书生大模型实战营第3期》进阶岛 第4关: InternVL 多模态模型部署微调实践
  • 解析网络流量管理方案:简化基于云的DNS负载均衡
  • 贷齐乐案例
  • 【MATLAB源码-第249期】基于matlab的信道量化反馈的预编码仿真,采用均匀量化方式和LDL分解的预编码。
  • Unity URP无光照下Shadow 制作 <二> 合批处理
  • 探索Go语言中的列表与环形缓冲区:container/list与container/ring全解析
  • python从入门到精通:函数
  • 从零开始搭建k8s集群详细步骤
  • 搭建个人网站
  • 【Python快速入门和实践020】Python常用脚本-查看电脑基本信息
  • 基于springboot的智能家居系统
  • SQL注入(head、报错、盲注)
  • 4-1-2 直流电机(电机专项教程)
  • Python3网络爬虫开发实战(10)模拟登录(需补充账号池的构建)
  • conda不是内部或外部命令
  • 医学超声图像后处理功能
  • PhpStorm完全配置指南:打造高效PHP开发环境!