[FFmpeg-devel] [PATCH 1/3] ass: factor out ff_ass_bprint_dialog

Marton Balint cus at passwd.hu
Fri Oct 25 01:47:04 CEST 2013


Signed-off-by: Marton Balint <cus at passwd.hu>
---
 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 6fe18f5..21d2b8b 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 ef99b58..544f66a 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 AVBPrintf buffer.
+ *
+ * @param buf pointer to the 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 */
-- 
1.8.1.4



More information about the ffmpeg-devel mailing list