compute rects duration in ASS decoder

Signed-off-by: Aurelien Jacobs <aurel@gnuage.org>
This commit is contained in:
Aurelien Jacobs 2010-12-16 09:16:33 +01:00
parent 3ee8ca9b08
commit 6873cf9bc8
1 changed files with 13 additions and 1 deletions

View File

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