FFMPEG4.1源码分析之 av_opt_next()

1 av_opt_next()


av_opt_next() 声明:

  • 所属库:libavutil(lavu)
  • 头文件:libavutil/opt.h
  • 声明:枚举所有属于obj对象的AVOptions  
    ​
    /**
     * Iterate over all AVOptions belonging to obj.
     *
     * obj必须是AVOptions-enabled struct,意思是结构体obj的第一成员必须是AVClass*;
     * 或者obj是AVClass**对象
     * @param obj an AVOptions-enabled struct or a double pointer to an
     *            AVClass describing it.
     * prev为上一次调用av_opt_next()所获取的AVOption对象
     * @param prev result of the previous call to av_opt_next() on this object
     *             or NULL
     * @return next AVOption or NULL
     */
    const AVOption *av_opt_next(const void *obj, const AVOption *prev);
    
    ​

av_opt_next() 源码:

  • 源文件:opt.c
    ​
    const AVOption *av_opt_next(const void *obj, const AVOption *last)
    {
        const AVClass *class;
        // 若obj对象为空,自然option也肯定不存在,返回空
        if (!obj) 
            return NULL;
    
        // 这个是重点:
        // obj是一个对象的指针,其指向的对象实体的第一个参数是一个指向AVClass对象的指针
        // 如下的强制转换就是取出obj第一个参数值,也即指向obj对象关联的AVClass对象的地址
        // 赋值给class
        class = *(const AVClass**)obj; 
    
        // 如果last为空,也即没有指定AVOption对象
        // 并且class不为空,也即obj这个对象第一个参数确实是AVClass对象指针
        // 并且AVClass->option不为空,也即指向有效的AVOption数组
        // 并且class->option[0].name不为空,也即AVOption数组的第一项的name成员不为空
        if (!last && class && class->option && class->option[0].name)     
            return class->option;         // 返回AVOption数组的第一个成员
    
        // 如果last不为空,即已被指定
        // 并且last[1].name不为空,即注意理解这个last[1]的数组操作:last指向的AVOption的下一个AVOption的name成员不为空。
        if (last && last[1].name)
            return ++last;               // 返回AVOtion数组的last的下一个AVOption,注意一般AVOption数组的最后一项是NULL。
    
        // 若之前没找到合适的AVOption,那么返回NULL
        return NULL;
    }
    
    ​

    源码比较短,也比较简单,分析已经在源码上注释了,此处就不多赘述了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值