1
0
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:
Clément Bœsch 2015-12-17 12:23:35 +01:00 committed by Clément Bœsch
parent 244766e407
commit f122ba36cb
6 changed files with 253 additions and 5 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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, \

View File

@ -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
View 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>