diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2015-12-04 06:42:48 -0600 |
---|---|---|
committer | Rodger Combs <rodger.combs@gmail.com> | 2016-09-12 15:57:50 -0500 |
commit | 3b32e1313c6d68aa10bc7d97ad505382def833b0 (patch) | |
tree | 2c1635b3be97628169dcd95754084edb68126131 /libavcodec/ass_split.c | |
parent | a50ca6b3570fb3b13e7b4602b27fb0bba4f4ccc9 (diff) | |
download | ffmpeg-3b32e1313c6d68aa10bc7d97ad505382def833b0.tar.gz |
ass_split: fix handling of streams with no [Events] or Format: line
Diffstat (limited to 'libavcodec/ass_split.c')
-rw-r--r-- | libavcodec/ass_split.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/libavcodec/ass_split.c b/libavcodec/ass_split.c index beaba7eb7c..cdb1aa2d65 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; } @@ -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; |