范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

ffmpeg的AVOption模块API使用演示

  查找选项
  1、av_opt_next/av_opt_find函数可以直接在AVClass对象上查找选项:// 1、API直接操作AVClass结构体  // 通过av_opt_next查找AVClass中的所有选项 const AVClass *test_c = &test_class; const AVOption *ret_c = NULL; while ((ret_c = av_opt_next(&test_c, ret_c))) {     printf("av_opt_next->AVClass option name: %s ", ret_c->name); } printf(" ");  // 通过av_opt_find查找AVClass中的某个选项 包括子结构体中的选项 // serach_flags需要设置为AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ const AVOption *find_c = av_opt_find(&test_c, "test_flags", NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ); if (find_c) {     printf("av_opt_find->AVClass option name: %s ", find_c->name); } printf(" ");
  2、查找结构体中子结构体的AVClass并遍历子结构体的所有选项:// 查找结构体中子结构体的AVClass并遍历子结构体的所有选项 void *iter = NULL; const AVClass *child_c = av_opt_child_class_iterate(test_c, &iter); if (child_c) {     const AVOption *ret_c = NULL;     while ((ret_c = av_opt_next(&child_c, ret_c))) {         printf("av_opt_child_class_iterate->av_opt_next->AVClass option name: %s ", ret_c->name);     } } printf(" ");
  3、API操作结构体对象test_struct *obj = alloc_test_struct();  // 演示av_opt_child_next和av_opt_next用法 void *child = NULL; child = av_opt_child_next(obj, child); if (child) {     child_struct *child_obj = (child_struct *)child;      const AVOption *ret = NULL;     while ((ret = av_opt_next(child_obj, ret))) {         printf("av_opt_child_next->av_opt_next->obj option name: %s ", ret->name);     } } printf(" ");  // 演示av_opt_find用法 const AVOption *find = av_opt_find(obj, "test_flags", NULL, 0, AV_OPT_SEARCH_CHILDREN); if (find) {     printf("av_opt_find->obj option name: %s ", find->name); } printf(" ");读写选项
  通过av_opt_get获取某个选项的值,通过av_opt_set设置某个选项的值:/*************************  * 二、读写选项  * **********************/ int res = -1; uint8_t *buf = NULL; res = av_opt_get(obj, "test_int", AV_OPT_SEARCH_CHILDREN, &buf); if (res >= 0) {     printf("before test_int value: %s ", buf);     av_free(buf); } res = av_opt_set(obj, "test_int", "100", AV_OPT_SEARCH_CHILDREN); res = av_opt_get(obj, "test_int", AV_OPT_SEARCH_CHILDREN, &buf); if (res >= 0) {     printf("after test_int value: %s ", buf);     av_free(buf); }
  完整演示代码:#include  #include   void *child_next(void *obj, void *prev); const AVClass* child_class_iterate(void **iter);  typedef struct child_struct {   const AVClass *class;   int flags_opt; } child_struct;  static const AVOption child_opts[] = {   { "test_flags", "This is a test option of flags type.",    offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX },   { NULL }, };  static const AVClass child_class = {   .class_name = "child class",   .item_name  = av_default_item_name,   .option     = child_opts,   .version    = LIBAVUTIL_VERSION_INT, };  typedef struct test_struct {   const AVClass *class;   int      int_opt;   char    *str_opt;   uint8_t *bin_opt;   int      bin_len;   struct child_struct *child_struct; } test_struct;  static const AVOption test_options[] = {   {"test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),     AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX},   {"test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),     AV_OPT_TYPE_STRING },   {"test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),   AV_OPT_TYPE_BINARY},   {NULL}, };  static const AVClass test_class = {   .class_name          = "test class",   .item_name           = av_default_item_name,   .option              = test_options,   .child_next          = child_next,   .child_class_iterate = child_class_iterate,   .version             = LIBAVUTIL_VERSION_INT,  };  void *child_next(void *obj, void *prev) {   test_struct *t = obj;   if (!prev && t->child_struct)     return t->child_struct;   return NULL; }  const AVClass* child_class_iterate(void **iter) {   const AVClass *c = *iter ? NULL : &child_class;   *iter = (void*)(uintptr_t)c;   return c; }  test_struct *alloc_test_struct(void) {   test_struct *ret = av_mallocz(sizeof(*ret));   ret->class = &test_class;   ret->child_struct = av_mallocz(sizeof(*ret->child_struct));   ret->child_struct->class = &child_class;   av_opt_set_defaults(ret->child_struct);   av_opt_set_defaults(ret);   return ret; }  void free_test_struct(test_struct **foo) {   av_opt_free((*foo)->child_struct);   av_opt_free(*foo);    av_freep(&((*foo)->child_struct));   av_freep(foo); }  int main() {     /*************************      * 一、查找选项      * **********************/     // 1、API直接操作AVClass结构体      // 通过av_opt_next查找AVClass中的所有选项     const AVClass *test_c = &test_class;     const AVOption *ret_c = NULL;     while ((ret_c = av_opt_next(&test_c, ret_c))) {         printf("av_opt_next->AVClass option name: %s ", ret_c->name);     }     printf(" ");      // 通过av_opt_find查找AVClass中的某个选项 包括子结构体中的选项     // serach_flags需要设置为AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ     const AVOption *find_c = av_opt_find(&test_c, "test_flags", NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);     if (find_c) {         printf("av_opt_find->AVClass option name: %s ", find_c->name);     }     printf(" ");      // 查找结构体中子结构体的AVClass并遍历子结构体的所有选项     void *iter = NULL;     const AVClass *child_c = av_opt_child_class_iterate(test_c, &iter);     if (child_c) {         const AVOption *ret_c = NULL;         while ((ret_c = av_opt_next(&child_c, ret_c))) {             printf("av_opt_child_class_iterate->av_opt_next->AVClass option name: %s ", ret_c->name);         }     }     printf(" ");      // 2、API操作结构体对象     test_struct *obj = alloc_test_struct();      // 演示av_opt_child_next和av_opt_next用法     void *child = NULL;     child = av_opt_child_next(obj, child);     if (child) {         child_struct *child_obj = (child_struct *)child;          const AVOption *ret = NULL;         while ((ret = av_opt_next(child_obj, ret))) {             printf("av_opt_child_next->av_opt_next->obj option name: %s ", ret->name);         }     }     printf(" ");      // 演示av_opt_find用法     const AVOption *find = av_opt_find(obj, "test_flags", NULL, 0, AV_OPT_SEARCH_CHILDREN);     if (find) {         printf("av_opt_find->obj option name: %s ", find->name);     }     printf(" ");      /*************************      * 二、读写选项      * **********************/     int res = -1;     uint8_t *buf = NULL;     res = av_opt_get(obj, "test_int", AV_OPT_SEARCH_CHILDREN, &buf);     if (res >= 0) {         printf("before test_int value: %s ", buf);         av_free(buf);     }     res = av_opt_set(obj, "test_int", "100", AV_OPT_SEARCH_CHILDREN);     res = av_opt_get(obj, "test_int", AV_OPT_SEARCH_CHILDREN, &buf);     if (res >= 0) {         printf("after test_int value: %s ", buf);         av_free(buf);     }     free_test_struct(&obj);      return 0; }
  打印输出:
  演示代码打印

嘉定阿姨穿了20多年高定,背后的原因让人不得不服很多女性都喜欢买衣服,而家住嘉定工业区福蕴社区的董春阳却恰恰相反,她已经好多年没有买过衣服,却常常有新衣服穿。这到底是怎么回事,跟着小嘉去看看来到董春阳家中,她正坐在缝纫机面前忙碌大理将军洞樱花美景正当时大理苍山斜阳峰脚下的将军洞,是一座有着600多年历史的悠久古刹。将军洞是苍山脚下香火最旺的寺院,也是大理市内最著名的白族本主庙之一。暖冬季节,将军洞景区是欣赏冬樱花最好的地方之一。为何这么多年轻女导游没嫁出去?司机说出了实情,很现实!如今,人们的生活水平日益提高。对于人们来说,会利用空闲时间出去欣赏美丽的风景,然而,许多人在旅行时可能会雇佣漂亮的导游。面对那些非常优秀的美丽导游,价格也会不同,对于人们来说,这些实证西域为中国固有领土之丨苏巴什佛寺两位佛学大师相隔200多年的对话道中华微信公众号阅读原文出新疆阿克苏地区库车市东北23公里,来到却勒塔格山南麓的一片台地上,就看见一片残垣断壁的土墙和各种各样造型的房屋遗址。这就是闻名中外的苏巴什佛寺遗址。苏巴什哪个地区的白酒最好喝?经过大众品鉴,这4款优质白酒被列入清单中国的白酒历史悠久,经过几千年的历史沉淀,发展至今,可以说各类白酒在酒界的发展逐步呈现百花齐放,争奇斗艳的局面了。市场上的白酒类型可以说是千篇一律,又因为地区的划分,每个地方的白酒俄罗斯已付出了血本,却无法打赢乌克兰,俄乌战争普京已落下风文周显俄乌战争正如其他所有的战争一样,谣言满天飞,通常真相反而是在战事完结了好几年之后,才会逐渐揭露出来。好比美国是灭掉了伊拉克的萨达姆复兴党政权之后,才被发现前者的开战理由中,即北约击败俄罗斯,只需要3天文熊姐近日,有网友在社交媒体上针对俄乌冲突提问称如果俄罗斯的军力如此孱弱,为什么北约还没有打败他们?对此,美国共和党众议院议员前美军中校飞行员亚当金辛格回应称,自己希望这名网友只是泽连斯基又说梦话俄罗斯人若让普京垮台,乌会提供帮助近段期间,俄乌两军也陷入胶着状态,乌克兰境内不断遭受俄军空袭,警报声更是不断响起。炮火硝烟弥漫着乌克兰全境,民众再度陷入恐慌情绪。与此同时,乌军的报复行动并没有停止,对俄罗斯机场发白蚂蚁和白鸽清末民国那些卖人和被卖的女性李佩珊文被人拐卖,或者是被骗入娼门,是女人在上海动辄会遇到的一大风险。著名历史学者贺萧(GailHershatter)在她那本今年又推出了中文新版的经典之作,危险的愉悦20世纪上海石龙第三届商埠骑楼文化节启动,将发放50万补贴促消费2022老石龙新魅力石龙第三届商埠骑楼文化节日前正式启动。本届文化节以石龙美食文旅本土文化等为推广载体,通过推出美食纪录片餐厅评选骑楼文化节老店更新等系列文旅商贸促消费活动,为老城中国唯一没有树的市数千年种不活一棵树,这到底是怎么回事?说到树木,大家应该都不陌生,作为生活之中随处可见的植物,树木遍布大江南北,并且成为了人类上千年来生存所必需的物资之一。无论是高山之巅,还是荒漠戈壁,亦或是林海雪原,树木的身影无处不
详解摩托罗拉motoedgeS30骁龙8881亿像素144Hz5000mAh12GB256GB记得第一部手机就是摩托罗拉的翻盖,那个时候的摩托罗拉手机还是反向操作,这款摩托罗拉颜值太高了,浅蓝色,特别漂亮大气,屏幕简洁干净,顺畅,内存大运行内存高,刷了一会视频没有发热感觉,讯飞输入法兔年焕新,兔个好看暴富又暖心春节快过半,很多人都已经开始复工,但走亲访友可能还没结束,回顾假日时光,过年团聚虽温暖和美,却总也少不了小烦恼小尴尬。面对一年未见的弟弟妹妹,有代沟没的聊发拜年短信,没文采只能复制199,全新自带万兆光口的微星MATX主板M4SMD过年前买了一张全新的B150芯片组的MATX主板微星的M4SMD。其实这张板子存在很长时间了,之前也买来玩过,但是这次逛闲鱼,发现有人在卖全新的库存板子,价格也不是很离谱,就买了一海外自动驾驶行业寒潮持续?行业领头羊Waymo被曝裁员文懂车帝原创魏微懂车帝原创行业据国外科技媒体TheInformation消息,近日,谷歌母公司Alphabet旗下自动驾驶子公司Waymo正在裁员。报道称,有Waymo前员工在社交频繁变动人事,ERP巨头缘何急于求成配图来自Canva可画在云转型的行业大背景下,曾经的ERP巨头用友网络(以下简称用友),也选择加入到了云转型的行列之中,但其转型进展似乎并不如意。据用友2022半年报数据显示,其上新元肇始,南大光学成果再登顶刊Science近日,南京大学物理学院彭茹雯教授王牧教授研究组联合美国东北大学刘咏民教授研究组在国际学术期刊Science上发表研究论文Breakingthelimitationofpolariz一篇文章读懂腾讯用人哲学腾讯人力资源与组织管理体系马化腾对于腾讯来说,业务和资金都不是最重要的,业务可以拓展,可以更换,资金可以吸收,而人才却是最不可轻易替代的,是我们最宝贵的财富。本文是腾讯人力资源与组织管理体系,希望你阅读后有一分钟看天下潮商2023。01。29小摩维持腾讯增持评级目标价410港元小摩发研报称,维持腾讯股份增持评级,目标价410港元。腾讯上季业绩表现对近期的股价影响有限,对公司今年股价前景看法维持正面,在年初至今上升28后币圈本周的基本面汇总AAVEV3开始在以太坊上上线。它允许提高资本效率和可组合性的资产DYDX投资者的解锁推迟到12月,价值1。85亿美元,这将使目前的流通量增加一倍目前的循环供应JonesDAO在1曾经不被看好如今领先全世界,上海如何让更多科学家敢于挑战量子通信这类难题在科技创新过程中,尤其是在基础研究领域,1000次的失败可能才能换来1次成功。作为全过程创新的第一环,如何让高校研究机构的科研人员在频繁失败后,仍有动力有能力继续进行研究?全过程创提出量子计算机的数学家去世了,享年85岁,门下2位菲尔兹奖得主羿阁萧箫发自凹非寺量子位公众号QbitAI最早提出量子计算机的人,离世了。85岁的俄罗斯数学家尤里曼宁(YuriManin)的人生故事,永远终止在了2023年1月7日这天。这一消息