[FFmpeg-devel] [PATCH v2 8/9] lavc/ccaption_dec: implement positioning for closed captions

Aman Gupta ffmpeg at tmm1.net
Wed Jan 13 02:42:59 CET 2016


From: Aman Gupta <aman at tmm1.net>

Positioning math is based on the guidelines in
https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-608
---
 libavcodec/ccaption_dec.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/libavcodec/ccaption_dec.c b/libavcodec/ccaption_dec.c
index 1c8a0d0..4ec063e 100644
--- a/libavcodec/ccaption_dec.c
+++ b/libavcodec/ccaption_dec.c
@@ -316,7 +316,7 @@ static void roll_up(CCaptionSubContext *ctx)
 
 static int capture_screen(CCaptionSubContext *ctx)
 {
-    int i;
+    int i, j, tab = 0;
     struct Screen *screen = ctx->screen + ctx->active_screen;
     enum cc_font prev_font = CCFONT_REGULAR;
     av_bprint_clear(&ctx->buffer);
@@ -325,13 +325,30 @@ static int capture_screen(CCaptionSubContext *ctx)
     {
         if (CHECK_FLAG(screen->row_used, i)) {
             const char *row = screen->characters[i];
+            j = 0;
+            while (row[j] == ' ')
+                j++;
+            if (!tab || j < tab)
+                tab = j;
+        }
+    }
+
+    for (i = 0; screen->row_used && i < SCREEN_ROWS; i++)
+    {
+        if (CHECK_FLAG(screen->row_used, i)) {
+            const char *row = screen->characters[i];
             const char *font = screen->fonts[i];
-            int j = 0;
+            int x, y, seen_char = 0;
+            j = 0;
 
             /* skip leading space */
-            while (row[j] == ' ')
+            while (row[j] == ' ' && j < tab)
                 j++;
 
+            x = ASS_DEFAULT_PLAYRESX * (0.1 + 0.0250 * j);
+            y = ASS_DEFAULT_PLAYRESY * (0.1 + 0.0533 * i);
+            av_bprintf(&ctx->buffer, "{\\an7}{\\pos(%d,%d)}", x, y);
+
             for (; j < SCREEN_COLUMNS; j++) {
                 const char *e_tag = "", *s_tag = "";
 
@@ -365,8 +382,12 @@ static int capture_screen(CCaptionSubContext *ctx)
                 prev_font = font[j];
                 if (row[j] == 1)
                     av_bprintf(&ctx->buffer, "%s%s\u266A", e_tag, s_tag);
-                else
+                else if (row[j] == ' ' && !seen_char)
+                    av_bprintf(&ctx->buffer, "%s%s\\h", e_tag, s_tag);
+                else {
                     av_bprintf(&ctx->buffer, "%s%s%c", e_tag, s_tag, row[j]);
+                    seen_char = 1;
+                }
 
             }
             av_bprintf(&ctx->buffer, "\\N");
-- 
2.5.3



More information about the ffmpeg-devel mailing list