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; }
源码比较短,也比较简单,分析已经在源码上注释了,此处就不多赘述了。