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