diff options
author | Jan Schmidt <thaytan@noraisin.net> | 2010-12-12 02:24:00 +1100 |
---|---|---|
committer | Jan Schmidt <jan.schmidt@oracle.com> | 2010-12-12 02:24:00 +1100 |
commit | a4f2ab78ffe9a5f0bd8a29e778ca9ea7688de792 (patch) | |
tree | 44e19c2051c0499d0071339fc06d16b76c4e3382 | |
parent | 7e3472d772573cb4d645845d2242f24f61b51b72 (diff) |
gaudieffects: Avoid divide by 0 in burn element
-rw-r--r-- | gst/gaudieffects/burn-example.py | 23 | ||||
-rw-r--r-- | gst/gaudieffects/gstburn.c | 31 |
2 files changed, 34 insertions, 20 deletions
diff --git a/gst/gaudieffects/burn-example.py b/gst/gaudieffects/burn-example.py new file mode 100644 index 000000000..01080b909 --- /dev/null +++ b/gst/gaudieffects/burn-example.py @@ -0,0 +1,23 @@ +#!/usr/bin/python +import gobject; gobject.threads_init() +import pygst; pygst.require("0.10") +import gst + +p = gst.parse_launch (""" + v4l2src ! + ffmpegcolorspace ! queue ! video/x-raw-rgb,width=320,height=240,framerate=30/1 ! burn qos=true name=vf ! ffmpegcolorspace ! + timeoverlay ! xvimagesink + """) + +m = p.get_by_name ("vf") +m.set_property ("adjustment", 128) + +control = gst.Controller(m, "adjustment") +control.set_interpolation_mode("adjustment", gst.INTERPOLATE_LINEAR) +control.set("adjustment", 0 * gst.SECOND, 128) +control.set("adjustment", 5 * gst.SECOND, 256) +control.set("adjustment", 25 * gst.SECOND, 0) + +p.set_state (gst.STATE_PLAYING) + +gobject.MainLoop().run() diff --git a/gst/gaudieffects/gstburn.c b/gst/gaudieffects/gstburn.c index 582d5e85b..3d769356a 100644 --- a/gst/gaudieffects/gstburn.c +++ b/gst/gaudieffects/gstburn.c @@ -96,7 +96,6 @@ enum #define DEFAULT_ADJUSTMENT 175 -static gint gate_int (gint value, gint min, gint max); static void transform (guint32 * src, guint32 * dest, gint video_area, gint adjustment); @@ -289,24 +288,13 @@ gst_burn_plugin_init (GstPlugin * burn) } /*** Now the image processing work.... ***/ -/* Keep the values inbounds. */ -static gint -gate_int (gint value, gint min, gint max) -{ - if (value < min) { - return min; - } else if (value > max) { - return max; - } else { - return value; - } -} /* Transform processes each frame. */ static void transform (guint32 * src, guint32 * dest, gint video_area, gint adjustment) { - guint32 in, red, green, blue; + guint32 in; + gint red, green, blue, c; gint x; for (x = 0; x < video_area; x++) { @@ -316,13 +304,16 @@ transform (guint32 * src, guint32 * dest, gint video_area, gint adjustment) green = (in >> 8) & 0xff; blue = (in) & 0xff; - red = 256 - ((256 * (255 - red)) / (red + adjustment)); - green = 256 - ((256 * (255 - green)) / (green + adjustment)); - blue = 256 - ((256 * (255 - blue)) / (blue + adjustment)); + c = (red + adjustment); + red = c ? (256 - (256 * (255 - red) / c)) : 0; + c = (green + adjustment); + green = c ? (256 - (256 * (255 - green) / c)) : 0; + c = (blue + adjustment); + blue = c ? (256 - (256 * (255 - blue) / c)) : 0; - red = gate_int (red, 0, 255); - green = gate_int (green, 0, 255); - blue = gate_int (blue, 0, 255); + red = CLAMP (red, 0, 255); + green = CLAMP (green, 0, 255); + blue = CLAMP (blue, 0, 255); *dest++ = (red << 16) | (green << 8) | blue; } |