X-Git-Url: https://git.piment-noir.org/?p=deb_ffmpeg.git;a=blobdiff_plain;f=ffmpeg%2Flibavcodec%2Fass_split.c;fp=ffmpeg%2Flibavcodec%2Fass_split.c;h=cc4f961c4d6761b84d0de33444a80212c77a7969;hp=413e9c8d06ebfda106737bebb8011d6c648790a0;hb=f6fa7814ccfe3e76514b36cf04f5cd3cb657c8cf;hpb=2ba45a602cbfa7b771effba9b11bb4245c21bc00 diff --git a/ffmpeg/libavcodec/ass_split.c b/ffmpeg/libavcodec/ass_split.c index 413e9c8..cc4f961 100644 --- a/ffmpeg/libavcodec/ass_split.c +++ b/ffmpeg/libavcodec/ass_split.c @@ -44,7 +44,7 @@ typedef struct { int size; int offset; int offset_count; - ASSFields fields[10]; + ASSFields fields[24]; } ASSSection; static const ASSSection ass_sections[] = { @@ -64,15 +64,29 @@ static const ASSSection ass_sections[] = { .size = sizeof(ASSStyle), .offset = offsetof(ASS, styles), .offset_count = offsetof(ASS, styles_count), - .fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) }, - {"Fontname", ASS_STR, offsetof(ASSStyle, font_name) }, - {"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) }, - {"PrimaryColour",ASS_COLOR,offsetof(ASSStyle, primary_color)}, - {"BackColour", ASS_COLOR,offsetof(ASSStyle, back_color) }, - {"Bold", ASS_INT, offsetof(ASSStyle, bold) }, - {"Italic", ASS_INT, offsetof(ASSStyle, italic) }, - {"Underline", ASS_INT, offsetof(ASSStyle, underline) }, - {"Alignment", ASS_INT, offsetof(ASSStyle, alignment) }, + .fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) }, + {"Fontname", ASS_STR, offsetof(ASSStyle, font_name) }, + {"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) }, + {"PrimaryColour", ASS_COLOR, offsetof(ASSStyle, primary_color) }, + {"SecondaryColour", ASS_COLOR, offsetof(ASSStyle, secondary_color)}, + {"OutlineColour", ASS_COLOR, offsetof(ASSStyle, outline_color) }, + {"BackColour", ASS_COLOR, offsetof(ASSStyle, back_color) }, + {"Bold", ASS_INT, offsetof(ASSStyle, bold) }, + {"Italic", ASS_INT, offsetof(ASSStyle, italic) }, + {"Underline", ASS_INT, offsetof(ASSStyle, underline) }, + {"StrikeOut", ASS_INT, offsetof(ASSStyle, strikeout) }, + {"ScaleX", ASS_FLT, offsetof(ASSStyle, scalex) }, + {"ScaleY", ASS_FLT, offsetof(ASSStyle, scaley) }, + {"Spacing", ASS_FLT, offsetof(ASSStyle, spacing) }, + {"Angle", ASS_FLT, offsetof(ASSStyle, angle) }, + {"BorderStyle", ASS_INT, offsetof(ASSStyle, border_style) }, + {"Outline", ASS_FLT, offsetof(ASSStyle, outline) }, + {"Shadow", ASS_FLT, offsetof(ASSStyle, shadow) }, + {"Alignment", ASS_INT, offsetof(ASSStyle, alignment) }, + {"MarginL", ASS_INT, offsetof(ASSStyle, margin_l) }, + {"MarginR", ASS_INT, offsetof(ASSStyle, margin_r) }, + {"MarginV", ASS_INT, offsetof(ASSStyle, margin_v) }, + {"Encoding", ASS_INT, offsetof(ASSStyle, encoding) }, {0}, } }, @@ -82,14 +96,24 @@ static const ASSSection ass_sections[] = { .size = sizeof(ASSStyle), .offset = offsetof(ASS, styles), .offset_count = offsetof(ASS, styles_count), - .fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) }, - {"Fontname", ASS_STR, offsetof(ASSStyle, font_name) }, - {"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) }, - {"PrimaryColour",ASS_COLOR,offsetof(ASSStyle, primary_color)}, - {"BackColour", ASS_COLOR,offsetof(ASSStyle, back_color) }, - {"Bold", ASS_INT, offsetof(ASSStyle, bold) }, - {"Italic", ASS_INT, offsetof(ASSStyle, italic) }, - {"Alignment", ASS_ALGN, offsetof(ASSStyle, alignment) }, + .fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) }, + {"Fontname", ASS_STR, offsetof(ASSStyle, font_name) }, + {"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) }, + {"PrimaryColour", ASS_COLOR, offsetof(ASSStyle, primary_color) }, + {"SecondaryColour", ASS_COLOR, offsetof(ASSStyle, secondary_color)}, + {"TertiaryColour", ASS_COLOR, offsetof(ASSStyle, outline_color) }, + {"BackColour", ASS_COLOR, offsetof(ASSStyle, back_color) }, + {"Bold", ASS_INT, offsetof(ASSStyle, bold) }, + {"Italic", ASS_INT, offsetof(ASSStyle, italic) }, + {"BorderStyle", ASS_INT, offsetof(ASSStyle, border_style) }, + {"Outline", ASS_FLT, offsetof(ASSStyle, outline) }, + {"Shadow", ASS_FLT, offsetof(ASSStyle, shadow) }, + {"Alignment", ASS_ALGN, offsetof(ASSStyle, alignment) }, + {"MarginL", ASS_INT, offsetof(ASSStyle, margin_l) }, + {"MarginR", ASS_INT, offsetof(ASSStyle, margin_r) }, + {"MarginV", ASS_INT, offsetof(ASSStyle, margin_v) }, + {"AlphaLevel", ASS_INT, offsetof(ASSStyle, alpha_level) }, + {"Encoding", ASS_INT, offsetof(ASSStyle, encoding) }, {0}, } }, @@ -99,11 +123,16 @@ static const ASSSection ass_sections[] = { .size = sizeof(ASSDialog), .offset = offsetof(ASS, dialogs), .offset_count = offsetof(ASS, dialogs_count), - .fields = {{"Layer", ASS_INT, offsetof(ASSDialog, layer) }, - {"Start", ASS_TIMESTAMP, offsetof(ASSDialog, start) }, - {"End", ASS_TIMESTAMP, offsetof(ASSDialog, end) }, - {"Style", ASS_STR, offsetof(ASSDialog, style) }, - {"Text", ASS_STR, offsetof(ASSDialog, text) }, + .fields = {{"Layer", ASS_INT, offsetof(ASSDialog, layer) }, + {"Start", ASS_TIMESTAMP, offsetof(ASSDialog, start) }, + {"End", ASS_TIMESTAMP, offsetof(ASSDialog, end) }, + {"Style", ASS_STR, offsetof(ASSDialog, style) }, + {"Name", ASS_STR, offsetof(ASSDialog, name) }, + {"MarginL", ASS_INT, offsetof(ASSDialog, margin_l)}, + {"MarginR", ASS_INT, offsetof(ASSDialog, margin_r)}, + {"MarginV", ASS_INT, offsetof(ASSDialog, margin_v)}, + {"Effect", ASS_STR, offsetof(ASSDialog, effect) }, + {"Text", ASS_STR, offsetof(ASSDialog, text) }, {0}, } }, @@ -200,6 +229,20 @@ static inline const char *skip_space(const char *buf) return buf; } +static int *get_default_field_orders(const ASSSection *section) +{ + int i; + int *order = av_malloc(FF_ARRAY_ELEMS(section->fields) * sizeof(*order)); + + if (!order) + return NULL; + for (i = 0; section->fields[i].name; i++) + order[i] = i; + while (i < FF_ARRAY_ELEMS(section->fields)) + order[i] = -1; + return order; +} + static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) { const ASSSection *section = &ass_sections[ctx->current_section]; @@ -217,7 +260,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) } else if (section->format_header && !order) { len = strlen(section->format_header); if (strncmp(buf, section->format_header, len) || buf[len] != ':') - return NULL; + goto next_line; buf += len + 1; while (!is_eol(*buf)) { buf = skip_space(buf); @@ -240,6 +283,15 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) if (!strncmp(buf, section->fields_header, len) && buf[len] == ':') { uint8_t *ptr, *struct_ptr = realloc_section_array(ctx); if (!struct_ptr) return NULL; + + /* No format header line found so far, assume default */ + if (!order) { + order = get_default_field_orders(section); + if (!order) + return NULL; + ctx->field_order[ctx->current_section] = order; + } + buf += len + 1; for (i=0; !is_eol(*buf) && i < *number; i++) { int last = i == *number - 1; @@ -269,6 +321,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf) } } } +next_line: buf += strcspn(buf, "\n"); buf += !!*buf; }