ass_split: fix handling of streams with no [Events] or Format: line

parent a50ca6b3
...@@ -229,7 +229,7 @@ static inline const char *skip_space(const char *buf) ...@@ -229,7 +229,7 @@ static inline const char *skip_space(const char *buf)
return 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 i;
int *order = av_malloc_array(FF_ARRAY_ELEMS(section->fields), sizeof(*order)); 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) ...@@ -238,8 +238,9 @@ static int *get_default_field_orders(const ASSSection *section)
return NULL; return NULL;
for (i = 0; section->fields[i].name; i++) for (i = 0; section->fields[i].name; i++)
order[i] = i; order[i] = i;
*number = i;
while (i < FF_ARRAY_ELEMS(section->fields)) while (i < FF_ARRAY_ELEMS(section->fields))
order[i] = -1; order[i++] = -1;
return order; return order;
} }
...@@ -255,12 +256,26 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) ...@@ -255,12 +256,26 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
ctx->current_section = -1; ctx->current_section = -1;
break; break;
} }
if (buf[0] == ';' || (buf[0] == '!' && buf[1] == ':')) { if (buf[0] == ';' || (buf[0] == '!' && buf[1] == ':'))
/* skip comments */ goto next_line; // skip comments
} else if (section->format_header && !order) {
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); len = strlen(section->format_header);
if (strncmp(buf, section->format_header, len) || buf[len] != ':') if (buf[len] == ':' && !strncmp(buf, section->format_header, len)) {
goto next_line;
buf += len + 1; buf += len + 1;
while (!is_eol(*buf)) { while (!is_eol(*buf)) {
buf = skip_space(buf); buf = skip_space(buf);
...@@ -278,7 +293,10 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) ...@@ -278,7 +293,10 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
buf = skip_space(buf + len + (buf[len] == ',')); buf = skip_space(buf + len + (buf[len] == ','));
} }
ctx->field_order[ctx->current_section] = order; ctx->field_order[ctx->current_section] = order;
} else if (section->fields_header) { goto next_line;
}
}
if (section->fields_header) {
len = strlen(section->fields_header); len = strlen(section->fields_header);
if (!strncmp(buf, section->fields_header, len) && buf[len] == ':') { if (!strncmp(buf, section->fields_header, len) && buf[len] == ':') {
uint8_t *ptr, *struct_ptr = realloc_section_array(ctx); uint8_t *ptr, *struct_ptr = realloc_section_array(ctx);
...@@ -286,7 +304,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) ...@@ -286,7 +304,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
/* No format header line found so far, assume default */ /* No format header line found so far, assume default */
if (!order) { if (!order) {
order = get_default_field_orders(section); order = get_default_field_orders(section, number);
if (!order) if (!order)
return NULL; return NULL;
ctx->field_order[ctx->current_section] = order; ctx->field_order[ctx->current_section] = order;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment