mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-24 17:12:34 +02:00
lavc: add text encoder
This commit is contained in:
parent
244766e407
commit
f122ba36cb
@ -499,6 +499,7 @@ OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o \
|
|||||||
h263.o ituh263enc.o
|
h263.o ituh263enc.o
|
||||||
OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o mpegutils.o
|
OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o mpegutils.o
|
||||||
OBJS-$(CONFIG_TEXT_DECODER) += textdec.o ass.o
|
OBJS-$(CONFIG_TEXT_DECODER) += textdec.o ass.o
|
||||||
|
OBJS-$(CONFIG_TEXT_ENCODER) += srtenc.o ass_split.o
|
||||||
OBJS-$(CONFIG_TAK_DECODER) += takdec.o tak.o takdsp.o
|
OBJS-$(CONFIG_TAK_DECODER) += takdec.o tak.o takdsp.o
|
||||||
OBJS-$(CONFIG_TARGA_DECODER) += targa.o
|
OBJS-$(CONFIG_TARGA_DECODER) += targa.o
|
||||||
OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
|
OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
|
||||||
|
@ -550,7 +550,7 @@ void avcodec_register_all(void)
|
|||||||
REGISTER_ENCDEC (SUBRIP, subrip);
|
REGISTER_ENCDEC (SUBRIP, subrip);
|
||||||
REGISTER_DECODER(SUBVIEWER, subviewer);
|
REGISTER_DECODER(SUBVIEWER, subviewer);
|
||||||
REGISTER_DECODER(SUBVIEWER1, subviewer1);
|
REGISTER_DECODER(SUBVIEWER1, subviewer1);
|
||||||
REGISTER_DECODER(TEXT, text);
|
REGISTER_ENCDEC (TEXT, text);
|
||||||
REGISTER_DECODER(VPLAYER, vplayer);
|
REGISTER_DECODER(VPLAYER, vplayer);
|
||||||
REGISTER_ENCDEC (WEBVTT, webvtt);
|
REGISTER_ENCDEC (WEBVTT, webvtt);
|
||||||
REGISTER_ENCDEC (XSUB, xsub);
|
REGISTER_ENCDEC (XSUB, xsub);
|
||||||
|
@ -221,8 +221,14 @@ static const ASSCodesCallbacks srt_callbacks = {
|
|||||||
.end = srt_end_cb,
|
.end = srt_end_cb,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int srt_encode_frame(AVCodecContext *avctx,
|
static const ASSCodesCallbacks text_callbacks = {
|
||||||
unsigned char *buf, int bufsize, const AVSubtitle *sub)
|
.text = srt_text_cb,
|
||||||
|
.new_line = srt_new_line_cb,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int encode_frame(AVCodecContext *avctx,
|
||||||
|
unsigned char *buf, int bufsize, const AVSubtitle *sub,
|
||||||
|
const ASSCodesCallbacks *cb)
|
||||||
{
|
{
|
||||||
SRTContext *s = avctx->priv_data;
|
SRTContext *s = avctx->priv_data;
|
||||||
ASSDialog *dialog;
|
ASSDialog *dialog;
|
||||||
@ -241,7 +247,7 @@ static int srt_encode_frame(AVCodecContext *avctx,
|
|||||||
for (; dialog && num--; dialog++) {
|
for (; dialog && num--; dialog++) {
|
||||||
s->alignment_applied = 0;
|
s->alignment_applied = 0;
|
||||||
srt_style_apply(s, dialog->style);
|
srt_style_apply(s, dialog->style);
|
||||||
ff_ass_split_override_codes(&srt_callbacks, s, dialog->text);
|
ff_ass_split_override_codes(cb, s, dialog->text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,6 +265,18 @@ static int srt_encode_frame(AVCodecContext *avctx,
|
|||||||
return s->buffer.len;
|
return s->buffer.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int srt_encode_frame(AVCodecContext *avctx,
|
||||||
|
unsigned char *buf, int bufsize, const AVSubtitle *sub)
|
||||||
|
{
|
||||||
|
return encode_frame(avctx, buf, bufsize, sub, &srt_callbacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int text_encode_frame(AVCodecContext *avctx,
|
||||||
|
unsigned char *buf, int bufsize, const AVSubtitle *sub)
|
||||||
|
{
|
||||||
|
return encode_frame(avctx, buf, bufsize, sub, &text_callbacks);
|
||||||
|
}
|
||||||
|
|
||||||
static int srt_encode_close(AVCodecContext *avctx)
|
static int srt_encode_close(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
SRTContext *s = avctx->priv_data;
|
SRTContext *s = avctx->priv_data;
|
||||||
@ -293,3 +311,16 @@ AVCodec ff_subrip_encoder = {
|
|||||||
.close = srt_encode_close,
|
.close = srt_encode_close,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_TEXT_ENCODER
|
||||||
|
AVCodec ff_text_encoder = {
|
||||||
|
.name = "text",
|
||||||
|
.long_name = NULL_IF_CONFIG_SMALL("Raw text subtitle"),
|
||||||
|
.type = AVMEDIA_TYPE_SUBTITLE,
|
||||||
|
.id = AV_CODEC_ID_TEXT,
|
||||||
|
.priv_data_size = sizeof(SRTContext),
|
||||||
|
.init = srt_encode_init,
|
||||||
|
.encode_sub = text_encode_frame,
|
||||||
|
.close = srt_encode_close,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "libavutil/version.h"
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_MAJOR 57
|
#define LIBAVCODEC_VERSION_MAJOR 57
|
||||||
#define LIBAVCODEC_VERSION_MINOR 18
|
#define LIBAVCODEC_VERSION_MINOR 19
|
||||||
#define LIBAVCODEC_VERSION_MICRO 100
|
#define LIBAVCODEC_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
|
@ -76,6 +76,9 @@ fate-sub-webvtt2: CMD = fmtstdout ass -i $(TARGET_SAMPLES)/sub/WebVTT_extended_t
|
|||||||
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER WEBVTT_ENCODER WEBVTT_MUXER) += fate-sub-webvttenc
|
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER WEBVTT_ENCODER WEBVTT_MUXER) += fate-sub-webvttenc
|
||||||
fate-sub-webvttenc: CMD = fmtstdout webvtt -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt
|
fate-sub-webvttenc: CMD = fmtstdout webvtt -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt
|
||||||
|
|
||||||
|
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER TEXT_ENCODER SRT_MUXER) += fate-sub-textenc
|
||||||
|
fate-sub-textenc: CMD = fmtstdout srt -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt -c:s text
|
||||||
|
|
||||||
FATE_SUBTITLES_ASS-$(call ALLYES, MICRODVD_DEMUXER MICRODVD_DECODER ICONV) += fate-sub-charenc
|
FATE_SUBTITLES_ASS-$(call ALLYES, MICRODVD_DEMUXER MICRODVD_DECODER ICONV) += fate-sub-charenc
|
||||||
fate-sub-charenc: CMD = fmtstdout ass -sub_charenc cp1251 -i $(TARGET_SAMPLES)/sub/cp1251-subtitles.sub
|
fate-sub-charenc: CMD = fmtstdout ass -sub_charenc cp1251 -i $(TARGET_SAMPLES)/sub/cp1251-subtitles.sub
|
||||||
|
|
||||||
|
213
tests/ref/fate/sub-textenc
Normal file
213
tests/ref/fate/sub-textenc
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
1
|
||||||
|
00:00:00,000 --> 00:00:00,000
|
||||||
|
Don't show this text it may be used to insert hidden data
|
||||||
|
|
||||||
|
2
|
||||||
|
00:00:01,500 --> 00:00:04,500
|
||||||
|
SubRip subtitles capability tester 1.3o by ale5000
|
||||||
|
Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others
|
||||||
|
This text should be blue
|
||||||
|
This text should be red
|
||||||
|
This text should be black
|
||||||
|
If you see this with the normal font, the player don't (fully) support font face
|
||||||
|
|
||||||
|
3
|
||||||
|
00:00:04,500 --> 00:00:04,500
|
||||||
|
Hidden
|
||||||
|
|
||||||
|
4
|
||||||
|
00:00:04,501 --> 00:00:07,501
|
||||||
|
This text should be small
|
||||||
|
This text should be normal
|
||||||
|
This text should be big
|
||||||
|
|
||||||
|
5
|
||||||
|
00:00:07,501 --> 00:00:11,501
|
||||||
|
This should be an E with an accent: È
|
||||||
|
日本語
|
||||||
|
This text should be bold, italics and underline
|
||||||
|
This text should be small and green
|
||||||
|
This text should be small and red
|
||||||
|
This text should be big and brown
|
||||||
|
|
||||||
|
6
|
||||||
|
00:00:11,501 --> 00:00:14,501
|
||||||
|
This line should be bold
|
||||||
|
This line should be italics
|
||||||
|
This line should be underline
|
||||||
|
This line should be strikethrough
|
||||||
|
Both lines
|
||||||
|
should be underline
|
||||||
|
|
||||||
|
7
|
||||||
|
00:00:14,501 --> 00:00:17,501
|
||||||
|
>
|
||||||
|
It would be a good thing to
|
||||||
|
hide invalid html tags that are closed and show the text in them
|
||||||
|
<invalid_tag_unclosed>but show un-closed invalid html tags
|
||||||
|
Show not opened tags</invalid_tag_not_opened>
|
||||||
|
<
|
||||||
|
|
||||||
|
8
|
||||||
|
00:00:17,501 --> 00:00:20,501
|
||||||
|
and also
|
||||||
|
hide invalid html tags with parameters that are closed and show the text in them
|
||||||
|
<invalid_tag_uc par=5>but show un-closed invalid html tags
|
||||||
|
This text should be showed underlined without problems also: 2<3,5>1,4<6
|
||||||
|
This shouldn't be underlined
|
||||||
|
|
||||||
|
9
|
||||||
|
00:00:20,501 --> 00:00:21,501
|
||||||
|
This text should be in the normal position...
|
||||||
|
|
||||||
|
10
|
||||||
|
00:00:21,501 --> 00:00:22,501
|
||||||
|
This text should NOT be in the normal position
|
||||||
|
|
||||||
|
11
|
||||||
|
00:00:22,501 --> 00:00:24,501
|
||||||
|
Implementation is the same of the ASS tag
|
||||||
|
This text should be at the
|
||||||
|
top and horizontally centered
|
||||||
|
|
||||||
|
12
|
||||||
|
00:00:22,501 --> 00:00:24,501
|
||||||
|
This text should be at the
|
||||||
|
middle and horizontally centered
|
||||||
|
|
||||||
|
13
|
||||||
|
00:00:22,501 --> 00:00:24,501
|
||||||
|
This text should be at the
|
||||||
|
bottom and horizontally centered
|
||||||
|
|
||||||
|
14
|
||||||
|
00:00:24,501 --> 00:00:26,501
|
||||||
|
This text should be at the
|
||||||
|
top and horizontally at the left
|
||||||
|
|
||||||
|
15
|
||||||
|
00:00:24,501 --> 00:00:26,501
|
||||||
|
This text should be at the
|
||||||
|
middle and horizontally at the left
|
||||||
|
(The second position must be ignored)
|
||||||
|
|
||||||
|
16
|
||||||
|
00:00:24,501 --> 00:00:26,501
|
||||||
|
This text should be at the
|
||||||
|
bottom and horizontally at the left
|
||||||
|
|
||||||
|
17
|
||||||
|
00:00:26,501 --> 00:00:28,501
|
||||||
|
This text should be at the
|
||||||
|
top and horizontally at the right
|
||||||
|
|
||||||
|
18
|
||||||
|
00:00:26,501 --> 00:00:28,501
|
||||||
|
This text should be at the
|
||||||
|
middle and horizontally at the right
|
||||||
|
|
||||||
|
19
|
||||||
|
00:00:26,501 --> 00:00:28,501
|
||||||
|
This text should be at the
|
||||||
|
bottom and horizontally at the right
|
||||||
|
|
||||||
|
20
|
||||||
|
00:00:28,501 --> 00:00:31,501
|
||||||
|
This could be the most difficult thing to implement
|
||||||
|
|
||||||
|
21
|
||||||
|
00:00:31,501 --> 00:00:50,501
|
||||||
|
First text
|
||||||
|
|
||||||
|
22
|
||||||
|
00:00:33,500 --> 00:00:35,500
|
||||||
|
Second, it shouldn't overlap first
|
||||||
|
|
||||||
|
23
|
||||||
|
00:00:35,501 --> 00:00:37,501
|
||||||
|
Third, it should replace second
|
||||||
|
|
||||||
|
24
|
||||||
|
00:00:36,501 --> 00:00:50,501
|
||||||
|
Fourth, it shouldn't overlap first and third
|
||||||
|
|
||||||
|
25
|
||||||
|
00:00:40,501 --> 00:00:45,501
|
||||||
|
Fifth, it should replace third
|
||||||
|
|
||||||
|
26
|
||||||
|
00:00:45,501 --> 00:00:50,501
|
||||||
|
Sixth, it shouldn't be
|
||||||
|
showed overlapped
|
||||||
|
|
||||||
|
27
|
||||||
|
00:00:50,501 --> 00:00:52,501
|
||||||
|
TEXT 1 (bottom)
|
||||||
|
|
||||||
|
28
|
||||||
|
00:00:50,501 --> 00:00:52,501
|
||||||
|
text 2
|
||||||
|
|
||||||
|
29
|
||||||
|
00:00:52,501 --> 00:00:54,501
|
||||||
|
Hide these tags:
|
||||||
|
also hide these tags:
|
||||||
|
but show this: {normal text}
|
||||||
|
|
||||||
|
30
|
||||||
|
00:00:54,501 --> 00:01:00,501
|
||||||
|
|
||||||
|
\ N is a forced line break
|
||||||
|
\ h is a hard space
|
||||||
|
Normal spaces at the start and at the end of the line are trimmed while hard spaces are not trimmed.
|
||||||
|
The\hline\hwill\hnever\hbreak\hautomatically\hright\hbefore\hor\hafter\ha\hhard\hspace.\h:-D
|
||||||
|
|
||||||
|
31
|
||||||
|
00:00:54,501 --> 00:00:56,501
|
||||||
|
|
||||||
|
\h\h\h\h\hA (05 hard spaces followed by a letter)
|
||||||
|
A (Normal spaces followed by a letter)
|
||||||
|
A (No hard spaces followed by a letter)
|
||||||
|
|
||||||
|
32
|
||||||
|
00:00:56,501 --> 00:00:58,501
|
||||||
|
\h\h\h\h\hA (05 hard spaces followed by a letter)
|
||||||
|
A (Normal spaces followed by a letter)
|
||||||
|
A (No hard spaces followed by a letter)
|
||||||
|
Show this: \TEST and this: \-)
|
||||||
|
|
||||||
|
33
|
||||||
|
00:00:58,501 --> 00:01:00,501
|
||||||
|
|
||||||
|
A letter followed by 05 hard spaces: A\h\h\h\h\h
|
||||||
|
A letter followed by normal spaces: A
|
||||||
|
A letter followed by no hard spaces: A
|
||||||
|
05 hard spaces between letters: A\h\h\h\h\hA
|
||||||
|
5 normal spaces between letters: A A
|
||||||
|
|
||||||
|
^--Forced line break
|
||||||
|
|
||||||
|
34
|
||||||
|
00:01:00,501 --> 00:01:02,501
|
||||||
|
Both line should be strikethrough,
|
||||||
|
yes.
|
||||||
|
Correctly closed tags
|
||||||
|
should be hidden.
|
||||||
|
|
||||||
|
35
|
||||||
|
00:01:02,501 --> 00:01:04,501
|
||||||
|
It shouldn't be strikethrough,
|
||||||
|
not opened tag showed as text.</s>
|
||||||
|
Not opened tag showed as text.</xxxxx>
|
||||||
|
|
||||||
|
36
|
||||||
|
00:01:04,501 --> 00:01:06,501
|
||||||
|
Three lines should be strikethrough,
|
||||||
|
yes.
|
||||||
|
<yyyy>Not closed tags showed as text
|
||||||
|
|
||||||
|
37
|
||||||
|
00:01:06,501 --> 00:01:08,501
|
||||||
|
Both line should be strikethrough but
|
||||||
|
the wrong closing tag should be showed</b>
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user