Commit 189da986 authored by ramiro's avatar ramiro

Add expression evaluation parameters for colors in imlib2 vhook

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@9342 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 9f01957a
...@@ -150,6 +150,14 @@ Usage examples: ...@@ -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
......
...@@ -26,6 +26,9 @@ ...@@ -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 { ...@@ -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) ...@@ -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[]) ...@@ -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[]) ...@@ -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[]) ...@@ -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[]) ...@@ -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, ...@@ -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');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment