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

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; }
  打印输出:
  演示代码打印

有糖尿病的人要长寿,3个习惯要养成,3个错误要避免有糖尿病的人能长寿吗?答案是肯定的,实际生活中可以见到,不少糖尿病人确实比很多正常人更健康更长寿,追根溯源,他们致胜的法宝就是自律,为什么呢?糖尿病是一种可防可治的生活方式病,干预高圆圆出席时尚活动,穿着性感戴奢华项链出镜,43岁越来越美了近日,高圆圆现身参加品牌活动,作为品牌代言人高圆圆一登场可谓是出尽风头,她一改往日的清新淡雅风走起了性感女神风让人眼前一亮。当天高圆圆身穿一席蓝色紧身丝绒连衣裙把整个身材轮廓勾勒的中药诠解石膏药材概述石膏为含水硫酸钙纤维状结晶聚合体的矿石。主产于湖北甘肃等地。随时可釆。以块大色白质松半透明纵断面如丝者为佳。生用或煅用。(石膏)性味归经石膏甘辛,大寒。归肺胃经。炮制及功效时间真的存在吗?头条创作挑战赛宁缺堂主人独处山居,悠闲度日。门外绿树成荫,时有农夫来往墙内菜畦整洁,偶见彩蝶回旋。这日,刚上大学的孙子明明放假归来,与爷爷同坐石几旁,边看书,边品茶聊天。是时,晴空中医江志峰吃中药的最佳时候是什么?吃中药的最佳时候是什么?传统中医呢认为它是在饭前吃或者饭后吃,还是在凌晨吃,或者是在晚上吃啊,都是很有讲究的。这个呢不但要看我们中药方剂它自己的药性,其实我们还要看这个本身药物开出世界杯完整时间表(北京时间)世界杯完整时间表(北京时间)日期球队比赛场地北京时间赛果11月21日卡塔尔VS厄瓜多尔阿尔拜特体育场0000011月21日塞内加尔VS荷兰图玛玛体育场18000011月21日英格兰勇士仁至义尽,库里竭尽全力!你并不是杜兰特,现在也该让位了作为上赛季总冠军,本赛季开打前三周多的时间,勇士整体表现很挣扎,5胜7负的战绩,西部第11名的位置。当勇士内部出现各种各样的问题时,就连裁判都不想让勇士赢球,一些莫须有的吹罚颇具争智慧矿基本架构定义及建设标智慧矿的基本构架是什么?智慧矿包括了矿的各个,也是绿矿建设的更层级。就其基本构架按照通常的划分法,主要包括三个,就是智慧产系统智慧职业健康与安全系统智慧技术与管理系统。智慧矿的主要重新思考这个世界的15位年轻创始人(五)阿米拉和时尚电商平台15YoungFoundersRethinkingEverything(5)重新思考这个世界的15位年轻创始人(五)阿米拉热苏尔和TheFolkloreGroup时尚电商平台从留学发现这个世界的真相(下)我们现在所处的这个世界,全部都是假的!喜怒哀乐,情苦悲愁,都是假的!声望名誉,权势地位,都是假的!即便是你眼睛看到的花花世界,也是经过你的大脑处理过的!那么,什么才是真的?你读过的16。1。1最省电方法根据最近两天对16。1。1系统的深入研究和体验,我找到了最好的省电方法,果友们不妨试试。首先要关闭后台APP刷新功能,它不会对我们手机运行有影响。后台应用刷新这个概念其实可以跟应用
接地气!全红婵老爸光膀子喂鸡,肚腩明显,老妈用3个水桶洗衣服奥运冠军是所有运动员都向往的理想的成绩,一旦获得,不仅成为国家的骄傲,也立刻提高的自己的体坛地位,同时也能收获诸多金钱奖励,包括国家社会企业和个人的奖赠等,面对突如其来的财富和荣誉一首同桌的你让他赚了800万,为啥词曲作者高晓松只赚了800块一1996年,因为一件事,老狼和曾经带领他成为校园民谣之父,且甘愿自己挣800块老狼挣800万的高晓松,彻底决裂。和高晓松牛逼的家世相比,老狼的家世也不错,本名王阳的他,1968年秀恩爱?他们早婚变了娱乐聚焦哈喽呀,瓜友们,晚上好这几年鱼圈的姐姐和哥哥们都活跃了起来,同时秀恩爱的明星夫妻们也越来越多。最近有一对儿夫妻又开始秀别样恩爱,外表看上去是大哥和娇妻,但呈现出的情况又极具张靓颖与冯轲相爱15年,被骗6亿后转身离开,在伤痛中涅槃重生爱情待在高山之巅,在理智的谷地之上。爱情是生活的升华人生的绝顶,它难得出现。爱情是一个亘古不变的话题。在面对爱情的道路上,有人会选择小心翼翼地走下去,也有一些人会不顾周围的反对,为虚假消息满天飞!大衣哥儿子被结婚,婚纱照有明显的P图痕迹网络时代,有些本来就是虚假的事情,被媒体们传着传着就变成了了真的,就像大衣哥的儿子朱小伟再婚这件事情!日前,在网络上突然传出几张婚纱照,是大衣哥儿子朱小伟和某位不知名女子的,画面中连衣裙如何穿才不烂大街?这些博主的穿搭思路值得get,学起来现在来到夏天的末尾,不过连衣裙仍然是女孩们日常搭配不可忽视的服装,穿连衣裙需要掌握的技巧很多,比如连衣裙怎么挑选,连衣裙怎么搭配,以及我们的发型妆容应该如何匹配都是我们需要认真思考秋冬穿搭单品针织背心女生必备单品平价高颜值的马甲背心!你的内搭你准备好了吗?这次和大家分享了自家针织马甲背心,值得大家珍藏的哟!针织马甲不仅可以搭配打底衫,还可以搭配衬衫平时打底衫套个针织马甲,在加一踢嗨了!韦世豪向郑智喊话希望你能一直带我们走下去果真是换帅如换刀,郑智一回归韦世豪就被彻底激活,连韦世豪也踢嗨了,赛后向郑智喊话希望你能一直带我们走下去。在中超第14轮的一场比赛中,韦世豪踢嗨了,独进2球还差点上演帽子戏法。上半争冠失败!若真的用布朗换来杜兰特,明年绿凯反而更加难以夺冠?2122赛季,虽然绿凯打出了51胜31负东部第二战绩,但是相比排名第三的雄鹿第四的费城第七的篮网,他们仍旧无法成为外界眼中的争冠热门。甚至在冲出东部的预测结果中,绿凯还被雄鹿费城篮老詹4项历史第一,哈登做好事,篮网有意安东尼,阿杜欧文留队?NBA联盟现在各大球队基本确定下赛季阵容,只有杜兰特米切尔和欧文三人的交易还没有定夺。篮网队老板蔡崇信如今还是不愿意送走杜兰特,篮网管理层还想签约安东尼补强,以此来安抚杜兰特,希望CBA名帅小诸葛李秋平细数CBA历史上的名几乎都在北方,然而有一位南方教练他的能力和成就足以在CBA教练历史上名列前茅。李秋平1959年出生于上海和很多名帅生涯从一终一样。球员时期的他效力于上海队并且担