FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
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
29
int
ff_ass_subtitle_header
(
AVCodecContext
*avctx,
30
const
char
*font,
int
font_size,
31
int
color
,
int
back_color,
32
int
bold,
int
italic,
int
underline,
33
int
alignment)
34
{
35
avctx->
subtitle_header
=
av_asprintf
(
36
"[Script Info]\r\n"
37
"ScriptType: v4.00+\r\n"
38
"\r\n"
39
"[V4+ Styles]\r\n"
40
"Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding\r\n"
41
"Style: Default,%s,%d,&H%x,&H%x,&H%x,&H%x,%d,%d,%d,1,1,0,%d,10,10,10,0,0\r\n"
42
"\r\n"
43
"[Events]\r\n"
44
"Format: Layer, Start, End, Style, Text\r\n"
,
45
font, font_size, color, color, back_color, back_color,
46
-bold, -italic, -underline, alignment);
47
48
if
(!avctx->
subtitle_header
)
49
return
AVERROR
(ENOMEM);
50
avctx->
subtitle_header_size
= strlen(avctx->
subtitle_header
);
51
return
0;
52
}
53
54
int
ff_ass_subtitle_header_default
(
AVCodecContext
*avctx)
55
{
56
return
ff_ass_subtitle_header
(avctx,
ASS_DEFAULT_FONT
,
57
ASS_DEFAULT_FONT_SIZE
,
58
ASS_DEFAULT_COLOR
,
59
ASS_DEFAULT_BACK_COLOR
,
60
ASS_DEFAULT_BOLD
,
61
ASS_DEFAULT_ITALIC
,
62
ASS_DEFAULT_UNDERLINE
,
63
ASS_DEFAULT_ALIGNMENT
);
64
}
65
66
static
void
insert_ts
(
AVBPrint
*
buf
,
int
ts)
67
{
68
if
(ts == -1) {
69
av_bprintf
(buf,
"9:59:59.99,"
);
70
}
else
{
71
int
h,
m
,
s
;
72
73
h = ts/360000; ts -= 360000*h;
74
m = ts/ 6000; ts -= 6000*
m
;
75
s = ts/ 100; ts -= 100*
s
;
76
av_bprintf
(buf,
"%d:%02d:%02d.%02d,"
, h, m, s, ts);
77
}
78
}
79
80
int
ff_ass_add_rect
(
AVSubtitle
*sub,
const
char
*dialog,
81
int
ts_start,
int
duration
,
int
raw)
82
{
83
AVBPrint
buf
;
84
int
ret
, dlen;
85
AVSubtitleRect
**rects;
86
87
av_bprint_init
(&buf, 0,
AV_BPRINT_SIZE_UNLIMITED
);
88
if
(!raw || raw == 2) {
89
long
int
layer = 0;
90
91
if
(raw == 2) {
92
/* skip ReadOrder */
93
dialog = strchr(dialog,
','
);
94
if
(!dialog)
95
return
AVERROR_INVALIDDATA
;
96
dialog++;
97
98
/* extract Layer or Marked */
99
layer = strtol(dialog, (
char
**)&dialog, 10);
100
if
(*dialog !=
','
)
101
return
AVERROR_INVALIDDATA
;
102
dialog++;
103
}
104
av_bprintf
(&buf,
"Dialogue: %ld,"
, layer);
105
insert_ts
(&buf, ts_start);
106
insert_ts
(&buf, duration == -1 ? -1 : ts_start + duration);
107
if
(raw != 2)
108
av_bprintf
(&buf,
"Default,"
);
109
}
110
111
dlen = strcspn(dialog,
"\n"
);
112
dlen += dialog[dlen] ==
'\n'
;
113
114
av_bprintf
(&buf,
"%.*s"
, dlen, dialog);
115
if
(raw == 2)
116
av_bprintf
(&buf,
"\r\n"
);
117
if
(!
av_bprint_is_complete
(&buf))
118
return
AVERROR
(ENOMEM);
119
120
rects =
av_realloc
(sub->
rects
, (sub->
num_rects
+1) *
sizeof
(*sub->
rects
));
121
if
(!rects)
122
return
AVERROR
(ENOMEM);
123
sub->
rects
= rects;
124
sub->
end_display_time
=
FFMAX
(sub->
end_display_time
, 10 * duration);
125
rects[sub->
num_rects
] =
av_mallocz
(
sizeof
(*rects[0]));
126
rects[sub->
num_rects
]->
type
=
SUBTITLE_ASS
;
127
ret =
av_bprint_finalize
(&buf, &rects[sub->
num_rects
]->
ass
);
128
if
(ret < 0)
129
return
ret
;
130
sub->
num_rects
++;
131
return
dlen;
132
}
Generated on Sat Jan 25 2014 19:51:44 for FFmpeg by
1.8.2