Add expression evaluation parameters for colors in imlib2 vhook

Originally committed as revision 9342 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Ramiro Polla 2007-06-16 22:28:10 +00:00
parent b41c1db38d
commit 41e4c556e9
2 changed files with 64 additions and 1 deletions

View File

@ -150,6 +150,14 @@ Usage examples:
This example does the same as the one above, but specifies an rgb.txt file This example does the same as the one above, but specifies an rgb.txt file
to be used, which has a custom made color in it. to be used, which has a custom made color in it.
# Variable colors
ffmpeg -i input.avi -vhook \
'vhook/imlib2.so -t Hello -R abs(255*sin(N/47*PI)) -G abs(255*sin(N/47*PI)) -B abs(255*sin(N/47*PI))' \
-sameq output.avi
In this example, the color for the text goes up and down from black to
white.
# scrolling credits from a graphics file # scrolling credits from a graphics file
ffmpeg -sameq -i input.avi \ ffmpeg -sameq -i input.avi \
-vhook 'vhook/imlib2.so -x 0 -y -1.0*N -i credits.png' output.avi -vhook 'vhook/imlib2.so -x 0 -y -1.0*N -i credits.png' output.avi

View File

@ -26,6 +26,9 @@
* -x <expression> X coordinate of text or image * -x <expression> X coordinate of text or image
* -y <expression> Y coordinate of text or image * -y <expression> Y coordinate of text or image
* -i <filename> The filename to read a image from * -i <filename> The filename to read a image from
* -R <expression> Value for R color
* -G <expression> Value for G color
* -B <expression> Value for B color
* *
* Expressions are functions of: * Expressions are functions of:
* N // frame number (starting at zero) * N // frame number (starting at zero)
@ -131,6 +134,9 @@ typedef struct {
char *text; char *text;
char *file; char *file;
int r, g, b; int r, g, b;
AVEvalExpr *eval_r, *eval_g, *eval_b;
char *expr_R, *expr_G, *expr_B;
int eval_colors;
double x, y; double x, y;
char *fileImage; char *fileImage;
struct _CachedImage *cache; struct _CachedImage *cache;
@ -170,6 +176,9 @@ void Release(void *ctx)
} }
ff_eval_free(ci->expr_x); ff_eval_free(ci->expr_x);
ff_eval_free(ci->expr_y); ff_eval_free(ci->expr_y);
ff_eval_free(ci->expr_R);
ff_eval_free(ci->expr_G);
ff_eval_free(ci->expr_B);
sws_freeContext(ci->toRGB_convert_ctx); sws_freeContext(ci->toRGB_convert_ctx);
sws_freeContext(ci->fromRGB_convert_ctx); sws_freeContext(ci->fromRGB_convert_ctx);
av_free(ctx); av_free(ctx);
@ -208,8 +217,20 @@ int Configure(void **ctxp, int argc, char *argv[])
imlib_add_path_to_font_path(fp); imlib_add_path_to_font_path(fp);
while ((c = getopt(argc, argv, "C:c:f:F:t:x:y:i:")) > 0) { while ((c = getopt(argc, argv, "R:G:B:C:c:f:F:t:x:y:i:")) > 0) {
switch (c) { switch (c) {
case 'R':
ci->expr_R = av_strdup(optarg);
ci->eval_colors = 1;
break;
case 'G':
ci->expr_G = av_strdup(optarg);
ci->eval_colors = 1;
break;
case 'B':
ci->expr_B = av_strdup(optarg);
ci->eval_colors = 1;
break;
case 'C': case 'C':
rgbtxt = optarg; rgbtxt = optarg;
break; break;
@ -240,6 +261,12 @@ int Configure(void **ctxp, int argc, char *argv[])
} }
} }
if (ci->eval_colors && !(ci->expr_R && ci->expr_G && ci->expr_B))
{
fprintf(stderr, "You must specify expressions for all or no colors.\n");
return -1;
}
if (ci->text || ci->file) { if (ci->text || ci->file) {
ci->fn = imlib_load_font(font); ci->fn = imlib_load_font(font);
if (!ci->fn) { if (!ci->fn) {
@ -254,6 +281,12 @@ int Configure(void **ctxp, int argc, char *argv[])
char buff[256]; char buff[256];
int done = 0; int done = 0;
if (ci->eval_colors)
{
fprintf(stderr, "You must not specify both a color name and expressions for the colors.\n");
return -1;
}
if (rgbtxt) if (rgbtxt)
f = fopen(rgbtxt, "r"); f = fopen(rgbtxt, "r");
else else
@ -285,7 +318,22 @@ int Configure(void **ctxp, int argc, char *argv[])
fprintf(stderr, "Unable to find color '%s' in rgb.txt\n", color); fprintf(stderr, "Unable to find color '%s' in rgb.txt\n", color);
return -1; return -1;
} }
} else if (ci->eval_colors) {
if (!(ci->eval_r = ff_parse(ci->expr_R, const_names, NULL, NULL, NULL, NULL, NULL))){
av_log(NULL, AV_LOG_ERROR, "Couldn't parse R expression '%s'\n", ci->expr_R);
return -1;
}
if (!(ci->eval_g = ff_parse(ci->expr_G, const_names, NULL, NULL, NULL, NULL, NULL))){
av_log(NULL, AV_LOG_ERROR, "Couldn't parse G expression '%s'\n", ci->expr_G);
return -1;
}
if (!(ci->eval_b = ff_parse(ci->expr_B, const_names, NULL, NULL, NULL, NULL, NULL))){
av_log(NULL, AV_LOG_ERROR, "Couldn't parse B expression '%s'\n", ci->expr_B);
return -1;
}
} }
if (!ci->eval_colors)
imlib_context_set_color(ci->r, ci->g, ci->b, 255); imlib_context_set_color(ci->r, ci->g, ci->b, 255);
/* load the image (for example, credits for a movie) */ /* load the image (for example, credits for a movie) */
@ -423,6 +471,13 @@ void Process(void *ctx, AVPicture *picture, enum PixelFormat pix_fmt, int width,
ci->y = ff_parse_eval(ci->eval_y, const_values, ci); ci->y = ff_parse_eval(ci->eval_y, const_values, ci);
y = ci->y; y = ci->y;
if (ci->eval_colors) {
ci->r = ff_parse_eval(ci->eval_r, const_values, ci);
ci->g = ff_parse_eval(ci->eval_g, const_values, ci);
ci->b = ff_parse_eval(ci->eval_b, const_values, ci);
imlib_context_set_color(ci->r, ci->g, ci->b, 255);
}
if (!(ci->imageOverlaid)) if (!(ci->imageOverlaid))
for (p = buff; p; p = q) { for (p = buff; p; p = q) {
q = strchr(p, '\n'); q = strchr(p, '\n');