[PATCH] Add frame numbers when burning in text (v1.1.0)

"Allan N. Snider" <[email protected]> Tue, 03 Feb 2009 15:16:57 -0500
Newsgroups gmane.comp.video.transcode.devel
Message-ID <[email protected]>
This patch adds a "frame" argument to the text filter.  It generates the
text "Frame: %06d", ptr->id.  It also revamps the positional argument to
make it more intuitive (keypad navigation).
                                                                        
                  Allan
filter_text_frame.patch (text/plain, 5.6 KB)
diff -ru old/filter/filter_text.c new/filter/filter_text.c
--- old/filter/filter_text.c	2007-11-03 05:02:34.000000000 -0400
+++ new/filter/filter_text.c	2009-01-27 00:52:45.000000000 -0500
@@ -21,8 +21,16 @@
  *
  */
 
+/*
+ * 	v0.1.4 -> v0.1.5:	(Allan Snider)
+ * 		- change posdef to keypad location
+ * 		- changed default font path, new standard location
+ * 		- add "frame" option, similar to tstamp, but just
+ * 			writes a frame number (ptr->id)
+ */
+
 #define MOD_NAME    "filter_text.so"
-#define MOD_VERSION "v0.1.4 (2004-02-14)"
+#define MOD_VERSION "v0.1.5 (2007-02-14)"
 #define MOD_CAP     "write text in the image"
 #define MOD_AUTHOR  "Tilmann Bitterberg"
 
@@ -41,7 +49,11 @@
 
 // basic parameter
 
-enum POS { NONE, TOP_LEFT, TOP_RIGHT, BOT_LEFT, BOT_RIGHT, CENTER, BOT_CENTER };
+/* use keypad naviation */
+enum POS { NONE=0,
+	TOP_LEFT=7, TOP_CENTER=8, TOP_RIGHT=9,
+	CTR_LEFT=4, CTR_CENTER=5, CTR_RIGHT=6,
+	BOT_LEFT=1, BOT_CENTER=2, BOT_RIGHT=3 };
 
 #define MAX_OPACITY 100
 
@@ -80,6 +92,7 @@
 	int fade;            /* fade in/out (speed) */
 	int transparent;     /* do not draw a black bounding box */
 	int tstamp;          /* */
+	int frame;           /* string is "Frame: %06d", ptr->id */
 	int antialias;       /* do sub frame anti-aliasing (not done) */
 	int R, G, B;         /* color to apply in RGB */
 	int Y, U, V;         /* color to apply in YUV */
@@ -94,7 +107,6 @@
 	int boundX, boundY;
 	int fade_in, fade_out;
 
-
 	FT_Library  library;
 	FT_Face     face;
 	FT_GlyphSlot  slot;
@@ -117,8 +129,9 @@
 "          'fade' Fade in and/or fade out [0=off, 1=slow, 10=fast]\n"
 " 'notransparent' disable transparency\n"
 "           'pos' Position (0-width x 0-height) [0x0]\n"
-"        'posdef' Position (0=None 1=TopL 2=TopR 3=BotL 4=BotR 5=Cent 6=BotCent) [0]\n"
-"        'tstamp' add timestamp to each frame (overrides string)\n"
+"        'posdef' Position (keypad number, 0=None) [0]\n"
+"        'tstamp' add timestamp to each frame (overridden by string)\n"
+"        'frame'  add frame number to each frame (overridden by string)\n"
 		, MOD_CAP);
 }
 
@@ -219,7 +232,7 @@
   static float elapsed_ss;
   static uint8_t *buf = NULL;
   static uint8_t *p, *q;
-  char *default_font = "/usr/X11R6/lib/X11/fonts/TrueType/arial.ttf";
+  char *default_font = "/usr/share/fonts/corefonts/arial.ttf";
   extern int flip; // transcode.c
 
   if (ptr->tag & TC_AUDIO)
@@ -258,10 +271,17 @@
       optstr_param (options, "pos", "Position (0-width x 0-height)",
 	      "%dx%d", "0x0", "0", "width", "0", "height");
 
-      optstr_param (options, "posdef", "Position (0=None 1=TopL 2=TopR 3=BotL 4=BotR 5=Cent 6=BotCent)",  "%d", "0", "0", "5");
+      optstr_param (options, "posdef", "Position (keypad number, 0=None)",
+		"%d", "0", "0", "9");
 
-      optstr_param (options, "notransparent", "disable transparency (enables block box)", "", "0");
-      optstr_param (options, "tstamp", "add timestamp to each frame (overrides string)", "", "0");
+      optstr_param (options, "notransparent", "disable transparency (enables block box)",
+		"", "0");
+
+      optstr_param (options, "tstamp", "add timestamps (overridden by string)",
+		"", "0");
+
+      optstr_param (options, "frame", "add frame numbers (overridden by string)",
+		 "", "0");
 
       return 0;
   }
@@ -300,6 +320,7 @@
 
     mfd->do_time=1;
     mfd->tstamp=0;
+    mfd->frame=0;
     mfd->opaque=MAX_OPACITY;
     mfd->fade_in = 0;
     mfd->fade_out = 0;
@@ -349,6 +370,10 @@
             mfd->string = "[ timestamp ]";
 	    mfd->do_time = 0;
 	    mfd->tstamp = 1;
+	} else if (optstr_lookup (options, "frame") ) {
+	    mfd->string=strdup("Frame: dddddd");
+	    mfd->do_time = 0;
+	    mfd->frame = 1;
 	} else {
 	    // do `date` as default
 	    mytime = time(NULL);
@@ -456,36 +481,66 @@
     switch (mfd->pos) {
 	case NONE: /* 0 */
 	    break;
+
 	case TOP_LEFT:
 	    mfd->posx = 0;
 	    mfd->posy = 0;
 	    break;
+
+	case TOP_CENTER:
+	    mfd->posx = (width - mfd->boundX)/2;
+	    mfd->posy = 0;
+	    if (mfd->posx&1)
+		mfd->posx++;
+	    break;
+
 	case TOP_RIGHT:
 	    mfd->posx = width  - mfd->boundX;
 	    mfd->posy = 0;
 	    break;
-	case BOT_LEFT:
+
+	case CTR_LEFT:
 	    mfd->posx = 0;
-	    mfd->posy = height - mfd->boundY;
-	    break;
-	case BOT_RIGHT:
-	    mfd->posx = width  - mfd->boundX;
-	    mfd->posy = height - mfd->boundY;
+	    mfd->posy = (height- mfd->boundY)/2;
+	    if (mfd->posy&1)
+		mfd->posy++;
 	    break;
-	case CENTER:
+
+	case CTR_CENTER:
 	    mfd->posx = (width - mfd->boundX)/2;
 	    mfd->posy = (height- mfd->boundY)/2;
+
 	    /* align to not cause color disruption */
-	    if (mfd->posx&1) mfd->posx++;
-	    if (mfd->posy&1) mfd->posy++;
+	    if (mfd->posx&1)
+		mfd->posx++;
+	    if (mfd->posy&1)
+		mfd->posy++;
+	    break;
+
+	case CTR_RIGHT:
+	    mfd->posx = width  - mfd->boundX;
+	    mfd->posy = (height- mfd->boundY)/2;
+	    if (mfd->posy&1)
+		mfd->posy++;
+	    break;
+
+	case BOT_LEFT:
+	    mfd->posx = 0;
+	    mfd->posy = height - mfd->boundY;
 	    break;
+
 	case BOT_CENTER:
 	    mfd->posx = (width - mfd->boundX)/2;
 	    mfd->posy = height - mfd->boundY;
-	    if (mfd->posx&1) mfd->posx++;
+	    if (mfd->posx&1)
+		mfd->posx++;
 	    break;
-    }
 
+	case BOT_RIGHT:
+	    mfd->posx = width  - mfd->boundX;
+	    mfd->posy = height - mfd->boundY;
+	    break;
+    }
 
     if ( mfd->posy < 0 || mfd->posx < 0 ||
 	    mfd->posx+mfd->boundX > width ||
@@ -566,6 +621,11 @@
 	    font_render(width,height,codec,w,h,i,p,q,buf);
 	}
 
+	else if (mfd->frame) {
+	    sprintf(mfd->string, "Frame: %06d", ptr->id);  
+	    font_render(width,height,codec,w,h,i,p,q,buf);
+	}
+
 	if (mfd->start == ptr->id && mfd->fade) {
 	    mfd->fade_in = 1;
 	    mfd->fade_out= 0;