From f148954b0ac11123e47eedf24abb99366dc9a3ad Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Wed, 23 Oct 2013 11:20:04 +0200 Subject: [PATCH] ass: factor out ff_ass_bprint_dialog Signed-off-by: Marton Balint --- libavcodec/ass.c | 35 +++++++++++++++++++++++------------ libavcodec/ass.h | 23 +++++++++++++++++++++++ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/libavcodec/ass.c b/libavcodec/ass.c index 6fe18f512e..21d2b8b380 100644 --- a/libavcodec/ass.c +++ b/libavcodec/ass.c @@ -77,14 +77,11 @@ static void insert_ts(AVBPrint *buf, int ts) } } -int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, - int ts_start, int duration, int raw) +int ff_ass_bprint_dialog(AVBPrint *buf, const char *dialog, + int ts_start, int duration, int raw) { - AVBPrint buf; - int ret, dlen; - AVSubtitleRect **rects; + int dlen; - av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED); if (!raw || raw == 2) { long int layer = 0; @@ -101,19 +98,33 @@ int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, return AVERROR_INVALIDDATA; dialog++; } - av_bprintf(&buf, "Dialogue: %ld,", layer); - insert_ts(&buf, ts_start); - insert_ts(&buf, duration == -1 ? -1 : ts_start + duration); + av_bprintf(buf, "Dialogue: %ld,", layer); + insert_ts(buf, ts_start); + insert_ts(buf, duration == -1 ? -1 : ts_start + duration); if (raw != 2) - av_bprintf(&buf, "Default,"); + av_bprintf(buf, "Default,"); } dlen = strcspn(dialog, "\n"); dlen += dialog[dlen] == '\n'; - av_bprintf(&buf, "%.*s", dlen, dialog); + av_bprintf(buf, "%.*s", dlen, dialog); if (raw == 2) - av_bprintf(&buf, "\r\n"); + av_bprintf(buf, "\r\n"); + + return dlen; +} + +int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, + int ts_start, int duration, int raw) +{ + AVBPrint buf; + int ret, dlen; + AVSubtitleRect **rects; + + av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED); + if ((dlen = ff_ass_bprint_dialog(&buf, dialog, ts_start, duration, raw)) < 0) + return dlen; if (!av_bprint_is_complete(&buf)) return AVERROR(ENOMEM); diff --git a/libavcodec/ass.h b/libavcodec/ass.h index ef99b58cbc..d267665514 100644 --- a/libavcodec/ass.h +++ b/libavcodec/ass.h @@ -23,6 +23,7 @@ #define AVCODEC_ASS_H #include "avcodec.h" +#include "libavutil/bprint.h" /** * @name Default values for ASS style @@ -90,4 +91,26 @@ int ff_ass_subtitle_header_default(AVCodecContext *avctx); int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, int ts_start, int duration, int raw); +/** + * Add an ASS dialog line to an AVBPrint buffer. + * + * @param buf pointer to an initialized AVBPrint buffer + * @param dialog ASS dialog to add to sub + * @param ts_start start timestamp for this dialog (in 1/100 second unit) + * @param duration duration for this dialog (in 1/100 second unit), can be -1 + * to last until the end of the presentation + * @param raw when set to 2, it indicates that dialog contains an ASS + * dialog line as muxed in Matroska + * when set to 1, it indicates that dialog contains a whole SSA + * dialog line which should be copied as is. + * when set to 0, it indicates that dialog contains only the Text + * part of the ASS dialog line, the rest of the line + * will be generated. + * @return number of characters read from dialog. It can be less than the whole + * length of dialog, if dialog contains several lines of text. + * A negative value indicates an error. + */ +int ff_ass_bprint_dialog(AVBPrint *buf, const char *dialog, + int ts_start, int duration, int raw); + #endif /* AVCODEC_ASS_H */