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
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;