Commit 88c39f0c authored by ramiro's avatar ramiro

Add alpha channel support for imlib2 vhook

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@9365 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent d3bfcc24
...@@ -158,6 +158,14 @@ Usage examples: ...@@ -158,6 +158,14 @@ Usage examples:
In this example, the color for the text goes up and down from black to In this example, the color for the text goes up and down from black to
white. white.
# Text fade-out
ffmpeg -i input.avi -vhook \
'vhook/imlib2.so -t Hello -A max(0,255-exp(N/47))' \
-sameq output.avi
In this example, the text fades out in about 10 seconds for a 25 fps input
video file.
# 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
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
* -R <expression> Value for R color * -R <expression> Value for R color
* -G <expression> Value for G color * -G <expression> Value for G color
* -B <expression> Value for B color * -B <expression> Value for B color
* -A <expression> Value for Alpha channel
* *
* Expressions are functions of: * Expressions are functions of:
* N // frame number (starting at zero) * N // frame number (starting at zero)
...@@ -133,9 +134,9 @@ typedef struct { ...@@ -133,9 +134,9 @@ typedef struct {
Imlib_Font fn; Imlib_Font fn;
char *text; char *text;
char *file; char *file;
int r, g, b; int r, g, b, a;
AVEvalExpr *eval_r, *eval_g, *eval_b; AVEvalExpr *eval_r, *eval_g, *eval_b, *eval_a;
char *expr_R, *expr_G, *expr_B; char *expr_R, *expr_G, *expr_B, *expr_A;
int eval_colors; int eval_colors;
double x, y; double x, y;
char *fileImage; char *fileImage;
...@@ -179,12 +180,14 @@ void Release(void *ctx) ...@@ -179,12 +180,14 @@ void Release(void *ctx)
ff_eval_free(ci->eval_r); ff_eval_free(ci->eval_r);
ff_eval_free(ci->eval_g); ff_eval_free(ci->eval_g);
ff_eval_free(ci->eval_b); ff_eval_free(ci->eval_b);
ff_eval_free(ci->eval_a);
av_free(ci->expr_x); av_free(ci->expr_x);
av_free(ci->expr_y); av_free(ci->expr_y);
av_free(ci->expr_R); av_free(ci->expr_R);
av_free(ci->expr_G); av_free(ci->expr_G);
av_free(ci->expr_B); av_free(ci->expr_B);
av_free(ci->expr_A);
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);
...@@ -223,7 +226,7 @@ int Configure(void **ctxp, int argc, char *argv[]) ...@@ -223,7 +226,7 @@ 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, "R:G:B:C:c:f:F:t:x:y:i:")) > 0) { while ((c = getopt(argc, argv, "R:G:B:A:C:c:f:F:t:x:y:i:")) > 0) {
switch (c) { switch (c) {
case 'R': case 'R':
ci->expr_R = av_strdup(optarg); ci->expr_R = av_strdup(optarg);
...@@ -237,6 +240,9 @@ int Configure(void **ctxp, int argc, char *argv[]) ...@@ -237,6 +240,9 @@ int Configure(void **ctxp, int argc, char *argv[])
ci->expr_B = av_strdup(optarg); ci->expr_B = av_strdup(optarg);
ci->eval_colors = 1; ci->eval_colors = 1;
break; break;
case 'A':
ci->expr_A = av_strdup(optarg);
break;
case 'C': case 'C':
rgbtxt = optarg; rgbtxt = optarg;
break; break;
...@@ -339,8 +345,17 @@ int Configure(void **ctxp, int argc, char *argv[]) ...@@ -339,8 +345,17 @@ int Configure(void **ctxp, int argc, char *argv[])
} }
} }
if (!ci->eval_colors) if (ci->expr_A) {
imlib_context_set_color(ci->r, ci->g, ci->b, 255); if (!(ci->eval_a = ff_parse(ci->expr_A, const_names, NULL, NULL, NULL, NULL, NULL))){
av_log(NULL, AV_LOG_ERROR, "Couldn't parse A expression '%s'\n", ci->expr_A);
return -1;
}
} else {
ci->a = 255;
}
if (!(ci->eval_colors || ci->eval_a))
imlib_context_set_color(ci->r, ci->g, ci->b, ci->a);
/* load the image (for example, credits for a movie) */ /* load the image (for example, credits for a movie) */
if (ci->fileImage) { if (ci->fileImage) {
...@@ -477,11 +492,18 @@ void Process(void *ctx, AVPicture *picture, enum PixelFormat pix_fmt, int width, ...@@ -477,11 +492,18 @@ 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_a) {
ci->a = ff_parse_eval(ci->eval_a, const_values, ci);
}
if (ci->eval_colors) { if (ci->eval_colors) {
ci->r = ff_parse_eval(ci->eval_r, const_values, ci); ci->r = ff_parse_eval(ci->eval_r, const_values, ci);
ci->g = ff_parse_eval(ci->eval_g, 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); ci->b = ff_parse_eval(ci->eval_b, const_values, ci);
imlib_context_set_color(ci->r, ci->g, ci->b, 255); }
if (ci->eval_colors || ci->eval_a) {
imlib_context_set_color(ci->r, ci->g, ci->b, ci->a);
} }
if (!(ci->imageOverlaid)) if (!(ci->imageOverlaid))
......
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