在 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 不是很容易搞混么?这是为了与旧版的兼容采取的不得已的措施么?
1
ryd994 2017-05-07 00:32:24 +08:00
可能是不止一处用到,只能逐渐更换
|
2
Fishdrowned 2017-05-07 00:35:59 +08:00 via Android
没看过源码,我猜这个数字指的是参数的数量
|
3
justou OP @Fishdrowned 我开始也这样以为,但是看了函数原型后。。。
int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) AVCodecContext * avcodec_alloc_context3 (const AVCodec *codec) |
4
LukeXuan 2017-05-07 01:03:24 +08:00 via Android
@justou 有没有数字小的函数存在
有一种情形是更新 API 但是为了兼容性只能这么明明保留原来的函数 |
5
justou OP @ryd994 你的意思是,举个例子来说,整个库里有些地方用的新实现的 avcodec_alloc_context3,但有些地方仍需要用 avcodec_alloc_context2,最后版本更新完了就全是 avcodec_alloc_context3 了。
我在谷歌的过程当中看到 make avcodec_alloc_context3 officially public 的字样后这样猜想的。 |
7
justou OP @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! |
8
justou OP 这算是大型 C 项目的维护过于蛋疼才催生出来的东西么 23333
|
10
weyou 2017-05-07 01:32:54 +08:00 via Android
其实 windows 也有类似的 api,或加数字或加 Ex 之类的
|
11
geelaw 2017-05-07 01:42:52 +08:00 via iPhone 1
@weyou 加数字和加 Ex 是两码事。数字是版本变化,经常用在 COM 接口的命名上,加 Ex 和不加 Ex 一般是同时有,加 Ex 提供更多自定义选项(有的时候无 Ex 版本是 Ex 版本的宏)
|
12
lrxiao 2017-05-07 09:03:58 +08:00
ABI 问题..蛋疼
|
13
weyou 2017-05-07 15:57:27 +08:00 via Android
@geelaw 第一,加数字的函数一般也是同时存在的。第二,加 ex 其实也是由于版本的不同,只不过仅用在增强参数 /功能的函数名上。
|
14
bombless 2017-05-07 18:05:08 +08:00 via Android
这个应该是让链接器出来抱怨吧。cpp 有类型安全的链接 c 没有,所以需要这样做。
毕竟编译期报错永远比运行期报错好 |
15
bombless 2017-05-07 18:09:55 +08:00 via Android
说起来接口应该可以单独编版本才对……毕竟接口即使类型不变有时候语意需要变如果能给接口一个大版本号就好了。
比如 use api_name[version=1];表示用 1 号的接口。当然这是技术债,但是适当负债也是项目良好运行的表现。 (当然,我串话题了,逃 |
16
pexcn 2017-05-08 10:05:32 +08:00
版本号吧?
|
17
ahtsiu 2017-05-08 11:13:52 +08:00 1
观察一下 avcodec_encode_video 和 avcodec_encode_video2 就知道了,参数类型变了。ffmpeg 很多时候是作为动态库存在的,C 函数不改名字只改参数类型在链接时并不会报错。
其二这么做往往也只是在小范围,不涉及主要的架构和处理流程的改动的时候才会用吧,算是权宜之计。从 ffmpeg 3.1 开始,编解码的流程统一用 avcodec_send_frame/packet() 和 avcodec_receive_packet/frame() ,这个 avcodec_encode_audio2/video2 就 deprecated 了,估计再过几个版本就会移除。 |