V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justou
V2EX  ›  C

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

  •  
  •   justou · 2017-05-07 00:14:38 +08:00 · 3121 次点击
    这是一个创建于 2758 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 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 不是很容易搞混么?这是为了与旧版的兼容采取的不得已的措施么?

    17 条回复    2017-05-08 11:13:52 +08:00
    ryd994
        1
    ryd994  
       2017-05-07 00:32:24 +08:00
    可能是不止一处用到,只能逐渐更换
    Fishdrowned
        2
    Fishdrowned  
       2017-05-07 00:35:59 +08:00 via Android
    没看过源码,我猜这个数字指的是参数的数量
    justou
        3
    justou  
    OP
       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
        4
    LukeXuan  
       2017-05-07 01:03:24 +08:00 via Android
    @justou 有没有数字小的函数存在
    有一种情形是更新 API 但是为了兼容性只能这么明明保留原来的函数
    justou
        5
    justou  
    OP
       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
        6
    ryd994  
       2017-05-07 01:08:13 +08:00
    @justou 我觉得就是
    justou
        7
    justou  
    OP
       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
        8
    justou  
    OP
       2017-05-07 01:11:58 +08:00
    这算是大型 C 项目的维护过于蛋疼才催生出来的东西么 23333
    LukeXuan
        9
    LukeXuan  
       2017-05-07 01:17:36 +08:00 via Android
    @justou Linux 也有
    weyou
        10
    weyou  
       2017-05-07 01:32:54 +08:00 via Android
    其实 windows 也有类似的 api,或加数字或加 Ex 之类的
    geelaw
        11
    geelaw  
       2017-05-07 01:42:52 +08:00 via iPhone   ❤️ 1
    @weyou 加数字和加 Ex 是两码事。数字是版本变化,经常用在 COM 接口的命名上,加 Ex 和不加 Ex 一般是同时有,加 Ex 提供更多自定义选项(有的时候无 Ex 版本是 Ex 版本的宏)
    lrxiao
        12
    lrxiao  
       2017-05-07 09:03:58 +08:00
    ABI 问题..蛋疼
    weyou
        13
    weyou  
       2017-05-07 15:57:27 +08:00 via Android
    @geelaw 第一,加数字的函数一般也是同时存在的。第二,加 ex 其实也是由于版本的不同,只不过仅用在增强参数 /功能的函数名上。
    bombless
        14
    bombless  
       2017-05-07 18:05:08 +08:00 via Android
    这个应该是让链接器出来抱怨吧。cpp 有类型安全的链接 c 没有,所以需要这样做。

    毕竟编译期报错永远比运行期报错好
    bombless
        15
    bombless  
       2017-05-07 18:09:55 +08:00 via Android
    说起来接口应该可以单独编版本才对……毕竟接口即使类型不变有时候语意需要变如果能给接口一个大版本号就好了。
    比如 use api_name[version=1];表示用 1 号的接口。当然这是技术债,但是适当负债也是项目良好运行的表现。
    (当然,我串话题了,逃
    pexcn
        16
    pexcn  
       2017-05-08 10:05:32 +08:00
    版本号吧?
    ahtsiu
        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 了,估计再过几个版本就会移除。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:53 · PVG 21:53 · LAX 05:53 · JFK 08:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.