mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
gaudieffects: Avoid divide by 0 in burn element
This commit is contained in:
parent
7e3472d772
commit
a4f2ab78ff
2 changed files with 34 additions and 20 deletions
23
gst/gaudieffects/burn-example.py
Normal file
23
gst/gaudieffects/burn-example.py
Normal file
|
@ -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()
|
|
@ -96,7 +96,6 @@ enum
|
||||||
|
|
||||||
#define DEFAULT_ADJUSTMENT 175
|
#define DEFAULT_ADJUSTMENT 175
|
||||||
|
|
||||||
static gint gate_int (gint value, gint min, gint max);
|
|
||||||
static void transform (guint32 * src, guint32 * dest, gint video_area,
|
static void transform (guint32 * src, guint32 * dest, gint video_area,
|
||||||
gint adjustment);
|
gint adjustment);
|
||||||
|
|
||||||
|
@ -289,24 +288,13 @@ gst_burn_plugin_init (GstPlugin * burn)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** Now the image processing work.... ***/
|
/*** 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. */
|
/* Transform processes each frame. */
|
||||||
static void
|
static void
|
||||||
transform (guint32 * src, guint32 * dest, gint video_area, gint adjustment)
|
transform (guint32 * src, guint32 * dest, gint video_area, gint adjustment)
|
||||||
{
|
{
|
||||||
guint32 in, red, green, blue;
|
guint32 in;
|
||||||
|
gint red, green, blue, c;
|
||||||
gint x;
|
gint x;
|
||||||
|
|
||||||
for (x = 0; x < video_area; 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;
|
green = (in >> 8) & 0xff;
|
||||||
blue = (in) & 0xff;
|
blue = (in) & 0xff;
|
||||||
|
|
||||||
red = 256 - ((256 * (255 - red)) / (red + adjustment));
|
c = (red + adjustment);
|
||||||
green = 256 - ((256 * (255 - green)) / (green + adjustment));
|
red = c ? (256 - (256 * (255 - red) / c)) : 0;
|
||||||
blue = 256 - ((256 * (255 - blue)) / (blue + adjustment));
|
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);
|
red = CLAMP (red, 0, 255);
|
||||||
green = gate_int (green, 0, 255);
|
green = CLAMP (green, 0, 255);
|
||||||
blue = gate_int (blue, 0, 255);
|
blue = CLAMP (blue, 0, 255);
|
||||||
|
|
||||||
*dest++ = (red << 16) | (green << 8) | blue;
|
*dest++ = (red << 16) | (green << 8) | blue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue