Imported Debian version 2.5.0~trusty1.1
[deb_ffmpeg.git] / ffmpeg / libavcodec / ass_split.c
index 413e9c8d06ebfda106737bebb8011d6c648790a0..cc4f961c4d6761b84d0de33444a80212c77a7969 100644 (file)
@@ -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;
     }