8 * typical parsed command line:
9 * msmpeg4:bitrate=720000:qmax=16
16 #define strcasecmp(s1,s2) stricmp(s1,s2)
19 const AVOption avoptions_common
[] = {
20 AVOPTION_CODEC_FLAG("bit_exact", "use only bit-exact stuff", flags
, CODEC_FLAG_BITEXACT
, 0),
21 AVOPTION_CODEC_FLAG("mm_force", "force mm flags", dsp_mask
, FF_MM_FORCE
, 0),
23 AVOPTION_CODEC_FLAG("mm_mmx", "mask MMX feature", dsp_mask
, FF_MM_MMX
, 0),
24 AVOPTION_CODEC_FLAG("mm_3dnow", "mask 3DNow feature", dsp_mask
, FF_MM_3DNOW
, 0),
25 AVOPTION_CODEC_FLAG("mm_mmxext", "mask MMXEXT (MMX2) feature", dsp_mask
, FF_MM_MMXEXT
, 0),
26 AVOPTION_CODEC_FLAG("mm_sse", "mask SSE feature", dsp_mask
, FF_MM_SSE
, 0),
27 AVOPTION_CODEC_FLAG("mm_sse2", "mask SSE2 feature", dsp_mask
, FF_MM_SSE2
, 0),
32 const AVOption avoptions_workaround_bug
[] = {
33 AVOPTION_CODEC_FLAG("bug_autodetect", "workaround bug autodetection", workaround_bugs
, FF_BUG_AUTODETECT
, 1),
34 AVOPTION_CODEC_FLAG("bug_old_msmpeg4", "workaround old msmpeg4 bug", workaround_bugs
, FF_BUG_OLD_MSMPEG4
, 0),
35 AVOPTION_CODEC_FLAG("bug_xvid_ilace", "workaround XviD interlace bug", workaround_bugs
, FF_BUG_XVID_ILACE
, 0),
36 AVOPTION_CODEC_FLAG("bug_ump4", "workaround ump4 bug", workaround_bugs
, FF_BUG_UMP4
, 0),
37 AVOPTION_CODEC_FLAG("bug_no_padding", "workaround padding bug", workaround_bugs
, FF_BUG_NO_PADDING
, 0),
38 AVOPTION_CODEC_FLAG("bug_ac_vlc", "workaround ac VLC bug", workaround_bugs
, FF_BUG_AC_VLC
, 0),
39 AVOPTION_CODEC_FLAG("bug_qpel_chroma", "workaround qpel chroma bug", workaround_bugs
, FF_BUG_QPEL_CHROMA
, 0),
40 AVOPTION_CODEC_FLAG("bug_std_qpel", "workaround std qpel bug", workaround_bugs
, FF_BUG_STD_QPEL
, 0),
41 AVOPTION_CODEC_FLAG("bug_qpel_chroma2", "workaround qpel chroma2 bug", workaround_bugs
, FF_BUG_QPEL_CHROMA2
, 0),
42 AVOPTION_CODEC_FLAG("bug_direct_blocksize", "workaround direct blocksize bug", workaround_bugs
, FF_BUG_DIRECT_BLOCKSIZE
, 0),
47 static int parse_bool(const AVOption
*c
, char *s
, int *var
)
49 int b
= 1; /* by default -on- when present */
51 if (!strcasecmp(s
, "off") || !strcasecmp(s
, "false")
54 else if (!strcasecmp(s
, "on") || !strcasecmp(s
, "true")
61 if (c
->type
== FF_OPT_TYPE_FLAG
) {
71 static int parse_double(const AVOption
*c
, char *s
, double *var
)
77 if (c
->min
!= c
->max
) {
78 if (d
< c
->min
|| d
> c
->max
) {
79 fprintf(stderr
, "Option: %s double value: %f out of range <%f, %f>\n",
80 c
->name
, d
, c
->min
, c
->max
);
88 static int parse_int(const AVOption
* c
, char* s
, int* var
)
94 if (c
->min
!= c
->max
) {
95 if (i
< (int)c
->min
|| i
> (int)c
->max
) {
96 fprintf(stderr
, "Option: %s integer value: %d out of range <%d, %d>\n",
97 c
->name
, i
, (int)c
->min
, (int)c
->max
);
105 static int parse_string(const AVOption
*c
, char *s
, void* strct
, char **var
)
110 if (c
->type
== FF_OPT_TYPE_RCOVERRIDE
) {
113 if (sscanf(s
, "%d,%d,%d,%f", &sf
, &ef
, &qs
, &qf
) == 4 && sf
< ef
) {
114 AVCodecContext
*avctx
= (AVCodecContext
*) strct
;
116 avctx
->rc_override
= av_realloc(avctx
->rc_override
,
117 sizeof(RcOverride
) * (avctx
->rc_override_count
+ 1));
118 o
= avctx
->rc_override
+ avctx
->rc_override_count
++;
122 o
->quality_factor
= qf
;
124 //printf("parsed Rc: %d,%d,%d,%f (%d)\n", sf,ef,qs,qf, avctx->rc_override_count);
126 printf("incorrect/unparsable Rc: \"%s\"\n", s
);
133 int avoption_parse(void* strct
, const AVOption
* list
, const char *opts
)
136 char* dopts
= av_strdup(opts
);
140 while (str
&& *str
&& r
== 0) {
141 const AVOption
*stack
[FF_OPT_MAX_DEPTH
];
142 const AVOption
*c
= list
;
144 char* e
= strchr(str
, ':');
149 p
= strchr(str
, '=');
153 // going through option structures
158 c
= (const AVOption
*) c
->help
;
159 assert(depth
> FF_OPT_MAX_DEPTH
);
167 if (!strcmp(c
->name
, str
)) {
168 void* ptr
= (char*)strct
+ c
->offset
;
170 switch (c
->type
& FF_OPT_TYPE_MASK
) {
171 case FF_OPT_TYPE_BOOL
:
172 r
= parse_bool(c
, p
, (int*)ptr
);
174 case FF_OPT_TYPE_DOUBLE
:
175 r
= parse_double(c
, p
, (double*)ptr
);
177 case FF_OPT_TYPE_INT
:
178 r
= parse_int(c
, p
, (int*)ptr
);
180 case FF_OPT_TYPE_STRING
:
181 r
= parse_string(c
, p
, strct
, (char**)ptr
);