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