Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
40b7a27b
Commit
40b7a27b
authored
Apr 07, 2012
by
Nicolas George
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vf_drawtext: fontconfig support.
parent
be9b0d2c
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
111 additions
and
8 deletions
+111
-8
Changelog
Changelog
+1
-0
configure
configure
+3
-0
filters.texi
doc/filters.texi
+12
-0
vf_drawtext.c
libavfilter/vf_drawtext.c
+95
-8
No files found.
Changelog
View file @
40b7a27b
...
...
@@ -23,6 +23,7 @@ version next:
- OpenEXR image decoder
- removelogo filter
- drop support for ffmpeg without libavfilter
- drawtext video filter: fontconfig support
version 0.10:
...
...
configure
View file @
40b7a27b
...
...
@@ -166,6 +166,7 @@ Individual component options:
External library support:
--enable-avisynth enable reading of AVISynth script files [no]
--enable-bzlib enable bzlib [autodetect]
--enable-fontconfig enable fontconfig
--enable-frei0r enable frei0r video filtering
--enable-gnutls enable gnutls [no]
--enable-libaacplus enable AAC+ encoding via libaacplus [no]
...
...
@@ -1022,6 +1023,7 @@ CONFIG_LIST="
dxva2
fastdiv
fft
fontconfig
frei0r
gnutls
gpl
...
...
@@ -3164,6 +3166,7 @@ check_mathfunc truncf
# these are off by default, so fail if requested and not available
enabled avisynth
&&
require2 vfw32
"windows.h vfw.h"
AVIFileInit
-lavifil32
enabled fontconfig
&&
require_pkg_config fontconfig
"fontconfig/fontconfig.h"
FcInit
enabled frei0r
&&
{
check_header frei0r.h
||
die
"ERROR: frei0r.h header not found"
;
}
enabled gnutls
&&
require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
enabled libaacplus
&&
require
"libaacplus >= 2.0.0"
aacplus.h aacplusEncOpen
-laacplus
...
...
doc/filters.texi
View file @
40b7a27b
...
...
@@ -1414,6 +1414,9 @@ with or without text parameter. @var{rate} option must be specified.
frame rate (timecode only)
@end table
If libavfilter was built with @code{--enable-fontconfig}, then
@option{fontfile} can be a fontconfig pattern or omitted.
Some examples follow.
@itemize
...
...
@@ -1467,11 +1470,20 @@ The glyph baseline is placed at half screen height.
drawtext=fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent
@end example
@item
Use fontconfig to set the font. Note that the colons need to be escaped.
@example
drawtext='fontfile=Linux Libertine O-40\\:style=Semibold:text=FFmpeg'
@end example
@end itemize
For more information about libfreetype, check:
@url{http://www.freetype.org/}.
For more information about fontconfig, check:
@url{http://freedesktop.org/software/fontconfig/fontconfig-user.html}.
@section fade
Apply fade-in/out effect to input video.
...
...
libavfilter/vf_drawtext.c
View file @
40b7a27b
...
...
@@ -48,6 +48,9 @@
#include <freetype/config/ftheader.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#if CONFIG_FONTCONFIG
#include <fontconfig/fontconfig.h>
#endif
static
const
char
*
const
var_names
[]
=
{
"main_w"
,
"w"
,
"W"
,
///< width of the input video
...
...
@@ -167,7 +170,7 @@ static const AVOption drawtext_options[]= {
{
"boxcolor"
,
"set box color"
,
OFFSET
(
boxcolor_string
),
AV_OPT_TYPE_STRING
,
{.
str
=
"white"
},
CHAR_MIN
,
CHAR_MAX
},
{
"shadowcolor"
,
"set shadow color"
,
OFFSET
(
shadowcolor_string
),
AV_OPT_TYPE_STRING
,
{.
str
=
"black"
},
CHAR_MIN
,
CHAR_MAX
},
{
"box"
,
"set box"
,
OFFSET
(
draw_box
),
AV_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
1
},
{
"fontsize"
,
"set font size"
,
OFFSET
(
fontsize
),
AV_OPT_TYPE_INT
,
{.
dbl
=
16
},
1
,
INT_MAX
},
{
"fontsize"
,
"set font size"
,
OFFSET
(
fontsize
),
AV_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
INT_MAX
},
{
"x"
,
"set x expression"
,
OFFSET
(
x_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
},
{
"y"
,
"set y expression"
,
OFFSET
(
y_expr
),
AV_OPT_TYPE_STRING
,
{.
str
=
"0"
},
CHAR_MIN
,
CHAR_MAX
},
{
"shadowx"
,
"set x"
,
OFFSET
(
shadowx
),
AV_OPT_TYPE_INT
,
{.
dbl
=
0
},
INT_MIN
,
INT_MAX
},
...
...
@@ -298,6 +301,91 @@ error:
return
ret
;
}
static
int
load_font_file
(
AVFilterContext
*
ctx
,
const
char
*
path
,
int
index
,
const
char
**
error
)
{
DrawTextContext
*
dtext
=
ctx
->
priv
;
int
err
;
err
=
FT_New_Face
(
dtext
->
library
,
path
,
index
,
&
dtext
->
face
);
if
(
err
)
{
*
error
=
FT_ERRMSG
(
err
);
return
AVERROR
(
EINVAL
);
}
return
0
;
}
#if CONFIG_FONTCONFIG
static
int
load_font_fontconfig
(
AVFilterContext
*
ctx
,
const
char
**
error
)
{
DrawTextContext
*
dtext
=
ctx
->
priv
;
FcConfig
*
fontconfig
;
FcPattern
*
pattern
,
*
fpat
;
FcResult
result
=
FcResultMatch
;
FcChar8
*
filename
;
int
err
,
index
;
double
size
;
fontconfig
=
FcInitLoadConfigAndFonts
();
if
(
!
fontconfig
)
{
*
error
=
"impossible to init fontconfig
\n
"
;
return
AVERROR
(
EINVAL
);
}
pattern
=
FcNameParse
(
dtext
->
fontfile
?
dtext
->
fontfile
:
(
uint8_t
*
)(
intptr_t
)
"default"
);
if
(
!
pattern
)
{
*
error
=
"could not parse fontconfig pattern"
;
return
AVERROR
(
EINVAL
);
}
if
(
!
FcConfigSubstitute
(
fontconfig
,
pattern
,
FcMatchPattern
))
{
*
error
=
"could not substitue fontconfig options"
;
/* very unlikely */
return
AVERROR
(
EINVAL
);
}
FcDefaultSubstitute
(
pattern
);
fpat
=
FcFontMatch
(
fontconfig
,
pattern
,
&
result
);
if
(
!
fpat
||
result
!=
FcResultMatch
)
{
*
error
=
"impossible to find a matching font"
;
return
AVERROR
(
EINVAL
);
}
if
(
FcPatternGetString
(
fpat
,
FC_FILE
,
0
,
&
filename
)
!=
FcResultMatch
||
FcPatternGetInteger
(
fpat
,
FC_INDEX
,
0
,
&
index
)
!=
FcResultMatch
||
FcPatternGetDouble
(
fpat
,
FC_SIZE
,
0
,
&
size
)
!=
FcResultMatch
)
{
*
error
=
"impossible to find font information"
;
return
AVERROR
(
EINVAL
);
}
av_log
(
ctx
,
AV_LOG_INFO
,
"Using
\"
%s
\"\n
"
,
filename
);
if
(
!
dtext
->
fontsize
)
dtext
->
fontsize
=
size
+
0
.
5
;
err
=
load_font_file
(
ctx
,
filename
,
index
,
error
);
if
(
err
)
return
err
;
FcPatternDestroy
(
fpat
);
FcPatternDestroy
(
pattern
);
FcConfigDestroy
(
fontconfig
);
return
0
;
}
#endif
static
int
load_font
(
AVFilterContext
*
ctx
)
{
DrawTextContext
*
dtext
=
ctx
->
priv
;
int
err
;
const
char
*
error
=
"unknown error
\n
"
;
/* load the face, and set up the encoding, which is by default UTF-8 */
err
=
load_font_file
(
ctx
,
dtext
->
fontfile
,
0
,
&
error
);
if
(
!
err
)
return
0
;
#if CONFIG_FONTCONFIG
err
=
load_font_fontconfig
(
ctx
,
&
error
);
if
(
!
err
)
return
0
;
#endif
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not load font
\"
%s
\"
: %s
\n
"
,
dtext
->
fontfile
,
error
);
return
err
;
}
static
av_cold
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
,
void
*
opaque
)
{
int
err
;
...
...
@@ -312,7 +400,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
return
err
;
}
if
(
!
dtext
->
fontfile
)
{
if
(
!
dtext
->
fontfile
&&
!
CONFIG_FONTCONFIG
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"No font filename provided
\n
"
);
return
AVERROR
(
EINVAL
);
}
...
...
@@ -381,12 +469,11 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
return
AVERROR
(
EINVAL
);
}
/* load the face, and set up the encoding, which is by default UTF-8 */
if
((
err
=
FT_New_Face
(
dtext
->
library
,
dtext
->
fontfile
,
0
,
&
dtext
->
face
)))
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not load fontface from file '%s': %s
\n
"
,
dtext
->
fontfile
,
FT_ERRMSG
(
err
));
return
AVERROR
(
EINVAL
);
}
err
=
load_font
(
ctx
);
if
(
err
)
return
err
;
if
(
!
dtext
->
fontsize
)
dtext
->
fontsize
=
16
;
if
((
err
=
FT_Set_Pixel_Sizes
(
dtext
->
face
,
0
,
dtext
->
fontsize
)))
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"Could not set font size to %d pixels: %s
\n
"
,
dtext
->
fontsize
,
FT_ERRMSG
(
err
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment