opt.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * AVOptions
  3.  * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21. /**
  22.  * @file opt.c
  23.  * AVOptions
  24.  * @author Michael Niedermayer <michaelni@gmx.at>
  25.  */
  26. #include "avcodec.h"
  27. #include "opt.h"
  28. #include "eval.h"
  29. #include <stdio.h>
  30. #include "define.h"
  31. //FIXME order them and do a bin search
  32. const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags){
  33.     AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
  34.     const AVOption *o= c->option;
  35.     for(;o && o->name; o++){
  36.         if(!strcmp(o->name, name) && (!unit || (o->unit && !strcmp(o->unit, unit))) && (o->flags & mask) == flags )
  37.             return o;
  38.     }
  39.     return NULL;
  40. }
  41. const AVOption *av_next_option(void *obj, const AVOption *last){
  42.     if(last && last[1].name) return ++last;
  43.     else if(last)            return NULL;
  44.     else                     return (*(AVClass**)obj)->option;
  45. }
  46. //static const AVOption *av_set_number(void *obj, const char *name, double num, int den, int64_t intnum){
  47. //    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
  48. //    void *dst;
  49. //    if(!o || o->offset<=0)
  50. //        return NULL;
  51. //
  52. //    if(o->max*den < num*intnum || o->min*den > num*intnum) {
  53. //        av_log(NULL, AV_LOG_ERROR, "Value %lf for parameter '%s' out of range.n", num, name);
  54. //        return NULL;
  55. //    }
  56. //
  57. //    dst= ((uint8_t*)obj) + o->offset;
  58. //
  59. //    switch(o->type){
  60. //    case FF_OPT_TYPE_FLAGS:
  61. //    case FF_OPT_TYPE_INT:   *(int       *)dst= llrint(num/den)*intnum; break;
  62. //    case FF_OPT_TYPE_INT64: *(int64_t   *)dst= llrint(num/den)*intnum; break;
  63. //    case FF_OPT_TYPE_FLOAT: *(float     *)dst= num*intnum/den;         break;
  64. //    case FF_OPT_TYPE_DOUBLE:*(double    *)dst= num*intnum/den;         break;
  65. //    case FF_OPT_TYPE_RATIONAL:
  66. //        if((int)num == num) *(AVRational*)dst= (AVRational){num*intnum, den};
  67. //        else                *(AVRational*)dst= av_d2q(num*intnum/den, 1<<24);
  68. //        break;
  69. //    default:
  70. //        return NULL;
  71. //    }
  72. //    return o;
  73. //}
  74. //
  75. //static const AVOption *set_all_opt(void *v, const char *unit, double d){
  76. //    AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
  77. //    const AVOption *o= c->option;
  78. //    const AVOption *ret=NULL;
  79. //
  80. //    for(;o && o->name; o++){
  81. //        if(o->type != FF_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)){
  82. //            double tmp= d;
  83. //            if(o->type == FF_OPT_TYPE_FLAGS)
  84. //                tmp= av_get_int(v, o->name, NULL) | (int64_t)d;
  85. //
  86. //            av_set_number(v, o->name, tmp, 1, 1);
  87. //            ret= o;
  88. //        }
  89. //    }
  90. //    return ret;
  91. //}
  92. //
  93. //static double const_values[]={
  94. //    M_PI,
  95. //    M_E,
  96. //    FF_QP2LAMBDA,
  97. //    0
  98. //};
  99. //
  100. //static const char *const_names[]={
  101. //    "PI",
  102. //    "E",
  103. //    "QP2LAMBDA",
  104. //    0
  105. //};
  106. //
  107. //static int hexchar2int(char c) {
  108. //    if (c >= '0' && c <= '9') return c - '0';
  109. //    if (c >= 'a' && c <= 'f') return c - 'a' + 10;
  110. //    if (c >= 'A' && c <= 'F') return c - 'A' + 10;
  111. //    return -1;
  112. //}
  113. //
  114. //const AVOption *av_set_string(void *obj, const char *name, const char *val){
  115. //    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
  116. //    if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){
  117. //        return set_all_opt(obj, o->unit, o->default_val);
  118. //    }
  119. //    if(!o || !val || o->offset<=0)
  120. //        return NULL;
  121. //    if(o->type == FF_OPT_TYPE_BINARY){
  122. //        uint8_t **dst = (uint8_t **)(((uint8_t*)obj) + o->offset);
  123. //        int *lendst = (int *)(dst + 1);
  124. //        uint8_t *bin, *ptr;
  125. //        int len = strlen(val);
  126. //        av_freep(dst);
  127. //        *lendst = 0;
  128. //        if (len & 1) return NULL;
  129. //        len /= 2;
  130. //        ptr = bin = av_malloc(len);
  131. //        while (*val) {
  132. //            int a = hexchar2int(*val++);
  133. //            int b = hexchar2int(*val++);
  134. //            if (a < 0 || b < 0) {
  135. //                av_free(bin);
  136. //                return NULL;
  137. //            }
  138. //            *ptr++ = (a << 4) | b;
  139. //        }
  140. //        *dst = bin;
  141. //        *lendst = len;
  142. //        return o;
  143. //    }
  144. //    if(o->type != FF_OPT_TYPE_STRING){
  145. //        int notfirst=0;
  146. //        for(;;){
  147. //            int i;
  148. //            char buf[256];
  149. //            int cmd=0;
  150. //            double d;
  151. //            const char *error = NULL;
  152. //
  153. //            if(*val == '+' || *val == '-')
  154. //                cmd= *(val++);
  155. //
  156. //            for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++)
  157. //                buf[i]= val[i];
  158. //            buf[i]=0;
  159. //
  160. //            d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error);
  161. //            if(isnan(d)) {
  162. //                const AVOption *o_named= av_find_opt(obj, buf, o->unit, 0, 0);
  163. //                if(o_named && o_named->type == FF_OPT_TYPE_CONST)
  164. //                    d= o_named->default_val;
  165. //                else if(!strcmp(buf, "default")) d= o->default_val;
  166. //                else if(!strcmp(buf, "max"    )) d= o->max;
  167. //                else if(!strcmp(buf, "min"    )) d= o->min;
  168. //                else if(!strcmp(buf, "none"   )) d= 0;
  169. //                else if(!strcmp(buf, "all"    )) d= ~0;
  170. //                else {
  171. //                    if (error)
  172. //                        av_log(NULL, AV_LOG_ERROR, "Unable to parse option value "%s": %sn", val, error);
  173. //                    return NULL;
  174. //                }
  175. //            }
  176. //            if(o->type == FF_OPT_TYPE_FLAGS){
  177. //                if     (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
  178. //                else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
  179. //            }else{
  180. //                if     (cmd=='+') d= notfirst*av_get_double(obj, name, NULL) + d;
  181. //                else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d;
  182. //            }
  183. //
  184. //            if (!av_set_number(obj, name, d, 1, 1))
  185. //                return NULL;
  186. //            val+= i;
  187. //            if(!*val)
  188. //                return o;
  189. //            notfirst=1;
  190. //        }
  191. //        return NULL;
  192. //    }
  193. //
  194. //    memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val));
  195. //    return o;
  196. //}
  197. //
  198. const AVOption *av_set_double(void *obj, const char *name, double n){
  199. //    return av_set_number(obj, name, n, 1, 1);
  200. return 0;
  201. }
  202. //
  203. static AVOption *AVNULL = 0;
  204. const AVOption *av_set_q(void *obj, const char *name, AVRational n){
  205. //    return av_set_number(obj, name, n.num, n.den, 1);
  206. return 0;
  207. }
  208. //
  209. const AVOption *av_set_int(void *obj, const char *name, int64_t n){
  210. //    return av_set_number(obj, name, 1, 1, n);
  211. return 0;
  212. }
  213. //
  214. ///**
  215. // *
  216. // * @param buf a buffer which is used for returning non string values as strings, can be NULL
  217. // * @param buf_len allocated length in bytes of buf
  218. // */
  219. //const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len){
  220. //    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
  221. //    void *dst;
  222. //    uint8_t *bin;
  223. //    int len, i;
  224. //    if(!o || o->offset<=0)
  225. //        return NULL;
  226. //    if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len))
  227. //        return NULL;
  228. //
  229. //    dst= ((uint8_t*)obj) + o->offset;
  230. //    if(o_out) *o_out= o;
  231. //
  232. //    switch(o->type){
  233. //    case FF_OPT_TYPE_FLAGS:     snprintf(buf, buf_len, "0x%08X",*(int    *)dst);break;
  234. //    case FF_OPT_TYPE_INT:       snprintf(buf, buf_len, "%d" , *(int    *)dst);break;
  235. //    case FF_OPT_TYPE_INT64:     snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break;
  236. //    case FF_OPT_TYPE_FLOAT:     snprintf(buf, buf_len, "%f" , *(float  *)dst);break;
  237. //    case FF_OPT_TYPE_DOUBLE:    snprintf(buf, buf_len, "%f" , *(double *)dst);break;
  238. //    case FF_OPT_TYPE_RATIONAL:  snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break;
  239. //    case FF_OPT_TYPE_STRING:    return *(void**)dst;
  240. //    case FF_OPT_TYPE_BINARY:
  241. //        len = *(int*)(((uint8_t *)dst) + sizeof(uint8_t *));
  242. //        if(len >= (buf_len + 1)/2) return NULL;
  243. //        bin = *(uint8_t**)dst;
  244. //        for(i = 0; i < len; i++) snprintf(buf + i*2, 3, "%02X", bin[i]);
  245. //        break;
  246. //    default: return NULL;
  247. //    }
  248. //    return buf;
  249. //}
  250. //
  251. //static int av_get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum){
  252. //    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
  253. //    void *dst;
  254. //    if(!o || o->offset<=0)
  255. //        goto error;
  256. //
  257. //    dst= ((uint8_t*)obj) + o->offset;
  258. //
  259. //    if(o_out) *o_out= o;
  260. //
  261. //    switch(o->type){
  262. //    case FF_OPT_TYPE_FLAGS:     *intnum= *(unsigned int*)dst;return 0;
  263. //    case FF_OPT_TYPE_INT:       *intnum= *(int    *)dst;return 0;
  264. //    case FF_OPT_TYPE_INT64:     *intnum= *(int64_t*)dst;return 0;
  265. //    case FF_OPT_TYPE_FLOAT:     *num=    *(float  *)dst;return 0;
  266. //    case FF_OPT_TYPE_DOUBLE:    *num=    *(double *)dst;return 0;
  267. //    case FF_OPT_TYPE_RATIONAL:  *intnum= ((AVRational*)dst)->num;
  268. //                                *den   = ((AVRational*)dst)->den;
  269. //                                                        return 0;
  270. //    }
  271. //error:
  272. //    *den=*intnum=0;
  273. //    return -1;
  274. //}
  275. //
  276. //double av_get_double(void *obj, const char *name, const AVOption **o_out){
  277. //    int64_t intnum=1;
  278. //    double num=1;
  279. //    int den=1;
  280. //
  281. //    av_get_number(obj, name, o_out, &num, &den, &intnum);
  282. //    return num*intnum/den;
  283. //}
  284. //
  285. //AVRational av_get_q(void *obj, const char *name, const AVOption **o_out){
  286. //    int64_t intnum=1;
  287. //    double num=1;
  288. //    int den=1;
  289. //
  290. //    av_get_number(obj, name, o_out, &num, &den, &intnum);
  291. //    if(num == 1.0 && (int)intnum == intnum)
  292. //        return (AVRational){intnum, den};
  293. //    else
  294. //        return av_d2q(num*intnum/den, 1<<24);
  295. //}
  296. //
  297. //int64_t av_get_int(void *obj, const char *name, const AVOption **o_out){
  298. //    int64_t intnum=1;
  299. //    double num=1;
  300. //    int den=1;
  301. //
  302. //    av_get_number(obj, name, o_out, &num, &den, &intnum);
  303. //    return num*intnum/den;
  304. //}
  305. //
  306. //static void opt_list(void *obj, void *av_log_obj, const char *unit)
  307. //{
  308. //    const AVOption *opt=NULL;
  309. //
  310. //    while((opt= av_next_option(obj, opt))){
  311. //        if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM)))
  312. //            continue;
  313. //
  314. //        /* Don't print CONST's on level one.
  315. //         * Don't print anything but CONST's on level two.
  316. //         * Only print items from the requested unit.
  317. //         */
  318. //        if (!unit && opt->type==FF_OPT_TYPE_CONST)
  319. //            continue;
  320. //        else if (unit && opt->type!=FF_OPT_TYPE_CONST)
  321. //            continue;
  322. //        else if (unit && opt->type==FF_OPT_TYPE_CONST && strcmp(unit, opt->unit))
  323. //            continue;
  324. //        else if (unit && opt->type == FF_OPT_TYPE_CONST)
  325. //            av_log(av_log_obj, AV_LOG_INFO, "   %-15s ", opt->name);
  326. //        else
  327. //            av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name);
  328. //
  329. //        switch( opt->type )
  330. //        {
  331. //            case FF_OPT_TYPE_FLAGS:
  332. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<flags>" );
  333. //                break;
  334. //            case FF_OPT_TYPE_INT:
  335. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int>" );
  336. //                break;
  337. //            case FF_OPT_TYPE_INT64:
  338. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int64>" );
  339. //                break;
  340. //            case FF_OPT_TYPE_DOUBLE:
  341. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<double>" );
  342. //                break;
  343. //            case FF_OPT_TYPE_FLOAT:
  344. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<float>" );
  345. //                break;
  346. //            case FF_OPT_TYPE_STRING:
  347. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<string>" );
  348. //                break;
  349. //            case FF_OPT_TYPE_RATIONAL:
  350. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<rational>" );
  351. //                break;
  352. //            case FF_OPT_TYPE_BINARY:
  353. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<binary>" );
  354. //                break;
  355. //            case FF_OPT_TYPE_CONST:
  356. //            default:
  357. //                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" );
  358. //                break;
  359. //        }
  360. //        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.');
  361. //        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.');
  362. //        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM   ) ? 'V' : '.');
  363. //        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM   ) ? 'A' : '.');
  364. //        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.');
  365. //
  366. //        if(opt->help)
  367. //            av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
  368. //        av_log(av_log_obj, AV_LOG_INFO, "n");
  369. //        if (opt->unit && opt->type != FF_OPT_TYPE_CONST) {
  370. //            opt_list(obj, av_log_obj, opt->unit);
  371. //        }
  372. //    }
  373. //}
  374. //
  375. //int av_opt_show(void *obj, void *av_log_obj){
  376. //    if(!obj)
  377. //        return -1;
  378. //
  379. //    av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:n", (*(AVClass**)obj)->class_name);
  380. //
  381. //    opt_list(obj, av_log_obj, NULL);
  382. //
  383. //    return 0;
  384. //}
  385. //
  386. ///** Set the values of the AVCodecContext or AVFormatContext structure.
  387. // * They are set to the defaults specified in the according AVOption options
  388. // * array default_val field.
  389. // *
  390. // * @param s AVCodecContext or AVFormatContext for which the defaults will be set
  391. // */
  392. void av_opt_set_defaults2(void *s, int mask, int flags)
  393. {
  394.     const AVOption *opt = NULL;
  395.     while ((opt = av_next_option(s, opt)) != NULL) {
  396.         if((opt->flags & mask) != flags)
  397.             continue;
  398.         switch(opt->type) {
  399.             case FF_OPT_TYPE_CONST:
  400.                 /* Nothing to be done here */
  401.             break;
  402.             case FF_OPT_TYPE_FLAGS:
  403.             case FF_OPT_TYPE_INT: {
  404.                 int val;
  405.                 val = opt->default_val;
  406.                 av_set_int(s, opt->name, val);
  407.             }
  408.             break;
  409.             case FF_OPT_TYPE_FLOAT: {
  410.                 double val;
  411.                 val = opt->default_val;
  412.                 av_set_double(s, opt->name, val);
  413.             }
  414.             break;
  415.             case FF_OPT_TYPE_RATIONAL: {
  416.                 AVRational val;
  417.                 val = av_d2q(opt->default_val, INT_MAX);
  418.                 av_set_q(s, opt->name, val);
  419.             }
  420.             break;
  421.             case FF_OPT_TYPE_STRING:
  422.             case FF_OPT_TYPE_BINARY:
  423.                 /* Cannot set default for string as default_val is of type * double */
  424.             break;
  425.             default:
  426.                 av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yetn", opt->type, opt->name);
  427.         }
  428.     }
  429. }
  430. //
  431. //void av_opt_set_defaults(void *s){
  432. //    av_opt_set_defaults2(s, 0, 0);
  433. //}
  434. //