ffmpeg 里面一些奇怪的函数命名

2017-05-07 00:14:38 +08:00
 justou

在 ffmpeg 的源码中看到一些函数名:

avcodec_alloc_context3

avcodec_open2

avcodec_decode_video2, ...

后面跟的数字 2, 3 是什么意思,avcodec_alloc_context,avcodec_alloc_context2 发生了什么?

如果不同版本之间这些函数的实现改变了,为什么不直接用 avcodec_alloc_context,avcodec_open,avcodec_decode_video 命名,而要加一些数字,哪个 2,哪个 3 不是很容易搞混么?这是为了与旧版的兼容采取的不得已的措施么?

3040 次点击
所在节点    C
17 条回复
ryd994
2017-05-07 00:32:24 +08:00
可能是不止一处用到,只能逐渐更换
Fishdrowned
2017-05-07 00:35:59 +08:00
没看过源码,我猜这个数字指的是参数的数量
justou
2017-05-07 00:41:15 +08:00
@Fishdrowned 我开始也这样以为,但是看了函数原型后。。。

int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)

AVCodecContext * avcodec_alloc_context3 (const AVCodec *codec)
LukeXuan
2017-05-07 01:03:24 +08:00
@justou 有没有数字小的函数存在
有一种情形是更新 API 但是为了兼容性只能这么明明保留原来的函数
justou
2017-05-07 01:04:47 +08:00
@ryd994 你的意思是,举个例子来说,整个库里有些地方用的新实现的 avcodec_alloc_context3,但有些地方仍需要用 avcodec_alloc_context2,最后版本更新完了就全是 avcodec_alloc_context3 了。

我在谷歌的过程当中看到 make avcodec_alloc_context3 officially public 的字样后这样猜想的。
ryd994
2017-05-07 01:08:13 +08:00
@justou 我觉得就是
justou
2017-05-07 01:08:51 +08:00
@LukeXuan
估计是了,我看到 ffmpeg0.6 的源码里有这样的东西:

AVCodecContext* avcodec_alloc_context (void)
......

AVCodecContext* avcodec_alloc_context2(enum AVMediaType)
THIS FUNCTION IS NOT YET PART OF THE PUBLIC API! we WILL change its arguments and name a few times!
justou
2017-05-07 01:11:58 +08:00
这算是大型 C 项目的维护过于蛋疼才催生出来的东西么 23333
LukeXuan
2017-05-07 01:17:36 +08:00
@justou Linux 也有
weyou
2017-05-07 01:32:54 +08:00
其实 windows 也有类似的 api,或加数字或加 Ex 之类的
geelaw
2017-05-07 01:42:52 +08:00
@weyou 加数字和加 Ex 是两码事。数字是版本变化,经常用在 COM 接口的命名上,加 Ex 和不加 Ex 一般是同时有,加 Ex 提供更多自定义选项(有的时候无 Ex 版本是 Ex 版本的宏)
lrxiao
2017-05-07 09:03:58 +08:00
ABI 问题..蛋疼
weyou
2017-05-07 15:57:27 +08:00
@geelaw 第一,加数字的函数一般也是同时存在的。第二,加 ex 其实也是由于版本的不同,只不过仅用在增强参数 /功能的函数名上。
bombless
2017-05-07 18:05:08 +08:00
这个应该是让链接器出来抱怨吧。cpp 有类型安全的链接 c 没有,所以需要这样做。

毕竟编译期报错永远比运行期报错好
bombless
2017-05-07 18:09:55 +08:00
说起来接口应该可以单独编版本才对……毕竟接口即使类型不变有时候语意需要变如果能给接口一个大版本号就好了。
比如 use api_name[version=1];表示用 1 号的接口。当然这是技术债,但是适当负债也是项目良好运行的表现。
(当然,我串话题了,逃
pexcn
2017-05-08 10:05:32 +08:00
版本号吧?
ahtsiu
2017-05-08 11:13:52 +08:00
观察一下 avcodec_encode_video 和 avcodec_encode_video2 就知道了,参数类型变了。ffmpeg 很多时候是作为动态库存在的,C 函数不改名字只改参数类型在链接时并不会报错。
其二这么做往往也只是在小范围,不涉及主要的架构和处理流程的改动的时候才会用吧,算是权宜之计。从 ffmpeg 3.1 开始,编解码的流程统一用 avcodec_send_frame/packet() 和 avcodec_receive_packet/frame() ,这个 avcodec_encode_audio2/video2 就 deprecated 了,估计再过几个版本就会移除。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/359630

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX