avfilter/vf_subtitles: add wrap_unicode option

So CJK can be wrapped automatically.

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Zhao Zhili 2023-05-23 13:22:25 +08:00
parent 8e2547ebb2
commit 43ace8f2bc
3 changed files with 26 additions and 1 deletions

View File

@ -22440,6 +22440,13 @@ Set subtitles stream index. @code{subtitles} filter only.
@item force_style
Override default style or script info parameters of the subtitles. It accepts a
string containing ASS style format @code{KEY=VALUE} couples separated by ",".
@item wrap_unicode
Break lines according to the Unicode Line Breaking Algorithm. Only available
since libass version 0x01600010, and whether it's usable depends on the built
of libass.
The option is enabled by default except for native ASS.
@end table
If the first key is not specified, it is assumed that the first value

View File

@ -32,7 +32,7 @@
#include "version_major.h"
#define LIBAVFILTER_VERSION_MINOR 8
#define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_MICRO 101
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \

View File

@ -45,6 +45,8 @@
#include "formats.h"
#include "video.h"
#define FF_ASS_FEATURE_WRAP_UNICODE (LIBASS_VERSION >= 0x01600010)
typedef struct AssContext {
const AVClass *class;
ASS_Library *library;
@ -61,6 +63,7 @@ typedef struct AssContext {
int original_w, original_h;
int shaping;
FFDrawContext draw;
int wrap_unicode;
} AssContext;
#define OFFSET(x) offsetof(AssContext, x)
@ -271,6 +274,9 @@ static const AVOption subtitles_options[] = {
{"stream_index", "set stream index", OFFSET(stream_index), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS},
{"si", "set stream index", OFFSET(stream_index), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS},
{"force_style", "force subtitle style", OFFSET(force_style), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS},
#if FF_ASS_FEATURE_WRAP_UNICODE
{"wrap_unicode", "break lines according to the Unicode Line Breaking Algorithm", OFFSET(wrap_unicode), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, FLAGS },
#endif
{NULL},
};
@ -432,6 +438,18 @@ static av_cold int init_subtitles(AVFilterContext *ctx)
if (ret < 0)
goto end;
#if FF_ASS_FEATURE_WRAP_UNICODE
/* Don't overwrite wrap automatically for native ASS */
if (ass->wrap_unicode == -1)
ass->wrap_unicode = st->codecpar->codec_id != AV_CODEC_ID_ASS;
if (ass->wrap_unicode) {
ret = ass_track_set_feature(ass->track, ASS_FEATURE_WRAP_UNICODE, 1);
if (ret < 0)
av_log(ctx, AV_LOG_WARNING,
"libass wasn't built with ASS_FEATURE_WRAP_UNICODE support\n");
}
#endif
if (ass->force_style) {
char **list = NULL;
char *temp = NULL;