diff --git a/Changelog b/Changelog index 1bbe690cc9..5a08d8f2aa 100644 --- a/Changelog +++ b/Changelog @@ -46,6 +46,7 @@ version next: - asetpts filter - hue filter - ICO muxer +- SubRip encoder and decoder without embedded timing version 0.11: diff --git a/libavcodec/Makefile b/libavcodec/Makefile index bab97e4767..ed861aeaa6 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -409,6 +409,7 @@ OBJS-$(CONFIG_SP5X_DECODER) += sp5xdec.o mjpegdec.o mjpeg.o OBJS-$(CONFIG_SRT_DECODER) += srtdec.o ass.o OBJS-$(CONFIG_SRT_ENCODER) += srtenc.o ass_split.o OBJS-$(CONFIG_SUBRIP_DECODER) += srtdec.o ass.o +OBJS-$(CONFIG_SUBRIP_ENCODER) += srtenc.o ass_split.o OBJS-$(CONFIG_SUBVIEWER_DECODER) += subviewerdec.o ass.o OBJS-$(CONFIG_SUNRAST_DECODER) += sunrast.o OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index f7ae4498b3..98147732ed 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -415,7 +415,7 @@ void avcodec_register_all(void) REGISTER_DECODER (REALTEXT, realtext); REGISTER_DECODER (SAMI, sami); REGISTER_ENCDEC (SRT, srt); - REGISTER_DECODER (SUBRIP, subrip); + REGISTER_ENCDEC (SUBRIP, subrip); REGISTER_DECODER (SUBVIEWER, subviewer); REGISTER_ENCDEC (XSUB, xsub); diff --git a/libavcodec/srtenc.c b/libavcodec/srtenc.c index 9e152c70c7..dfc4e6c47c 100644 --- a/libavcodec/srtenc.c +++ b/libavcodec/srtenc.c @@ -252,16 +252,18 @@ static int srt_encode_frame(AVCodecContext *avctx, dialog = ff_ass_split_dialog(s->ass_ctx, sub->rects[i]->ass, 0, &num); for (; dialog && num--; dialog++) { - int sh, sm, ss, sc = 10 * dialog->start; - int eh, em, es, ec = 10 * dialog->end; - sh = sc/3600000; sc -= 3600000*sh; - sm = sc/ 60000; sc -= 60000*sm; - ss = sc/ 1000; sc -= 1000*ss; - eh = ec/3600000; ec -= 3600000*eh; - em = ec/ 60000; ec -= 60000*em; - es = ec/ 1000; ec -= 1000*es; - srt_print(s,"%d\r\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\r\n", - ++s->count, sh, sm, ss, sc, eh, em, es, ec); + if (avctx->codec->id == CODEC_ID_SRT) { + int sh, sm, ss, sc = 10 * dialog->start; + int eh, em, es, ec = 10 * dialog->end; + sh = sc/3600000; sc -= 3600000*sh; + sm = sc/ 60000; sc -= 60000*sm; + ss = sc/ 1000; sc -= 1000*ss; + eh = ec/3600000; ec -= 3600000*eh; + em = ec/ 60000; ec -= 60000*em; + es = ec/ 1000; ec -= 1000*es; + srt_print(s,"%d\r\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\r\n", + ++s->count, sh, sm, ss, sc, eh, em, es, ec); + } s->alignment_applied = 0; s->dialog_start = s->ptr - 2; srt_style_apply(s, dialog->style); @@ -289,9 +291,10 @@ static int srt_encode_close(AVCodecContext *avctx) return 0; } +#if CONFIG_SRT_ENCODER AVCodec ff_srt_encoder = { .name = "srt", - .long_name = NULL_IF_CONFIG_SMALL("SubRip subtitle"), + .long_name = NULL_IF_CONFIG_SMALL("SubRip subtitle with embedded timing"), .type = AVMEDIA_TYPE_SUBTITLE, .id = AV_CODEC_ID_SRT, .priv_data_size = sizeof(SRTContext), @@ -299,3 +302,17 @@ AVCodec ff_srt_encoder = { .encode = srt_encode_frame, .close = srt_encode_close, }; +#endif + +#if CONFIG_SUBRIP_ENCODER +AVCodec ff_subrip_encoder = { + .name = "subrip", + .long_name = NULL_IF_CONFIG_SMALL("SubRip subtitle"), + .type = AVMEDIA_TYPE_SUBTITLE, + .id = AV_CODEC_ID_SUBRIP, + .priv_data_size = sizeof(SRTContext), + .init = srt_encode_init, + .encode = srt_encode_frame, + .close = srt_encode_close, +}; +#endif diff --git a/libavcodec/version.h b/libavcodec/version.h index f2c5151a3e..7f4db0b566 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -27,7 +27,7 @@ */ #define LIBAVCODEC_VERSION_MAJOR 54 -#define LIBAVCODEC_VERSION_MINOR 52 +#define LIBAVCODEC_VERSION_MINOR 53 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ diff --git a/libavformat/srtenc.c b/libavformat/srtenc.c index 7fe559f487..6b8278fa80 100644 --- a/libavformat/srtenc.c +++ b/libavformat/srtenc.c @@ -42,6 +42,7 @@ static int srt_write_header(AVFormatContext *avf) return AVERROR(EINVAL); } if (avf->streams[0]->codec->codec_id != AV_CODEC_ID_TEXT && + avf->streams[0]->codec->codec_id != AV_CODEC_ID_SUBRIP && avf->streams[0]->codec->codec_id != AV_CODEC_ID_SRT) { av_log(avf, AV_LOG_ERROR, "Unsupported subtitles codec: %s\n", diff --git a/tests/fate/subtitles.mak b/tests/fate/subtitles.mak index 59c55a56a5..aa0b50dddd 100644 --- a/tests/fate/subtitles.mak +++ b/tests/fate/subtitles.mak @@ -19,6 +19,9 @@ fate-sub-sami: CMD = md5 -i $(SAMPLES)/sub/SAMI_capability_tester.smi -f ass FATE_SUBTITLES += fate-sub-srt fate-sub-srt: CMD = md5 -i $(SAMPLES)/sub/SubRip_capability_tester.srt -f ass +FATE_SUBTITLES += fate-sub-subripenc +fate-sub-subripenc: CMD = md5 -i $(SAMPLES)/sub/MovText_capability_tester.mp4 -scodec subrip -f srt + FATE_SUBTITLES += fate-sub-subviewer fate-sub-subviewer: CMD = md5 -i $(SAMPLES)/sub/SubViewer_capability_tester.sub -f ass diff --git a/tests/ref/fate/sub-subripenc b/tests/ref/fate/sub-subripenc new file mode 100644 index 0000000000..7daa4f5533 --- /dev/null +++ b/tests/ref/fate/sub-subripenc @@ -0,0 +1 @@ +bd520f85238abf9df292374aed54681a