Browse code

avfilter/vf_blend: add multiply128 mode

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2016/02/08 03:24:49
Showing 3 changed files
... ...
@@ -4138,6 +4138,7 @@ Available values for component modes are:
4138 4138
 @item lighten
4139 4139
 @item linearlight
4140 4140
 @item multiply
4141
+@item multiply128
4141 4142
 @item negation
4142 4143
 @item normal
4143 4144
 @item or
... ...
@@ -55,6 +55,7 @@ enum BlendMode {
55 55
     BLEND_LINEARLIGHT,
56 56
     BLEND_GLOW,
57 57
     BLEND_ADDITION128,
58
+    BLEND_MULTIPLY128,
58 59
     BLEND_NB
59 60
 };
60 61
 
... ...
@@ -82,6 +82,7 @@ typedef struct ThreadData {
82 82
     { "lighten",    "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_LIGHTEN},    0, 0, FLAGS, "mode" },\
83 83
     { "linearlight","", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_LINEARLIGHT},0, 0, FLAGS, "mode" },\
84 84
     { "multiply",   "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_MULTIPLY},   0, 0, FLAGS, "mode" },\
85
+    { "multiply128","", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_MULTIPLY128},0, 0, FLAGS, "mode" },\
85 86
     { "negation",   "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_NEGATION},   0, 0, FLAGS, "mode" },\
86 87
     { "normal",     "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_NORMAL},     0, 0, FLAGS, "mode" },\
87 88
     { "or",         "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_OR},         0, 0, FLAGS, "mode" },\
... ...
@@ -229,6 +230,7 @@ DEFINE_BLEND8(addition128, av_clip_uint8(A + B - 128))
229 229
 DEFINE_BLEND8(average,    (A + B) / 2)
230 230
 DEFINE_BLEND8(subtract,   FFMAX(0, A - B))
231 231
 DEFINE_BLEND8(multiply,   MULTIPLY(1, A, B))
232
+DEFINE_BLEND8(multiply128,av_clip_uint8((A - 128) * B / 32. + 128))
232 233
 DEFINE_BLEND8(negation,   255 - FFABS(255 - A - B))
233 234
 DEFINE_BLEND8(difference, FFABS(A - B))
234 235
 DEFINE_BLEND8(difference128, av_clip_uint8(128 + A - B))
... ...
@@ -268,6 +270,7 @@ DEFINE_BLEND16(addition128, av_clip_uint16(A + B - 32768))
268 268
 DEFINE_BLEND16(average,    (A + B) / 2)
269 269
 DEFINE_BLEND16(subtract,   FFMAX(0, A - B))
270 270
 DEFINE_BLEND16(multiply,   MULTIPLY(1, A, B))
271
+DEFINE_BLEND16(multiply128, av_clip_uint16((A - 32768) * B / 8192. + 32768))
271 272
 DEFINE_BLEND16(negation,   65535 - FFABS(65535 - A - B))
272 273
 DEFINE_BLEND16(difference, FFABS(A - B))
273 274
 DEFINE_BLEND16(difference128, av_clip_uint16(32768 + A - B))
... ...
@@ -500,6 +503,7 @@ static int config_output(AVFilterLink *outlink)
500 500
         case BLEND_LIGHTEN:    param->blend = is_16bit ? blend_lighten_16bit    : blend_lighten_8bit;    break;
501 501
         case BLEND_LINEARLIGHT:param->blend = is_16bit ? blend_linearlight_16bit: blend_linearlight_8bit;break;
502 502
         case BLEND_MULTIPLY:   param->blend = is_16bit ? blend_multiply_16bit   : blend_multiply_8bit;   break;
503
+        case BLEND_MULTIPLY128:param->blend = is_16bit ? blend_multiply128_16bit: blend_multiply128_8bit;break;
503 504
         case BLEND_NEGATION:   param->blend = is_16bit ? blend_negation_16bit   : blend_negation_8bit;   break;
504 505
         case BLEND_NORMAL:     param->blend = param->opacity == 1 ? blend_normal:
505 506
                                               is_16bit ? blend_normal_16bit     : blend_normal_8bit;     break;