[FFmpeg-devel] [PATCH 1/2] ass_split: fix handling of streams with no [Events] or Format: line

Clément Bœsch u at pkh.me
Sat Sep 10 11:47:47 EEST 2016


On Sat, Sep 10, 2016 at 12:31:12AM -0500, Rodger Combs wrote:
> ---
>  libavcodec/ass_split.c | 36 +++++++++++++++++++++++++++---------
>  1 file changed, 27 insertions(+), 9 deletions(-)
> 
> diff --git a/libavcodec/ass_split.c b/libavcodec/ass_split.c
> index beaba7e..cdb1aa2 100644
> --- a/libavcodec/ass_split.c
> +++ b/libavcodec/ass_split.c
> @@ -229,7 +229,7 @@ static inline const char *skip_space(const char *buf)
>      return buf;
>  }
>  
> -static int *get_default_field_orders(const ASSSection *section)
> +static int *get_default_field_orders(const ASSSection *section, int *number)
>  {
>      int i;
>      int *order = av_malloc_array(FF_ARRAY_ELEMS(section->fields), sizeof(*order));
> @@ -238,8 +238,9 @@ static int *get_default_field_orders(const ASSSection *section)
>          return NULL;
>      for (i = 0; section->fields[i].name; i++)
>          order[i] = i;
> +    *number = i;
>      while (i < FF_ARRAY_ELEMS(section->fields))
> -        order[i] = -1;
> +        order[i++] = -1;
>      return order;

omg i wrote this

>  }
>  
> @@ -255,12 +256,26 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
>              ctx->current_section = -1;
>              break;
>          }
> -        if (buf[0] == ';' || (buf[0] == '!' && buf[1] == ':')) {
> -            /* skip comments */
> -        } else if (section->format_header && !order) {
> +        if (buf[0] == ';' || (buf[0] == '!' && buf[1] == ':'))
> +            goto next_line; // skip comments
> +
> +        len = strcspn(buf, ":\r\n");
> +        if (buf[len] == ':' &&
> +            (!section->fields_header || strncmp(buf, section->fields_header, len))) {
> +            for (i = 0; i < FF_ARRAY_ELEMS(ass_sections); i++) {
> +                if (ass_sections[i].fields_header &&
> +                    !strncmp(buf, ass_sections[i].fields_header, len)) {
> +                    ctx->current_section = i;
> +                    section = &ass_sections[ctx->current_section];
> +                    number = &ctx->field_number[ctx->current_section];
> +                    order = ctx->field_order[ctx->current_section];
> +                    break;
> +                }
> +            }
> +        }
> +        if (section->format_header && !order) {
>              len = strlen(section->format_header);
> -            if (strncmp(buf, section->format_header, len) || buf[len] != ':')
> -                goto next_line;
> +            if (buf[len] == ':' && !strncmp(buf, section->format_header, len)) {
>              buf += len + 1;
>              while (!is_eol(*buf)) {
>                  buf = skip_space(buf);
> @@ -278,7 +293,10 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
>                  buf = skip_space(buf + len + (buf[len] == ','));
>              }
>              ctx->field_order[ctx->current_section] = order;
> -        } else if (section->fields_header) {
> +                goto next_line;
> +            }
> +        }
> +        if (section->fields_header) {
>              len = strlen(section->fields_header);
>              if (!strncmp(buf, section->fields_header, len) && buf[len] == ':') {
>                  uint8_t *ptr, *struct_ptr = realloc_section_array(ctx);
> @@ -286,7 +304,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
>  
>                  /* No format header line found so far, assume default */
>                  if (!order) {
> -                    order = get_default_field_orders(section);
> +                    order = get_default_field_orders(section, number);
>                      if (!order)
>                          return NULL;
>                      ctx->field_order[ctx->current_section] = order;

OK if it works

would be great to have a FATE test though

-- 
Clément B.


More information about the ffmpeg-devel mailing list