[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