#define DEFAULT_FORCE_ASPECT_RATIO TRUE
#define DEFAULT_PAR_N 0
#define DEFAULT_PAR_D 1
+#define DEFAULT_IGNORE_ALPHA TRUE
static void gst_gtk_gl_sink_finalize (GObject * object);
static void gst_gtk_gl_sink_set_property (GObject * object, guint prop_id,
PROP_WIDGET,
PROP_FORCE_ASPECT_RATIO,
PROP_PIXEL_ASPECT_RATIO,
+ PROP_IGNORE_ALPHA,
};
enum
"The pixel aspect ratio of the device", DEFAULT_PAR_N, DEFAULT_PAR_D,
G_MAXINT, 1, 1, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_IGNORE_ALPHA,
+ g_param_spec_boolean ("ignore-alpha", "Ignore Alpha",
+ "When enabled, alpha will be ignored and converted to black",
+ DEFAULT_IGNORE_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&gst_gtk_gl_sink_template));
gtk_sink->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO;
gtk_sink->par_n = DEFAULT_PAR_N;
gtk_sink->par_d = DEFAULT_PAR_D;
+ gtk_sink->ignore_alpha = DEFAULT_IGNORE_ALPHA;
}
static void
gtk_sink->bind_pixel_aspect_ratio =
g_object_bind_property (gtk_sink, "pixel-aspect-ratio", gtk_sink->widget,
"pixel-aspect-ratio", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+ gtk_sink->bind_ignore_alpha =
+ g_object_bind_property (gtk_sink, "ignore-alpha", gtk_sink->widget,
+ "ignore-alpha", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
/* Take the floating ref, otherwise the destruction of the container will
* make this widget disapear possibly before we are done. */
case PROP_PIXEL_ASPECT_RATIO:
gst_value_set_fraction (value, gtk_sink->par_n, gtk_sink->par_d);
break;
+ case PROP_IGNORE_ALPHA:
+ g_value_set_boolean (value, gtk_sink->ignore_alpha);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gtk_sink->par_n = gst_value_get_fraction_numerator (value);
gtk_sink->par_d = gst_value_get_fraction_denominator (value);
break;
+ case PROP_IGNORE_ALPHA:
+ gtk_sink->ignore_alpha = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gint par_d;
GBinding *bind_pixel_aspect_ratio;
+ gboolean ignore_alpha;
+ GBinding *bind_ignore_alpha;
+
GstGtkGLSinkPrivate *priv;
};
#define DEFAULT_FORCE_ASPECT_RATIO TRUE
#define DEFAULT_PAR_N 0
#define DEFAULT_PAR_D 1
+#define DEFAULT_IGNORE_ALPHA TRUE
enum
{
PROP_WIDGET,
PROP_FORCE_ASPECT_RATIO,
PROP_PIXEL_ASPECT_RATIO,
+ PROP_IGNORE_ALPHA,
};
enum
"The pixel aspect ratio of the device", DEFAULT_PAR_N, DEFAULT_PAR_D,
G_MAXINT, 1, 1, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_IGNORE_ALPHA,
+ g_param_spec_boolean ("ignore-alpha", "Ignore Alpha",
+ "When enabled, alpha will be ignored and converted to black",
+ DEFAULT_IGNORE_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&gst_gtk_sink_template));
gtk_sink->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO;
gtk_sink->par_n = DEFAULT_PAR_N;
gtk_sink->par_d = DEFAULT_PAR_D;
+ gtk_sink->ignore_alpha = DEFAULT_IGNORE_ALPHA;
}
static void
gtk_sink->bind_pixel_aspect_ratio =
g_object_bind_property (gtk_sink, "pixel-aspect-ratio", gtk_sink->widget,
"pixel-aspect-ratio", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+ gtk_sink->bind_ignore_alpha =
+ g_object_bind_property (gtk_sink, "ignore-alpha", gtk_sink->widget,
+ "ignore-alpha", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
/* Take the floating ref, other wise the destruction of the container will
* make this widget disapear possibly before we are done. */
case PROP_PIXEL_ASPECT_RATIO:
gst_value_set_fraction (value, gtk_sink->par_n, gtk_sink->par_d);
break;
+ case PROP_IGNORE_ALPHA:
+ g_value_set_boolean (value, gtk_sink->ignore_alpha);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gtk_sink->par_n = gst_value_get_fraction_numerator (value);
gtk_sink->par_d = gst_value_get_fraction_denominator (value);
break;
+ case PROP_IGNORE_ALPHA:
+ gtk_sink->ignore_alpha = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gint par_d;
GBinding *bind_pixel_aspect_ratio;
+ gboolean ignore_alpha;
+ GBinding *bind_ignore_alpha;
+
GstGtkSinkPrivate *priv;
};
#define DEFAULT_FORCE_ASPECT_RATIO TRUE
#define DEFAULT_PAR_N 0
#define DEFAULT_PAR_D 1
+#define DEFAULT_IGNORE_ALPHA TRUE
enum
{
PROP_0,
PROP_FORCE_ASPECT_RATIO,
PROP_PIXEL_ASPECT_RATIO,
+ PROP_IGNORE_ALPHA,
};
struct _GtkGstGLWidgetPrivate
/* properties */
gboolean force_aspect_ratio;
gint par_n, par_d;
+ gboolean ignore_alpha;
gint display_width;
gint display_height;
gtk_widget->priv->par_n = gst_value_get_fraction_numerator (value);
gtk_widget->priv->par_d = gst_value_get_fraction_denominator (value);
break;
+ case PROP_IGNORE_ALPHA:
+ gtk_widget->priv->ignore_alpha = g_value_get_boolean (value);
+ gtk_gl_area_set_has_alpha ((GtkGLArea *) gtk_widget,
+ !gtk_widget->priv->ignore_alpha);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gst_value_set_fraction (value, gtk_widget->priv->par_n,
gtk_widget->priv->par_d);
break;
+ case PROP_IGNORE_ALPHA:
+ g_value_set_boolean (value, gtk_widget->priv->ignore_alpha);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
"The pixel aspect ratio of the device", DEFAULT_PAR_N, DEFAULT_PAR_D,
G_MAXINT, 1, 1, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_IGNORE_ALPHA,
+ g_param_spec_boolean ("ignore-alpha", "Ignore Alpha",
+ "When enabled, alpha will be ignored and converted to black",
+ DEFAULT_IGNORE_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gl_widget_klass->render = gtk_gst_gl_widget_render;
widget_klass->get_preferred_width = gtk_gst_gl_widget_get_preferred_width;
widget->priv->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO;
widget->priv->par_n = DEFAULT_PAR_N;
widget->priv->par_d = DEFAULT_PAR_D;
+ widget->priv->ignore_alpha = DEFAULT_IGNORE_ALPHA;
g_mutex_init (&widget->priv->lock);
if (!widget->priv->display)
widget->priv->display = gst_gl_display_new ();
- gtk_gl_area_set_has_alpha ((GtkGLArea *) widget, FALSE);
+ gtk_gl_area_set_has_alpha ((GtkGLArea *) widget, !widget->priv->ignore_alpha);
}
GtkWidget *
#define DEFAULT_FORCE_ASPECT_RATIO TRUE
#define DEFAULT_PAR_N 0
#define DEFAULT_PAR_D 1
+#define DEFAULT_IGNORE_ALPHA TRUE
enum
{
PROP_0,
PROP_FORCE_ASPECT_RATIO,
PROP_PIXEL_ASPECT_RATIO,
+ PROP_IGNORE_ALPHA,
};
struct _GtkGstWidgetPrivate
/* properties */
gboolean force_aspect_ratio;
gint par_n, par_d;
+ gboolean ignore_alpha;
gint display_width;
gint display_height;
result.h = widget_height;
}
+ if (gst_widget->priv->ignore_alpha) {
+ GdkRGBA color = { 0.0, 0.0, 0.0, 1.0 };
+
+ gdk_cairo_set_source_rgba (cr, &color);
+ if (result.x > 0) {
+ cairo_rectangle (cr, 0, 0, result.x, widget_height);
+ cairo_fill (cr);
+ }
+ if (result.y > 0) {
+ cairo_rectangle (cr, 0, 0, widget_width, result.y);
+ cairo_fill (cr);
+ }
+ if (result.w < widget_width) {
+ cairo_rectangle (cr, result.x + result.w, 0, widget_width - result.w,
+ widget_height);
+ cairo_fill (cr);
+ }
+ if (result.h < widget_height) {
+ cairo_rectangle (cr, 0, result.y + result.h, widget_width,
+ widget_height - result.h);
+ cairo_fill (cr);
+ }
+ }
+
scale_x *=
(gdouble) gst_widget->priv->display_width / (gdouble) frame.info.width;
scale_y *=
} else {
GdkRGBA color;
- gtk_style_context_get_color (gtk_widget_get_style_context (widget), 0,
- &color);
+ if (gst_widget->priv->ignore_alpha) {
+ color.red = color.blue = color.green = 0.0;
+ color.alpha = 1.0;
+ } else {
+ gtk_style_context_get_color (gtk_widget_get_style_context (widget),
+ GTK_STATE_FLAG_NORMAL, &color);
+ }
gdk_cairo_set_source_rgba (cr, &color);
cairo_rectangle (cr, 0, 0, widget_width, widget_height);
cairo_fill (cr);
gtk_widget->priv->par_n = gst_value_get_fraction_numerator (value);
gtk_widget->priv->par_d = gst_value_get_fraction_denominator (value);
break;
+ case PROP_IGNORE_ALPHA:
+ gtk_widget->priv->ignore_alpha = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_PIXEL_ASPECT_RATIO:
gst_value_set_fraction (value, gtk_widget->priv->par_n,
gtk_widget->priv->par_d);
+ case PROP_IGNORE_ALPHA:
+ g_value_set_boolean (value, gtk_widget->priv->ignore_alpha);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
"The pixel aspect ratio of the device", DEFAULT_PAR_N, DEFAULT_PAR_D,
G_MAXINT, 1, 1, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_klass, PROP_IGNORE_ALPHA,
+ g_param_spec_boolean ("ignore-alpha", "Ignore Alpha",
+ "When enabled, alpha will be ignored and converted to black",
+ DEFAULT_IGNORE_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
widget_klass->draw = gtk_gst_widget_draw;
widget_klass->get_preferred_width = gtk_gst_widget_get_preferred_width;
widget_klass->get_preferred_height = gtk_gst_widget_get_preferred_height;
widget->priv->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO;
widget->priv->par_n = DEFAULT_PAR_N;
widget->priv->par_d = DEFAULT_PAR_D;
+ widget->priv->ignore_alpha = DEFAULT_IGNORE_ALPHA;
g_mutex_init (&widget->priv->lock);
}