[FFmpeg-devel] [PATCH] avcodec/bsf: switch to av_get_token to parse bsf list string
James Almer
jamrial at gmail.com
Sat Jul 3 17:17:20 EEST 2021
On 7/3/2021 8:42 AM, Gyan Doshi wrote:
> The recently added setts bsf makes use of the eval API whose
> expressions can contain commas. The existing parsing in
> av_bsf_list_parse_str() uses av_strtok to naively split
> the string at commas, thus preventing the use of setts filter
> with expressions containing commas.
> ---
> libavcodec/bsf.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
> index 9d67ea5395..726911785d 100644
> --- a/libavcodec/bsf.c
> +++ b/libavcodec/bsf.c
> @@ -520,7 +520,8 @@ static int bsf_parse_single(char *str, AVBSFList *bsf_lst)
> int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
> {
> AVBSFList *lst;
> - char *bsf_str, *buf, *dup, *saveptr;
> + char *bsf_str, *dup;
> + const char *buf;
> int ret;
>
> if (!str)
> @@ -530,18 +531,18 @@ int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
> if (!lst)
> return AVERROR(ENOMEM);
>
> - if (!(dup = buf = av_strdup(str))) {
> + if (!(buf = dup = av_strdup(str))) {
Is this av_strdup() even necessary? You could let av_get_token() update
str just fine and remove both buf and dup. Or maybe just use a copy of
the pointer in buf.
> ret = AVERROR(ENOMEM);
> goto end;
> }
>
> - while (bsf_str = av_strtok(buf, ",", &saveptr)) {
> + do {
> + bsf_str = av_get_token(&buf, ",");
You can reduce the scope of bsf_str now, so declare it here.
> ret = bsf_parse_single(bsf_str, lst);
> + av_free(bsf_str);
> if (ret < 0)
> goto end;
> -
> - buf = NULL;
> - }
> + } while (*buf == ',' && buf++);
You can simplify this into while (*++buf) or (*++str) if you remove the
av_strdup(). It will also preserve the existing behavior of discarding
the last comma in the string if it's the last character, instead of
aborting with EINVAL.
>
> ret = av_bsf_list_finalize(&lst, bsf_lst);
> end:
>
More information about the ffmpeg-devel
mailing list