--- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 2 +- libavcodec/srtenc.c | 37 +++++++- libavcodec/version.h | 2 +- tests/fate/subtitles.mak | 3 + tests/ref/fate/sub-textenc | 213 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 253 insertions(+), 5 deletions(-) create mode 100644 tests/ref/fate/sub-textenc
diff --git a/libavcodec/Makefile b/libavcodec/Makefile index c169135..24de0c1 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -497,6 +497,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 diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 245332e..6361a38 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -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); diff --git a/libavcodec/srtenc.c b/libavcodec/srtenc.c index 3287970..0a6875a 100644 --- a/libavcodec/srtenc.c +++ b/libavcodec/srtenc.c @@ -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 diff --git a/libavcodec/version.h b/libavcodec/version.h index 3027853..6f88ee4 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 17 +#define LIBAVCODEC_VERSION_MINOR 18 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ diff --git a/tests/fate/subtitles.mak b/tests/fate/subtitles.mak index 2d9eb50..25914da 100644 --- a/tests/fate/subtitles.mak +++ b/tests/fate/subtitles.mak @@ -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 -c:s text -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt + 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 diff --git a/tests/ref/fate/sub-textenc b/tests/ref/fate/sub-textenc new file mode 100644 index 0000000..8cf0409 --- /dev/null +++ b/tests/ref/fate/sub-textenc @@ -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 +<b><i>Use VLC 1.1 or higher as reference for most things and MPC Home Cinema for others</i></b> +<font color="#0000FF">This text should be blue</font> +<font color="red">This text should be red</font> +<font color="#000000">This text should be black</font> +<font face="Webdings">If you see this with the normal font, the player don't (fully) support font face</font> + +3 +00:00:04,500 --> 00:00:04,500 +Hidden + +4 +00:00:04,501 --> 00:00:07,501 +<font size="8">This text should be small</font> +This text should be normal +<font size="35">This text should be big</font> + +5 +00:00:07,501 --> 00:00:11,501 +This should be an E with an accent: È +日本語 +<font size=30><b><i><u>This text should be bold, italics and underline</u></i></b></font> +<font size=9 color="00ff00">This text should be small and green</font> +<font color=#ff0000 size=9>This text should be small and red</font> +<font color=brown size=24>This text should be big and brown</font> + +6 +00:00:11,501 --> 00:00:14,501 +<b>This line should be bold</b> +<i>This line should be italics</i> +<u>This line should be underline</u> +<s>This line should be strikethrough</s> +<u>Both lines +should be underline</u> + +7 +00:00:14,501 --> 00:00:17,501 +> +It would be a good thing to +<invalid_tag>hide invalid html tags that are closed and show the text in them</invalid_tag> +<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 +<invalid_tag par=5>hide invalid html tags with parameters that are closed and show the text in them</invalid_tag> +<invalid_tag_uc par=5>but show un-closed invalid html tags +<u>This text should be showed underlined without problems also: 2<3,5>1,4<6</u> +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 +\{\an8}This text should be at the +top and horizontally centered + +12 +00:00:22,501 --> 00:00:24,501 +\{\an5}This text should be at the +middle and horizontally centered + +13 +00:00:22,501 --> 00:00:24,501 +\{\an2}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\{\an7} + +15 +00:00:24,501 --> 00:00:26,501 +\{\an4}This text should be at the +middle and horiz\ontally at the left +(The second position must be ignored) + +16 +00:00:24,501 --> 00:00:26,501 +\{\an1}This text should be at the +bottom and horizontally at the left + +17 +00:00:26,501 --> 00:00:28,501 +\{\an9}This text should be at the +top and horizontally at the right + +18 +00:00:26,501 --> 00:00:28,501 +\{\an6}This text should be at the +middle and horizontally at the right + +19 +00:00:26,501 --> 00:00:28,501 +\{\an3}This text should be at the +bottom and horizontally at the right + +20 +00:00:28,501 --> 00:00:31,501 +<font color="#00FF00" size="6">This could be the <font size="35">m<font color="#000000">o</font>st</font> difficult thing to implement</font> + +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: \{Y:some_letters_or_numbers_or_chars\} +but show this: \{normal text\} + +30 +00:00:54,501 --> 00:01:00,501 +\{\an8} +\\ 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 +\{\an1} +\\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 +\{\an3} +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 +<s>Both line should be strikethrough, +yes.</s> +<wwww>Correctly closed tags +should be hidden.</wwww> + +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 +<s>Three lines should be strikethrough, +yes. +<yyyy>Not closed tags showed as text + +37 +00:01:06,501 --> 00:01:08,501 +<s>Both line should be strikethrough but +the wrong closing tag should be showed</b> + -- 2.6.4 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel