x264是怎样实现多种位深(bitdepth)支持的?

随着生活水平的提高,小伙伴们的眼神也越发好了。8bit 位深不够用了,现在都 10bit,12bit 了。鼠哥编 x264 的时候,也都必须是支持 8bit 和 10bit 位深的。x264 在不同位深的支持上,颇具奇技淫巧。其实 x265 也不遑多让,但是 x265 编起来比 x264 麻烦多了,留作后话。今天先从一个宏开始,看看 x264 是如何支持多位深的,是为 “窥一斑而知全豹”。

假设有这么一个函数,它在 8bit 位深和 10bit 位深的情况下,里面的实现有所不同:

void x264_log( x264_t *h, int i_level, const char *psz_fmt, ... );

要让鼠哥实现的话,那就得搞成这样:

void x264_8_log( x264_t *h, int i_level, const char *psz_fmt, ... );
void x264_10_log( x264_t *h, int i_level, const char *psz_fmt, ... );

 具体实现也就得写2个。甚至相关的 .c 源文件,可能都得每种位深各写一个,不优雅,不高明。

下面直接看 x264 是怎么搞的。

#define x264_log x264_template(log)
void x264_log( x264_t *h, int i_level, const char *psz_fmt, ... );

x264_template 这个宏在整套工程中很常见,以上面这条打log的函数为例,上面两句话,实际上将生成的内容可能是这样的:

void x264_8_log( x264_t *h, int i_level, const char *psz_fmt, ... );

也可能是这样的:

void x264_10_log( x264_t *h, int i_level, const char *psz_fmt, ... );

也就是说,如果你去看 dll 库或者 .o 文件的话,是没有 x264_log 这个函数的,有的只是 x264_8_log 和/或 x264_10_log 函数。让我们再看看这个宏的实现:

#define x264_template(w) x264_glue3(x264, BIT_DEPTH, w)

关注其中有个 BIT_DEPTH 宏,提问:这个宏是几?

如果你当时 ./configure 中没指定 bitdepth,那默认就是 8bit+10bit 都有。那 BIT_DEPTH 具体是几呢?答案就是,工程在编译时,会同时生成一个 common-8.o 和 一个 common-10.o ,在前者里面,BIT_DEPTH 就是8,在后者里面,它就是10。同时,在前者里面,含有 x264_8_log(...) 函数符号,在后者里面,含有 x264_10_log(...) 符号。

那么,工程是怎样从一个 common.c 文件编出来 2个 .o 的呢? 玄机正在 Makefile 中:

#c文件部分
%-8.o: %.c$(CC) $(CFLAGS) -c $< $(CC_O) -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8%-10.o: %.c$(CC) $(CFLAGS) -c $< $(CC_O) -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10#汇编部分
%-8.o: %.S$(AS) $(ASFLAGS) -o $@ $< -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8-@ $(if $(STRIP), $(STRIP) -x $@)%-10.o: %.S$(AS) $(ASFLAGS) -o $@ $< -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10-@ $(if $(STRIP), $(STRIP) -x $@)

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

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

相关文章

使用Element UI组件时,icon图标不显示

问题描述&#xff1a; 我在使用Element UI组件的日期选择器时&#xff0c;发现图标不显示(左边是原图&#xff0c;右边的问题图)。 经过检查我发现&#xff0c;我的JS&#xff0c;CSS文件都没有问题&#xff0c;只是缺少了element-icons.tff和element-icons.woff这两个文件。 …

【运维项目经历|041】上云项目-物理机迁移到阿里云

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 ​ 🏅阿里云ACE认证高级工程师 ​ 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目录 项目名称 项目背景 项目目标 项…

微信小程序的四种弹窗使用

​ 在做小程序的过程中&#xff0c;弹窗也算是非常实用的功能了&#xff0c;这几天写的几个功能就用到了弹窗&#xff0c;也可能是初学者的问题&#xff0c;比较菜&#xff0c;想找一个可以带图片的自定义的弹窗&#xff0c;&#xff0c;这里简单介绍一下官方封装好的四个弹窗…

密码学之RSA算法

文章目录 1. RSA算法介绍1.2 算法历史与发展1.3 算法应用场景 2. RSA密钥生成2.1 选择素数2.2 计算公钥和私钥2.3 密钥长度与安全性 3 算法原理3.1 加密原理3.2 加密方法3.3 加密示例3.4 代码实现 4. 总结 1. RSA算法介绍 1.2 算法历史与发展 RSA算法由Ron Rivest、Adi Shami…

Qt 0814作业

一、思维导图 二、登录窗口界面 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求&#xff1a;每行代码都有注释 【需要用到的图片或者动图&#xff0c;自己去网上找】 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(par…

Java-文件下载(后端response直接下载文件还是后端将文件流返回给前端,由前端负责下载)

Java 后端处理文件下载时,有两种常见的方法:一种是后端直接下载文件,另一种是后端将文件 流返回给前端,由前端负责下载。这两种方法各有优缺点,适用于不同的场景。 1. 后端直接下载 在这种情况下,后端会直接处理文件的下载逻辑,通常涉及到设置HTTP响应头,将文件内容…

