From 6873cf9bc8f3cb4959df51bdf79f079cee9a7006 Mon Sep 17 00:00:00 2001 From: Aurelien Jacobs Date: Thu, 16 Dec 2010 09:16:33 +0100 Subject: [PATCH] compute rects duration in ASS decoder Signed-off-by: Aurelien Jacobs --- libavcodec/assdec.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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, };