lavu/opt: implement av_opt_get_key_value().
This function does the low-level work of av_opt_set_from_string() but can be used when there is no option context or when a generic handling of unknown keys is needed. av_opt_set_from_string() is changed to make use of it.
This commit is contained in:
parent
e021eeb9f0
commit
3bdf4971ba
@ -15,6 +15,9 @@ libavutil: 2012-10-22
|
|||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
|
2012-11-02 - xxxxxxx - lavu 52.4.100 - opt.h
|
||||||
|
Add av_opt_get_key_value().
|
||||||
|
|
||||||
2012-11-03 - xxxxxxx - lavu 52.3.100 - opt.h
|
2012-11-03 - xxxxxxx - lavu 52.3.100 - opt.h
|
||||||
Add AV_OPT_TYPE_SAMPLE_FMT value to AVOptionType enum.
|
Add AV_OPT_TYPE_SAMPLE_FMT value to AVOptionType enum.
|
||||||
|
|
||||||
|
@ -854,13 +854,37 @@ static int get_key(const char **ropts, const char *delim, char **rkey)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int av_opt_get_key_value(const char **ropts,
|
||||||
|
const char *key_val_sep, const char *pairs_sep,
|
||||||
|
unsigned flags,
|
||||||
|
char **rkey, char **rval)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *key = NULL, *val;
|
||||||
|
const char *opts = *ropts;
|
||||||
|
|
||||||
|
if ((ret = get_key(&opts, key_val_sep, &key)) < 0 &&
|
||||||
|
!(flags & AV_OPT_FLAG_IMPLICIT_KEY))
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
if (!(val = av_get_token(&opts, pairs_sep))) {
|
||||||
|
av_free(key);
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
if (*opts && strchr(pairs_sep, *opts))
|
||||||
|
opts++;
|
||||||
|
*ropts = opts;
|
||||||
|
*rkey = key;
|
||||||
|
*rval = val;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int av_opt_set_from_string(void *ctx, const char *opts,
|
int av_opt_set_from_string(void *ctx, const char *opts,
|
||||||
const char *const *shorthand,
|
const char *const *shorthand,
|
||||||
const char *key_val_sep, const char *pairs_sep)
|
const char *key_val_sep, const char *pairs_sep)
|
||||||
{
|
{
|
||||||
int ret, count = 0;
|
int ret, count = 0;
|
||||||
const char *dummy_shorthand = NULL;
|
const char *dummy_shorthand = NULL;
|
||||||
char *parsed_key, *value;
|
char *av_uninit(parsed_key), *av_uninit(value);
|
||||||
const char *key;
|
const char *key;
|
||||||
|
|
||||||
if (!opts)
|
if (!opts)
|
||||||
@ -869,25 +893,25 @@ int av_opt_set_from_string(void *ctx, const char *opts,
|
|||||||
shorthand = &dummy_shorthand;
|
shorthand = &dummy_shorthand;
|
||||||
|
|
||||||
while (*opts) {
|
while (*opts) {
|
||||||
parsed_key = NULL; /* so we can free it anyway */
|
ret = av_opt_get_key_value(&opts, key_val_sep, pairs_sep,
|
||||||
if ((ret = get_key(&opts, key_val_sep, &parsed_key)) < 0) {
|
*shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
|
||||||
if (*shorthand) {
|
&parsed_key, &value);
|
||||||
key = *(shorthand++);
|
if (ret < 0) {
|
||||||
} else {
|
if (ret == AVERROR(EINVAL))
|
||||||
av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", opts);
|
av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", opts);
|
||||||
return AVERROR(EINVAL);
|
else
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", opts,
|
||||||
|
av_err2str(ret));
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
} else {
|
if (parsed_key) {
|
||||||
key = parsed_key;
|
key = parsed_key;
|
||||||
while (*shorthand) /* discard all remaining shorthand */
|
while (*shorthand) /* discard all remaining shorthand */
|
||||||
shorthand++;
|
shorthand++;
|
||||||
|
} else {
|
||||||
|
key = *(shorthand++);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value = av_get_token(&opts, pairs_sep)))
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
if (*opts && strchr(pairs_sep, *opts))
|
|
||||||
opts++;
|
|
||||||
|
|
||||||
av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
|
av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
|
||||||
if ((ret = av_opt_set(ctx, key, value, 0)) < 0) {
|
if ((ret = av_opt_set(ctx, key, value, 0)) < 0) {
|
||||||
if (ret == AVERROR_OPTION_NOT_FOUND)
|
if (ret == AVERROR_OPTION_NOT_FOUND)
|
||||||
|
@ -455,6 +455,38 @@ int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
|
|||||||
*/
|
*/
|
||||||
int av_opt_set_dict(void *obj, struct AVDictionary **options);
|
int av_opt_set_dict(void *obj, struct AVDictionary **options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract a key-value pair from the beginning of a string.
|
||||||
|
*
|
||||||
|
* @param ropts pointer to the options string, will be updated to
|
||||||
|
* point to the rest of the string
|
||||||
|
* @param key_val_sep a 0-terminated list of characters used to separate
|
||||||
|
* key from value, for example '='
|
||||||
|
* @param pairs_sep a 0-terminated list of characters used to separate
|
||||||
|
* two pairs from each other, for example ':' or ','
|
||||||
|
* @param flags flags; see the AV_OPT_FLAG_* values below
|
||||||
|
* @param rkey parsed key; must be freed using av_free()
|
||||||
|
* @param rval parsed value; must be freed using av_free()
|
||||||
|
*
|
||||||
|
* @return 0 for success, or a negative value corresponding to an AVERROR
|
||||||
|
* code in case of error; in particular:
|
||||||
|
* AVERROR(EINVAL) if no key is present
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int av_opt_get_key_value(const char **ropts,
|
||||||
|
const char *key_val_sep, const char *pairs_sep,
|
||||||
|
unsigned flags,
|
||||||
|
char **rkey, char **rval);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accept to parse a value without a key; the key will then be returned
|
||||||
|
* as NULL.
|
||||||
|
*/
|
||||||
|
AV_OPT_FLAG_IMPLICIT_KEY = 1,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup opt_eval_funcs Evaluating option strings
|
* @defgroup opt_eval_funcs Evaluating option strings
|
||||||
* @{
|
* @{
|
||||||
|
@ -75,7 +75,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_MAJOR 52
|
#define LIBAVUTIL_VERSION_MAJOR 52
|
||||||
#define LIBAVUTIL_VERSION_MINOR 3
|
#define LIBAVUTIL_VERSION_MINOR 4
|
||||||
#define LIBAVUTIL_VERSION_MICRO 100
|
#define LIBAVUTIL_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user