|
|
@ -431,7 +431,7 @@ int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf) |
|
|
|
return av_dynarray_add_nofree(&lst->bsfs, &lst->nb_bsfs, bsf); |
|
|
|
return av_dynarray_add_nofree(&lst->bsfs, &lst->nb_bsfs, bsf); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** options) |
|
|
|
static int bsf_list_append_internal(AVBSFList *lst, const char *bsf_name, const char *options, AVDictionary ** options_dict) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret; |
|
|
|
int ret; |
|
|
|
const AVBitStreamFilter *filter; |
|
|
|
const AVBitStreamFilter *filter; |
|
|
@ -445,8 +445,20 @@ int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** op |
|
|
|
if (ret < 0) |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
if (options) { |
|
|
|
if (options && filter->priv_class) { |
|
|
|
ret = av_opt_set_dict2(bsf, options, AV_OPT_SEARCH_CHILDREN); |
|
|
|
const AVOption *opt = av_opt_next(bsf->priv_data, NULL); |
|
|
|
|
|
|
|
const char * shorthand[2] = {NULL}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt) |
|
|
|
|
|
|
|
shorthand[0] = opt->name; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret = av_opt_set_from_string(bsf->priv_data, options, shorthand, "=", ":"); |
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
|
|
goto end; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (options_dict) { |
|
|
|
|
|
|
|
ret = av_opt_set_dict2(bsf, options_dict, AV_OPT_SEARCH_CHILDREN); |
|
|
|
if (ret < 0) |
|
|
|
if (ret < 0) |
|
|
|
goto end; |
|
|
|
goto end; |
|
|
|
} |
|
|
|
} |
|
|
@ -460,6 +472,11 @@ end: |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** options) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return bsf_list_append_internal(lst, bsf_name, NULL, options); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf) |
|
|
|
int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret = 0; |
|
|
|
int ret = 0; |
|
|
@ -486,33 +503,15 @@ end: |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int bsf_parse_single(const char *str, AVBSFList *bsf_lst) |
|
|
|
static int bsf_parse_single(char *str, AVBSFList *bsf_lst) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char *bsf_name, *bsf_options_str, *buf; |
|
|
|
char *bsf_name, *bsf_options_str; |
|
|
|
AVDictionary *bsf_options = NULL; |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!(buf = av_strdup(str))) |
|
|
|
bsf_name = av_strtok(str, "=", &bsf_options_str); |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
if (!bsf_name) |
|
|
|
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
bsf_name = av_strtok(buf, "=", &bsf_options_str); |
|
|
|
|
|
|
|
if (!bsf_name) { |
|
|
|
|
|
|
|
ret = AVERROR(EINVAL); |
|
|
|
|
|
|
|
goto end; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (bsf_options_str) { |
|
|
|
|
|
|
|
ret = av_dict_parse_string(&bsf_options, bsf_options_str, "=", ":", 0); |
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
|
|
goto end; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret = av_bsf_list_append2(bsf_lst, bsf_name, &bsf_options); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end: |
|
|
|
return bsf_list_append_internal(bsf_lst, bsf_name, bsf_options_str, NULL); |
|
|
|
av_dict_free(&bsf_options); |
|
|
|
|
|
|
|
av_free(buf); |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst) |
|
|
|
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst) |
|
|
|