mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
ass_split: fix handling of streams with no [Events] or Format: line
This commit is contained in:
parent
a50ca6b357
commit
3b32e1313c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user