[FFmpeg-devel] [PATCH 2/3] avcodec/bsf: support shorthand options for av_bsf_list_parse_str
James Almer
jamrial at gmail.com
Sat Apr 25 22:07:02 EEST 2020
On 4/25/2020 3:55 PM, Marton Balint wrote:
> Or maybe we should just drop supporting shorthand options instead?
That would be a breaking change (commands like -bsf:v noise=123 would
stop working), vs extending existing API in a way that i assume does not
break currently valid strings, so this approach is better.
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> libavcodec/bsf.c | 53 ++++++++++++++++++++++++++---------------------------
> 1 file changed, 26 insertions(+), 27 deletions(-)
>
> diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
> index d3a9db57f7..85b63a5c9a 100644
> --- a/libavcodec/bsf.c
> +++ b/libavcodec/bsf.c
> @@ -431,7 +431,7 @@ int av_bsf_list_append(AVBSFList *lst, AVBSFContext *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;
> const AVBitStreamFilter *filter;
> @@ -445,8 +445,20 @@ int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** op
> if (ret < 0)
> return ret;
>
> - if (options) {
> - ret = av_opt_set_dict2(bsf, options, AV_OPT_SEARCH_CHILDREN);
> + if (options && filter->priv_class) {
> + 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)
> goto end;
> }
> @@ -460,6 +472,11 @@ end:
> 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 ret = 0;
> @@ -486,33 +503,15 @@ end:
> 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;
> - AVDictionary *bsf_options = NULL;
> - int ret = 0;
> + char *bsf_name, *bsf_options_str;
>
> - if (!(buf = av_strdup(str)))
> - return AVERROR(ENOMEM);
> -
> - 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);
> + bsf_name = av_strtok(str, "=", &bsf_options_str);
> + if (!bsf_name)
> + return AVERROR(EINVAL);
>
> -end:
> - av_dict_free(&bsf_options);
> - av_free(buf);
> - return ret;
> + return bsf_list_append_internal(bsf_lst, bsf_name, bsf_options_str, NULL);
> }
>
> int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
>
More information about the ffmpeg-devel
mailing list