mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +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
|
||||
OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o mpegutils.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_TARGA_DECODER) += targa.o
|
||||
OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
|
||||
|
@ -550,7 +550,7 @@ void avcodec_register_all(void)
|
||||
REGISTER_ENCDEC (SUBRIP, subrip);
|
||||
REGISTER_DECODER(SUBVIEWER, subviewer);
|
||||
REGISTER_DECODER(SUBVIEWER1, subviewer1);
|
||||
REGISTER_DECODER(TEXT, text);
|
||||
REGISTER_ENCDEC (TEXT, text);
|
||||
REGISTER_DECODER(VPLAYER, vplayer);
|
||||
REGISTER_ENCDEC (WEBVTT, webvtt);
|
||||
REGISTER_ENCDEC (XSUB, xsub);
|
||||
|
@ -221,8 +221,14 @@ static const ASSCodesCallbacks srt_callbacks = {
|
||||
.end = srt_end_cb,
|
||||
};
|
||||
|
||||
static int srt_encode_frame(AVCodecContext *avctx,
|
||||
unsigned char *buf, int bufsize, const AVSubtitle *sub)
|
||||
static const ASSCodesCallbacks text_callbacks = {
|
||||
.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;
|
||||
ASSDialog *dialog;
|
||||
@ -241,7 +247,7 @@ static int srt_encode_frame(AVCodecContext *avctx,
|
||||
for (; dialog && num--; dialog++) {
|
||||
s->alignment_applied = 0;
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
SRTContext *s = avctx->priv_data;
|
||||
@ -293,3 +311,16 @@ AVCodec ff_subrip_encoder = {
|
||||
.close = srt_encode_close,
|
||||
};
|
||||
#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"
|
||||
|
||||
#define LIBAVCODEC_VERSION_MAJOR 57
|
||||
#define LIBAVCODEC_VERSION_MINOR 18
|
||||
#define LIBAVCODEC_VERSION_MINOR 19
|
||||
#define LIBAVCODEC_VERSION_MICRO 100
|
||||
|
||||
#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-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-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…
Reference in New Issue
Block a user