ffmpeg 里面一些奇怪的函数命名 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justou
V2EX    C

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

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

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

    /div>
    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     Solana     2900 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:04 PVG 22:04 LAX 06:04 JFK 09:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86