FFmpeg  4.0
ass.c
Go to the documentation of this file.
1 /*
2  * SSA/ASS common 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 #include "avcodec.h"
23 #include "ass.h"
24 #include "libavutil/avassert.h"
25 #include "libavutil/avstring.h"
26 #include "libavutil/bprint.h"
27 #include "libavutil/common.h"
28 
30  const char *font, int font_size,
31  int color, int back_color,
32  int bold, int italic, int underline,
33  int border_style, int alignment)
34 {
36  "[Script Info]\r\n"
37  "; Script generated by FFmpeg/Lavc%s\r\n"
38  "ScriptType: v4.00+\r\n"
39  "PlayResX: %d\r\n"
40  "PlayResY: %d\r\n"
41  "\r\n"
42  "[V4+ Styles]\r\n"
43 
44  /* ASSv4 header */
45  "Format: Name, "
46  "Fontname, Fontsize, "
47  "PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
48  "Bold, Italic, Underline, StrikeOut, "
49  "ScaleX, ScaleY, "
50  "Spacing, Angle, "
51  "BorderStyle, Outline, Shadow, "
52  "Alignment, MarginL, MarginR, MarginV, "
53  "Encoding\r\n"
54 
55  "Style: "
56  "Default," /* Name */
57  "%s,%d," /* Font{name,size} */
58  "&H%x,&H%x,&H%x,&H%x," /* {Primary,Secondary,Outline,Back}Colour */
59  "%d,%d,%d,0," /* Bold, Italic, Underline, StrikeOut */
60  "100,100," /* Scale{X,Y} */
61  "0,0," /* Spacing, Angle */
62  "%d,1,0," /* BorderStyle, Outline, Shadow */
63  "%d,10,10,10," /* Alignment, Margin[LRV] */
64  "0\r\n" /* Encoding */
65 
66  "\r\n"
67  "[Events]\r\n"
68  "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
71  font, font_size, color, color, back_color, back_color,
72  -bold, -italic, -underline, border_style, alignment);
73 
74  if (!avctx->subtitle_header)
75  return AVERROR(ENOMEM);
76  avctx->subtitle_header_size = strlen(avctx->subtitle_header);
77  return 0;
78 }
79 
81 {
91 }
92 
93 char *ff_ass_get_dialog(int readorder, int layer, const char *style,
94  const char *speaker, const char *text)
95 {
96  return av_asprintf("%d,%d,%s,%s,0,0,0,,%s",
97  readorder, layer, style ? style : "Default",
98  speaker ? speaker : "", text);
99 }
100 
101 int ff_ass_add_rect(AVSubtitle *sub, const char *dialog,
102  int readorder, int layer, const char *style,
103  const char *speaker)
104 {
105  char *ass_str;
106  AVSubtitleRect **rects;
107 
108  rects = av_realloc_array(sub->rects, (sub->num_rects+1), sizeof(*sub->rects));
109  if (!rects)
110  return AVERROR(ENOMEM);
111  sub->rects = rects;
112  rects[sub->num_rects] = av_mallocz(sizeof(*rects[0]));
113  if (!rects[sub->num_rects])
114  return AVERROR(ENOMEM);
115  rects[sub->num_rects]->type = SUBTITLE_ASS;
116  ass_str = ff_ass_get_dialog(readorder, layer, style, speaker, dialog);
117  if (!ass_str)
118  return AVERROR(ENOMEM);
119  rects[sub->num_rects]->ass = ass_str;
120  sub->num_rects++;
121  return 0;
122 }
123 
125 {
126  FFASSDecoderContext *s = avctx->priv_data;
127  if (!(avctx->flags2 & AV_CODEC_FLAG2_RO_FLUSH_NOOP))
128  s->readorder = 0;
129 }
130 
131 void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size,
132  const char *linebreaks, int keep_ass_markup)
133 {
134  const char *p_end = p + size;
135 
136  for (; p < p_end && *p; p++) {
137 
138  /* forced custom line breaks, not accounted as "normal" EOL */
139  if (linebreaks && strchr(linebreaks, *p)) {
140  av_bprintf(buf, "\\N");
141 
142  /* standard ASS escaping so random characters don't get mis-interpreted
143  * as ASS */
144  } else if (!keep_ass_markup && strchr("{}\\", *p)) {
145  av_bprintf(buf, "\\%c", *p);
146 
147  /* some packets might end abruptly (no \0 at the end, like for example
148  * in some cases of demuxing from a classic video container), some
149  * might be terminated with \n or \r\n which we have to remove (for
150  * consistency with those who haven't), and we also have to deal with
151  * evil cases such as \r at the end of the buffer (and no \0 terminated
152  * character) */
153  } else if (p[0] == '\n') {
154  /* some stuff left so we can insert a line break */
155  if (p < p_end - 1)
156  av_bprintf(buf, "\\N");
157  } else if (p[0] == '\r' && p < p_end - 1 && p[1] == '\n') {
158  /* \r followed by a \n, we can skip it. We don't insert the \N yet
159  * because we don't know if it is followed by more text */
160  continue;
161 
162  /* finally, a sane character */
163  } else {
164  av_bprint_chars(buf, *p, 1);
165  }
166  }
167 }
const char * s
Definition: avisynth_c.h:768
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:94
int size
#define ASS_DEFAULT_BORDERSTYLE
Definition: ass.h:43
int ff_ass_subtitle_header(AVCodecContext *avctx, const char *font, int font_size, int color, int back_color, int bold, int italic, int underline, int border_style, int alignment)
Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS.
Definition: ass.c:29
unsigned num_rects
Definition: avcodec.h:3864
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, int readorder, int layer, const char *style, const char *speaker)
Add an ASS dialog to a subtitle.
Definition: ass.c:101
AVSubtitleRect ** rects
Definition: avcodec.h:3865
#define ASS_DEFAULT_ALIGNMENT
Definition: ass.h:42
int subtitle_header_size
Definition: avcodec.h:2986
int ff_ass_subtitle_header_default(AVCodecContext *avctx)
Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS with default style.
Definition: ass.c:80
#define AV_CODEC_FLAG2_RO_FLUSH_NOOP
Do not reset ASS ReadOrder field on flush (subtitles decoding)
Definition: avcodec.h:941
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array.
Definition: mem.c:198
#define ASS_DEFAULT_PLAYRESY
Definition: ass.h:29
#define ASS_DEFAULT_BACK_COLOR
Definition: ass.h:38
#define ASS_DEFAULT_UNDERLINE
Definition: ass.h:41
char * ff_ass_get_dialog(int readorder, int layer, const char *style, const char *speaker, const char *text)
Craft an ASS dialog string.
Definition: ass.c:93
#define AVERROR(e)
Definition: error.h:43
#define ASS_DEFAULT_FONT
Definition: ass.h:35
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:1598
simple assert() macros that are a bit more flexible than ISO C assert().
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
#define ASS_DEFAULT_FONT_SIZE
Definition: ass.h:36
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:113
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:886
Libavcodec external API header.
main external API structure.
Definition: avcodec.h:1518
void * buf
Definition: avisynth_c.h:690
#define AV_STRINGIFY(s)
Definition: macros.h:36
void ff_ass_decoder_flush(AVCodecContext *avctx)
Helper to flush a text subtitles decoder making use of the FFASSDecoderContext.
Definition: ass.c:124
#define LIBAVCODEC_VERSION
Definition: version.h:37
common internal and external API header
#define ASS_DEFAULT_COLOR
Definition: ass.h:37
void * priv_data
Definition: avcodec.h:1545
Formatted text, the ass field must be set by the decoder and is authoritative.
Definition: avcodec.h:3820
#define ASS_DEFAULT_ITALIC
Definition: ass.h:40
void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size, const char *linebreaks, int keep_ass_markup)
Escape a text subtitle using ASS syntax into an AVBPrint buffer.
Definition: ass.c:131
#define ASS_DEFAULT_BOLD
Definition: ass.h:39
char * ass
0 terminated ASS/SSA compatible event line.
Definition: avcodec.h:3855
int flags2
AV_CODEC_FLAG2_*.
Definition: avcodec.h:1605
enum AVSubtitleType type
Definition: avcodec.h:3846
#define ASS_DEFAULT_PLAYRESX
Definition: ass.h:28
uint8_t * subtitle_header
Header containing style information for text subtitles.
Definition: avcodec.h:2985
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
Definition: bprint.c:140