1 /* 2 * SSA/ASS spliting functions 3 * Copyright (c) 2010 Aurelien Jacobs <aurel@gnuage.org> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 #ifndef AVCODEC_ASS_SPLIT_H 23 #define AVCODEC_ASS_SPLIT_H 24 25 /** 26 * fields extracted from the [Script Info] section 27 */ 28 typedef struct { 29 char *script_type; /**< SSA script format version (eg. v4.00) */ 30 char *collisions; /**< how subtitles are moved to prevent collisions */ 31 int play_res_x; /**< video width that ASS coords are referring to */ 32 int play_res_y; /**< video height that ASS coords are referring to */ 33 float timer; /**< time multiplier to apply to SSA clock (in %) */ 34 } ASSScriptInfo; 35 36 /** 37 * fields extracted from the [V4(+) Styles] section 38 */ 39 typedef struct { 40 char *name; /**< name of the tyle (case sensitive) */ 41 char *font_name; /**< font face (case sensitive) */ 42 int font_size; /**< font height */ 43 int primary_color; /**< color that a subtitle will normally appear in */ 44 int secondary_color; 45 int outline_color; /**< color for outline in ASS, called tertiary in SSA */ 46 int back_color; /**< color of the subtitle outline or shadow */ 47 int bold; /**< whether text is bold (1) or not (0) */ 48 int italic; /**< whether text is italic (1) or not (0) */ 49 int underline; /**< whether text is underlined (1) or not (0) */ 50 int strikeout; 51 float scalex; 52 float scaley; 53 float spacing; 54 float angle; 55 int border_style; 56 float outline; 57 float shadow; 58 int alignment; /**< position of the text (left, center, top...), 59 defined after the layout of the numpad 60 (1-3 sub, 4-6 mid, 7-9 top) */ 61 int margin_l; 62 int margin_r; 63 int margin_v; 64 int alpha_level; 65 int encoding; 66 } ASSStyle; 67 68 /** 69 * fields extracted from the [Events] section 70 */ 71 typedef struct { 72 int readorder; 73 int layer; /**< higher numbered layers are drawn over lower numbered */ 74 int start; /**< start time of the dialog in centiseconds */ 75 int end; /**< end time of the dialog in centiseconds */ 76 char *style; /**< name of the ASSStyle to use with this dialog */ 77 char *name; 78 int margin_l; 79 int margin_r; 80 int margin_v; 81 char *effect; 82 char *text; /**< actual text which will be displayed as a subtitle, 83 can include style override control codes (see 84 ff_ass_split_override_codes()) */ 85 } ASSDialog; 86 87 /** 88 * structure containing the whole split ASS data 89 */ 90 typedef struct { 91 ASSScriptInfo script_info; /**< general information about the SSA script*/ 92 ASSStyle *styles; /**< array of split out styles */ 93 int styles_count; /**< number of ASSStyle in the styles array */ 94 ASSDialog *dialogs; /**< array of split out dialogs */ 95 int dialogs_count; /**< number of ASSDialog in the dialogs array*/ 96 } ASS; 97 98 /** 99 * This struct can be casted to ASS to access to the split data. 100 */ 101 typedef struct ASSSplitContext ASSSplitContext; 102 103 /** 104 * Split a full ASS file or a ASS header from a string buffer and store 105 * the split structure in a newly allocated context. 106 * 107 * @param buf String containing the ASS formatted data. 108 * @return Newly allocated struct containing split data. 109 */ 110 ASSSplitContext *ff_ass_split(const char *buf); 111 112 /** 113 * Free a dialogue obtained from ff_ass_split_dialog(). 114 */ 115 void ff_ass_free_dialog(ASSDialog **dialogp); 116 117 /** 118 * Split one ASS Dialogue line from a string buffer. 119 * 120 * @param ctx Context previously initialized by ff_ass_split(). 121 * @param buf String containing the ASS "Dialogue" line. 122 * @return Pointer to the split ASSDialog. Must be freed with ff_ass_free_dialog() 123 */ 124 ASSDialog *ff_ass_split_dialog(ASSSplitContext *ctx, const char *buf); 125 126 /** 127 * Free all the memory allocated for an ASSSplitContext. 128 * 129 * @param ctx Context previously initialized by ff_ass_split(). 130 */ 131 void ff_ass_split_free(ASSSplitContext *ctx); 132 133 134 /** 135 * Set of callback functions corresponding to each override codes that can 136 * be encountered in a "Dialogue" Text field. 137 */ 138 typedef struct { 139 /** 140 * @defgroup ass_styles ASS styles 141 * @{ 142 */ 143 void (*text)(void *priv, const char *text, int len); 144 void (*new_line)(void *priv, int forced); 145 void (*style)(void *priv, char style, int close); 146 void (*color)(void *priv, unsigned int /* color */, unsigned int color_id); 147 void (*alpha)(void *priv, int alpha, int alpha_id); 148 void (*font_name)(void *priv, const char *name); 149 void (*font_size)(void *priv, int size); 150 void (*alignment)(void *priv, int alignment); 151 void (*cancel_overrides)(void *priv, const char *style); 152 /** @} */ 153 154 /** 155 * @defgroup ass_functions ASS functions 156 * @{ 157 */ 158 void (*move)(void *priv, int x1, int y1, int x2, int y2, int t1, int t2); 159 void (*origin)(void *priv, int x, int y); 160 /** @} */ 161 162 /** 163 * @defgroup ass_end end of Dialogue Event 164 * @{ 165 */ 166 void (*end)(void *priv); 167 /** @} */ 168 } ASSCodesCallbacks; 169 170 /** 171 * Split override codes out of a ASS "Dialogue" Text field. 172 * 173 * @param callbacks Set of callback functions called for each override code 174 * encountered. 175 * @param priv Opaque pointer passed to the callback functions. 176 * @param buf The ASS "Dialogue" Text field to split. 177 * @return >= 0 on success otherwise an error code <0 178 */ 179 int ff_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *priv, 180 const char *buf); 181 182 /** 183 * Find an ASSStyle structure by its name. 184 * 185 * @param ctx Context previously initialized by ff_ass_split(). 186 * @param style name of the style to search for. 187 * @return the ASSStyle corresponding to style, or NULL if style can't be found 188 */ 189 ASSStyle *ff_ass_style_get(ASSSplitContext *ctx, const char *style); 190 191 #endif /* AVCODEC_ASS_SPLIT_H */ 192