【OCR 学习笔记】二值化——全局阈值方法

二值化——全局阈值方法 固定阈值方法Otsu算法在OpenCV中的实现固定阈值Otsu算法 图像二值化&#xff08;Image Binarization&#xff09;是指将像素点的灰度值设为0或255&#xff0c;使图像呈现明显的黑白效果。二值化一方面减少了数据维度&#xff0c;另一方面通过排除原图中…

微服务架构的介绍

系统架构的演变 随着互联⽹的发展&#xff0c;⽹站应⽤的规模不断扩⼤&#xff0c;常规的应⽤架构已⽆法应对&#xff0c;分布式服务架构以及微服务架构势在必⾏&#xff0c;必需⼀个治理系统确保架构有条不紊的演进。 单体应用架构 Web应⽤程序发展的早期&#xff0c;⼤部分…

C++入门——“继承”

一、引入 面相对象的计算机语言有三大特性&#xff1a;“封装”、“继承”、“多态”。今天来讲解一下C的一大重要特性——继承。 通俗理解来讲&#xff0c;继承就和现实生活一样&#xff0c;子辈继承父辈的一些特性&#xff0c;C中的继承也可以这样理解。它允许我们在保持原有…

计算机毕业设计选什么题目好?springboot 基于Java的学院教学工作量统计系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

day31 贪心算法-mergeIntervals+monotoneIncreasingDigits+binaryTreeCameras

### 8.16 56. Merge Intervals Given an array of intervals where intervals[i] [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input. 56. 合并区间 本题也是重叠区间问题…

vue使用高德获取当前地区天气

1、收件箱 | 高德控制台 (amap.com) 首先打开高德开放平台注册一下 2、创建一个应用获取到key后面获取天气的时候 请求接口的时候会用到key 2.1.1 创建应用的时候注意类型选成天气 2.1.2 创建完成之后就点添加key 然后选择web服务就行 3、可以调取天气接口 天气查询-基础 API…

DISCUZ论坛中 “阅读权限10“这几个字的修改教程以及后台目录路径修改后的管理路径

第一篇&#xff1a;修改“阅读权限10”这几个字 首先找到目录&#xff1a; source\language\lang_message.php 找到这个文件 查找&#xff1a; thread_nopermission 首发地址&#xff1a;玖毅论坛 第二篇&#xff1a;后台管理路径 看到好多人在网上问discuz管理路径怎么…

围观|微信小程序开发数据绑定最佳实践?

在微信小程序开发中进行数据绑定时,遵循一些最佳实践可以帮助你编写更高效、可维护的代码。以下是一些数据绑定的最佳实践: 1. 保持数据简洁 尽量保持 data 对象中的数据简洁明了,避免嵌套过深的数据结构。这样可以减少数据更新的复杂性,提高代码的可读性。 Page({data:…

SocketIO的常见问题

1 常见问题 连接超时&#xff1a;当客户端尝试连接到服务器时&#xff0c;如果连接超出了设定的时间限制&#xff0c;就会发生连接超时异常。这可能是由于网络延迟、服务器负载过高或防火墙限制等原因引起的。读/写超时&#xff1a;在Socket通信中&#xff0c;当读/写操作超过…

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 二、ArkWeb 1、概念介绍 ArkWeb是用于应用程序中显示Web页面内容的Web组件&#xff0c;为开发者提供页面加载、页面交互、页面调…

文献检索中JCR与SCIE的区别

一、SCIE Science Citation Index-Expanded&#xff08;SCI-E&#xff0c;科学引文索引&#xff09;,属于Web of Science中一个子库&#xff0c;是全球著名的科学引文索引数据库&#xff0c;收录了全球自然科学、工程技术、临床医学等领域内170多个学科的9500多种国际性、高影响…

volta引发的血案

什么是volta volta用于做项目级别的node版本控制&#xff0c;当手头上的项目有多个时&#xff0c;且node版本可能还不一样&#xff0c;我们需要不断切换node版本。使用volta可以很好的解决这个问题。只需要安装volta&#xff0c;然后在下面的package.json中配置好node版本即可…

Oracle 用户-表空间-表之间关系常用SQL

问题&#xff1a; 当某一个表数据量特别大&#xff0c;突然插入数据一直失败&#xff0c;可能是表空间不足&#xff0c;需要查看表的使用率 用户-表空间-表之间关系&#xff1a;用户可以有多个表空间&#xff0c;表空间可以有多个表&#xff0c;表只能拥有一个表空间和用户 1.…

跨国企业是否适合使用专线连接国际互联网?

在跨国企业开展国际通信时&#xff0c;需要稳定高效的网络连接来保障业务运作。虽然传统的互联网连接方式较为普遍&#xff0c;但由于带宽有限、网络延迟等问题&#xff0c;跨国企业往往会遇到网速缓慢、连接不稳定等挑战。因此&#xff0c;专线连接逐渐成为跨国企业的一个可行…