diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2010-12-16 11:16:33 +0300 |
---|---|---|
committer | Aurelien Jacobs <aurel@gnuage.org> | 2011-04-12 01:39:12 +0400 |
commit | 6873cf9bc8f3cb4959df51bdf79f079cee9a7006 (patch) | |
tree | cb9fd62c7dca8df2349fbb7d4c5905e6424eae34 /libavcodec | |
parent | 3ee8ca9b0894df3aaf5086c643283cb58ef9763d (diff) |
compute rects duration in ASS decoder
Signed-off-by: Aurelien Jacobs <aurel@gnuage.org>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/assdec.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libavcodec/assdec.c b/libavcodec/assdec.c index 024127a042..087a0c839b 100644 --- a/libavcodec/assdec.c +++ b/libavcodec/assdec.c @@ -21,6 +21,7 @@ #include "avcodec.h" #include "ass.h" +#include "ass_split.h" static av_cold int ass_decode_init(AVCodecContext *avctx) { @@ -29,6 +30,7 @@ static av_cold int ass_decode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); memcpy(avctx->subtitle_header, avctx->extradata, avctx->extradata_size); avctx->subtitle_header_size = avctx->extradata_size; + avctx->priv_data = ff_ass_split(avctx->extradata); return 0; } @@ -39,7 +41,9 @@ static int ass_decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr, int len, size = avpkt->size; while (size > 0) { - len = ff_ass_add_rect(data, ptr, 0, 0/* FIXME: duration */, 1); + ASSDialog *dialog = ff_ass_split_dialog(avctx->priv_data, ptr, 0, NULL); + int duration = dialog->end - dialog->start; + len = ff_ass_add_rect(data, ptr, 0, duration, 1); if (len < 0) return len; ptr += len; @@ -50,6 +54,13 @@ static int ass_decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr, return avpkt->size; } +static int ass_decode_close(AVCodecContext *avctx) +{ + ff_ass_split_free(avctx->priv_data); + avctx->priv_data = NULL; + return 0; +} + AVCodec ff_ass_decoder = { .name = "ass", .long_name = NULL_IF_CONFIG_SMALL("Advanced SubStation Alpha subtitle"), @@ -57,4 +68,5 @@ AVCodec ff_ass_decoder = { .id = CODEC_ID_SSA, .init = ass_decode_init, .decode = ass_decode_frame, + .close = ass_decode_close, }; |