Commit 6873cf9b authored by Aurelien Jacobs's avatar Aurelien Jacobs

compute rects duration in ASS decoder

Signed-off-by: 's avatarAurelien Jacobs <aurel@gnuage.org>
parent 3ee8ca9b
......@@ -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,
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment